diff --git a/.gitignore b/.gitignore index a176a26e9..79504d9c1 100644 --- a/.gitignore +++ b/.gitignore @@ -22,8 +22,12 @@ build/ # Node frontend/node_modules/ +frontend/coverage/ npm-debug.log* +# Build output (generated by npm run build) +static/ + # Database *.db *.db-journal diff --git a/frontend/coverage/base.css b/frontend/coverage/base.css deleted file mode 100644 index f418035b4..000000000 --- a/frontend/coverage/base.css +++ /dev/null @@ -1,224 +0,0 @@ -body, html { - margin:0; padding: 0; - height: 100%; -} -body { - font-family: Helvetica Neue, Helvetica, Arial; - font-size: 14px; - color:#333; -} -.small { font-size: 12px; } -*, *:after, *:before { - -webkit-box-sizing:border-box; - -moz-box-sizing:border-box; - box-sizing:border-box; - } -h1 { font-size: 20px; margin: 0;} -h2 { font-size: 14px; } -pre { - font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; - margin: 0; - padding: 0; - -moz-tab-size: 2; - -o-tab-size: 2; - tab-size: 2; -} -a { color:#0074D9; text-decoration:none; } -a:hover { text-decoration:underline; } -.strong { font-weight: bold; } -.space-top1 { padding: 10px 0 0 0; } -.pad2y { padding: 20px 0; } -.pad1y { padding: 10px 0; } -.pad2x { padding: 0 20px; } -.pad2 { padding: 20px; } -.pad1 { padding: 10px; } -.space-left2 { padding-left:55px; } -.space-right2 { padding-right:20px; } -.center { text-align:center; } -.clearfix { display:block; } -.clearfix:after { - content:''; - display:block; - height:0; - clear:both; - visibility:hidden; - } -.fl { float: left; } -@media only screen and (max-width:640px) { - .col3 { width:100%; max-width:100%; } - .hide-mobile { display:none!important; } -} - -.quiet { - color: #7f7f7f; - color: rgba(0,0,0,0.5); -} -.quiet a { opacity: 0.7; } - -.fraction { - font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; - font-size: 10px; - color: #555; - background: #E8E8E8; - padding: 4px 5px; - border-radius: 3px; - vertical-align: middle; -} - -div.path a:link, div.path a:visited { color: #333; } -table.coverage { - border-collapse: collapse; - margin: 10px 0 0 0; - padding: 0; -} - -table.coverage td { - margin: 0; - padding: 0; - vertical-align: top; -} -table.coverage td.line-count { - text-align: right; - padding: 0 5px 0 20px; -} -table.coverage td.line-coverage { - text-align: right; - padding-right: 10px; - min-width:20px; -} - -table.coverage td span.cline-any { - display: inline-block; - padding: 0 5px; - width: 100%; -} -.missing-if-branch { - display: inline-block; - margin-right: 5px; - border-radius: 3px; - position: relative; - padding: 0 4px; - background: #333; - color: yellow; -} - -.skip-if-branch { - display: none; - margin-right: 10px; - position: relative; - padding: 0 4px; - background: #ccc; - color: white; -} -.missing-if-branch .typ, .skip-if-branch .typ { - color: inherit !important; -} -.coverage-summary { - border-collapse: collapse; - width: 100%; -} -.coverage-summary tr { border-bottom: 1px solid #bbb; } -.keyline-all { border: 1px solid #ddd; } -.coverage-summary td, .coverage-summary th { padding: 10px; } -.coverage-summary tbody { border: 1px solid #bbb; } -.coverage-summary td { border-right: 1px solid #bbb; } -.coverage-summary td:last-child { border-right: none; } -.coverage-summary th { - text-align: left; - font-weight: normal; - white-space: nowrap; -} -.coverage-summary th.file { border-right: none !important; } -.coverage-summary th.pct { } -.coverage-summary th.pic, -.coverage-summary th.abs, -.coverage-summary td.pct, -.coverage-summary td.abs { text-align: right; } -.coverage-summary td.file { white-space: nowrap; } -.coverage-summary td.pic { min-width: 120px !important; } -.coverage-summary tfoot td { } - -.coverage-summary .sorter { - height: 10px; - width: 7px; - display: inline-block; - margin-left: 0.5em; - background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; -} -.coverage-summary .sorted .sorter { - background-position: 0 -20px; -} -.coverage-summary .sorted-desc .sorter { - background-position: 0 -10px; -} -.status-line { height: 10px; } -/* yellow */ -.cbranch-no { background: yellow !important; color: #111; } -/* dark red */ -.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } -.low .chart { border:1px solid #C21F39 } -.highlighted, -.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ - background: #C21F39 !important; -} -/* medium red */ -.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } -/* light red */ -.low, .cline-no { background:#FCE1E5 } -/* light green */ -.high, .cline-yes { background:rgb(230,245,208) } -/* medium green */ -.cstat-yes { background:rgb(161,215,106) } -/* dark green */ -.status-line.high, .high .cover-fill { background:rgb(77,146,33) } -.high .chart { border:1px solid rgb(77,146,33) } -/* dark yellow (gold) */ -.status-line.medium, .medium .cover-fill { background: #f9cd0b; } -.medium .chart { border:1px solid #f9cd0b; } -/* light yellow */ -.medium { background: #fff4c2; } - -.cstat-skip { background: #ddd; color: #111; } -.fstat-skip { background: #ddd; color: #111 !important; } -.cbranch-skip { background: #ddd !important; color: #111; } - -span.cline-neutral { background: #eaeaea; } - -.coverage-summary td.empty { - opacity: .5; - padding-top: 4px; - padding-bottom: 4px; - line-height: 1; - color: #888; -} - -.cover-fill, .cover-empty { - display:inline-block; - height: 12px; -} -.chart { - line-height: 0; -} -.cover-empty { - background: white; -} -.cover-full { - border-right: none !important; -} -pre.prettyprint { - border: none !important; - padding: 0 !important; - margin: 0 !important; -} -.com { color: #999 !important; } -.ignore-none { color: #999; font-weight: normal; } - -.wrapper { - min-height: 100%; - height: auto !important; - height: 100%; - margin: 0 auto -48px; -} -.footer, .push { - height: 48px; -} diff --git a/frontend/coverage/block-navigation.js b/frontend/coverage/block-navigation.js deleted file mode 100644 index 530d1ed2b..000000000 --- a/frontend/coverage/block-navigation.js +++ /dev/null @@ -1,87 +0,0 @@ -/* eslint-disable */ -var jumpToCode = (function init() { - // Classes of code we would like to highlight in the file view - var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; - - // Elements to highlight in the file listing view - var fileListingElements = ['td.pct.low']; - - // We don't want to select elements that are direct descendants of another match - var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` - - // Selector that finds elements on the page to which we can jump - var selector = - fileListingElements.join(', ') + - ', ' + - notSelector + - missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` - - // The NodeList of matching elements - var missingCoverageElements = document.querySelectorAll(selector); - - var currentIndex; - - function toggleClass(index) { - missingCoverageElements - .item(currentIndex) - .classList.remove('highlighted'); - missingCoverageElements.item(index).classList.add('highlighted'); - } - - function makeCurrent(index) { - toggleClass(index); - currentIndex = index; - missingCoverageElements.item(index).scrollIntoView({ - behavior: 'smooth', - block: 'center', - inline: 'center' - }); - } - - function goToPrevious() { - var nextIndex = 0; - if (typeof currentIndex !== 'number' || currentIndex === 0) { - nextIndex = missingCoverageElements.length - 1; - } else if (missingCoverageElements.length > 1) { - nextIndex = currentIndex - 1; - } - - makeCurrent(nextIndex); - } - - function goToNext() { - var nextIndex = 0; - - if ( - typeof currentIndex === 'number' && - currentIndex < missingCoverageElements.length - 1 - ) { - nextIndex = currentIndex + 1; - } - - makeCurrent(nextIndex); - } - - return function jump(event) { - if ( - document.getElementById('fileSearch') === document.activeElement && - document.activeElement != null - ) { - // if we're currently focused on the search input, we don't want to navigate - return; - } - - switch (event.which) { - case 78: // n - case 74: // j - goToNext(); - break; - case 66: // b - case 75: // k - case 80: // p - goToPrevious(); - break; - } - }; -})(); -window.addEventListener('keydown', jumpToCode); diff --git a/frontend/coverage/coverage-final.json b/frontend/coverage/coverage-final.json deleted file mode 100644 index b2a01432e..000000000 --- a/frontend/coverage/coverage-final.json +++ /dev/null @@ -1,67 +0,0 @@ -{"/opt/claude/projects/bambuddy/frontend/src/App.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/App.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":64}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":73}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":45}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":52}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":52}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":46}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":46}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":52}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":52}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":58}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":52}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":48}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":60}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":52}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":56}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":56}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":37}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":19}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":14}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":27}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":15}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":6}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":4}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":3}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":73}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":17}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":25}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":1}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":16}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":10}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":19}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":21}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":50}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":29}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":27}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":22}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":76}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":53}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":60}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":70}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":64}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":64}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":70}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":76}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":70}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":70}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":78}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":24}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":23}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":28}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":30}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":30}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":22}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":20}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":1}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":19}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"26":0,"27":0,"28":0,"29":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"40":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":63,"column":-1249}},"locations":[{"start":{"line":1,"column":0},"end":{"line":63,"column":-1249}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":63,"column":-1249}},"loc":{"start":{"line":1,"column":0},"end":{"line":63,"column":-1249}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/api/client.ts": {"path":"/opt/claude/projects/bambuddy/frontend/src/api/client.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":26}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":19}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":27}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":15}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":58}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":15}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":14}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":41}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":25}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":6}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":5}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":21}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":58}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":63}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":3}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":25}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":1}},"1098":{"start":{"line":1099,"column":0},"end":{"line":1099,"column":20}},"1100":{"start":{"line":1101,"column":0},"end":{"line":1101,"column":54}},"1101":{"start":{"line":1102,"column":0},"end":{"line":1102,"column":66}},"1102":{"start":{"line":1103,"column":0},"end":{"line":1103,"column":41}},"1103":{"start":{"line":1104,"column":0},"end":{"line":1104,"column":36}},"1104":{"start":{"line":1105,"column":0},"end":{"line":1105,"column":21}},"1105":{"start":{"line":1106,"column":0},"end":{"line":1106,"column":33}},"1106":{"start":{"line":1107,"column":0},"end":{"line":1107,"column":7}},"1107":{"start":{"line":1108,"column":0},"end":{"line":1108,"column":62}},"1108":{"start":{"line":1109,"column":0},"end":{"line":1109,"column":41}},"1109":{"start":{"line":1110,"column":0},"end":{"line":1110,"column":22}},"1110":{"start":{"line":1111,"column":0},"end":{"line":1111,"column":33}},"1111":{"start":{"line":1112,"column":0},"end":{"line":1112,"column":7}},"1112":{"start":{"line":1113,"column":0},"end":{"line":1113,"column":32}},"1113":{"start":{"line":1114,"column":0},"end":{"line":1114,"column":59}},"1114":{"start":{"line":1115,"column":0},"end":{"line":1115,"column":35}},"1115":{"start":{"line":1116,"column":0},"end":{"line":1116,"column":53}},"1116":{"start":{"line":1117,"column":0},"end":{"line":1117,"column":33}},"1117":{"start":{"line":1118,"column":0},"end":{"line":1118,"column":64}},"1118":{"start":{"line":1119,"column":0},"end":{"line":1119,"column":21}},"1119":{"start":{"line":1120,"column":0},"end":{"line":1120,"column":7}},"1120":{"start":{"line":1121,"column":0},"end":{"line":1121,"column":36}},"1121":{"start":{"line":1122,"column":0},"end":{"line":1122,"column":67}},"1122":{"start":{"line":1123,"column":0},"end":{"line":1123,"column":21}},"1123":{"start":{"line":1124,"column":0},"end":{"line":1124,"column":7}},"1126":{"start":{"line":1127,"column":0},"end":{"line":1127,"column":43}},"1127":{"start":{"line":1128,"column":0},"end":{"line":1128,"column":84}},"1128":{"start":{"line":1129,"column":0},"end":{"line":1129,"column":21}},"1129":{"start":{"line":1130,"column":0},"end":{"line":1130,"column":7}},"1130":{"start":{"line":1131,"column":0},"end":{"line":1131,"column":44}},"1131":{"start":{"line":1132,"column":0},"end":{"line":1132,"column":85}},"1132":{"start":{"line":1133,"column":0},"end":{"line":1133,"column":21}},"1133":{"start":{"line":1134,"column":0},"end":{"line":1134,"column":7}},"1134":{"start":{"line":1135,"column":0},"end":{"line":1135,"column":37}},"1135":{"start":{"line":1136,"column":0},"end":{"line":1136,"column":64}},"1136":{"start":{"line":1137,"column":0},"end":{"line":1137,"column":39}},"1137":{"start":{"line":1138,"column":0},"end":{"line":1138,"column":67}},"1138":{"start":{"line":1139,"column":0},"end":{"line":1139,"column":23}},"1139":{"start":{"line":1140,"column":0},"end":{"line":1140,"column":7}},"1142":{"start":{"line":1143,"column":0},"end":{"line":1143,"column":53}},"1143":{"start":{"line":1144,"column":0},"end":{"line":1144,"column":13}},"1151":{"start":{"line":1152,"column":0},"end":{"line":1152,"column":72}},"1152":{"start":{"line":1153,"column":0},"end":{"line":1153,"column":65}},"1153":{"start":{"line":1154,"column":0},"end":{"line":1154,"column":88}},"1154":{"start":{"line":1155,"column":0},"end":{"line":1155,"column":57}},"1155":{"start":{"line":1156,"column":0},"end":{"line":1156,"column":112}},"1156":{"start":{"line":1157,"column":0},"end":{"line":1157,"column":23}},"1157":{"start":{"line":1158,"column":0},"end":{"line":1158,"column":7}},"1158":{"start":{"line":1159,"column":0},"end":{"line":1159,"column":43}},"1159":{"start":{"line":1160,"column":0},"end":{"line":1160,"column":104}},"1162":{"start":{"line":1163,"column":0},"end":{"line":1163,"column":84}},"1163":{"start":{"line":1164,"column":0},"end":{"line":1164,"column":41}},"1164":{"start":{"line":1165,"column":0},"end":{"line":1165,"column":63}},"1165":{"start":{"line":1166,"column":0},"end":{"line":1166,"column":63}},"1166":{"start":{"line":1167,"column":0},"end":{"line":1167,"column":39}},"1167":{"start":{"line":1168,"column":0},"end":{"line":1168,"column":41}},"1168":{"start":{"line":1169,"column":0},"end":{"line":1169,"column":54}},"1169":{"start":{"line":1170,"column":0},"end":{"line":1170,"column":4}},"1170":{"start":{"line":1171,"column":0},"end":{"line":1171,"column":66}},"1171":{"start":{"line":1172,"column":0},"end":{"line":1172,"column":45}},"1177":{"start":{"line":1178,"column":0},"end":{"line":1178,"column":9}},"1178":{"start":{"line":1179,"column":0},"end":{"line":1179,"column":41}},"1179":{"start":{"line":1180,"column":0},"end":{"line":1180,"column":27}},"1180":{"start":{"line":1181,"column":0},"end":{"line":1181,"column":80}},"1181":{"start":{"line":1182,"column":0},"end":{"line":1182,"column":80}},"1182":{"start":{"line":1183,"column":0},"end":{"line":1183,"column":62}},"1183":{"start":{"line":1184,"column":0},"end":{"line":1184,"column":67}},"1184":{"start":{"line":1185,"column":0},"end":{"line":1185,"column":70}},"1185":{"start":{"line":1186,"column":0},"end":{"line":1186,"column":60}},"1186":{"start":{"line":1187,"column":0},"end":{"line":1187,"column":4}},"1187":{"start":{"line":1188,"column":0},"end":{"line":1188,"column":111}},"1188":{"start":{"line":1189,"column":0},"end":{"line":1189,"column":37}},"1198":{"start":{"line":1199,"column":0},"end":{"line":1199,"column":41}},"1199":{"start":{"line":1200,"column":0},"end":{"line":1200,"column":22}},"1200":{"start":{"line":1201,"column":0},"end":{"line":1201,"column":33}},"1201":{"start":{"line":1202,"column":0},"end":{"line":1202,"column":7}},"1202":{"start":{"line":1203,"column":0},"end":{"line":1203,"column":33}},"1203":{"start":{"line":1204,"column":0},"end":{"line":1204,"column":69}},"1204":{"start":{"line":1205,"column":0},"end":{"line":1205,"column":32}},"1205":{"start":{"line":1206,"column":0},"end":{"line":1206,"column":59}},"1206":{"start":{"line":1207,"column":0},"end":{"line":1207,"column":66}},"1207":{"start":{"line":1208,"column":0},"end":{"line":1208,"column":96}},"1208":{"start":{"line":1209,"column":0},"end":{"line":1209,"column":41}},"1209":{"start":{"line":1210,"column":0},"end":{"line":1210,"column":64}},"1210":{"start":{"line":1211,"column":0},"end":{"line":1211,"column":80}},"1211":{"start":{"line":1212,"column":0},"end":{"line":1212,"column":80}},"1212":{"start":{"line":1213,"column":0},"end":{"line":1213,"column":77}},"1213":{"start":{"line":1214,"column":0},"end":{"line":1214,"column":4}},"1214":{"start":{"line":1215,"column":0},"end":{"line":1215,"column":44}},"1215":{"start":{"line":1216,"column":0},"end":{"line":1216,"column":88}},"1216":{"start":{"line":1217,"column":0},"end":{"line":1217,"column":57}},"1217":{"start":{"line":1218,"column":0},"end":{"line":1218,"column":79}},"1218":{"start":{"line":1219,"column":0},"end":{"line":1219,"column":36}},"1227":{"start":{"line":1228,"column":0},"end":{"line":1228,"column":52}},"1228":{"start":{"line":1229,"column":0},"end":{"line":1229,"column":41}},"1229":{"start":{"line":1230,"column":0},"end":{"line":1230,"column":62}},"1230":{"start":{"line":1231,"column":0},"end":{"line":1231,"column":72}},"1231":{"start":{"line":1232,"column":0},"end":{"line":1232,"column":80}},"1232":{"start":{"line":1233,"column":0},"end":{"line":1233,"column":80}},"1233":{"start":{"line":1234,"column":0},"end":{"line":1234,"column":62}},"1234":{"start":{"line":1235,"column":0},"end":{"line":1235,"column":69}},"1235":{"start":{"line":1236,"column":0},"end":{"line":1236,"column":63}},"1236":{"start":{"line":1237,"column":0},"end":{"line":1237,"column":62}},"1238":{"start":{"line":1239,"column":0},"end":{"line":1239,"column":74}},"1239":{"start":{"line":1240,"column":0},"end":{"line":1240,"column":23}},"1240":{"start":{"line":1241,"column":0},"end":{"line":1241,"column":60}},"1241":{"start":{"line":1242,"column":0},"end":{"line":1242,"column":65}},"1242":{"start":{"line":1243,"column":0},"end":{"line":1243,"column":5}},"1244":{"start":{"line":1245,"column":0},"end":{"line":1245,"column":75}},"1245":{"start":{"line":1246,"column":0},"end":{"line":1246,"column":95}},"1246":{"start":{"line":1247,"column":0},"end":{"line":1247,"column":29}},"1247":{"start":{"line":1248,"column":0},"end":{"line":1248,"column":69}},"1248":{"start":{"line":1249,"column":0},"end":{"line":1249,"column":37}},"1249":{"start":{"line":1250,"column":0},"end":{"line":1250,"column":5}},"1251":{"start":{"line":1252,"column":0},"end":{"line":1252,"column":39}},"1252":{"start":{"line":1253,"column":0},"end":{"line":1253,"column":30}},"1253":{"start":{"line":1254,"column":0},"end":{"line":1254,"column":4}},"1254":{"start":{"line":1255,"column":0},"end":{"line":1255,"column":33}},"1259":{"start":{"line":1260,"column":0},"end":{"line":1260,"column":52}},"1260":{"start":{"line":1261,"column":0},"end":{"line":1261,"column":41}},"1261":{"start":{"line":1262,"column":0},"end":{"line":1262,"column":62}},"1262":{"start":{"line":1263,"column":0},"end":{"line":1263,"column":64}},"1263":{"start":{"line":1264,"column":0},"end":{"line":1264,"column":80}},"1264":{"start":{"line":1265,"column":0},"end":{"line":1265,"column":80}},"1266":{"start":{"line":1267,"column":0},"end":{"line":1267,"column":80}},"1267":{"start":{"line":1268,"column":0},"end":{"line":1268,"column":23}},"1268":{"start":{"line":1269,"column":0},"end":{"line":1269,"column":60}},"1269":{"start":{"line":1270,"column":0},"end":{"line":1270,"column":65}},"1270":{"start":{"line":1271,"column":0},"end":{"line":1271,"column":5}},"1272":{"start":{"line":1273,"column":0},"end":{"line":1273,"column":75}},"1273":{"start":{"line":1274,"column":0},"end":{"line":1274,"column":89}},"1274":{"start":{"line":1275,"column":0},"end":{"line":1275,"column":29}},"1275":{"start":{"line":1276,"column":0},"end":{"line":1276,"column":69}},"1276":{"start":{"line":1277,"column":0},"end":{"line":1277,"column":37}},"1277":{"start":{"line":1278,"column":0},"end":{"line":1278,"column":5}},"1279":{"start":{"line":1280,"column":0},"end":{"line":1280,"column":39}},"1280":{"start":{"line":1281,"column":0},"end":{"line":1281,"column":30}},"1281":{"start":{"line":1282,"column":0},"end":{"line":1282,"column":4}},"1282":{"start":{"line":1283,"column":0},"end":{"line":1283,"column":39}},"1283":{"start":{"line":1284,"column":0},"end":{"line":1284,"column":93}},"1284":{"start":{"line":1285,"column":0},"end":{"line":1285,"column":30}},"1285":{"start":{"line":1286,"column":0},"end":{"line":1286,"column":109}},"1286":{"start":{"line":1287,"column":0},"end":{"line":1287,"column":21}},"1287":{"start":{"line":1288,"column":0},"end":{"line":1288,"column":7}},"1288":{"start":{"line":1289,"column":0},"end":{"line":1289,"column":78}},"1289":{"start":{"line":1290,"column":0},"end":{"line":1290,"column":76}},"1290":{"start":{"line":1291,"column":0},"end":{"line":1291,"column":70}},"1291":{"start":{"line":1292,"column":0},"end":{"line":1292,"column":78}},"1292":{"start":{"line":1293,"column":0},"end":{"line":1293,"column":39}},"1293":{"start":{"line":1294,"column":0},"end":{"line":1294,"column":13}},"1298":{"start":{"line":1299,"column":0},"end":{"line":1299,"column":42}},"1299":{"start":{"line":1300,"column":0},"end":{"line":1300,"column":21}},"1300":{"start":{"line":1301,"column":0},"end":{"line":1301,"column":7}},"1301":{"start":{"line":1302,"column":0},"end":{"line":1302,"column":59}},"1302":{"start":{"line":1303,"column":0},"end":{"line":1303,"column":67}},"1303":{"start":{"line":1304,"column":0},"end":{"line":1304,"column":82}},"1304":{"start":{"line":1305,"column":0},"end":{"line":1305,"column":24}},"1305":{"start":{"line":1306,"column":0},"end":{"line":1306,"column":6}},"1306":{"start":{"line":1307,"column":0},"end":{"line":1307,"column":115}},"1307":{"start":{"line":1308,"column":0},"end":{"line":1308,"column":36}},"1308":{"start":{"line":1309,"column":0},"end":{"line":1309,"column":34}},"1309":{"start":{"line":1310,"column":0},"end":{"line":1310,"column":88}},"1310":{"start":{"line":1311,"column":0},"end":{"line":1311,"column":21}},"1311":{"start":{"line":1312,"column":0},"end":{"line":1312,"column":21}},"1312":{"start":{"line":1313,"column":0},"end":{"line":1313,"column":7}},"1313":{"start":{"line":1314,"column":0},"end":{"line":1314,"column":23}},"1314":{"start":{"line":1315,"column":0},"end":{"line":1315,"column":60}},"1315":{"start":{"line":1316,"column":0},"end":{"line":1316,"column":65}},"1316":{"start":{"line":1317,"column":0},"end":{"line":1317,"column":5}},"1317":{"start":{"line":1318,"column":0},"end":{"line":1318,"column":27}},"1318":{"start":{"line":1319,"column":0},"end":{"line":1319,"column":4}},"1320":{"start":{"line":1321,"column":0},"end":{"line":1321,"column":62}},"1321":{"start":{"line":1322,"column":0},"end":{"line":1322,"column":79}},"1322":{"start":{"line":1323,"column":0},"end":{"line":1323,"column":129}},"1323":{"start":{"line":1324,"column":0},"end":{"line":1324,"column":36}},"1324":{"start":{"line":1325,"column":0},"end":{"line":1325,"column":34}},"1325":{"start":{"line":1326,"column":0},"end":{"line":1326,"column":78}},"1326":{"start":{"line":1327,"column":0},"end":{"line":1327,"column":21}},"1327":{"start":{"line":1328,"column":0},"end":{"line":1328,"column":21}},"1328":{"start":{"line":1329,"column":0},"end":{"line":1329,"column":7}},"1329":{"start":{"line":1330,"column":0},"end":{"line":1330,"column":23}},"1330":{"start":{"line":1331,"column":0},"end":{"line":1331,"column":60}},"1331":{"start":{"line":1332,"column":0},"end":{"line":1332,"column":65}},"1332":{"start":{"line":1333,"column":0},"end":{"line":1333,"column":5}},"1333":{"start":{"line":1334,"column":0},"end":{"line":1334,"column":27}},"1334":{"start":{"line":1335,"column":0},"end":{"line":1335,"column":4}},"1335":{"start":{"line":1336,"column":0},"end":{"line":1336,"column":62}},"1336":{"start":{"line":1337,"column":0},"end":{"line":1337,"column":123}},"1337":{"start":{"line":1338,"column":0},"end":{"line":1338,"column":23}},"1338":{"start":{"line":1339,"column":0},"end":{"line":1339,"column":7}},"1340":{"start":{"line":1341,"column":0},"end":{"line":1341,"column":49}},"1341":{"start":{"line":1342,"column":0},"end":{"line":1342,"column":47}},"1342":{"start":{"line":1343,"column":0},"end":{"line":1343,"column":65}},"1343":{"start":{"line":1344,"column":0},"end":{"line":1344,"column":127}},"1344":{"start":{"line":1345,"column":0},"end":{"line":1345,"column":108}},"1345":{"start":{"line":1346,"column":0},"end":{"line":1346,"column":36}},"1346":{"start":{"line":1347,"column":0},"end":{"line":1347,"column":34}},"1347":{"start":{"line":1348,"column":0},"end":{"line":1348,"column":78}},"1348":{"start":{"line":1349,"column":0},"end":{"line":1349,"column":21}},"1349":{"start":{"line":1350,"column":0},"end":{"line":1350,"column":21}},"1350":{"start":{"line":1351,"column":0},"end":{"line":1351,"column":7}},"1351":{"start":{"line":1352,"column":0},"end":{"line":1352,"column":23}},"1352":{"start":{"line":1353,"column":0},"end":{"line":1353,"column":60}},"1353":{"start":{"line":1354,"column":0},"end":{"line":1354,"column":65}},"1354":{"start":{"line":1355,"column":0},"end":{"line":1355,"column":5}},"1355":{"start":{"line":1356,"column":0},"end":{"line":1356,"column":27}},"1356":{"start":{"line":1357,"column":0},"end":{"line":1357,"column":4}},"1357":{"start":{"line":1358,"column":0},"end":{"line":1358,"column":41}},"1358":{"start":{"line":1359,"column":0},"end":{"line":1359,"column":66}},"1359":{"start":{"line":1360,"column":0},"end":{"line":1360,"column":23}},"1360":{"start":{"line":1361,"column":0},"end":{"line":1361,"column":7}},"1363":{"start":{"line":1364,"column":0},"end":{"line":1364,"column":57}},"1364":{"start":{"line":1365,"column":0},"end":{"line":1365,"column":60}},"1365":{"start":{"line":1366,"column":0},"end":{"line":1366,"column":41}},"1366":{"start":{"line":1367,"column":0},"end":{"line":1367,"column":13}},"1370":{"start":{"line":1371,"column":0},"end":{"line":1371,"column":39}},"1372":{"start":{"line":1373,"column":0},"end":{"line":1373,"column":40}},"1373":{"start":{"line":1374,"column":0},"end":{"line":1374,"column":13}},"1394":{"start":{"line":1395,"column":0},"end":{"line":1395,"column":39}},"1395":{"start":{"line":1396,"column":0},"end":{"line":1396,"column":48}},"1404":{"start":{"line":1405,"column":0},"end":{"line":1405,"column":45}},"1405":{"start":{"line":1406,"column":0},"end":{"line":1406,"column":22}},"1406":{"start":{"line":1407,"column":0},"end":{"line":1407,"column":33}},"1407":{"start":{"line":1408,"column":0},"end":{"line":1408,"column":7}},"1408":{"start":{"line":1409,"column":0},"end":{"line":1409,"column":70}},"1409":{"start":{"line":1410,"column":0},"end":{"line":1410,"column":87}},"1410":{"start":{"line":1411,"column":0},"end":{"line":1411,"column":56}},"1411":{"start":{"line":1412,"column":0},"end":{"line":1412,"column":118}},"1412":{"start":{"line":1413,"column":0},"end":{"line":1413,"column":59}},"1413":{"start":{"line":1414,"column":0},"end":{"line":1414,"column":90}},"1414":{"start":{"line":1415,"column":0},"end":{"line":1415,"column":63}},"1415":{"start":{"line":1416,"column":0},"end":{"line":1416,"column":24}},"1416":{"start":{"line":1417,"column":0},"end":{"line":1417,"column":6}},"1417":{"start":{"line":1418,"column":0},"end":{"line":1418,"column":78}},"1418":{"start":{"line":1419,"column":0},"end":{"line":1419,"column":36}},"1419":{"start":{"line":1420,"column":0},"end":{"line":1420,"column":34}},"1420":{"start":{"line":1421,"column":0},"end":{"line":1421,"column":25}},"1421":{"start":{"line":1422,"column":0},"end":{"line":1422,"column":61}},"1422":{"start":{"line":1423,"column":0},"end":{"line":1423,"column":38}},"1423":{"start":{"line":1424,"column":0},"end":{"line":1424,"column":39}},"1424":{"start":{"line":1425,"column":0},"end":{"line":1425,"column":21}},"1425":{"start":{"line":1426,"column":0},"end":{"line":1426,"column":21}},"1426":{"start":{"line":1427,"column":0},"end":{"line":1427,"column":7}},"1427":{"start":{"line":1428,"column":0},"end":{"line":1428,"column":23}},"1428":{"start":{"line":1429,"column":0},"end":{"line":1429,"column":60}},"1429":{"start":{"line":1430,"column":0},"end":{"line":1430,"column":65}},"1430":{"start":{"line":1431,"column":0},"end":{"line":1431,"column":5}},"1431":{"start":{"line":1432,"column":0},"end":{"line":1432,"column":27}},"1432":{"start":{"line":1433,"column":0},"end":{"line":1433,"column":4}},"1433":{"start":{"line":1434,"column":0},"end":{"line":1434,"column":95}},"1434":{"start":{"line":1435,"column":0},"end":{"line":1435,"column":36}},"1435":{"start":{"line":1436,"column":0},"end":{"line":1436,"column":60}},"1436":{"start":{"line":1437,"column":0},"end":{"line":1437,"column":25}},"1437":{"start":{"line":1438,"column":0},"end":{"line":1438,"column":66}},"1438":{"start":{"line":1439,"column":0},"end":{"line":1439,"column":43}},"1439":{"start":{"line":1440,"column":0},"end":{"line":1440,"column":39}},"1440":{"start":{"line":1441,"column":0},"end":{"line":1441,"column":21}},"1441":{"start":{"line":1442,"column":0},"end":{"line":1442,"column":21}},"1442":{"start":{"line":1443,"column":0},"end":{"line":1443,"column":7}},"1443":{"start":{"line":1444,"column":0},"end":{"line":1444,"column":23}},"1444":{"start":{"line":1445,"column":0},"end":{"line":1445,"column":60}},"1445":{"start":{"line":1446,"column":0},"end":{"line":1446,"column":65}},"1446":{"start":{"line":1447,"column":0},"end":{"line":1447,"column":5}},"1447":{"start":{"line":1448,"column":0},"end":{"line":1448,"column":27}},"1448":{"start":{"line":1449,"column":0},"end":{"line":1449,"column":4}},"1451":{"start":{"line":1452,"column":0},"end":{"line":1452,"column":56}},"1452":{"start":{"line":1453,"column":0},"end":{"line":1453,"column":46}},"1453":{"start":{"line":1454,"column":0},"end":{"line":1454,"column":40}},"1454":{"start":{"line":1455,"column":0},"end":{"line":1455,"column":20}},"1455":{"start":{"line":1456,"column":0},"end":{"line":1456,"column":33}},"1456":{"start":{"line":1457,"column":0},"end":{"line":1457,"column":7}},"1457":{"start":{"line":1458,"column":0},"end":{"line":1458,"column":22}},"1458":{"start":{"line":1459,"column":0},"end":{"line":1459,"column":64}},"1459":{"start":{"line":1460,"column":0},"end":{"line":1460,"column":108}},"1460":{"start":{"line":1461,"column":0},"end":{"line":1461,"column":41}},"1461":{"start":{"line":1462,"column":0},"end":{"line":1462,"column":21}},"1462":{"start":{"line":1463,"column":0},"end":{"line":1463,"column":105}},"1463":{"start":{"line":1464,"column":0},"end":{"line":1464,"column":120}},"1464":{"start":{"line":1465,"column":0},"end":{"line":1465,"column":108}},"1465":{"start":{"line":1466,"column":0},"end":{"line":1466,"column":114}},"1466":{"start":{"line":1467,"column":0},"end":{"line":1467,"column":105}},"1467":{"start":{"line":1468,"column":0},"end":{"line":1468,"column":108}},"1468":{"start":{"line":1469,"column":0},"end":{"line":1469,"column":114}},"1469":{"start":{"line":1470,"column":0},"end":{"line":1470,"column":105}},"1470":{"start":{"line":1471,"column":0},"end":{"line":1471,"column":117}},"1471":{"start":{"line":1472,"column":0},"end":{"line":1472,"column":5}},"1472":{"start":{"line":1473,"column":0},"end":{"line":1473,"column":97}},"1473":{"start":{"line":1474,"column":0},"end":{"line":1474,"column":38}},"1476":{"start":{"line":1477,"column":0},"end":{"line":1477,"column":75}},"1477":{"start":{"line":1478,"column":0},"end":{"line":1478,"column":42}},"1478":{"start":{"line":1479,"column":0},"end":{"line":1479,"column":29}},"1479":{"start":{"line":1480,"column":0},"end":{"line":1480,"column":65}},"1480":{"start":{"line":1481,"column":0},"end":{"line":1481,"column":44}},"1481":{"start":{"line":1482,"column":0},"end":{"line":1482,"column":5}},"1483":{"start":{"line":1484,"column":0},"end":{"line":1484,"column":39}},"1484":{"start":{"line":1485,"column":0},"end":{"line":1485,"column":30}},"1485":{"start":{"line":1486,"column":0},"end":{"line":1486,"column":4}},"1486":{"start":{"line":1487,"column":0},"end":{"line":1487,"column":58}},"1487":{"start":{"line":1488,"column":0},"end":{"line":1488,"column":36}},"1488":{"start":{"line":1489,"column":0},"end":{"line":1489,"column":34}},"1489":{"start":{"line":1490,"column":0},"end":{"line":1490,"column":84}},"1490":{"start":{"line":1491,"column":0},"end":{"line":1491,"column":39}},"1491":{"start":{"line":1492,"column":0},"end":{"line":1492,"column":21}},"1492":{"start":{"line":1493,"column":0},"end":{"line":1493,"column":21}},"1493":{"start":{"line":1494,"column":0},"end":{"line":1494,"column":7}},"1494":{"start":{"line":1495,"column":0},"end":{"line":1495,"column":39}},"1503":{"start":{"line":1504,"column":0},"end":{"line":1504,"column":4}},"1504":{"start":{"line":1505,"column":0},"end":{"line":1505,"column":20}},"1505":{"start":{"line":1506,"column":0},"end":{"line":1506,"column":83}},"1508":{"start":{"line":1509,"column":0},"end":{"line":1509,"column":66}},"1509":{"start":{"line":1510,"column":0},"end":{"line":1510,"column":69}},"1510":{"start":{"line":1511,"column":0},"end":{"line":1511,"column":49}},"1511":{"start":{"line":1512,"column":0},"end":{"line":1512,"column":21}},"1512":{"start":{"line":1513,"column":0},"end":{"line":1513,"column":56}},"1513":{"start":{"line":1514,"column":0},"end":{"line":1514,"column":7}},"1514":{"start":{"line":1515,"column":0},"end":{"line":1515,"column":47}},"1515":{"start":{"line":1516,"column":0},"end":{"line":1516,"column":50}},"1516":{"start":{"line":1517,"column":0},"end":{"line":1517,"column":21}},"1517":{"start":{"line":1518,"column":0},"end":{"line":1518,"column":44}},"1518":{"start":{"line":1519,"column":0},"end":{"line":1519,"column":7}},"1519":{"start":{"line":1520,"column":0},"end":{"line":1520,"column":42}},"1520":{"start":{"line":1521,"column":0},"end":{"line":1521,"column":46}},"1521":{"start":{"line":1522,"column":0},"end":{"line":1522,"column":21}},"1522":{"start":{"line":1523,"column":0},"end":{"line":1523,"column":45}},"1523":{"start":{"line":1524,"column":0},"end":{"line":1524,"column":7}},"1524":{"start":{"line":1525,"column":0},"end":{"line":1525,"column":20}},"1525":{"start":{"line":1526,"column":0},"end":{"line":1526,"column":71}},"1526":{"start":{"line":1527,"column":0},"end":{"line":1527,"column":48}},"1527":{"start":{"line":1528,"column":0},"end":{"line":1528,"column":74}},"1528":{"start":{"line":1529,"column":0},"end":{"line":1529,"column":47}},"1529":{"start":{"line":1530,"column":0},"end":{"line":1530,"column":65}},"1530":{"start":{"line":1531,"column":0},"end":{"line":1531,"column":52}},"1531":{"start":{"line":1532,"column":0},"end":{"line":1532,"column":53}},"1532":{"start":{"line":1533,"column":0},"end":{"line":1533,"column":21}},"1533":{"start":{"line":1534,"column":0},"end":{"line":1534,"column":33}},"1534":{"start":{"line":1535,"column":0},"end":{"line":1535,"column":7}},"1535":{"start":{"line":1536,"column":0},"end":{"line":1536,"column":71}},"1536":{"start":{"line":1537,"column":0},"end":{"line":1537,"column":66}},"1537":{"start":{"line":1538,"column":0},"end":{"line":1538,"column":20}},"1538":{"start":{"line":1539,"column":0},"end":{"line":1539,"column":33}},"1539":{"start":{"line":1540,"column":0},"end":{"line":1540,"column":7}},"1540":{"start":{"line":1541,"column":0},"end":{"line":1541,"column":44}},"1541":{"start":{"line":1542,"column":0},"end":{"line":1542,"column":74}},"1542":{"start":{"line":1543,"column":0},"end":{"line":1543,"column":23}},"1543":{"start":{"line":1544,"column":0},"end":{"line":1544,"column":7}},"1544":{"start":{"line":1545,"column":0},"end":{"line":1545,"column":66}},"1545":{"start":{"line":1546,"column":0},"end":{"line":1546,"column":79}},"1546":{"start":{"line":1547,"column":0},"end":{"line":1547,"column":69}},"1547":{"start":{"line":1548,"column":0},"end":{"line":1548,"column":26}},"1548":{"start":{"line":1549,"column":0},"end":{"line":1549,"column":71}},"1551":{"start":{"line":1552,"column":0},"end":{"line":1552,"column":61}},"1552":{"start":{"line":1553,"column":0},"end":{"line":1553,"column":73}},"1553":{"start":{"line":1554,"column":0},"end":{"line":1554,"column":114}},"1554":{"start":{"line":1555,"column":0},"end":{"line":1555,"column":45}},"1555":{"start":{"line":1556,"column":0},"end":{"line":1556,"column":41}},"1556":{"start":{"line":1557,"column":0},"end":{"line":1557,"column":21}},"1557":{"start":{"line":1558,"column":0},"end":{"line":1558,"column":33}},"1558":{"start":{"line":1559,"column":0},"end":{"line":1559,"column":7}},"1559":{"start":{"line":1560,"column":0},"end":{"line":1560,"column":57}},"1560":{"start":{"line":1561,"column":0},"end":{"line":1561,"column":46}},"1561":{"start":{"line":1562,"column":0},"end":{"line":1562,"column":22}},"1562":{"start":{"line":1563,"column":0},"end":{"line":1563,"column":33}},"1563":{"start":{"line":1564,"column":0},"end":{"line":1564,"column":7}},"1564":{"start":{"line":1565,"column":0},"end":{"line":1565,"column":34}},"1565":{"start":{"line":1566,"column":0},"end":{"line":1566,"column":62}},"1566":{"start":{"line":1567,"column":0},"end":{"line":1567,"column":68}},"1567":{"start":{"line":1568,"column":0},"end":{"line":1568,"column":81}},"1568":{"start":{"line":1569,"column":0},"end":{"line":1569,"column":21}},"1569":{"start":{"line":1570,"column":0},"end":{"line":1570,"column":39}},"1570":{"start":{"line":1571,"column":0},"end":{"line":1571,"column":7}},"1571":{"start":{"line":1572,"column":0},"end":{"line":1572,"column":37}},"1572":{"start":{"line":1573,"column":0},"end":{"line":1573,"column":58}},"1573":{"start":{"line":1574,"column":0},"end":{"line":1574,"column":102}},"1574":{"start":{"line":1575,"column":0},"end":{"line":1575,"column":66}},"1575":{"start":{"line":1576,"column":0},"end":{"line":1576,"column":21}},"1576":{"start":{"line":1577,"column":0},"end":{"line":1577,"column":63}},"1577":{"start":{"line":1578,"column":0},"end":{"line":1578,"column":7}},"1580":{"start":{"line":1581,"column":0},"end":{"line":1581,"column":54}},"1581":{"start":{"line":1582,"column":0},"end":{"line":1582,"column":41}},"1582":{"start":{"line":1583,"column":0},"end":{"line":1583,"column":63}},"1583":{"start":{"line":1584,"column":0},"end":{"line":1584,"column":45}},"1584":{"start":{"line":1585,"column":0},"end":{"line":1585,"column":58}},"1585":{"start":{"line":1586,"column":0},"end":{"line":1586,"column":4}},"1586":{"start":{"line":1587,"column":0},"end":{"line":1587,"column":72}},"1587":{"start":{"line":1588,"column":0},"end":{"line":1588,"column":45}},"1588":{"start":{"line":1589,"column":0},"end":{"line":1589,"column":40}},"1589":{"start":{"line":1590,"column":0},"end":{"line":1590,"column":21}},"1590":{"start":{"line":1591,"column":0},"end":{"line":1591,"column":33}},"1591":{"start":{"line":1592,"column":0},"end":{"line":1592,"column":7}},"1592":{"start":{"line":1593,"column":0},"end":{"line":1593,"column":62}},"1593":{"start":{"line":1594,"column":0},"end":{"line":1594,"column":45}},"1594":{"start":{"line":1595,"column":0},"end":{"line":1595,"column":22}},"1595":{"start":{"line":1596,"column":0},"end":{"line":1596,"column":33}},"1596":{"start":{"line":1597,"column":0},"end":{"line":1597,"column":7}},"1597":{"start":{"line":1598,"column":0},"end":{"line":1598,"column":34}},"1598":{"start":{"line":1599,"column":0},"end":{"line":1599,"column":71}},"1599":{"start":{"line":1600,"column":0},"end":{"line":1600,"column":62}},"1600":{"start":{"line":1601,"column":0},"end":{"line":1601,"column":52}},"1601":{"start":{"line":1602,"column":0},"end":{"line":1602,"column":21}},"1602":{"start":{"line":1603,"column":0},"end":{"line":1603,"column":38}},"1603":{"start":{"line":1604,"column":0},"end":{"line":1604,"column":7}},"1604":{"start":{"line":1605,"column":0},"end":{"line":1605,"column":34}},"1605":{"start":{"line":1606,"column":0},"end":{"line":1606,"column":76}},"1606":{"start":{"line":1607,"column":0},"end":{"line":1607,"column":32}},"1607":{"start":{"line":1608,"column":0},"end":{"line":1608,"column":74}},"1610":{"start":{"line":1611,"column":0},"end":{"line":1611,"column":62}},"1611":{"start":{"line":1612,"column":0},"end":{"line":1612,"column":102}},"1612":{"start":{"line":1613,"column":0},"end":{"line":1613,"column":62}},"1613":{"start":{"line":1614,"column":0},"end":{"line":1614,"column":89}},"1614":{"start":{"line":1615,"column":0},"end":{"line":1615,"column":21}},"1615":{"start":{"line":1616,"column":0},"end":{"line":1616,"column":36}},"1616":{"start":{"line":1617,"column":0},"end":{"line":1617,"column":7}},"1617":{"start":{"line":1618,"column":0},"end":{"line":1618,"column":65}},"1618":{"start":{"line":1619,"column":0},"end":{"line":1619,"column":89}},"1619":{"start":{"line":1620,"column":0},"end":{"line":1620,"column":23}},"1620":{"start":{"line":1621,"column":0},"end":{"line":1621,"column":36}},"1621":{"start":{"line":1622,"column":0},"end":{"line":1622,"column":7}},"1622":{"start":{"line":1623,"column":0},"end":{"line":1623,"column":71}},"1623":{"start":{"line":1624,"column":0},"end":{"line":1624,"column":94}},"1624":{"start":{"line":1625,"column":0},"end":{"line":1625,"column":21}},"1625":{"start":{"line":1626,"column":0},"end":{"line":1626,"column":37}},"1626":{"start":{"line":1627,"column":0},"end":{"line":1627,"column":7}},"1629":{"start":{"line":1630,"column":0},"end":{"line":1630,"column":42}},"1630":{"start":{"line":1631,"column":0},"end":{"line":1631,"column":77}},"1631":{"start":{"line":1632,"column":0},"end":{"line":1632,"column":74}},"1632":{"start":{"line":1633,"column":0},"end":{"line":1633,"column":94}},"1633":{"start":{"line":1634,"column":0},"end":{"line":1634,"column":20}},"1634":{"start":{"line":1635,"column":0},"end":{"line":1635,"column":60}},"1635":{"start":{"line":1636,"column":0},"end":{"line":1636,"column":7}},"1636":{"start":{"line":1637,"column":0},"end":{"line":1637,"column":63}},"1637":{"start":{"line":1638,"column":0},"end":{"line":1638,"column":127}},"1638":{"start":{"line":1639,"column":0},"end":{"line":1639,"column":23}},"1639":{"start":{"line":1640,"column":0},"end":{"line":1640,"column":7}},"1642":{"start":{"line":1643,"column":0},"end":{"line":1643,"column":40}},"1643":{"start":{"line":1644,"column":0},"end":{"line":1644,"column":86}},"1644":{"start":{"line":1645,"column":0},"end":{"line":1645,"column":70}},"1645":{"start":{"line":1646,"column":0},"end":{"line":1646,"column":96}},"1646":{"start":{"line":1647,"column":0},"end":{"line":1647,"column":109}},"1647":{"start":{"line":1648,"column":0},"end":{"line":1648,"column":178}},"1648":{"start":{"line":1649,"column":0},"end":{"line":1649,"column":20}},"1649":{"start":{"line":1650,"column":0},"end":{"line":1650,"column":7}},"1650":{"start":{"line":1651,"column":0},"end":{"line":1651,"column":73}},"1651":{"start":{"line":1652,"column":0},"end":{"line":1652,"column":93}},"1652":{"start":{"line":1653,"column":0},"end":{"line":1653,"column":23}},"1653":{"start":{"line":1654,"column":0},"end":{"line":1654,"column":7}},"1656":{"start":{"line":1657,"column":0},"end":{"line":1657,"column":58}},"1657":{"start":{"line":1658,"column":0},"end":{"line":1658,"column":69}},"1658":{"start":{"line":1659,"column":0},"end":{"line":1659,"column":90}},"1661":{"start":{"line":1662,"column":0},"end":{"line":1662,"column":85}},"1662":{"start":{"line":1663,"column":0},"end":{"line":1663,"column":97}},"1663":{"start":{"line":1664,"column":0},"end":{"line":1664,"column":67}},"1664":{"start":{"line":1665,"column":0},"end":{"line":1665,"column":54}},"1665":{"start":{"line":1666,"column":0},"end":{"line":1666,"column":21}},"1666":{"start":{"line":1667,"column":0},"end":{"line":1667,"column":33}},"1667":{"start":{"line":1668,"column":0},"end":{"line":1668,"column":7}},"1668":{"start":{"line":1669,"column":0},"end":{"line":1669,"column":79}},"1669":{"start":{"line":1670,"column":0},"end":{"line":1670,"column":59}},"1670":{"start":{"line":1671,"column":0},"end":{"line":1671,"column":22}},"1671":{"start":{"line":1672,"column":0},"end":{"line":1672,"column":33}},"1672":{"start":{"line":1673,"column":0},"end":{"line":1673,"column":7}},"1673":{"start":{"line":1674,"column":0},"end":{"line":1674,"column":45}},"1674":{"start":{"line":1675,"column":0},"end":{"line":1675,"column":79}},"1675":{"start":{"line":1676,"column":0},"end":{"line":1676,"column":43}},"1676":{"start":{"line":1677,"column":0},"end":{"line":1677,"column":87}},"1677":{"start":{"line":1678,"column":0},"end":{"line":1678,"column":60}},"1678":{"start":{"line":1679,"column":0},"end":{"line":1679,"column":69}},"1679":{"start":{"line":1680,"column":0},"end":{"line":1680,"column":21}},"1680":{"start":{"line":1681,"column":0},"end":{"line":1681,"column":33}},"1681":{"start":{"line":1682,"column":0},"end":{"line":1682,"column":7}},"1682":{"start":{"line":1683,"column":0},"end":{"line":1683,"column":37}},"1683":{"start":{"line":1684,"column":0},"end":{"line":1684,"column":13}},"1694":{"start":{"line":1695,"column":0},"end":{"line":1695,"column":54}},"1697":{"start":{"line":1698,"column":0},"end":{"line":1698,"column":93}},"1698":{"start":{"line":1699,"column":0},"end":{"line":1699,"column":106}},"1699":{"start":{"line":1700,"column":0},"end":{"line":1700,"column":79}},"1700":{"start":{"line":1701,"column":0},"end":{"line":1701,"column":68}},"1701":{"start":{"line":1702,"column":0},"end":{"line":1702,"column":20}},"1702":{"start":{"line":1703,"column":0},"end":{"line":1703,"column":33}},"1703":{"start":{"line":1704,"column":0},"end":{"line":1704,"column":7}},"1704":{"start":{"line":1705,"column":0},"end":{"line":1705,"column":44}},"1705":{"start":{"line":1706,"column":0},"end":{"line":1706,"column":74}},"1706":{"start":{"line":1707,"column":0},"end":{"line":1707,"column":21}},"1707":{"start":{"line":1708,"column":0},"end":{"line":1708,"column":7}},"1708":{"start":{"line":1709,"column":0},"end":{"line":1709,"column":101}},"1709":{"start":{"line":1710,"column":0},"end":{"line":1710,"column":52}},"1710":{"start":{"line":1711,"column":0},"end":{"line":1711,"column":73}},"1711":{"start":{"line":1712,"column":0},"end":{"line":1712,"column":21}},"1712":{"start":{"line":1713,"column":0},"end":{"line":1713,"column":33}},"1713":{"start":{"line":1714,"column":0},"end":{"line":1714,"column":7}},"1716":{"start":{"line":1717,"column":0},"end":{"line":1717,"column":34}},"1723":{"start":{"line":1724,"column":0},"end":{"line":1724,"column":9}},"1724":{"start":{"line":1725,"column":0},"end":{"line":1725,"column":47}},"1725":{"start":{"line":1726,"column":0},"end":{"line":1726,"column":71}},"1726":{"start":{"line":1727,"column":0},"end":{"line":1727,"column":74}},"1727":{"start":{"line":1728,"column":0},"end":{"line":1728,"column":89}},"1728":{"start":{"line":1729,"column":0},"end":{"line":1729,"column":78}},"1729":{"start":{"line":1730,"column":0},"end":{"line":1730,"column":91}},"1730":{"start":{"line":1731,"column":0},"end":{"line":1731,"column":68}},"1731":{"start":{"line":1732,"column":0},"end":{"line":1732,"column":82}},"1732":{"start":{"line":1733,"column":0},"end":{"line":1733,"column":4}},"1733":{"start":{"line":1734,"column":0},"end":{"line":1734,"column":40}},"1734":{"start":{"line":1735,"column":0},"end":{"line":1735,"column":76}},"1735":{"start":{"line":1736,"column":0},"end":{"line":1736,"column":48}},"1736":{"start":{"line":1737,"column":0},"end":{"line":1737,"column":50}},"1737":{"start":{"line":1738,"column":0},"end":{"line":1738,"column":61}},"1738":{"start":{"line":1739,"column":0},"end":{"line":1739,"column":26}},"1739":{"start":{"line":1740,"column":0},"end":{"line":1740,"column":6}},"1742":{"start":{"line":1743,"column":0},"end":{"line":1743,"column":71}},"1743":{"start":{"line":1744,"column":0},"end":{"line":1744,"column":24}},"1744":{"start":{"line":1745,"column":0},"end":{"line":1745,"column":73}},"1745":{"start":{"line":1746,"column":0},"end":{"line":1746,"column":21}},"1746":{"start":{"line":1747,"column":0},"end":{"line":1747,"column":7}},"1747":{"start":{"line":1748,"column":0},"end":{"line":1748,"column":27}},"1748":{"start":{"line":1749,"column":0},"end":{"line":1749,"column":76}},"1749":{"start":{"line":1750,"column":0},"end":{"line":1750,"column":21}},"1750":{"start":{"line":1751,"column":0},"end":{"line":1751,"column":7}},"1751":{"start":{"line":1752,"column":0},"end":{"line":1752,"column":40}},"1752":{"start":{"line":1753,"column":0},"end":{"line":1753,"column":64}},"1753":{"start":{"line":1754,"column":0},"end":{"line":1754,"column":21}},"1754":{"start":{"line":1755,"column":0},"end":{"line":1755,"column":7}},"1755":{"start":{"line":1756,"column":0},"end":{"line":1756,"column":27}},"1756":{"start":{"line":1757,"column":0},"end":{"line":1757,"column":55}},"1757":{"start":{"line":1758,"column":0},"end":{"line":1758,"column":21}},"1758":{"start":{"line":1759,"column":0},"end":{"line":1759,"column":7}},"1759":{"start":{"line":1760,"column":0},"end":{"line":1760,"column":26}},"1760":{"start":{"line":1761,"column":0},"end":{"line":1761,"column":55}},"1761":{"start":{"line":1762,"column":0},"end":{"line":1762,"column":29}},"1762":{"start":{"line":1763,"column":0},"end":{"line":1763,"column":61}},"1765":{"start":{"line":1766,"column":0},"end":{"line":1766,"column":61}},"1766":{"start":{"line":1767,"column":0},"end":{"line":1767,"column":70}},"1767":{"start":{"line":1768,"column":0},"end":{"line":1768,"column":20}},"1768":{"start":{"line":1769,"column":0},"end":{"line":1769,"column":92}},"1769":{"start":{"line":1770,"column":0},"end":{"line":1770,"column":21}},"1770":{"start":{"line":1771,"column":0},"end":{"line":1771,"column":7}},"1771":{"start":{"line":1772,"column":0},"end":{"line":1772,"column":66}},"1774":{"start":{"line":1775,"column":0},"end":{"line":1775,"column":78}},"1775":{"start":{"line":1776,"column":0},"end":{"line":1776,"column":57}},"1776":{"start":{"line":1777,"column":0},"end":{"line":1777,"column":52}},"1777":{"start":{"line":1778,"column":0},"end":{"line":1778,"column":21}},"1778":{"start":{"line":1779,"column":0},"end":{"line":1779,"column":33}},"1779":{"start":{"line":1780,"column":0},"end":{"line":1780,"column":7}},"1780":{"start":{"line":1781,"column":0},"end":{"line":1781,"column":78}},"1781":{"start":{"line":1782,"column":0},"end":{"line":1782,"column":58}},"1782":{"start":{"line":1783,"column":0},"end":{"line":1783,"column":22}},"1783":{"start":{"line":1784,"column":0},"end":{"line":1784,"column":33}},"1784":{"start":{"line":1785,"column":0},"end":{"line":1785,"column":7}},"1785":{"start":{"line":1786,"column":0},"end":{"line":1786,"column":40}},"1786":{"start":{"line":1787,"column":0},"end":{"line":1787,"column":82}},"1787":{"start":{"line":1788,"column":0},"end":{"line":1788,"column":95}},"1788":{"start":{"line":1789,"column":0},"end":{"line":1789,"column":47}},"1789":{"start":{"line":1790,"column":0},"end":{"line":1790,"column":78}},"1790":{"start":{"line":1791,"column":0},"end":{"line":1791,"column":160}},"1791":{"start":{"line":1792,"column":0},"end":{"line":1792,"column":64}},"1792":{"start":{"line":1793,"column":0},"end":{"line":1793,"column":22}},"1793":{"start":{"line":1794,"column":0},"end":{"line":1794,"column":33}},"1794":{"start":{"line":1795,"column":0},"end":{"line":1795,"column":7}},"1795":{"start":{"line":1796,"column":0},"end":{"line":1796,"column":57}},"1796":{"start":{"line":1797,"column":0},"end":{"line":1797,"column":72}},"1797":{"start":{"line":1798,"column":0},"end":{"line":1798,"column":21}},"1798":{"start":{"line":1799,"column":0},"end":{"line":1799,"column":38}},"1799":{"start":{"line":1800,"column":0},"end":{"line":1800,"column":7}},"1800":{"start":{"line":1801,"column":0},"end":{"line":1801,"column":44}},"1801":{"start":{"line":1802,"column":0},"end":{"line":1802,"column":74}},"1802":{"start":{"line":1803,"column":0},"end":{"line":1803,"column":83}},"1803":{"start":{"line":1804,"column":0},"end":{"line":1804,"column":61}},"1804":{"start":{"line":1805,"column":0},"end":{"line":1805,"column":102}},"1805":{"start":{"line":1806,"column":0},"end":{"line":1806,"column":75}},"1806":{"start":{"line":1807,"column":0},"end":{"line":1807,"column":25}},"1807":{"start":{"line":1808,"column":0},"end":{"line":1808,"column":6}},"1810":{"start":{"line":1811,"column":0},"end":{"line":1811,"column":54}},"1811":{"start":{"line":1812,"column":0},"end":{"line":1812,"column":65}},"1812":{"start":{"line":1813,"column":0},"end":{"line":1813,"column":46}},"1813":{"start":{"line":1814,"column":0},"end":{"line":1814,"column":56}},"1814":{"start":{"line":1815,"column":0},"end":{"line":1815,"column":46}},"1815":{"start":{"line":1816,"column":0},"end":{"line":1816,"column":106}},"1818":{"start":{"line":1819,"column":0},"end":{"line":1819,"column":70}},"1819":{"start":{"line":1820,"column":0},"end":{"line":1820,"column":82}},"1820":{"start":{"line":1821,"column":0},"end":{"line":1821,"column":51}},"1821":{"start":{"line":1822,"column":0},"end":{"line":1822,"column":47}},"1822":{"start":{"line":1823,"column":0},"end":{"line":1823,"column":21}},"1823":{"start":{"line":1824,"column":0},"end":{"line":1824,"column":33}},"1824":{"start":{"line":1825,"column":0},"end":{"line":1825,"column":7}},"1825":{"start":{"line":1826,"column":0},"end":{"line":1826,"column":63}},"1826":{"start":{"line":1827,"column":0},"end":{"line":1827,"column":52}},"1827":{"start":{"line":1828,"column":0},"end":{"line":1828,"column":22}},"1828":{"start":{"line":1829,"column":0},"end":{"line":1829,"column":33}},"1829":{"start":{"line":1830,"column":0},"end":{"line":1830,"column":7}},"1830":{"start":{"line":1831,"column":0},"end":{"line":1831,"column":37}},"1831":{"start":{"line":1832,"column":0},"end":{"line":1832,"column":80}},"1832":{"start":{"line":1833,"column":0},"end":{"line":1833,"column":42}},"1833":{"start":{"line":1834,"column":0},"end":{"line":1834,"column":56}},"1834":{"start":{"line":1835,"column":0},"end":{"line":1835,"column":20}},"1835":{"start":{"line":1836,"column":0},"end":{"line":1836,"column":36}},"1836":{"start":{"line":1837,"column":0},"end":{"line":1837,"column":7}},"1837":{"start":{"line":1838,"column":0},"end":{"line":1838,"column":84}},"1838":{"start":{"line":1839,"column":0},"end":{"line":1839,"column":36}},"1839":{"start":{"line":1840,"column":0},"end":{"line":1840,"column":34}},"1840":{"start":{"line":1841,"column":0},"end":{"line":1841,"column":75}},"1841":{"start":{"line":1842,"column":0},"end":{"line":1842,"column":21}},"1842":{"start":{"line":1843,"column":0},"end":{"line":1843,"column":21}},"1843":{"start":{"line":1844,"column":0},"end":{"line":1844,"column":7}},"1844":{"start":{"line":1845,"column":0},"end":{"line":1845,"column":23}},"1845":{"start":{"line":1846,"column":0},"end":{"line":1846,"column":60}},"1846":{"start":{"line":1847,"column":0},"end":{"line":1847,"column":65}},"1847":{"start":{"line":1848,"column":0},"end":{"line":1848,"column":5}},"1848":{"start":{"line":1849,"column":0},"end":{"line":1849,"column":27}},"1849":{"start":{"line":1850,"column":0},"end":{"line":1850,"column":4}},"1850":{"start":{"line":1851,"column":0},"end":{"line":1851,"column":41}},"1851":{"start":{"line":1852,"column":0},"end":{"line":1852,"column":78}},"1852":{"start":{"line":1853,"column":0},"end":{"line":1853,"column":82}},"1855":{"start":{"line":1856,"column":0},"end":{"line":1856,"column":37}},"1856":{"start":{"line":1857,"column":0},"end":{"line":1857,"column":41}},"1857":{"start":{"line":1858,"column":0},"end":{"line":1858,"column":45}},"1858":{"start":{"line":1859,"column":0},"end":{"line":1859,"column":62}},"1859":{"start":{"line":1860,"column":0},"end":{"line":1860,"column":4}},"1860":{"start":{"line":1861,"column":0},"end":{"line":1861,"column":66}},"1861":{"start":{"line":1862,"column":0},"end":{"line":1862,"column":41}},"1862":{"start":{"line":1863,"column":0},"end":{"line":1863,"column":36}},"1863":{"start":{"line":1864,"column":0},"end":{"line":1864,"column":21}},"1864":{"start":{"line":1865,"column":0},"end":{"line":1865,"column":33}},"1865":{"start":{"line":1866,"column":0},"end":{"line":1866,"column":7}},"1866":{"start":{"line":1867,"column":0},"end":{"line":1867,"column":53}},"1867":{"start":{"line":1868,"column":0},"end":{"line":1868,"column":41}},"1868":{"start":{"line":1869,"column":0},"end":{"line":1869,"column":22}},"1869":{"start":{"line":1870,"column":0},"end":{"line":1870,"column":33}},"1870":{"start":{"line":1871,"column":0},"end":{"line":1871,"column":7}},"1871":{"start":{"line":1872,"column":0},"end":{"line":1872,"column":32}},"1872":{"start":{"line":1873,"column":0},"end":{"line":1873,"column":74}},"1873":{"start":{"line":1874,"column":0},"end":{"line":1874,"column":62}},"1874":{"start":{"line":1875,"column":0},"end":{"line":1875,"column":83}},"1875":{"start":{"line":1876,"column":0},"end":{"line":1876,"column":68}},"1876":{"start":{"line":1877,"column":0},"end":{"line":1877,"column":73}},"1877":{"start":{"line":1878,"column":0},"end":{"line":1878,"column":21}},"1878":{"start":{"line":1879,"column":0},"end":{"line":1879,"column":56}},"1879":{"start":{"line":1880,"column":0},"end":{"line":1880,"column":7}},"1880":{"start":{"line":1881,"column":0},"end":{"line":1881,"column":73}},"1881":{"start":{"line":1882,"column":0},"end":{"line":1882,"column":76}},"1882":{"start":{"line":1883,"column":0},"end":{"line":1883,"column":21}},"1883":{"start":{"line":1884,"column":0},"end":{"line":1884,"column":56}},"1884":{"start":{"line":1885,"column":0},"end":{"line":1885,"column":7}},"1885":{"start":{"line":1886,"column":0},"end":{"line":1886,"column":72}},"1886":{"start":{"line":1887,"column":0},"end":{"line":1887,"column":70}},"1887":{"start":{"line":1888,"column":0},"end":{"line":1888,"column":21}},"1888":{"start":{"line":1889,"column":0},"end":{"line":1889,"column":61}},"1889":{"start":{"line":1890,"column":0},"end":{"line":1890,"column":7}},"1892":{"start":{"line":1893,"column":0},"end":{"line":1893,"column":52}},"1893":{"start":{"line":1894,"column":0},"end":{"line":1894,"column":39}},"1894":{"start":{"line":1895,"column":0},"end":{"line":1895,"column":49}},"1895":{"start":{"line":1896,"column":0},"end":{"line":1896,"column":21}},"1896":{"start":{"line":1897,"column":0},"end":{"line":1897,"column":33}},"1897":{"start":{"line":1898,"column":0},"end":{"line":1898,"column":7}},"1898":{"start":{"line":1899,"column":0},"end":{"line":1899,"column":51}},"1899":{"start":{"line":1900,"column":0},"end":{"line":1900,"column":40}},"1900":{"start":{"line":1901,"column":0},"end":{"line":1901,"column":22}},"1901":{"start":{"line":1902,"column":0},"end":{"line":1902,"column":33}},"1902":{"start":{"line":1903,"column":0},"end":{"line":1903,"column":7}},"1903":{"start":{"line":1904,"column":0},"end":{"line":1904,"column":31}},"1904":{"start":{"line":1905,"column":0},"end":{"line":1905,"column":74}},"1907":{"start":{"line":1908,"column":0},"end":{"line":1908,"column":66}},"1908":{"start":{"line":1909,"column":0},"end":{"line":1909,"column":85}},"1909":{"start":{"line":1910,"column":0},"end":{"line":1910,"column":2}}},"s":{"0":1,"2":26,"3":26,"4":26,"5":26,"6":26,"7":26,"8":26,"9":26,"10":26,"11":26,"12":26,"14":26,"15":0,"16":0,"17":0,"19":26,"20":26,"1098":1,"1100":1,"1101":1,"1102":1,"1103":0,"1104":0,"1105":0,"1106":0,"1107":1,"1108":0,"1109":0,"1110":0,"1111":0,"1112":1,"1113":0,"1114":1,"1115":0,"1116":1,"1117":0,"1118":0,"1119":0,"1120":1,"1121":0,"1122":0,"1123":0,"1126":1,"1127":0,"1128":0,"1129":0,"1130":1,"1131":0,"1132":0,"1133":0,"1134":1,"1135":0,"1136":1,"1137":0,"1138":0,"1139":0,"1142":1,"1143":0,"1151":0,"1152":1,"1153":0,"1154":1,"1155":0,"1156":0,"1157":0,"1158":1,"1159":0,"1162":1,"1163":0,"1164":0,"1165":0,"1166":0,"1167":0,"1168":0,"1169":0,"1170":1,"1171":1,"1177":0,"1178":0,"1179":0,"1180":0,"1181":0,"1182":0,"1183":0,"1184":0,"1185":0,"1186":0,"1187":1,"1188":1,"1198":0,"1199":0,"1200":0,"1201":0,"1202":1,"1203":0,"1204":1,"1205":0,"1206":1,"1207":1,"1208":0,"1209":0,"1210":0,"1211":0,"1212":0,"1213":0,"1214":1,"1215":0,"1216":1,"1217":0,"1218":1,"1227":0,"1228":0,"1229":0,"1230":0,"1231":0,"1232":0,"1233":0,"1234":0,"1235":0,"1236":0,"1238":0,"1239":0,"1240":0,"1241":0,"1242":0,"1244":0,"1245":0,"1246":0,"1247":0,"1248":0,"1249":0,"1251":0,"1252":0,"1253":0,"1254":1,"1259":0,"1260":0,"1261":0,"1262":0,"1263":0,"1264":0,"1266":0,"1267":0,"1268":0,"1269":0,"1270":0,"1272":0,"1273":0,"1274":0,"1275":0,"1276":0,"1277":0,"1279":0,"1280":0,"1281":0,"1282":1,"1283":0,"1284":1,"1285":0,"1286":0,"1287":0,"1288":1,"1289":1,"1290":1,"1291":1,"1292":1,"1293":0,"1298":0,"1299":0,"1300":0,"1301":1,"1302":0,"1303":0,"1304":0,"1305":0,"1306":1,"1307":0,"1308":0,"1309":0,"1310":0,"1311":0,"1312":0,"1313":0,"1314":0,"1315":0,"1316":0,"1317":0,"1318":0,"1320":1,"1321":0,"1322":1,"1323":0,"1324":0,"1325":0,"1326":0,"1327":0,"1328":0,"1329":0,"1330":0,"1331":0,"1332":0,"1333":0,"1334":0,"1335":1,"1336":0,"1337":0,"1338":0,"1340":1,"1341":0,"1342":1,"1343":0,"1344":1,"1345":0,"1346":0,"1347":0,"1348":0,"1349":0,"1350":0,"1351":0,"1352":0,"1353":0,"1354":0,"1355":0,"1356":0,"1357":1,"1358":0,"1359":0,"1360":0,"1363":1,"1364":0,"1365":1,"1366":0,"1370":0,"1372":1,"1373":0,"1394":0,"1395":1,"1404":0,"1405":0,"1406":0,"1407":0,"1408":1,"1409":0,"1410":1,"1411":0,"1412":1,"1413":0,"1414":0,"1415":0,"1416":0,"1417":1,"1418":0,"1419":0,"1420":0,"1421":0,"1422":0,"1423":0,"1424":0,"1425":0,"1426":0,"1427":0,"1428":0,"1429":0,"1430":0,"1431":0,"1432":0,"1433":1,"1434":0,"1435":0,"1436":0,"1437":0,"1438":0,"1439":0,"1440":0,"1441":0,"1442":0,"1443":0,"1444":0,"1445":0,"1446":0,"1447":0,"1448":0,"1451":1,"1452":1,"1453":0,"1454":0,"1455":0,"1456":0,"1457":1,"1458":0,"1459":1,"1460":0,"1461":0,"1462":0,"1463":0,"1464":0,"1465":0,"1466":0,"1467":0,"1468":0,"1469":0,"1470":0,"1471":0,"1472":0,"1473":0,"1476":0,"1477":0,"1478":0,"1479":0,"1480":0,"1481":0,"1483":0,"1484":0,"1485":0,"1486":1,"1487":0,"1488":0,"1489":0,"1490":0,"1491":0,"1492":0,"1493":0,"1494":0,"1503":0,"1504":1,"1505":0,"1508":1,"1509":1,"1510":0,"1511":0,"1512":0,"1513":0,"1514":1,"1515":0,"1516":0,"1517":0,"1518":0,"1519":1,"1520":0,"1521":0,"1522":0,"1523":0,"1524":1,"1525":0,"1526":1,"1527":0,"1528":1,"1529":0,"1530":1,"1531":0,"1532":0,"1533":0,"1534":0,"1535":1,"1536":0,"1537":0,"1538":0,"1539":0,"1540":1,"1541":0,"1542":0,"1543":0,"1544":1,"1545":1,"1546":0,"1547":1,"1548":0,"1551":1,"1552":1,"1553":1,"1554":1,"1555":0,"1556":0,"1557":0,"1558":0,"1559":1,"1560":0,"1561":0,"1562":0,"1563":0,"1564":1,"1565":0,"1566":1,"1567":0,"1568":0,"1569":0,"1570":0,"1571":1,"1572":13,"1573":1,"1574":0,"1575":0,"1576":0,"1577":0,"1580":1,"1581":0,"1582":0,"1583":0,"1584":0,"1585":0,"1586":1,"1587":1,"1588":0,"1589":0,"1590":0,"1591":0,"1592":1,"1593":0,"1594":0,"1595":0,"1596":0,"1597":1,"1598":0,"1599":1,"1600":0,"1601":0,"1602":0,"1603":0,"1604":1,"1605":0,"1606":1,"1607":0,"1610":1,"1611":0,"1612":1,"1613":0,"1614":0,"1615":0,"1616":0,"1617":1,"1618":0,"1619":0,"1620":0,"1621":0,"1622":1,"1623":0,"1624":0,"1625":0,"1626":0,"1629":1,"1630":0,"1631":1,"1632":0,"1633":0,"1634":0,"1635":0,"1636":1,"1637":0,"1638":0,"1639":0,"1642":1,"1643":0,"1644":1,"1645":0,"1646":1,"1647":0,"1648":0,"1649":0,"1650":1,"1651":0,"1652":0,"1653":0,"1656":1,"1657":1,"1658":1,"1661":1,"1662":1,"1663":1,"1664":0,"1665":0,"1666":0,"1667":0,"1668":1,"1669":0,"1670":0,"1671":0,"1672":0,"1673":1,"1674":0,"1675":1,"1676":0,"1677":1,"1678":0,"1679":0,"1680":0,"1681":0,"1682":1,"1683":0,"1694":0,"1697":1,"1698":1,"1699":1,"1700":0,"1701":0,"1702":0,"1703":0,"1704":1,"1705":0,"1706":0,"1707":0,"1708":1,"1709":1,"1710":0,"1711":0,"1712":0,"1713":0,"1716":1,"1723":0,"1724":0,"1725":0,"1726":0,"1727":0,"1728":0,"1729":0,"1730":0,"1731":0,"1732":0,"1733":1,"1734":0,"1735":1,"1736":0,"1737":0,"1738":0,"1739":0,"1742":1,"1743":1,"1744":0,"1745":0,"1746":0,"1747":1,"1748":0,"1749":0,"1750":0,"1751":1,"1752":0,"1753":0,"1754":0,"1755":1,"1756":0,"1757":0,"1758":0,"1759":1,"1760":0,"1761":1,"1762":0,"1765":1,"1766":1,"1767":1,"1768":0,"1769":0,"1770":0,"1771":1,"1774":1,"1775":1,"1776":0,"1777":0,"1778":0,"1779":0,"1780":1,"1781":0,"1782":0,"1783":0,"1784":0,"1785":1,"1786":0,"1787":1,"1788":1,"1789":0,"1790":1,"1791":0,"1792":0,"1793":0,"1794":0,"1795":1,"1796":0,"1797":0,"1798":0,"1799":0,"1800":1,"1801":0,"1802":1,"1803":1,"1804":0,"1805":0,"1806":0,"1807":0,"1810":1,"1811":0,"1812":1,"1813":0,"1814":1,"1815":0,"1818":1,"1819":1,"1820":1,"1821":0,"1822":0,"1823":0,"1824":0,"1825":1,"1826":0,"1827":0,"1828":0,"1829":0,"1830":1,"1831":0,"1832":1,"1833":0,"1834":0,"1835":0,"1836":0,"1837":1,"1838":0,"1839":0,"1840":0,"1841":0,"1842":0,"1843":0,"1844":0,"1845":0,"1846":0,"1847":0,"1848":0,"1849":0,"1850":1,"1851":0,"1852":1,"1855":1,"1856":0,"1857":0,"1858":0,"1859":0,"1860":1,"1861":1,"1862":0,"1863":0,"1864":0,"1865":0,"1866":1,"1867":0,"1868":0,"1869":0,"1870":0,"1871":1,"1872":0,"1873":1,"1874":0,"1875":1,"1876":0,"1877":0,"1878":0,"1879":0,"1880":1,"1881":0,"1882":0,"1883":0,"1884":0,"1885":1,"1886":0,"1887":0,"1888":0,"1889":0,"1892":1,"1893":1,"1894":0,"1895":0,"1896":0,"1897":0,"1898":1,"1899":0,"1900":0,"1901":0,"1902":0,"1903":1,"1904":0,"1907":1,"1908":0,"1909":1},"branchMap":{"0":{"type":"branch","line":3,"loc":{"start":{"line":3,"column":0},"end":{"line":21,"column":1}},"locations":[{"start":{"line":3,"column":0},"end":{"line":21,"column":1}}]},"1":{"type":"branch","line":15,"loc":{"start":{"line":15,"column":20},"end":{"line":18,"column":3}},"locations":[{"start":{"line":15,"column":20},"end":{"line":18,"column":3}}]},"2":{"type":"branch","line":1101,"loc":{"start":{"line":1101,"column":15},"end":{"line":1101,"column":54}},"locations":[{"start":{"line":1101,"column":15},"end":{"line":1101,"column":54}}]},"3":{"type":"branch","line":1572,"loc":{"start":{"line":1572,"column":22},"end":{"line":1573,"column":58}},"locations":[{"start":{"line":1572,"column":22},"end":{"line":1573,"column":58}}]}},"b":{"0":[26],"1":[0],"2":[13],"3":[13]},"fnMap":{"0":{"name":"request","decl":{"start":{"line":3,"column":0},"end":{"line":21,"column":1}},"loc":{"start":{"line":3,"column":0},"end":{"line":21,"column":1}},"line":3},"1":{"name":"getPrinters","decl":{"start":{"line":1101,"column":15},"end":{"line":1101,"column":54}},"loc":{"start":{"line":1101,"column":15},"end":{"line":1101,"column":54}},"line":1101},"2":{"name":"getPrinter","decl":{"start":{"line":1102,"column":14},"end":{"line":1102,"column":66}},"loc":{"start":{"line":1102,"column":14},"end":{"line":1102,"column":66}},"line":1102},"3":{"name":"createPrinter","decl":{"start":{"line":1103,"column":17},"end":{"line":1107,"column":7}},"loc":{"start":{"line":1103,"column":17},"end":{"line":1107,"column":7}},"line":1103},"4":{"name":"updatePrinter","decl":{"start":{"line":1108,"column":17},"end":{"line":1112,"column":7}},"loc":{"start":{"line":1108,"column":17},"end":{"line":1112,"column":7}},"line":1108},"5":{"name":"deletePrinter","decl":{"start":{"line":1113,"column":17},"end":{"line":1114,"column":59}},"loc":{"start":{"line":1113,"column":17},"end":{"line":1114,"column":59}},"line":1113},"6":{"name":"getPrinterStatus","decl":{"start":{"line":1115,"column":20},"end":{"line":1116,"column":53}},"loc":{"start":{"line":1115,"column":20},"end":{"line":1116,"column":53}},"line":1115},"7":{"name":"connectPrinter","decl":{"start":{"line":1117,"column":18},"end":{"line":1120,"column":7}},"loc":{"start":{"line":1117,"column":18},"end":{"line":1120,"column":7}},"line":1117},"8":{"name":"disconnectPrinter","decl":{"start":{"line":1121,"column":21},"end":{"line":1124,"column":7}},"loc":{"start":{"line":1121,"column":21},"end":{"line":1124,"column":7}},"line":1121},"9":{"name":"enableMQTTLogging","decl":{"start":{"line":1127,"column":21},"end":{"line":1130,"column":7}},"loc":{"start":{"line":1127,"column":21},"end":{"line":1130,"column":7}},"line":1127},"10":{"name":"disableMQTTLogging","decl":{"start":{"line":1131,"column":22},"end":{"line":1134,"column":7}},"loc":{"start":{"line":1131,"column":22},"end":{"line":1134,"column":7}},"line":1131},"11":{"name":"getMQTTLogs","decl":{"start":{"line":1135,"column":15},"end":{"line":1136,"column":64}},"loc":{"start":{"line":1135,"column":15},"end":{"line":1136,"column":64}},"line":1135},"12":{"name":"clearMQTTLogs","decl":{"start":{"line":1137,"column":17},"end":{"line":1140,"column":7}},"loc":{"start":{"line":1137,"column":17},"end":{"line":1140,"column":7}},"line":1137},"13":{"name":"getPrinterFiles","decl":{"start":{"line":1143,"column":19},"end":{"line":1152,"column":72}},"loc":{"start":{"line":1143,"column":19},"end":{"line":1152,"column":72}},"line":1143},"14":{"name":"getPrinterFileDownloadUrl","decl":{"start":{"line":1153,"column":29},"end":{"line":1154,"column":88}},"loc":{"start":{"line":1153,"column":29},"end":{"line":1154,"column":88}},"line":1153},"15":{"name":"deletePrinterFile","decl":{"start":{"line":1155,"column":21},"end":{"line":1158,"column":7}},"loc":{"start":{"line":1155,"column":21},"end":{"line":1158,"column":7}},"line":1155},"16":{"name":"getPrinterStorage","decl":{"start":{"line":1159,"column":21},"end":{"line":1160,"column":104}},"loc":{"start":{"line":1159,"column":21},"end":{"line":1160,"column":104}},"line":1159},"17":{"name":"getArchives","decl":{"start":{"line":1163,"column":15},"end":{"line":1170,"column":4}},"loc":{"start":{"line":1163,"column":15},"end":{"line":1170,"column":4}},"line":1163},"18":{"name":"getArchive","decl":{"start":{"line":1171,"column":14},"end":{"line":1171,"column":66}},"loc":{"start":{"line":1171,"column":14},"end":{"line":1171,"column":66}},"line":1171},"19":{"name":"searchArchives","decl":{"start":{"line":1172,"column":18},"end":{"line":1187,"column":4}},"loc":{"start":{"line":1172,"column":18},"end":{"line":1187,"column":4}},"line":1172},"20":{"name":"rebuildSearchIndex","decl":{"start":{"line":1188,"column":22},"end":{"line":1188,"column":111}},"loc":{"start":{"line":1188,"column":22},"end":{"line":1188,"column":111}},"line":1188},"21":{"name":"updateArchive","decl":{"start":{"line":1189,"column":17},"end":{"line":1202,"column":7}},"loc":{"start":{"line":1189,"column":17},"end":{"line":1202,"column":7}},"line":1189},"22":{"name":"toggleFavorite","decl":{"start":{"line":1203,"column":18},"end":{"line":1204,"column":69}},"loc":{"start":{"line":1203,"column":18},"end":{"line":1204,"column":69}},"line":1203},"23":{"name":"deleteArchive","decl":{"start":{"line":1205,"column":17},"end":{"line":1206,"column":59}},"loc":{"start":{"line":1205,"column":17},"end":{"line":1206,"column":59}},"line":1205},"24":{"name":"getArchiveStats","decl":{"start":{"line":1207,"column":19},"end":{"line":1207,"column":66}},"loc":{"start":{"line":1207,"column":19},"end":{"line":1207,"column":66}},"line":1207},"25":{"name":"getFailureAnalysis","decl":{"start":{"line":1208,"column":22},"end":{"line":1214,"column":4}},"loc":{"start":{"line":1208,"column":22},"end":{"line":1214,"column":4}},"line":1208},"26":{"name":"compareArchives","decl":{"start":{"line":1215,"column":19},"end":{"line":1216,"column":88}},"loc":{"start":{"line":1215,"column":19},"end":{"line":1216,"column":88}},"line":1215},"27":{"name":"findSimilarArchives","decl":{"start":{"line":1217,"column":23},"end":{"line":1218,"column":79}},"loc":{"start":{"line":1217,"column":23},"end":{"line":1218,"column":79}},"line":1217},"28":{"name":"exportArchives","decl":{"start":{"line":1219,"column":18},"end":{"line":1254,"column":4}},"loc":{"start":{"line":1219,"column":18},"end":{"line":1254,"column":4}},"line":1219},"29":{"name":"exportStats","decl":{"start":{"line":1255,"column":15},"end":{"line":1282,"column":4}},"loc":{"start":{"line":1255,"column":15},"end":{"line":1282,"column":4}},"line":1255},"30":{"name":"getArchiveDuplicates","decl":{"start":{"line":1283,"column":24},"end":{"line":1284,"column":93}},"loc":{"start":{"line":1283,"column":24},"end":{"line":1284,"column":93}},"line":1283},"31":{"name":"backfillContentHashes","decl":{"start":{"line":1285,"column":25},"end":{"line":1288,"column":7}},"loc":{"start":{"line":1285,"column":25},"end":{"line":1288,"column":7}},"line":1285},"32":{"name":"getArchiveThumbnail","decl":{"start":{"line":1289,"column":23},"end":{"line":1289,"column":78}},"loc":{"start":{"line":1289,"column":23},"end":{"line":1289,"column":78}},"line":1289},"33":{"name":"getArchiveDownload","decl":{"start":{"line":1290,"column":22},"end":{"line":1290,"column":76}},"loc":{"start":{"line":1290,"column":22},"end":{"line":1290,"column":76}},"line":1290},"34":{"name":"getArchiveGcode","decl":{"start":{"line":1291,"column":19},"end":{"line":1291,"column":70}},"loc":{"start":{"line":1291,"column":19},"end":{"line":1291,"column":70}},"line":1291},"35":{"name":"getArchiveTimelapse","decl":{"start":{"line":1292,"column":23},"end":{"line":1292,"column":78}},"loc":{"start":{"line":1292,"column":23},"end":{"line":1292,"column":78}},"line":1292},"36":{"name":"scanArchiveTimelapse","decl":{"start":{"line":1293,"column":24},"end":{"line":1301,"column":7}},"loc":{"start":{"line":1293,"column":24},"end":{"line":1301,"column":7}},"line":1293},"37":{"name":"selectArchiveTimelapse","decl":{"start":{"line":1302,"column":26},"end":{"line":1306,"column":6}},"loc":{"start":{"line":1302,"column":26},"end":{"line":1306,"column":6}},"line":1302},"38":{"name":"uploadArchiveTimelapse","decl":{"start":{"line":1307,"column":26},"end":{"line":1319,"column":4}},"loc":{"start":{"line":1307,"column":26},"end":{"line":1319,"column":4}},"line":1307},"39":{"name":"getArchivePhotoUrl","decl":{"start":{"line":1321,"column":22},"end":{"line":1322,"column":79}},"loc":{"start":{"line":1321,"column":22},"end":{"line":1322,"column":79}},"line":1321},"40":{"name":"uploadArchivePhoto","decl":{"start":{"line":1323,"column":22},"end":{"line":1335,"column":4}},"loc":{"start":{"line":1323,"column":22},"end":{"line":1335,"column":4}},"line":1323},"41":{"name":"deleteArchivePhoto","decl":{"start":{"line":1336,"column":22},"end":{"line":1339,"column":7}},"loc":{"start":{"line":1336,"column":22},"end":{"line":1339,"column":7}},"line":1336},"42":{"name":"getSource3mfDownloadUrl","decl":{"start":{"line":1341,"column":27},"end":{"line":1342,"column":47}},"loc":{"start":{"line":1341,"column":27},"end":{"line":1342,"column":47}},"line":1341},"43":{"name":"getSource3mfForSlicer","decl":{"start":{"line":1343,"column":25},"end":{"line":1344,"column":127}},"loc":{"start":{"line":1343,"column":25},"end":{"line":1344,"column":127}},"line":1343},"44":{"name":"uploadSource3mf","decl":{"start":{"line":1345,"column":19},"end":{"line":1357,"column":4}},"loc":{"start":{"line":1345,"column":19},"end":{"line":1357,"column":4}},"line":1345},"45":{"name":"deleteSource3mf","decl":{"start":{"line":1358,"column":19},"end":{"line":1361,"column":7}},"loc":{"start":{"line":1358,"column":19},"end":{"line":1361,"column":7}},"line":1358},"46":{"name":"getArchiveQRCodeUrl","decl":{"start":{"line":1364,"column":23},"end":{"line":1365,"column":60}},"loc":{"start":{"line":1364,"column":23},"end":{"line":1365,"column":60}},"line":1364},"47":{"name":"getArchiveCapabilities","decl":{"start":{"line":1366,"column":26},"end":{"line":1371,"column":39}},"loc":{"start":{"line":1366,"column":26},"end":{"line":1371,"column":39}},"line":1366},"48":{"name":"getArchiveProjectPage","decl":{"start":{"line":1373,"column":25},"end":{"line":1395,"column":39}},"loc":{"start":{"line":1373,"column":25},"end":{"line":1395,"column":39}},"line":1373},"49":{"name":"updateArchiveProjectPage","decl":{"start":{"line":1396,"column":28},"end":{"line":1408,"column":7}},"loc":{"start":{"line":1396,"column":28},"end":{"line":1408,"column":7}},"line":1396},"50":{"name":"getArchiveProjectImageUrl","decl":{"start":{"line":1409,"column":29},"end":{"line":1410,"column":87}},"loc":{"start":{"line":1409,"column":29},"end":{"line":1410,"column":87}},"line":1409},"51":{"name":"getArchiveForSlicer","decl":{"start":{"line":1411,"column":23},"end":{"line":1412,"column":118}},"loc":{"start":{"line":1411,"column":23},"end":{"line":1412,"column":118}},"line":1411},"52":{"name":"reprintArchive","decl":{"start":{"line":1413,"column":18},"end":{"line":1417,"column":6}},"loc":{"start":{"line":1413,"column":18},"end":{"line":1417,"column":6}},"line":1413},"53":{"name":"uploadArchive","decl":{"start":{"line":1418,"column":17},"end":{"line":1433,"column":4}},"loc":{"start":{"line":1418,"column":17},"end":{"line":1433,"column":4}},"line":1418},"54":{"name":"uploadArchivesBulk","decl":{"start":{"line":1434,"column":22},"end":{"line":1449,"column":4}},"loc":{"start":{"line":1434,"column":22},"end":{"line":1449,"column":4}},"line":1434},"55":{"name":"getSettings","decl":{"start":{"line":1452,"column":15},"end":{"line":1452,"column":56}},"loc":{"start":{"line":1452,"column":15},"end":{"line":1452,"column":56}},"line":1452},"56":{"name":"updateSettings","decl":{"start":{"line":1453,"column":18},"end":{"line":1457,"column":7}},"loc":{"start":{"line":1453,"column":18},"end":{"line":1457,"column":7}},"line":1453},"57":{"name":"resetSettings","decl":{"start":{"line":1458,"column":17},"end":{"line":1459,"column":64}},"loc":{"start":{"line":1458,"column":17},"end":{"line":1459,"column":64}},"line":1458},"58":{"name":"exportBackup","decl":{"start":{"line":1460,"column":16},"end":{"line":1486,"column":4}},"loc":{"start":{"line":1460,"column":16},"end":{"line":1486,"column":4}},"line":1460},"59":{"name":"importBackup","decl":{"start":{"line":1487,"column":16},"end":{"line":1504,"column":4}},"loc":{"start":{"line":1487,"column":16},"end":{"line":1504,"column":4}},"line":1487},"60":{"name":"checkFfmpeg","decl":{"start":{"line":1505,"column":15},"end":{"line":1506,"column":83}},"loc":{"start":{"line":1505,"column":15},"end":{"line":1506,"column":83}},"line":1505},"61":{"name":"getCloudStatus","decl":{"start":{"line":1509,"column":18},"end":{"line":1509,"column":66}},"loc":{"start":{"line":1509,"column":18},"end":{"line":1509,"column":66}},"line":1509},"62":{"name":"cloudLogin","decl":{"start":{"line":1510,"column":14},"end":{"line":1514,"column":7}},"loc":{"start":{"line":1510,"column":14},"end":{"line":1514,"column":7}},"line":1510},"63":{"name":"cloudVerify","decl":{"start":{"line":1515,"column":15},"end":{"line":1519,"column":7}},"loc":{"start":{"line":1515,"column":15},"end":{"line":1519,"column":7}},"line":1515},"64":{"name":"cloudSetToken","decl":{"start":{"line":1520,"column":17},"end":{"line":1524,"column":7}},"loc":{"start":{"line":1520,"column":17},"end":{"line":1524,"column":7}},"line":1520},"65":{"name":"cloudLogout","decl":{"start":{"line":1525,"column":15},"end":{"line":1526,"column":71}},"loc":{"start":{"line":1525,"column":15},"end":{"line":1526,"column":71}},"line":1525},"66":{"name":"getCloudSettings","decl":{"start":{"line":1527,"column":20},"end":{"line":1528,"column":74}},"loc":{"start":{"line":1527,"column":20},"end":{"line":1528,"column":74}},"line":1527},"67":{"name":"getCloudSettingDetail","decl":{"start":{"line":1529,"column":25},"end":{"line":1530,"column":65}},"loc":{"start":{"line":1529,"column":25},"end":{"line":1530,"column":65}},"line":1529},"68":{"name":"createCloudSetting","decl":{"start":{"line":1531,"column":22},"end":{"line":1535,"column":7}},"loc":{"start":{"line":1531,"column":22},"end":{"line":1535,"column":7}},"line":1531},"69":{"name":"updateCloudSetting","decl":{"start":{"line":1536,"column":22},"end":{"line":1540,"column":7}},"loc":{"start":{"line":1536,"column":22},"end":{"line":1540,"column":7}},"line":1536},"70":{"name":"deleteCloudSetting","decl":{"start":{"line":1541,"column":22},"end":{"line":1544,"column":7}},"loc":{"start":{"line":1541,"column":22},"end":{"line":1544,"column":7}},"line":1541},"71":{"name":"getCloudDevices","decl":{"start":{"line":1545,"column":19},"end":{"line":1545,"column":66}},"loc":{"start":{"line":1545,"column":19},"end":{"line":1545,"column":66}},"line":1545},"72":{"name":"getCloudFields","decl":{"start":{"line":1546,"column":18},"end":{"line":1547,"column":69}},"loc":{"start":{"line":1546,"column":18},"end":{"line":1547,"column":69}},"line":1546},"73":{"name":"getAllCloudFields","decl":{"start":{"line":1548,"column":21},"end":{"line":1549,"column":71}},"loc":{"start":{"line":1548,"column":21},"end":{"line":1549,"column":71}},"line":1548},"74":{"name":"getSmartPlugs","decl":{"start":{"line":1552,"column":17},"end":{"line":1552,"column":61}},"loc":{"start":{"line":1552,"column":17},"end":{"line":1552,"column":61}},"line":1552},"75":{"name":"getSmartPlug","decl":{"start":{"line":1553,"column":16},"end":{"line":1553,"column":73}},"loc":{"start":{"line":1553,"column":16},"end":{"line":1553,"column":73}},"line":1553},"76":{"name":"getSmartPlugByPrinter","decl":{"start":{"line":1554,"column":25},"end":{"line":1554,"column":114}},"loc":{"start":{"line":1554,"column":25},"end":{"line":1554,"column":114}},"line":1554},"77":{"name":"createSmartPlug","decl":{"start":{"line":1555,"column":19},"end":{"line":1559,"column":7}},"loc":{"start":{"line":1555,"column":19},"end":{"line":1559,"column":7}},"line":1555},"78":{"name":"updateSmartPlug","decl":{"start":{"line":1560,"column":19},"end":{"line":1564,"column":7}},"loc":{"start":{"line":1560,"column":19},"end":{"line":1564,"column":7}},"line":1560},"79":{"name":"deleteSmartPlug","decl":{"start":{"line":1565,"column":19},"end":{"line":1566,"column":62}},"loc":{"start":{"line":1565,"column":19},"end":{"line":1566,"column":62}},"line":1565},"80":{"name":"controlSmartPlug","decl":{"start":{"line":1567,"column":20},"end":{"line":1571,"column":7}},"loc":{"start":{"line":1567,"column":20},"end":{"line":1571,"column":7}},"line":1567},"81":{"name":"getSmartPlugStatus","decl":{"start":{"line":1572,"column":22},"end":{"line":1573,"column":58}},"loc":{"start":{"line":1572,"column":22},"end":{"line":1573,"column":58}},"line":1572},"82":{"name":"testSmartPlugConnection","decl":{"start":{"line":1574,"column":27},"end":{"line":1578,"column":7}},"loc":{"start":{"line":1574,"column":27},"end":{"line":1578,"column":7}},"line":1574},"83":{"name":"getQueue","decl":{"start":{"line":1581,"column":12},"end":{"line":1586,"column":4}},"loc":{"start":{"line":1581,"column":12},"end":{"line":1586,"column":4}},"line":1581},"84":{"name":"getQueueItem","decl":{"start":{"line":1587,"column":16},"end":{"line":1587,"column":72}},"loc":{"start":{"line":1587,"column":16},"end":{"line":1587,"column":72}},"line":1587},"85":{"name":"addToQueue","decl":{"start":{"line":1588,"column":14},"end":{"line":1592,"column":7}},"loc":{"start":{"line":1588,"column":14},"end":{"line":1592,"column":7}},"line":1588},"86":{"name":"updateQueueItem","decl":{"start":{"line":1593,"column":19},"end":{"line":1597,"column":7}},"loc":{"start":{"line":1593,"column":19},"end":{"line":1597,"column":7}},"line":1593},"87":{"name":"removeFromQueue","decl":{"start":{"line":1598,"column":19},"end":{"line":1599,"column":71}},"loc":{"start":{"line":1598,"column":19},"end":{"line":1599,"column":71}},"line":1598},"88":{"name":"reorderQueue","decl":{"start":{"line":1600,"column":16},"end":{"line":1604,"column":7}},"loc":{"start":{"line":1600,"column":16},"end":{"line":1604,"column":7}},"line":1600},"89":{"name":"cancelQueueItem","decl":{"start":{"line":1605,"column":19},"end":{"line":1606,"column":76}},"loc":{"start":{"line":1605,"column":19},"end":{"line":1606,"column":76}},"line":1605},"90":{"name":"stopQueueItem","decl":{"start":{"line":1607,"column":17},"end":{"line":1608,"column":74}},"loc":{"start":{"line":1607,"column":17},"end":{"line":1608,"column":74}},"line":1607},"91":{"name":"getKProfiles","decl":{"start":{"line":1611,"column":16},"end":{"line":1612,"column":102}},"loc":{"start":{"line":1611,"column":16},"end":{"line":1612,"column":102}},"line":1611},"92":{"name":"setKProfile","decl":{"start":{"line":1613,"column":15},"end":{"line":1617,"column":7}},"loc":{"start":{"line":1613,"column":15},"end":{"line":1617,"column":7}},"line":1613},"93":{"name":"deleteKProfile","decl":{"start":{"line":1618,"column":18},"end":{"line":1622,"column":7}},"loc":{"start":{"line":1618,"column":18},"end":{"line":1622,"column":7}},"line":1618},"94":{"name":"setKProfilesBatch","decl":{"start":{"line":1623,"column":21},"end":{"line":1627,"column":7}},"loc":{"start":{"line":1623,"column":21},"end":{"line":1627,"column":7}},"line":1623},"95":{"name":"getKProfileNotes","decl":{"start":{"line":1630,"column":20},"end":{"line":1631,"column":77}},"loc":{"start":{"line":1630,"column":20},"end":{"line":1631,"column":77}},"line":1630},"96":{"name":"setKProfileNote","decl":{"start":{"line":1632,"column":19},"end":{"line":1636,"column":7}},"loc":{"start":{"line":1632,"column":19},"end":{"line":1636,"column":7}},"line":1632},"97":{"name":"deleteKProfileNote","decl":{"start":{"line":1637,"column":22},"end":{"line":1640,"column":7}},"loc":{"start":{"line":1637,"column":22},"end":{"line":1640,"column":7}},"line":1637},"98":{"name":"getSlotPresets","decl":{"start":{"line":1643,"column":18},"end":{"line":1644,"column":86}},"loc":{"start":{"line":1643,"column":18},"end":{"line":1644,"column":86}},"line":1643},"99":{"name":"getSlotPreset","decl":{"start":{"line":1645,"column":17},"end":{"line":1646,"column":96}},"loc":{"start":{"line":1645,"column":17},"end":{"line":1646,"column":96}},"line":1645},"100":{"name":"saveSlotPreset","decl":{"start":{"line":1647,"column":18},"end":{"line":1650,"column":7}},"loc":{"start":{"line":1647,"column":18},"end":{"line":1650,"column":7}},"line":1647},"101":{"name":"deleteSlotPreset","decl":{"start":{"line":1651,"column":20},"end":{"line":1654,"column":7}},"loc":{"start":{"line":1651,"column":20},"end":{"line":1654,"column":7}},"line":1651},"102":{"name":"listFilaments","decl":{"start":{"line":1657,"column":17},"end":{"line":1657,"column":58}},"loc":{"start":{"line":1657,"column":17},"end":{"line":1657,"column":58}},"line":1657},"103":{"name":"getFilament","decl":{"start":{"line":1658,"column":15},"end":{"line":1658,"column":69}},"loc":{"start":{"line":1658,"column":15},"end":{"line":1658,"column":69}},"line":1658},"104":{"name":"getFilamentsByType","decl":{"start":{"line":1659,"column":22},"end":{"line":1659,"column":90}},"loc":{"start":{"line":1659,"column":22},"end":{"line":1659,"column":90}},"line":1659},"105":{"name":"getNotificationProviders","decl":{"start":{"line":1662,"column":28},"end":{"line":1662,"column":85}},"loc":{"start":{"line":1662,"column":28},"end":{"line":1662,"column":85}},"line":1662},"106":{"name":"getNotificationProvider","decl":{"start":{"line":1663,"column":27},"end":{"line":1663,"column":97}},"loc":{"start":{"line":1663,"column":27},"end":{"line":1663,"column":97}},"line":1663},"107":{"name":"createNotificationProvider","decl":{"start":{"line":1664,"column":30},"end":{"line":1668,"column":7}},"loc":{"start":{"line":1664,"column":30},"end":{"line":1668,"column":7}},"line":1664},"108":{"name":"updateNotificationProvider","decl":{"start":{"line":1669,"column":30},"end":{"line":1673,"column":7}},"loc":{"start":{"line":1669,"column":30},"end":{"line":1673,"column":7}},"line":1669},"109":{"name":"deleteNotificationProvider","decl":{"start":{"line":1674,"column":30},"end":{"line":1675,"column":79}},"loc":{"start":{"line":1674,"column":30},"end":{"line":1675,"column":79}},"line":1674},"110":{"name":"testNotificationProvider","decl":{"start":{"line":1676,"column":28},"end":{"line":1677,"column":87}},"loc":{"start":{"line":1676,"column":28},"end":{"line":1677,"column":87}},"line":1676},"111":{"name":"testNotificationConfig","decl":{"start":{"line":1678,"column":26},"end":{"line":1682,"column":7}},"loc":{"start":{"line":1678,"column":26},"end":{"line":1682,"column":7}},"line":1678},"112":{"name":"testAllNotificationProviders","decl":{"start":{"line":1683,"column":32},"end":{"line":1695,"column":54}},"loc":{"start":{"line":1683,"column":32},"end":{"line":1695,"column":54}},"line":1683},"113":{"name":"getNotificationTemplates","decl":{"start":{"line":1698,"column":28},"end":{"line":1698,"column":93}},"loc":{"start":{"line":1698,"column":28},"end":{"line":1698,"column":93}},"line":1698},"114":{"name":"getNotificationTemplate","decl":{"start":{"line":1699,"column":27},"end":{"line":1699,"column":106}},"loc":{"start":{"line":1699,"column":27},"end":{"line":1699,"column":106}},"line":1699},"115":{"name":"updateNotificationTemplate","decl":{"start":{"line":1700,"column":30},"end":{"line":1704,"column":7}},"loc":{"start":{"line":1700,"column":30},"end":{"line":1704,"column":7}},"line":1700},"116":{"name":"resetNotificationTemplate","decl":{"start":{"line":1705,"column":29},"end":{"line":1708,"column":7}},"loc":{"start":{"line":1705,"column":29},"end":{"line":1708,"column":7}},"line":1705},"117":{"name":"getTemplateVariables","decl":{"start":{"line":1709,"column":24},"end":{"line":1709,"column":101}},"loc":{"start":{"line":1709,"column":24},"end":{"line":1709,"column":101}},"line":1709},"118":{"name":"previewTemplate","decl":{"start":{"line":1710,"column":19},"end":{"line":1714,"column":7}},"loc":{"start":{"line":1710,"column":19},"end":{"line":1714,"column":7}},"line":1710},"119":{"name":"getNotificationLogs","decl":{"start":{"line":1717,"column":23},"end":{"line":1733,"column":4}},"loc":{"start":{"line":1717,"column":23},"end":{"line":1733,"column":4}},"line":1717},"120":{"name":"getNotificationLogStats","decl":{"start":{"line":1734,"column":27},"end":{"line":1735,"column":76}},"loc":{"start":{"line":1734,"column":27},"end":{"line":1735,"column":76}},"line":1734},"121":{"name":"clearNotificationLogs","decl":{"start":{"line":1736,"column":25},"end":{"line":1740,"column":6}},"loc":{"start":{"line":1736,"column":25},"end":{"line":1740,"column":6}},"line":1736},"122":{"name":"getSpoolmanStatus","decl":{"start":{"line":1743,"column":21},"end":{"line":1743,"column":71}},"loc":{"start":{"line":1743,"column":21},"end":{"line":1743,"column":71}},"line":1743},"123":{"name":"connectSpoolman","decl":{"start":{"line":1744,"column":19},"end":{"line":1747,"column":7}},"loc":{"start":{"line":1744,"column":19},"end":{"line":1747,"column":7}},"line":1744},"124":{"name":"disconnectSpoolman","decl":{"start":{"line":1748,"column":22},"end":{"line":1751,"column":7}},"loc":{"start":{"line":1748,"column":22},"end":{"line":1751,"column":7}},"line":1748},"125":{"name":"syncPrinterAms","decl":{"start":{"line":1752,"column":18},"end":{"line":1755,"column":7}},"loc":{"start":{"line":1752,"column":18},"end":{"line":1755,"column":7}},"line":1752},"126":{"name":"syncAllPrintersAms","decl":{"start":{"line":1756,"column":22},"end":{"line":1759,"column":7}},"loc":{"start":{"line":1756,"column":22},"end":{"line":1759,"column":7}},"line":1756},"127":{"name":"getSpoolmanSpools","decl":{"start":{"line":1760,"column":21},"end":{"line":1761,"column":55}},"loc":{"start":{"line":1760,"column":21},"end":{"line":1761,"column":55}},"line":1760},"128":{"name":"getSpoolmanFilaments","decl":{"start":{"line":1762,"column":24},"end":{"line":1763,"column":61}},"loc":{"start":{"line":1762,"column":24},"end":{"line":1763,"column":61}},"line":1762},"129":{"name":"getVersion","decl":{"start":{"line":1766,"column":14},"end":{"line":1766,"column":61}},"loc":{"start":{"line":1766,"column":14},"end":{"line":1766,"column":61}},"line":1766},"130":{"name":"checkForUpdates","decl":{"start":{"line":1767,"column":19},"end":{"line":1767,"column":70}},"loc":{"start":{"line":1767,"column":19},"end":{"line":1767,"column":70}},"line":1767},"131":{"name":"applyUpdate","decl":{"start":{"line":1768,"column":15},"end":{"line":1771,"column":7}},"loc":{"start":{"line":1768,"column":15},"end":{"line":1771,"column":7}},"line":1768},"132":{"name":"getUpdateStatus","decl":{"start":{"line":1772,"column":19},"end":{"line":1772,"column":66}},"loc":{"start":{"line":1772,"column":19},"end":{"line":1772,"column":66}},"line":1772},"133":{"name":"getMaintenanceTypes","decl":{"start":{"line":1775,"column":23},"end":{"line":1775,"column":78}},"loc":{"start":{"line":1775,"column":23},"end":{"line":1775,"column":78}},"line":1775},"134":{"name":"createMaintenanceType","decl":{"start":{"line":1776,"column":25},"end":{"line":1780,"column":7}},"loc":{"start":{"line":1776,"column":25},"end":{"line":1780,"column":7}},"line":1776},"135":{"name":"updateMaintenanceType","decl":{"start":{"line":1781,"column":25},"end":{"line":1785,"column":7}},"loc":{"start":{"line":1781,"column":25},"end":{"line":1785,"column":7}},"line":1781},"136":{"name":"deleteMaintenanceType","decl":{"start":{"line":1786,"column":25},"end":{"line":1787,"column":82}},"loc":{"start":{"line":1786,"column":25},"end":{"line":1787,"column":82}},"line":1786},"137":{"name":"getMaintenanceOverview","decl":{"start":{"line":1788,"column":26},"end":{"line":1788,"column":95}},"loc":{"start":{"line":1788,"column":26},"end":{"line":1788,"column":95}},"line":1788},"138":{"name":"getPrinterMaintenance","decl":{"start":{"line":1789,"column":25},"end":{"line":1790,"column":78}},"loc":{"start":{"line":1789,"column":25},"end":{"line":1790,"column":78}},"line":1789},"139":{"name":"updateMaintenanceItem","decl":{"start":{"line":1791,"column":25},"end":{"line":1795,"column":7}},"loc":{"start":{"line":1791,"column":25},"end":{"line":1795,"column":7}},"line":1791},"140":{"name":"performMaintenance","decl":{"start":{"line":1796,"column":22},"end":{"line":1800,"column":7}},"loc":{"start":{"line":1796,"column":22},"end":{"line":1800,"column":7}},"line":1796},"141":{"name":"getMaintenanceHistory","decl":{"start":{"line":1801,"column":25},"end":{"line":1802,"column":74}},"loc":{"start":{"line":1801,"column":25},"end":{"line":1802,"column":74}},"line":1801},"142":{"name":"getMaintenanceSummary","decl":{"start":{"line":1803,"column":25},"end":{"line":1803,"column":83}},"loc":{"start":{"line":1803,"column":25},"end":{"line":1803,"column":83}},"line":1803},"143":{"name":"setPrinterHours","decl":{"start":{"line":1804,"column":19},"end":{"line":1808,"column":6}},"loc":{"start":{"line":1804,"column":19},"end":{"line":1808,"column":6}},"line":1804},"144":{"name":"getCameraStreamUrl","decl":{"start":{"line":1811,"column":22},"end":{"line":1812,"column":65}},"loc":{"start":{"line":1811,"column":22},"end":{"line":1812,"column":65}},"line":1811},"145":{"name":"getCameraSnapshotUrl","decl":{"start":{"line":1813,"column":24},"end":{"line":1814,"column":56}},"loc":{"start":{"line":1813,"column":24},"end":{"line":1814,"column":56}},"line":1813},"146":{"name":"testCameraConnection","decl":{"start":{"line":1815,"column":24},"end":{"line":1816,"column":106}},"loc":{"start":{"line":1815,"column":24},"end":{"line":1816,"column":106}},"line":1815},"147":{"name":"getExternalLinks","decl":{"start":{"line":1819,"column":20},"end":{"line":1819,"column":70}},"loc":{"start":{"line":1819,"column":20},"end":{"line":1819,"column":70}},"line":1819},"148":{"name":"getExternalLink","decl":{"start":{"line":1820,"column":19},"end":{"line":1820,"column":82}},"loc":{"start":{"line":1820,"column":19},"end":{"line":1820,"column":82}},"line":1820},"149":{"name":"createExternalLink","decl":{"start":{"line":1821,"column":22},"end":{"line":1825,"column":7}},"loc":{"start":{"line":1821,"column":22},"end":{"line":1825,"column":7}},"line":1821},"150":{"name":"updateExternalLink","decl":{"start":{"line":1826,"column":22},"end":{"line":1830,"column":7}},"loc":{"start":{"line":1826,"column":22},"end":{"line":1830,"column":7}},"line":1826},"151":{"name":"deleteExternalLink","decl":{"start":{"line":1831,"column":22},"end":{"line":1832,"column":80}},"loc":{"start":{"line":1831,"column":22},"end":{"line":1832,"column":80}},"line":1831},"152":{"name":"reorderExternalLinks","decl":{"start":{"line":1833,"column":24},"end":{"line":1837,"column":7}},"loc":{"start":{"line":1833,"column":24},"end":{"line":1837,"column":7}},"line":1833},"153":{"name":"uploadExternalLinkIcon","decl":{"start":{"line":1838,"column":26},"end":{"line":1850,"column":4}},"loc":{"start":{"line":1838,"column":26},"end":{"line":1850,"column":4}},"line":1838},"154":{"name":"deleteExternalLinkIcon","decl":{"start":{"line":1851,"column":26},"end":{"line":1852,"column":78}},"loc":{"start":{"line":1851,"column":26},"end":{"line":1852,"column":78}},"line":1851},"155":{"name":"getExternalLinkIconUrl","decl":{"start":{"line":1853,"column":26},"end":{"line":1853,"column":82}},"loc":{"start":{"line":1853,"column":26},"end":{"line":1853,"column":82}},"line":1853},"156":{"name":"getProjects","decl":{"start":{"line":1856,"column":15},"end":{"line":1860,"column":4}},"loc":{"start":{"line":1856,"column":15},"end":{"line":1860,"column":4}},"line":1856},"157":{"name":"getProject","decl":{"start":{"line":1861,"column":14},"end":{"line":1861,"column":66}},"loc":{"start":{"line":1861,"column":14},"end":{"line":1861,"column":66}},"line":1861},"158":{"name":"createProject","decl":{"start":{"line":1862,"column":17},"end":{"line":1866,"column":7}},"loc":{"start":{"line":1862,"column":17},"end":{"line":1866,"column":7}},"line":1862},"159":{"name":"updateProject","decl":{"start":{"line":1867,"column":17},"end":{"line":1871,"column":7}},"loc":{"start":{"line":1867,"column":17},"end":{"line":1871,"column":7}},"line":1867},"160":{"name":"deleteProject","decl":{"start":{"line":1872,"column":17},"end":{"line":1873,"column":74}},"loc":{"start":{"line":1872,"column":17},"end":{"line":1873,"column":74}},"line":1872},"161":{"name":"getProjectArchives","decl":{"start":{"line":1874,"column":22},"end":{"line":1875,"column":83}},"loc":{"start":{"line":1874,"column":22},"end":{"line":1875,"column":83}},"line":1874},"162":{"name":"addArchivesToProject","decl":{"start":{"line":1876,"column":24},"end":{"line":1880,"column":7}},"loc":{"start":{"line":1876,"column":24},"end":{"line":1880,"column":7}},"line":1876},"163":{"name":"removeArchivesFromProject","decl":{"start":{"line":1881,"column":29},"end":{"line":1885,"column":7}},"loc":{"start":{"line":1881,"column":29},"end":{"line":1885,"column":7}},"line":1881},"164":{"name":"addQueueItemsToProject","decl":{"start":{"line":1886,"column":26},"end":{"line":1890,"column":7}},"loc":{"start":{"line":1886,"column":26},"end":{"line":1890,"column":7}},"line":1886},"165":{"name":"getAPIKeys","decl":{"start":{"line":1893,"column":14},"end":{"line":1893,"column":52}},"loc":{"start":{"line":1893,"column":14},"end":{"line":1893,"column":52}},"line":1893},"166":{"name":"createAPIKey","decl":{"start":{"line":1894,"column":16},"end":{"line":1898,"column":7}},"loc":{"start":{"line":1894,"column":16},"end":{"line":1898,"column":7}},"line":1894},"167":{"name":"updateAPIKey","decl":{"start":{"line":1899,"column":16},"end":{"line":1903,"column":7}},"loc":{"start":{"line":1899,"column":16},"end":{"line":1903,"column":7}},"line":1899},"168":{"name":"deleteAPIKey","decl":{"start":{"line":1904,"column":16},"end":{"line":1905,"column":74}},"loc":{"start":{"line":1904,"column":16},"end":{"line":1905,"column":74}},"line":1904},"169":{"name":"getAMSHistory","decl":{"start":{"line":1908,"column":17},"end":{"line":1909,"column":85}},"loc":{"start":{"line":1908,"column":17},"end":{"line":1909,"column":85}},"line":1908}},"f":{"0":26,"1":13,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":13,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/AMSHistoryModal.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/AMSHistoryModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":75}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":41}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":44}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":44}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":43}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":2}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":33}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":9}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":10}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":12}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":14}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":8}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":11}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":27}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":13}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":26}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":33}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":31}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":63}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":76}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":34}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":19}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":24}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":49}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":40}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":6}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":54}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":70}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":24}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":74}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":67}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":55}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":62}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":20}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":51}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":5}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":27}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":46}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":48}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":29}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":35}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":67}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":22}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":24}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":64}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":7}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":12}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":54}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":54}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":46}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":46}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":52}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":46}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":45}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":51}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":66}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":45}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":76}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":73}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":83}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":80}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":36}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":44}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":36}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":4}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":65}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":64}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":55}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":79}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":85}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":76}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":4}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":66}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":40}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":48}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":48}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":21}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":4}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":62}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":40}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":44}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":44}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":21}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":4}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":49}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":48}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":53}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":53}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":55}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":10}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":103}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":10}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":86}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":44}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":42}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":12}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":74}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":33}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":15}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":81}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":57}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":17}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":85}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":16}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":17}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":29}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":56}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":44}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":37}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":19}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":14}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":79}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":61}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":91}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":21}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":51}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":103}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":69}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":19}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":82}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":48}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":50}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":23}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":21}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":54}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":103}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":74}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":19}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":85}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":51}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":56}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":23}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":18}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":91}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":41}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":23}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":35}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":59}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":79}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":80}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":21}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":90}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":31}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":25}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":17}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":18}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":16}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":50}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":36}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":16}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":84}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":110}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":59}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":107}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":77}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":24}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":55}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":24}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":22}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":84}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":110}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":83}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":80}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":22}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":22}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":84}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":102}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":67}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":80}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":22}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":22}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":84}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":102}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":65}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":80}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":22}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":22}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":17}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":16}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":84}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":110}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":59}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":99}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":70}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":24}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":51}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":24}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":22}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":84}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":110}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":83}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":87}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":22}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":22}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":84}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":102}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":66}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":87}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":22}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":22}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":84}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":102}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":65}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":87}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":22}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":22}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":17}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":16}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":78}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":26}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":107}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":51}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":20}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":25}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":87}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":57}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":20}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":42}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":107}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":77}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":20}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":61}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":44}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":97}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":24}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":34}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":33}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":51}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":44}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":48}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":39}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":95}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":23}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":97}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":22}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":59}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":43}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":20}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":24}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":59}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":43}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":78}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":95}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":20}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":26}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":35}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":70}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":76}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":42}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":54}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":22}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":74}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":51}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":71}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":70}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":22}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":20}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":28}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":42}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":22}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":152}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":152}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":23}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":22}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":148}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":148}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":23}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":23}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":35}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":34}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":75}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":72}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":35}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":31}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":40}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":20}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":28}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":36}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":16}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":80}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":110}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":16}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":14}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":12}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":10}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":1}}},"s":{"0":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"69":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"78":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"93":0,"94":0,"95":0,"96":0,"99":0,"100":0,"101":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"116":0,"117":0,"119":0,"120":0,"121":0,"122":0,"123":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"141":0,"142":0,"143":0,"144":0,"145":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"155":0,"156":0,"157":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"170":0,"171":0,"172":0,"175":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"196":0,"197":0,"198":0,"199":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"211":0,"212":0,"213":0,"214":0,"215":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"280":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"336":0,"337":0,"338":0,"339":0,"340":0,"342":0,"343":0,"344":0,"345":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"360":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"370":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":371,"column":-7203}},"locations":[{"start":{"line":1,"column":0},"end":{"line":371,"column":-7203}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":371,"column":-7203}},"loc":{"start":{"line":1,"column":0},"end":{"line":371,"column":-7203}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/AddExternalLinkModal.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/AddExternalLinkModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":84}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":39}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":31}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":27}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":54}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":53}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":50}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":57}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":74}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":76}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":66}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":4}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":76}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":58}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":19}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":49}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":40}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":6}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":54}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":70}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":16}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":38}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":53}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":57}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":28}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":77}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":7}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":21}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":6}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":22}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":70}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":16}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":6}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":30}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":28}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":6}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":5}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":38}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":53}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":65}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":28}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":78}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":55}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":61}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":7}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":21}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":6}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":22}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":70}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":16}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":6}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":30}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":28}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":6}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":5}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":72}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":37}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":15}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":113}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":44}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":88}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":15}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":7}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":36}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":53}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":15}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":7}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":31}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":29}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":38}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":30}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":57}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":8}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":33}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":5}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":4}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":40}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":29}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":31}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":28}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":31}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":38}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":5}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":4}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":48}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":23}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":19}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":23}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":35}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":13}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":5}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":22}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":34}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":13}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":5}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":68}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":58}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":13}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":5}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":18}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":24}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":22}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":72}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":6}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":20}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":34}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":12}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":34}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":5}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":4}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":73}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":41}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":10}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":8}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":85}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":23}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":10}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":104}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":44}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":105}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":51}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":81}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":53}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":145}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":50}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":18}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":61}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":61}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":17}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":16}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":17}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":29}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":74}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":37}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":19}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":14}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":64}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":21}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":104}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":21}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":18}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":15}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":80}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":18}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":25}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":26}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":55}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":35}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":28}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":156}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":14}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":16}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":15}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":79}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":18}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":25}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":25}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":54}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":47}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":156}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":14}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":16}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":37}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":73}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":92}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":70}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":71}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":22}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":36}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":29}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":95}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":36}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":45}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":18}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":55}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":59}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":194}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":27}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":35}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":54}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":87}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":48}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":52}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":29}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":24}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":25}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":33}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":39}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":29}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":65}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":50}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":27}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":20}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":53}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":18}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":18}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":32}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":19}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":99}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":62}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":20}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":16}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":43}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":19}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":27}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":33}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":31}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":32}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":13}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":21}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":19}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":27}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":34}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":32}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":28}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":60}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":44}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":42}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":21}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":16}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":15}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":12}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":10}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":1}}},"s":{"0":0,"14":0,"15":0,"16":0,"17":0,"18":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"40":0,"41":0,"42":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"59":0,"60":0,"61":0,"63":0,"65":0,"66":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"81":0,"82":0,"83":0,"85":0,"86":0,"87":0,"88":0,"89":0,"92":0,"93":0,"94":0,"95":0,"97":0,"98":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"118":0,"119":0,"120":0,"122":0,"123":0,"124":0,"125":0,"127":0,"128":0,"129":0,"130":0,"133":0,"134":0,"135":0,"136":0,"138":0,"139":0,"140":0,"141":0,"142":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"151":0,"152":0,"154":0,"155":0,"156":0,"157":0,"159":0,"160":0,"161":0,"164":0,"165":0,"166":0,"167":0,"168":0,"170":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"181":0,"182":0,"183":0,"186":0,"187":0,"188":0,"189":0,"190":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"219":0,"220":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"242":0,"243":0,"244":0,"246":0,"247":0,"248":0,"249":0,"250":0,"252":0,"254":0,"256":0,"257":0,"259":0,"260":0,"263":0,"264":0,"265":0,"266":0,"267":0,"269":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"280":0,"281":0,"282":0,"283":0,"284":0,"286":0,"287":0,"289":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"298":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":299,"column":-3804}},"locations":[{"start":{"line":1,"column":0},"end":{"line":299,"column":-3804}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":299,"column":-3804}},"loc":{"start":{"line":1,"column":0},"end":{"line":299,"column":-3804}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/AddNotificationModal.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/AddNotificationModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":89}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":93}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":90}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":90}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":95}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":78}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":112}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":86}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":2}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":88}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":39}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":31}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":57}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":103}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":90}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":101}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":97}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":91}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":104}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":97}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":86}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":94}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":88}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":91}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":95}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":98}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":92}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":89}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":98}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":63}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":111}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":4}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":99}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":58}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":39}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":27}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":29}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":5}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":19}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":49}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":40}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":6}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":54}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":70}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":16}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":36}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":90}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":28}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":28}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":21}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":6}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":30}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":62}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":6}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":5}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":38}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":91}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":22}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":78}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":16}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":6}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":30}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":28}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":6}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":5}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":38}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":105}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":22}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":78}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":16}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":6}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":30}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":28}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":6}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":5}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":48}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":23}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":19}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":23}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":35}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":13}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":5}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":59}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":41}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":39}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":47}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":15}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":7}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":5}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":18}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":24}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":34}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":13}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":28}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":45}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":68}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":64}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":47}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":69}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":35}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":41}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":37}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":39}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":41}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":43}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":39}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":37}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":43}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":6}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":20}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":34}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":12}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":34}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":5}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":4}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":73}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":51}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":19}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":23}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":16}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":108}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":115}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":10}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":18}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":16}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":112}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":101}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":128}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":10}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":22}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":16}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":118}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":121}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":109}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":10}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":22}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":16}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":127}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":115}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":10}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":19}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":16}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":116}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":104}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":91}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":64}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":58}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":55}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":13}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":101}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":48}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":50}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":13}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":111}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":113}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":114}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":115}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":10}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":21}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":16}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":138}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":10}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":21}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":16}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":129}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":132}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":113}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":119}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":10}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":14}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":18}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":5}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":4}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":53}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":57}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":4}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":53}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":10}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":8}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":101}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":23}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":10}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":109}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":44}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":105}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":59}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":84}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":15}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":17}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":29}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":74}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":37}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":19}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":14}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":64}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":21}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":104}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":21}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":18}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":15}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":80}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":18}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":25}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":26}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":55}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":44}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":156}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":14}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":16}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":15}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":89}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":19}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":34}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":32}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":64}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":65}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":36}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":16}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":34}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":176}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":49}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":64}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":32}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":25}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":17}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":21}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":56}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":81}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":16}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":16}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":37}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":68}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":42}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":35}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":70}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":55}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":24}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":61}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":25}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":78}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":38}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":76}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":42}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":22}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":162}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":49}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":64}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":35}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":31}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":23}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":27}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":24}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":37}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":51}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":38}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":76}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":42}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":22}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":51}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":162}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":20}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":20}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":15}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":16}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":38}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":19}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":27}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":33}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":30}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":36}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":38}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":16}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":99}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":32}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":41}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":60}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":44}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":16}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":21}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":16}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":26}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":70}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":32}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":83}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":71}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":16}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":37}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":18}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":53}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":51}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":19}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":18}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":49}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":51}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":19}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":18}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":15}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":88}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":19}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":37}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":92}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":156}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":52}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":37}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":48}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":26}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":25}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":17}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":21}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":56}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":16}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":16}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":37}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":63}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":88}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":21}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":43}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":47}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":16}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":18}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":35}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":54}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":21}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":85}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":24}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":31}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":43}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":72}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":162}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":20}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":22}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":21}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":83}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":24}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":31}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":41}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":70}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":162}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":20}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":22}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":20}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":16}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":37}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":63}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":19}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":74}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":106}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":20}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":21}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":44}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":48}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":16}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":18}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":36}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":19}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":92}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":22}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":29}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":41}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":70}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":160}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":18}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":60}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":20}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":20}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":16}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":37}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":74}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":68}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":98}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":54}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":67}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":67}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":78}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":22}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":67}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":70}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":84}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":22}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":67}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":68}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":80}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":22}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":67}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":69}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":82}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":22}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":78}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":23}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":72}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":89}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":24}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":84}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":22}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":20}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":18}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":68}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":100}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":54}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":67}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":69}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":86}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":22}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":67}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":67}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":82}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":22}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":67}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":74}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":80}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":22}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":67}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":73}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":86}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":22}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":20}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":18}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":16}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":43}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":19}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":27}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":33}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":31}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":32}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":13}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":21}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":19}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":27}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":34}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":32}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":28}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":60}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":44}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":42}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":21}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":16}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":15}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":12}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":10}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":1}}},"s":{"0":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"23":0,"24":0,"25":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"35":0,"36":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"50":0,"51":0,"52":0,"54":0,"55":0,"58":0,"59":0,"60":0,"61":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"108":0,"109":0,"110":0,"112":0,"113":0,"114":0,"115":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"135":0,"136":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"156":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"217":0,"218":0,"219":0,"221":0,"223":0,"224":0,"225":0,"226":0,"228":0,"229":0,"230":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"241":0,"242":0,"243":0,"246":0,"247":0,"248":0,"249":0,"250":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"324":0,"325":0,"326":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"340":0,"341":0,"343":0,"344":0,"346":0,"347":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"362":0,"363":0,"364":0,"365":0,"367":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"387":0,"388":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"421":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"446":0,"447":0,"449":0,"452":0,"453":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"518":0,"519":0,"520":0,"521":0,"522":0,"524":0,"525":0,"527":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"536":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":537,"column":-7713}},"locations":[{"start":{"line":1,"column":0},"end":{"line":537,"column":-7713}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":537,"column":-7713}},"loc":{"start":{"line":1,"column":0},"end":{"line":537,"column":-7713}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/AddSmartPlugModal.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/AddSmartPlugModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":78}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":39}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":27}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":53}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":69}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":65}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":65}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":86}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":134}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":58}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":97}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":105}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":102}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":90}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":93}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":96}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":39}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":27}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":29}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":5}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":44}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":30}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":31}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":5}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":19}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":49}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":40}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":6}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":54}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":70}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":16}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":36}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":97}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":28}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":28}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":21}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":40}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":36}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":7}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":6}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":30}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":26}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":28}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":6}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":5}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":38}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":69}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":22}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":67}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":16}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":6}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":30}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":28}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":6}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":5}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":38}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":79}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":22}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":67}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":16}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":6}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":30}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":28}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":6}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":5}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":51}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":92}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":20}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":5}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":48}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":23}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":19}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":23}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":35}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":13}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":5}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":28}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":41}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":13}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":5}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":18}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":24}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":35}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":40}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":40}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":28}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":45}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":75}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":72}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":40}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":47}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":49}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":6}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":20}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":34}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":12}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":34}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":5}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":4}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":73}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":10}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":8}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":85}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":23}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":10}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":104}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":44}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":105}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":59}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":62}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":15}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":17}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":29}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":74}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":37}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":19}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":14}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":64}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":21}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":104}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":21}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":18}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":15}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":86}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":40}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":20}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":27}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":33}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":34}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":47}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":38}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":18}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":43}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":158}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":16}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":21}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":29}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":35}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":53}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":70}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":43}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":62}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":46}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":18}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":23}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":18}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":16}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":26}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":70}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":32}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":83}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":71}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":16}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":37}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":18}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":53}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":23}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":61}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":54}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":88}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":47}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":24}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":24}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":19}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":18}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":49}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":48}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":19}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":18}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":15}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":80}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":18}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":25}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":26}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":55}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":44}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":156}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":14}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":16}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":50}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":17}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":84}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":20}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":27}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":32}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":61}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":35}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":158}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":16}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":18}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":17}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":84}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":20}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":31}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":32}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":61}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":38}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":158}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":16}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":18}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":16}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":55}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":14}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":15}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":89}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":19}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":37}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":92}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":156}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":72}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":46}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":48}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":26}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":25}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":17}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":21}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":56}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":16}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":16}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":68}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":68}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":55}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":61}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":76}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":20}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":82}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":22}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":33}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":45}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":74}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":42}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":18}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":351}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":22}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":18}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":35}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":41}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":56}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":23}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":100}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":26}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":35}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":44}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":73}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":44}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":29}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":32}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":164}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":22}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":24}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":23}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":100}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":26}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":35}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":43}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":72}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":43}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":29}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":32}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":164}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":22}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":24}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":22}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":55}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":20}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":20}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":16}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":68}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":68}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":55}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":62}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":78}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":20}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":82}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":22}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":33}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":43}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":72}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":42}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":18}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":351}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":22}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":18}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":33}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":41}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":56}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":23}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":92}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":26}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":33}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":44}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":73}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":164}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":22}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":24}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":23}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":93}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":26}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":33}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":45}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":74}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":164}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":22}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":24}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":22}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":55}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":20}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":20}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":16}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":43}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":19}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":27}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":33}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":31}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":32}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":13}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":21}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":19}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":27}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":34}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":32}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":28}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":60}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":44}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":42}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":21}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":16}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":15}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":12}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":10}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":1}}},"s":{"0":0,"12":0,"13":0,"14":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"25":0,"26":0,"27":0,"30":0,"31":0,"32":0,"35":0,"36":0,"37":0,"38":0,"41":0,"42":0,"43":0,"44":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"56":0,"57":0,"58":0,"59":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"97":0,"98":0,"99":0,"100":0,"102":0,"103":0,"104":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"122":0,"123":0,"124":0,"126":0,"127":0,"128":0,"129":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"138":0,"140":0,"141":0,"142":0,"143":0,"145":0,"146":0,"147":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"158":0,"159":0,"160":0,"163":0,"164":0,"165":0,"166":0,"167":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"190":0,"191":0,"193":0,"194":0,"196":0,"197":0,"198":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"219":0,"220":0,"221":0,"222":0,"224":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"264":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"283":0,"284":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"333":0,"334":0,"336":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"379":0,"380":0,"382":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"393":0,"394":0,"395":0,"396":0,"397":0,"399":0,"400":0,"402":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"411":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":412,"column":-7968}},"locations":[{"start":{"line":1,"column":0},"end":{"line":412,"column":-7968}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":412,"column":-7968}},"loc":{"start":{"line":1,"column":0},"end":{"line":412,"column":-7968}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/AddToQueueModal.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/AddToQueueModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":92}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":39}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":35}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":66}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":81}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":57}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":78}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":58}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":39}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":27}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":37}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":5}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":19}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":47}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":35}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":5}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":28}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":19}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":49}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":40}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":6}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":54}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":70}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":16}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":35}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":69}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":22}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":61}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":40}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":16}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":6}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":32}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":68}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":6}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":5}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":48}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":23}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":21}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":52}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":13}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":5}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":40}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":28}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":28}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":55}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":35}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":6}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":56}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":66}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":5}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":29}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":4}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":32}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":27}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":41}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":42}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":4}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":10}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":8}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":85}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":23}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":77}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":37}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":101}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":53}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":63}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":82}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":18}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":19}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":31}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":76}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":39}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":21}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":16}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":66}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":17}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":85}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":78}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":18}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":17}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":83}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":41}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":78}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":53}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":22}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":23}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":160}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":41}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":96}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":26}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":61}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":41}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":69}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":21}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":25}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":18}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":17}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":89}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":42}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":23}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":31}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":132}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":43}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":70}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":99}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":21}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":57}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":47}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":25}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":23}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":31}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":132}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":48}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":70}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":99}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":21}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":62}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":50}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":25}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":20}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":18}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":46}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":19}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":89}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":22}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":39}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":160}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":39}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":68}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":40}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":26}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":18}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":20}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":53}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":20}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":31}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":36}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":48}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":77}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":116}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":16}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":83}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":22}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":18}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":53}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":20}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":31}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":33}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":38}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":67}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":116}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":16}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":104}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":49}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":22}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":18}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":51}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":38}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":68}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":142}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":16}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":45}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":93}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":23}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":21}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":29}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":34}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":88}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":70}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":23}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":18}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":17}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":22}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":13}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":10}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":1}}},"s":{"0":0,"15":0,"16":0,"17":0,"19":0,"20":0,"21":0,"22":0,"23":0,"25":0,"26":0,"27":0,"28":0,"31":0,"32":0,"33":0,"34":0,"35":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"72":0,"73":0,"74":0,"76":0,"77":0,"80":0,"81":0,"82":0,"83":0,"84":0,"86":0,"87":0,"88":0,"89":0,"91":0,"92":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"103":0,"104":0,"105":0,"108":0,"110":0,"111":0,"112":0,"113":0,"116":0,"117":0,"118":0,"119":0,"120":0,"122":0,"124":0,"125":0,"126":0,"127":0,"128":0,"130":0,"131":0,"132":0,"133":0,"134":0,"136":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"151":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"163":0,"165":0,"166":0,"167":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"195":0,"196":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"210":0,"211":0,"214":0,"215":0,"216":0,"217":0,"218":0,"221":0,"222":0,"224":0,"225":0,"226":0,"227":0,"228":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"238":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":239,"column":-4407}},"locations":[{"start":{"line":1,"column":0},"end":{"line":239,"column":-4407}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":239,"column":-4407}},"loc":{"start":{"line":1,"column":0},"end":{"line":239,"column":-4407}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/BackupModal.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/BackupModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":45}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":3}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":19}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":43}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":33}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":43}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":18}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":55}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":4}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":3}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":24}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":48}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":43}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":39}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":18}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":49}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":4}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":3}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":20}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":44}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":43}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":43}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":18}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":44}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":4}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":3}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":22}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":45}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":32}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":39}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":18}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":47}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":4}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":3}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":19}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":43}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":29}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":42}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":19}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":56}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":4}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":3}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":20}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":44}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":39}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":42}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":19}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":44}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":4}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":3}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":22}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":46}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":38}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":41}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":19}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":48}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":4}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":3}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":19}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":43}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":35}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":42}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":19}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":68}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":4}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":2}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":70}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":33}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":75}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":48}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":40}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":36}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":7}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":19}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":5}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":70}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":56}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":19}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":49}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":40}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":6}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":54}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":70}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":16}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":42}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":58}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":4}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":27}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":44}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":40}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":25}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":7}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":21}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":4}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":28}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":45}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":40}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":27}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":7}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":22}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":4}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":71}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":36}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":25}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":9}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":93}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":15}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":28}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":5}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":4}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":10}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":8}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":85}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":49}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":95}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":37}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":101}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":53}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":83}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":48}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":20}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":19}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":65}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":78}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":21}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":55}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":92}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":20}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":20}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":18}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":19}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":31}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":87}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":39}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":21}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":16}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":48}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":19}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":33}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":36}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":124}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":69}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":21}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":54}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":19}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":34}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":36}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":114}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":71}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":21}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":16}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":128}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":50}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":20}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":33}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":102}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":39}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":70}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":92}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":19}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":22}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":33}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":49}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":62}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":40}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":137}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":18}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":101}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":33}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":22}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":40}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":66}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":83}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":24}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":87}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":22}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":22}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":15}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":16}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":33}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":99}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":62}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":84}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":86}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":80}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":193}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":22}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":20}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":18}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":33}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":102}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":65}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":56}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":103}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":23}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":90}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":98}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":24}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":22}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":88}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":20}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":38}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":95}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":66}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":115}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":75}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":27}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":24}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":22}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":18}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":101}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":54}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":42}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":37}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":69}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":17}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":19}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":40}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":83}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":64}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":23}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":21}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":38}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":61}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":130}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":32}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":20}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":69}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":77}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":21}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":20}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":57}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":68}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":21}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":23}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":18}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":16}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":22}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":13}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":10}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":1}}},"s":{"0":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"109":0,"110":0,"111":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"129":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"140":0,"141":0,"142":0,"143":0,"145":0,"146":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"166":0,"167":0,"168":0,"171":0,"172":0,"173":0,"174":0,"175":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"185":0,"186":0,"187":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"252":0,"253":0,"254":0,"256":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"276":0,"277":0,"278":0,"279":0,"280":0,"282":0,"283":0,"284":0,"285":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"294":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":295,"column":-5166}},"locations":[{"start":{"line":1,"column":0},"end":{"line":295,"column":-5166}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":295,"column":-5166}},"loc":{"start":{"line":1,"column":0},"end":{"line":295,"column":-5166}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/BatchTagModal.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/BatchTagModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":91}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":39}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":35}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":43}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":75}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":60}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":19}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":49}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":40}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":6}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":54}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":70}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":16}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":40}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":29}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":49}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":27}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":37}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":13}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":51}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":109}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":32}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":31}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":67}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":18}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":68}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":11}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":68}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":25}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":23}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":64}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":110}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":9}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":7}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":60}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":6}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":43}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":64}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":185}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":16}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":6}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":32}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":67}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":6}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":5}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":38}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":31}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":33}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":26}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":25}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":14}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":22}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":7}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":18}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":7}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":4}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":27}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":60}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":67}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":20}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":5}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":4}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":53}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":28}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":25}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":18}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":5}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":4}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":10}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":89}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":40}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":37}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":101}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":53}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":58}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":63}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":61}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":19}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":18}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":19}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":31}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":76}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":39}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":21}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":16}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":41}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":51}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":133}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":16}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":40}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":21}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":25}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":66}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":46}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":15}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":23}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":21}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":25}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":69}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":49}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":15}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":23}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":18}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":32}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":42}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":22}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":29}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":48}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":168}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":32}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":61}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":43}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":18}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":100}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":46}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":25}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":20}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":41}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":19}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":78}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":54}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":46}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":27}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":31}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":52}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":80}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":45}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":55}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":94}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":25}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":27}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":29}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":21}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":22}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":20}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":39}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":19}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":60}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":62}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":20}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":54}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":58}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":25}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":31}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":86}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":104}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":25}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":27}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":90}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":49}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":31}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":27}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":21}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":22}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":20}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":16}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":78}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":77}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":21}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":19}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":55}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":78}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":32}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":45}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":18}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":62}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":19}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":18}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":45}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":63}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":19}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":21}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":16}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":22}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":13}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":10}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":1}}},"s":{"0":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"30":0,"31":0,"32":0,"33":0,"36":0,"37":0,"38":0,"39":0,"41":0,"42":0,"44":0,"45":0,"47":0,"48":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"95":0,"96":0,"97":0,"98":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"111":0,"112":0,"113":0,"116":0,"117":0,"118":0,"119":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"136":0,"137":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"171":0,"172":0,"173":0,"174":0,"175":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"201":0,"204":0,"205":0,"207":0,"208":0,"209":0,"210":0,"211":0,"213":0,"214":0,"215":0,"217":0,"219":0,"220":0,"221":0,"222":0,"224":0,"225":0,"226":0,"227":0,"228":0,"230":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":231,"column":-3098}},"locations":[{"start":{"line":1,"column":0},"end":{"line":231,"column":-3098}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":231,"column":-3098}},"loc":{"start":{"line":1,"column":0},"end":{"line":231,"column":-3098}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/Button.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/Button.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":61}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":24}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":22}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":14}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":17}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":11}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":10}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":17}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":20}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":216}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":20}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":91}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":14}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":89}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":72}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":10}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":91}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":4}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":17}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":62}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":58}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":60}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":4}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":10}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":11}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":82}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":16}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":16}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":13}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":1}}},"s":{"0":1,"8":1,"9":107,"10":107,"11":107,"12":107,"13":107,"14":107,"15":107,"16":107,"18":107,"19":107,"20":107,"21":107,"22":107,"23":107,"24":107,"25":107,"27":107,"28":107,"29":107,"30":107,"31":107,"33":107,"34":107,"35":107,"36":107,"38":107,"39":107,"41":107},"branchMap":{"0":{"type":"branch","line":9,"loc":{"start":{"line":9,"column":7},"end":{"line":42,"column":1}},"locations":[{"start":{"line":9,"column":7},"end":{"line":42,"column":1}}]}},"b":{"0":[107]},"fnMap":{"0":{"name":"Button","decl":{"start":{"line":9,"column":7},"end":{"line":42,"column":1}},"loc":{"start":{"line":9,"column":7},"end":{"line":42,"column":1}},"line":9}},"f":{"0":107}} -,"/opt/claude/projects/bambuddy/frontend/src/components/CalendarView.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/CalendarView.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":42}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":62}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":48}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":1}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":66}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":43}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":1}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":21}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":57}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":66}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":2}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":68}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":79}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":27}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":69}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":70}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":72}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":40}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":45}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":33}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":72}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":133}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":42}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":29}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":29}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":7}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":15}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":17}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":64}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":65}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":27}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":29}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":26}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":38}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":12}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":40}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":5}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":4}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":27}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":30}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":25}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":38}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":12}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":40}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":5}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":4}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":27}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":38}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":40}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":4}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":45}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":38}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":28}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":3}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":48}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":27}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":3}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":86}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":10}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":53}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":30}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":64}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":17}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":31}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":85}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":63}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":19}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":51}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":61}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":55}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":17}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":19}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":33}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":149}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":13}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":21}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":16}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":17}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":31}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":85}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":64}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":19}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":14}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":53}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":33}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":80}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":19}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":18}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":13}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":14}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":48}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":45}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":31}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":78}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":13}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":122}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":66}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":55}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":128}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":56}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":90}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":86}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":20}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":21}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":25}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":76}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":128}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":28}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":49}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":29}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":76}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":33}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":89}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":71}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":19}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":108}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":23}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":23}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":33}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":103}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":60}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":59}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":38}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":41}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":41}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":40}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":26}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":85}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":24}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":23}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":13}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":14}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":71}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":62}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":17}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":61}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":39}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":69}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":90}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":26}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":20}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":78}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":18}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":17}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":65}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":39}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":69}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":118}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":26}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":20}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":71}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":18}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":17}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":63}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":39}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":69}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":115}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":26}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":20}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":67}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":18}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":16}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":14}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":12}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":60}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":25}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":12}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":69}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":81}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":32}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":30}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":31}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":31}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":17}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":17}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":44}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":66}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":50}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":25}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":36}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":61}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":134}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":47}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":26}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":65}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":30}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":66}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":24}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":113}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":76}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":28}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":52}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":65}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":64}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":26}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":71}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":106}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":80}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":31}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":52}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":56}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":82}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":34}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":39}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":87}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":66}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":32}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":31}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":32}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":28}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":26}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":27}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":19}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":20}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":78}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":13}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":44}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":81}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":16}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":12}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":10}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":1}}},"s":{"0":0,"10":0,"11":0,"12":0,"14":0,"15":0,"16":0,"18":0,"19":0,"20":0,"21":0,"23":0,"25":0,"26":0,"27":0,"28":0,"29":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"44":0,"45":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"65":0,"66":0,"67":0,"68":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"79":0,"81":0,"82":0,"84":0,"86":0,"87":0,"88":0,"89":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"102":0,"103":0,"104":0,"105":0,"106":0,"108":0,"109":0,"110":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"122":0,"123":0,"124":0,"125":0,"126":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"165":0,"167":0,"168":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"231":0,"232":0,"233":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"254":0,"255":0,"256":0,"257":0,"258":0,"260":0,"262":0,"264":0,"265":0,"266":0,"268":0,"269":0,"271":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":272,"column":-4182}},"locations":[{"start":{"line":1,"column":0},"end":{"line":272,"column":-4182}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":272,"column":-4182}},"loc":{"start":{"line":1,"column":0},"end":{"line":272,"column":-4182}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/Card.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/Card.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":51}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":87}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":10}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":8}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":101}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":23}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":35}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":16}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":10}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":1}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":69}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":10}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":82}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":16}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":10}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":1}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":70}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":62}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":1}}},"s":{"0":1,"9":1,"10":46,"11":46,"12":46,"13":46,"14":46,"16":46,"17":46,"19":46,"21":1,"22":4,"23":4,"24":4,"25":4,"27":4,"29":1,"30":44,"31":44},"branchMap":{"0":{"type":"branch","line":10,"loc":{"start":{"line":10,"column":7},"end":{"line":20,"column":1}},"locations":[{"start":{"line":10,"column":7},"end":{"line":20,"column":1}}]},"1":{"type":"branch","line":22,"loc":{"start":{"line":22,"column":7},"end":{"line":28,"column":1}},"locations":[{"start":{"line":22,"column":7},"end":{"line":28,"column":1}}]},"2":{"type":"branch","line":30,"loc":{"start":{"line":30,"column":7},"end":{"line":32,"column":1}},"locations":[{"start":{"line":30,"column":7},"end":{"line":32,"column":1}}]}},"b":{"0":[46],"1":[4],"2":[44]},"fnMap":{"0":{"name":"Card","decl":{"start":{"line":10,"column":7},"end":{"line":20,"column":1}},"loc":{"start":{"line":10,"column":7},"end":{"line":20,"column":1}},"line":10},"1":{"name":"CardHeader","decl":{"start":{"line":22,"column":7},"end":{"line":28,"column":1}},"loc":{"start":{"line":22,"column":7},"end":{"line":28,"column":1}},"line":22},"2":{"name":"CardContent","decl":{"start":{"line":30,"column":7},"end":{"line":32,"column":1}},"loc":{"start":{"line":30,"column":7},"end":{"line":32,"column":1}},"line":30}},"f":{"0":46,"1":4,"2":44}} -,"/opt/claude/projects/bambuddy/frontend/src/components/CompareArchivesModal.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/CompareArchivesModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":34}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":90}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":19}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":49}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":40}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":6}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":54}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":70}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":16}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":59}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":49}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":51}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":5}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":10}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":107}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":173}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":99}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":59}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":50}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":15}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":17}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":29}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":60}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":37}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":19}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":14}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":74}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":24}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":68}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":75}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":18}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":23}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":60}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":77}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":46}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":58}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":74}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":18}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":18}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":28}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":57}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":19}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":14}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":65}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":75}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":19}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":14}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":12}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":10}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":1}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":79}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":10}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":31}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":39}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":34}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":17}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":16}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":100}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":19}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":53}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":19}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":34}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":83}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":96}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":40}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":24}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":45}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":73}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":84}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":22}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":36}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":24}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":21}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":17}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":17}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":18}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":59}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":51}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":17}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":33}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":73}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":50}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":59}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":46}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":89}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":99}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":35}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":27}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":24}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":21}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":51}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":73}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":76}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":54}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":80}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":23}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":19}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":19}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":15}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":18}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":16}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":12}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":45}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":85}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":91}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":49}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":106}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":15}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":58}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":63}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":35}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":115}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":19}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":15}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":51}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":46}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":63}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":19}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":15}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":14}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":59}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":54}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":86}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":58}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":15}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":64}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":47}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":74}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":19}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":43}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":66}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":19}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":16}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":108}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":39}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":73}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":97}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":87}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":74}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":22}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":17}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":18}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":113}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":14}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":78}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":127}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":14}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":10}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":1}}},"s":{"0":0,"12":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"22":0,"23":0,"24":0,"25":0,"27":0,"28":0,"29":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"39":0,"40":0,"41":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"63":0,"64":0,"66":0,"67":0,"68":0,"69":0,"71":0,"73":0,"74":0,"75":0,"77":0,"78":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"108":0,"109":0,"110":0,"111":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"150":0,"151":0,"155":0,"156":0,"157":0,"158":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"179":0,"181":0,"183":0,"184":0,"185":0,"187":0,"189":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":190,"column":-4385}},"locations":[{"start":{"line":1,"column":0},"end":{"line":190,"column":-4385}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":190,"column":-4385}},"loc":{"start":{"line":1,"column":0},"end":{"line":190,"column":-4385}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/ConfirmModal.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/ConfirmModal.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":34}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":30}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":8}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":10}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":26}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":24}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":22}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":12}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":11}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":23}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":19}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":49}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":41}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":6}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":54}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":70}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":17}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":25}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":13}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":27}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":44}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":6}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":14}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":30}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":50}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":6}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":14}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":31}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":57}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":6}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":4}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":40}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":10}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":8}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":85}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":24}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":95}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":37}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":50}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":77}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":51}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":18}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":36}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":80}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":66}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":18}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":16}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":43}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":78}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":26}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":21}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":19}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":33}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":51}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":27}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":21}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":16}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":22}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":13}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":10}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":1}}},"s":{"0":1,"15":1,"16":13,"17":13,"18":13,"19":13,"20":13,"21":13,"22":13,"23":13,"25":13,"26":13,"27":1,"28":1,"29":13,"30":13,"31":13,"33":13,"34":13,"35":13,"36":13,"37":13,"38":13,"39":13,"40":13,"41":13,"42":13,"43":13,"44":13,"45":13,"46":13,"48":13,"50":13,"51":13,"52":13,"53":13,"55":13,"56":13,"57":13,"58":13,"59":13,"60":13,"61":13,"62":13,"63":13,"64":13,"65":13,"66":13,"67":13,"68":13,"69":13,"70":13,"71":13,"72":13,"74":13,"75":13,"76":13,"77":13,"78":13,"79":13,"81":13},"branchMap":{"0":{"type":"branch","line":16,"loc":{"start":{"line":16,"column":7},"end":{"line":82,"column":1}},"locations":[{"start":{"line":16,"column":7},"end":{"line":82,"column":1}}]},"1":{"type":"branch","line":26,"loc":{"start":{"line":26,"column":12},"end":{"line":32,"column":5}},"locations":[{"start":{"line":26,"column":12},"end":{"line":32,"column":5}}]},"2":{"type":"branch","line":27,"loc":{"start":{"line":27,"column":26},"end":{"line":29,"column":6}},"locations":[{"start":{"line":27,"column":26},"end":{"line":29,"column":6}}]},"3":{"type":"branch","line":31,"loc":{"start":{"line":31,"column":11},"end":{"line":31,"column":70}},"locations":[{"start":{"line":31,"column":11},"end":{"line":31,"column":70}}]},"4":{"type":"branch","line":56,"loc":{"start":{"line":56,"column":49},"end":{"line":56,"column":95}},"locations":[{"start":{"line":56,"column":49},"end":{"line":56,"column":95}}]}},"b":{"0":[13],"1":[13],"2":[1],"3":[13],"4":[3]},"fnMap":{"0":{"name":"ConfirmModal","decl":{"start":{"line":16,"column":7},"end":{"line":82,"column":1}},"loc":{"start":{"line":16,"column":7},"end":{"line":82,"column":1}},"line":16},"1":{"name":"handleKeyDown","decl":{"start":{"line":27,"column":26},"end":{"line":29,"column":6}},"loc":{"start":{"line":27,"column":26},"end":{"line":29,"column":6}},"line":27},"2":{"name":"onClick","decl":{"start":{"line":56,"column":49},"end":{"line":56,"column":95}},"loc":{"start":{"line":56,"column":49},"end":{"line":56,"column":95}},"line":56}},"f":{"0":13,"1":1,"2":3}} -,"/opt/claude/projects/bambuddy/frontend/src/components/ContextMenu.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/ContextMenu.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":73}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":47}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":74}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":56}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":19}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":51}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":75}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":18}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":7}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":6}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":48}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":31}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":18}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":7}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":6}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":32}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":16}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":6}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":63}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":55}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":60}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":18}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":68}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":60}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":65}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":38}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":48}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":7}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":6}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":16}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":19}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":26}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":59}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":46}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":48}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":24}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":24}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":43}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":51}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":7}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":45}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":53}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":7}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":52}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":51}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":5}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":13}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":54}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":36}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":46}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":39}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":5}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":28}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":4}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":41}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":57}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":29}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":12}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":4}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":10}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":8}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":19}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":126}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":33}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":35}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":27}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":90}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":9}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":67}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":16}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":14}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":23}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":32}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":77}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":72}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":19}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":30}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":33}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":75}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":44}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":33}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":28}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":17}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":16}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":38}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":105}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":29}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":56}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":31}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":54}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":61}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":90}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":120}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":58}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":82}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":21}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":55}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":18}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":208}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":37}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":50}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":60}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":53}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":19}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":18}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":62}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":59}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":25}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":34}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":36}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":46}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":42}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":34}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":23}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":22}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":47}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":111}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":38}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":62}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":40}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":60}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":67}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":23}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":132}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":35}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":27}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":19}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":20}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":16}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":9}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":10}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":1}}},"s":{"0":0,"20":0,"21":0,"22":0,"23":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"32":0,"33":0,"34":0,"35":0,"36":0,"38":0,"39":0,"40":0,"42":0,"43":0,"44":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"57":0,"58":0,"59":0,"60":0,"61":0,"63":0,"64":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"73":0,"74":0,"75":0,"76":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"86":0,"87":0,"88":0,"89":0,"90":0,"92":0,"93":0,"94":0,"95":0,"96":0,"98":0,"99":0,"100":0,"101":0,"103":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"112":0,"113":0,"114":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"131":0,"132":0,"133":0,"134":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"165":0,"166":0,"167":0,"168":0,"169":0,"171":0,"173":0,"174":0,"176":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":177,"column":-1436}},"locations":[{"start":{"line":1,"column":0},"end":{"line":177,"column":-1436}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":177,"column":-1436}},"loc":{"start":{"line":1,"column":0},"end":{"line":177,"column":-1436}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/Dashboard.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/Dashboard.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":60}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":25}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":5}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":8}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":11}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":11}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":7}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":21}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":15}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":4}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":4}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":9}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":15}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":14}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":15}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":14}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":15}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":15}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":26}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":17}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":49}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":15}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":34}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":4}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":28}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":10}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":8}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":22}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":14}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":17}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":35}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":8}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":105}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":61}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":9}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":120}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":49}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":17}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":27}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":26}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":117}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":35}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":78}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":19}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":69}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":14}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":49}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":17}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":34}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":82}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":96}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":27}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":80}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":80}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":19}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":17}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":40}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":82}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":31}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":75}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":19}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":14}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":12}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":43}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":10}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":1}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":118}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":33}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":48}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":28}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":39}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":7}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":17}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":4}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":59}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":51}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":16}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":11}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":41}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":28}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":43}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":9}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":22}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":15}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":7}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":5}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":12}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":38}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":81}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":31}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":6}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":5}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":64}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":19}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":61}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":27}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":19}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":44}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":73}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":32}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":28}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":16}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":46}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":10}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":5}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":30}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":29}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":30}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":29}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":20}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":8}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":7}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":31}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":52}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":6}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":4}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":50}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":35}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":40}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":27}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":65}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":63}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":16}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":18}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":59}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":10}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":9}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":5}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":4}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":44}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":26}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":14}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":38}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":45}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":31}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":8}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":4}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":38}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":25}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":46}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":73}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":14}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":16}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":16}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":24}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":38}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":10}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":8}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":7}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":4}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":29}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":27}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":38}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":81}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":31}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":6}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":29}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":22}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":4}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":37}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":50}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":42}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":85}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":83}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":10}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":31}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":25}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":61}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":40}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":19}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":33}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":23}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":66}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":41}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":43}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":21}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":70}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":45}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":19}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":14}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":55}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":88}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":89}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":48}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":44}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":21}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":31}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":59}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":158}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":43}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":30}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":23}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":15}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":16}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":14}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":17}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":25}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":42}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":33}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":96}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":14}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":34}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":20}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":72}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":14}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":45}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":29}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":31}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":30}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":36}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":60}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":51}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":70}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":58}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":34}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":31}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":15}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":16}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":26}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":19}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":39}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":59}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":40}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":57}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":19}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":14}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":10}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":1}}},"s":{"0":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"69":0,"70":0,"71":0,"72":0,"73":0,"75":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"107":0,"108":0,"110":0,"112":0,"113":0,"114":0,"115":0,"116":0,"118":0,"119":0,"120":0,"121":0,"123":0,"124":0,"126":0,"128":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"138":0,"140":0,"141":0,"142":0,"143":0,"145":0,"146":0,"147":0,"148":0,"149":0,"151":0,"152":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"161":0,"164":0,"165":0,"166":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"191":0,"192":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"215":0,"216":0,"217":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"241":0,"242":0,"243":0,"245":0,"246":0,"248":0,"249":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"259":0,"260":0,"261":0,"263":0,"264":0,"266":0,"267":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"290":0,"291":0,"292":0,"293":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"319":0,"320":0,"321":0,"322":0,"324":0,"325":0,"327":0,"329":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":330,"column":-3079}},"locations":[{"start":{"line":1,"column":0},"end":{"line":330,"column":-3079}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":330,"column":-3079}},"loc":{"start":{"line":1,"column":0},"end":{"line":330,"column":-3079}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/EditArchiveModal.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/EditArchiveModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":25}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":21}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":25}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":16}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":19}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":20}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":12}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":14}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":20}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":18}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":19}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":10}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":2}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":98}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":19}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":49}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":40}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":6}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":54}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":70}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":16}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":39}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":71}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":80}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":88}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":58}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":55}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":83}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":71}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":62}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":70}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":53}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":55}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":53}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":39}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":27}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":29}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":5}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":39}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":27}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":37}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":5}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":39}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":27}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":55}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":39}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":5}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":41}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":18}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":18}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":97}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":16}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":73}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":71}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":35}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":37}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":55}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":23}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":5}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":42}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":43}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":5}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":33}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":4}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":46}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":74}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":21}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":4}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":38}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":66}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":42}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":22}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":64}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":64}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":16}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":6}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":5}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":79}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":37}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":22}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":28}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":9}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":68}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":31}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":64}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":21}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":54}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":15}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":31}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":34}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":41}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":7}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":5}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":4}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":57}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":9}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":72}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":37}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":64}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":21}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":54}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":5}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":4}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":48}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":23}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":27}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":41}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":28}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":28}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":32}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":30}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":93}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":7}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":4}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":10}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":8}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":85}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":23}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":10}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":131}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":44}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":105}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":76}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":17}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":29}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":74}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":37}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":19}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":14}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":87}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":15}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":78}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":18}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":25}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":31}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":60}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":156}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":38}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":14}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":16}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":15}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":81}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":19}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":37}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":92}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":156}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":50}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":37}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":48}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":26}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":25}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":17}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":21}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":16}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":15}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":66}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":62}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":20}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":19}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":37}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":92}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":156}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":50}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":37}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":48}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":26}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":25}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":17}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":21}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":16}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":15}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":79}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":21}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":27}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":56}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":22}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":168}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":57}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":14}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":16}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":15}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":78}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":40}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":59}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":43}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":23}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":29}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":124}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":47}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":25}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":27}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":35}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":52}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":73}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":47}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":29}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":25}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":19}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":20}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":38}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":20}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":33}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":27}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":28}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":57}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":32}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":56}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":57}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":19}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":46}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":18}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":31}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":102}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":18}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":158}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":89}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":16}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":67}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":180}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":99}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":24}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":62}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":50}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":29}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":33}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":37}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":51}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":161}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":29}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":31}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":23}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":24}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":22}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":18}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":16}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":43}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":17}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":90}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":21}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":37}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":66}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":158}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":58}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":50}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":54}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":28}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":27}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":19}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":23}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":18}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":15}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":66}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":56}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":20}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":55}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":41}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":63}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":22}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":70}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":38}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":99}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":20}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":25}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":33}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":63}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":137}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":61}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":27}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":22}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":17}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":195}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":22}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":37}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":29}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":58}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":46}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":36}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":43}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":18}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":35}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":78}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":62}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":22}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":18}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":99}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":16}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":43}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":19}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":27}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":33}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":31}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":32}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":13}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":21}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":19}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":27}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":49}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":32}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":42}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":63}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":21}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":16}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":15}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":12}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":10}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":1}}},"s":{"0":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"27":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"50":0,"51":0,"52":0,"53":0,"55":0,"56":0,"57":0,"58":0,"61":0,"62":0,"63":0,"64":0,"65":0,"68":0,"69":0,"70":0,"71":0,"72":0,"75":0,"78":0,"81":0,"82":0,"83":0,"84":0,"85":0,"87":0,"88":0,"89":0,"90":0,"91":0,"94":0,"95":0,"96":0,"97":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"109":0,"110":0,"111":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"150":0,"151":0,"152":0,"153":0,"155":0,"156":0,"157":0,"160":0,"161":0,"162":0,"163":0,"164":0,"166":0,"167":0,"168":0,"171":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"202":0,"203":0,"204":0,"206":0,"207":0,"208":0,"209":0,"210":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"234":0,"235":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"251":0,"252":0,"253":0,"254":0,"255":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"277":0,"278":0,"279":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"290":0,"291":0,"292":0,"293":0,"294":0,"296":0,"297":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"319":0,"320":0,"321":0,"323":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"338":0,"339":0,"340":0,"341":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"355":0,"357":0,"358":0,"359":0,"360":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"371":0,"372":0,"373":0,"374":0,"375":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"385":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":386,"column":-6423}},"locations":[{"start":{"line":1,"column":0},"end":{"line":386,"column":-6423}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":386,"column":-6423}},"loc":{"start":{"line":1,"column":0},"end":{"line":386,"column":-6423}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/EditQueueItemModal.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/EditQueueItemModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":80}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":39}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":35}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":70}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":50}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":87}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":73}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":68}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":4}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":60}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":52}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":49}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":45}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":5}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":14}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":5}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":102}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":72}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":39}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":27}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":37}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":5}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":19}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":49}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":40}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":6}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":54}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":70}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":16}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":38}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":83}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":22}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":61}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":38}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":16}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":6}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":32}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":73}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":6}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":5}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":48}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":23}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":40}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":28}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":55}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":35}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":6}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":56}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":66}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":12}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":33}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":5}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":32}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":4}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":32}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":27}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":41}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":42}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":4}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":10}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":8}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":85}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":23}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":77}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":37}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":101}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":53}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":61}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":83}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":18}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":19}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":31}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":76}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":39}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":21}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":16}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":66}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":17}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":85}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":61}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":68}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":18}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":18}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":17}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":83}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":41}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":78}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":53}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":22}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":23}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":160}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":35}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":72}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":26}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":41}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":69}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":21}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":25}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":18}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":17}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":89}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":42}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":23}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":31}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":132}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":43}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":70}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":99}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":21}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":57}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":47}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":25}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":23}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":31}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":132}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":48}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":70}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":99}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":21}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":62}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":50}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":25}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":20}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":18}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":46}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":19}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":89}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":22}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":39}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":160}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":39}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":68}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":40}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":26}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":18}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":20}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":53}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":20}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":31}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":36}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":48}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":77}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":116}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":16}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":83}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":22}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":18}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":53}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":20}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":31}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":33}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":38}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":67}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":116}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":16}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":104}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":49}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":22}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":18}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":51}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":38}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":68}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":142}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":16}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":45}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":93}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":23}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":21}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":29}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":34}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":77}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":73}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":23}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":18}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":17}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":22}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":13}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":10}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":1}}},"s":{"0":0,"14":0,"15":0,"16":0,"18":0,"21":0,"22":0,"24":0,"25":0,"26":0,"27":0,"28":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"38":0,"39":0,"40":0,"41":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"64":0,"65":0,"67":0,"68":0,"69":0,"70":0,"71":0,"73":0,"74":0,"75":0,"76":0,"77":0,"79":0,"80":0,"83":0,"84":0,"85":0,"86":0,"87":0,"89":0,"90":0,"91":0,"92":0,"94":0,"95":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"106":0,"107":0,"108":0,"111":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"121":0,"122":0,"123":0,"124":0,"125":0,"127":0,"129":0,"130":0,"131":0,"132":0,"133":0,"135":0,"136":0,"137":0,"138":0,"140":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"155":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"167":0,"169":0,"170":0,"171":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"199":0,"200":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"214":0,"215":0,"218":0,"219":0,"220":0,"221":0,"222":0,"225":0,"226":0,"228":0,"229":0,"230":0,"231":0,"232":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"242":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":243,"column":-5219}},"locations":[{"start":{"line":1,"column":0},"end":{"line":243,"column":-5219}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":243,"column":-5219}},"loc":{"start":{"line":1,"column":0},"end":{"line":243,"column":-5219}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/ExternalLinksSettings.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/ExternalLinksSettings.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":33}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":41}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":39}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":58}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":76}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":78}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":66}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":47}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":33}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":34}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":5}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":38}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":59}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":22}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":70}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":6}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":5}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":39}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":65}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":22}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":70}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":6}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":5}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":63}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":21}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":42}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":4}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":50}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":23}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":39}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":4}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":64}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":23}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":71}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":46}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":55}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":53}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":58}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":35}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":35}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":45}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":35}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":23}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":4}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":48}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":26}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":4}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":31}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":23}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":45}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":28}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":5}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":4}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":10}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":6}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":12}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":20}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":61}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":53}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":60}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":81}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":18}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":68}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":42}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":21}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":16}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":21}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":21}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":54}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":14}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":24}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":54}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":75}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":18}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":43}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":39}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":36}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":54}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":24}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":22}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":33}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":29}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":68}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":47}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":58}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":139}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":63}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":23}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":112}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":91}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":50}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":26}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":52}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":63}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":92}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":94}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":28}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":96}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":26}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":75}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":29}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":60}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":130}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":36}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":54}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":31}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":29}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":58}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":59}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":143}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":38}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":54}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":31}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":26}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":24}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":17}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":18}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":62}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":67}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":49}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":68}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":18}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":22}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":13}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":41}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":29}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":28}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":26}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":35}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":33}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":12}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":10}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":24}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":21}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":29}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":107}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":30}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":29}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":26}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":35}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":48}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":10}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":7}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":1}}},"s":{"0":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"19":0,"20":0,"21":0,"22":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"40":0,"41":0,"42":0,"43":0,"45":0,"46":0,"47":0,"48":0,"50":0,"51":0,"52":0,"54":0,"55":0,"56":0,"58":0,"61":0,"62":0,"63":0,"65":0,"66":0,"67":0,"69":0,"70":0,"71":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"92":0,"93":0,"94":0,"95":0,"96":0,"98":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"144":0,"145":0,"146":0,"147":0,"149":0,"150":0,"152":0,"153":0,"154":0,"155":0,"156":0,"158":0,"159":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"184":0,"186":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":187,"column":-3417}},"locations":[{"start":{"line":1,"column":0},"end":{"line":187,"column":-3417}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":187,"column":-3417}},"loc":{"start":{"line":1,"column":0},"end":{"line":187,"column":-3417}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/FilamentTrends.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/FilamentTrends.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":42}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":104}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":47}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":25}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":18}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":14}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":63}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":15}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":64}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":15}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":64}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":16}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":65}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":15}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":25}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":3}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":1}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":83}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":63}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":42}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":46}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":87}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":28}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":35}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":104}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":41}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":72}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":51}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":90}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":60}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":41}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":27}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":33}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":7}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":39}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":51}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":18}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":13}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":100}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":10}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":25}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":36}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":68}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":104}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":41}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":72}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":39}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":56}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":56}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":90}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":60}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":41}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":27}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":33}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":7}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":39}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":51}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":18}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":21}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":113}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":13}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":10}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":47}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":42}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":46}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":41}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":54}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":37}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":26}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":72}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":54}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":9}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":7}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":40}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":67}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":41}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":25}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":43}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":27}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":91}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":34}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":75}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":78}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":98}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":50}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":59}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":47}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":9}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":19}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":24}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":102}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":71}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":37}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":9}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":5}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":18}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":17}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":87}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":99}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":80}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":10}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":31}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":57}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":83}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":65}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":80}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":19}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":25}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":49}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":75}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":35}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":47}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":54}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":17}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":65}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":21}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":13}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":14}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":12}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":46}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":54}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":68}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":96}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":86}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":14}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":54}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":64}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":91}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":85}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":14}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":54}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":66}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":55}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":40}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":68}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":19}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":14}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":49}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":115}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":14}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":14}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":12}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":31}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":54}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":87}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":57}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":40}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":20}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":79}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":75}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":74}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":33}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":21}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":70}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":20}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":35}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":32}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":39}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":43}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":16}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":20}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":32}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":39}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":54}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":16}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":22}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":31}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":45}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":46}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":38}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":18}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":46}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":83}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":16}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":19}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":31}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":34}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":32}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":31}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":31}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":42}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":16}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":24}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":32}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":14}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":82}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":14}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":61}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":54}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":88}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":42}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":53}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":60}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":26}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":22}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":43}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":28}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":28}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":36}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":36}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":36}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":35}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":57}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":89}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":23}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":24}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":26}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":35}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":49}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":50}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":42}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":22}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":73}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":20}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":27}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":36}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":64}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":57}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":86}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":91}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":26}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":86}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":26}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":68}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":82}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":24}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":86}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":87}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":26}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":19}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":20}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":18}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":88}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":18}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":14}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":54}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":90}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":57}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":47}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":70}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":80}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":95}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":22}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":31}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":45}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":46}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":38}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":18}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":61}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":113}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":88}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":18}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":16}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":24}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":97}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":23}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":32}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":14}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":12}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":10}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":1}}},"s":{"0":0,"25":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"43":0,"44":0,"47":0,"48":0,"49":0,"50":0,"53":0,"54":0,"56":0,"57":0,"58":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"76":0,"77":0,"79":0,"81":0,"82":0,"84":0,"85":0,"86":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"105":0,"106":0,"108":0,"109":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"118":0,"119":0,"120":0,"121":0,"124":0,"125":0,"126":0,"128":0,"129":0,"130":0,"131":0,"133":0,"134":0,"135":0,"136":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"146":0,"147":0,"149":0,"150":0,"151":0,"153":0,"154":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"169":0,"170":0,"171":0,"172":0,"173":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"245":0,"247":0,"251":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"296":0,"297":0,"298":0,"300":0,"302":0,"304":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"333":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":334,"column":-5248}},"locations":[{"start":{"line":1,"column":0},"end":{"line":334,"column":-5248}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":334,"column":-5248}},"loc":{"start":{"line":1,"column":0},"end":{"line":334,"column":-5248}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/FileManagerModal.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/FileManagerModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":48}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":32}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":17}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":40}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":54}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":74}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":1}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":51}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":33}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":42}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":16}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":33}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":3}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":35}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":31}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":1}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":62}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":33}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":60}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":16}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":15}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":21}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":17}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":22}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":15}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":15}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":18}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":15}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":15}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":16}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":19}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":12}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":18}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":3}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":1}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":94}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":35}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":39}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":54}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":72}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":53}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":72}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":19}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":49}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":40}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":6}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":54}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":70}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":16}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":49}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":55}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":63}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":5}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":42}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":44}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":52}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":45}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":5}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":38}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":73}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":29}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":53}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":79}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":28}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":6}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":32}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":60}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":6}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":5}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":46}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":25}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":26}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":4}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":28}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":36}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":57}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":16}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":63}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":26}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":4}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":44}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":74}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":4}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":42}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":26}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":4}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":21}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":33}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":39}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":40}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":47}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":4}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":10}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":8}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":85}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":23}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":10}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":148}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":44}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":113}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":53}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":64}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":19}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":82}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":72}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":20}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":18}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":53}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":101}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":81}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":54}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":82}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":88}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":71}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":54}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":82}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":22}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":21}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":33}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":78}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":41}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":23}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":18}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":16}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":120}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":35}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":19}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":28}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":30}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":43}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":35}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":16}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":77}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":40}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":47}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":77}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":17}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":25}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":21}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":13}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":36}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":36}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":101}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":18}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":25}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":43}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":33}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":62}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":169}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":14}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":16}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":17}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":31}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":21}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":37}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":32}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":82}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":19}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":14}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":95}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":19}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":34}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":44}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":114}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":49}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":21}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":76}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":16}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":60}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":26}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":70}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":77}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":20}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":40}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":65}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":20}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":41}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":32}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":35}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":95}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":19}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":35}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":69}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":68}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":56}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":20}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":34}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":79}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":66}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":28}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":26}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":39}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":110}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":36}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":78}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":60}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":27}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":40}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":50}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":56}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":34}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":75}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":27}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":26}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":33}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":62}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":86}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":29}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":26}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":87}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":48}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":68}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":55}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":33}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":47}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":88}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":28}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":21}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":20}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":16}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":130}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":51}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":24}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":152}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":51}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":16}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":38}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":19}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":33}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":38}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":74}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":46}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":21}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":19}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":33}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":66}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":72}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":57}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":43}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":60}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":46}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":16}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":21}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":16}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":14}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":12}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":24}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":21}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":29}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":87}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":30}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":26}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":28}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":48}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":34}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":12}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":48}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":10}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":10}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":1}}},"s":{"0":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"47":0,"48":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"85":0,"86":0,"87":0,"88":0,"90":0,"91":0,"92":0,"93":0,"94":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"108":0,"109":0,"110":0,"111":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"121":0,"122":0,"123":0,"125":0,"126":0,"127":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"137":0,"138":0,"139":0,"140":0,"142":0,"143":0,"144":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"157":0,"158":0,"159":0,"160":0,"162":0,"163":0,"165":0,"166":0,"168":0,"170":0,"171":0,"172":0,"174":0,"175":0,"176":0,"177":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"214":0,"215":0,"216":0,"219":0,"220":0,"221":0,"222":0,"223":0,"225":0,"226":0,"227":0,"228":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"239":0,"241":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"283":0,"284":0,"286":0,"288":0,"289":0,"291":0,"294":0,"295":0,"296":0,"297":0,"298":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"307":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"316":0,"317":0,"319":0,"320":0,"322":0,"323":0,"324":0,"325":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"341":0,"343":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":344,"column":-5784}},"locations":[{"start":{"line":1,"column":0},"end":{"line":344,"column":-5784}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":344,"column":-5784}},"loc":{"start":{"line":1,"column":0},"end":{"line":344,"column":-5784}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/GcodeViewer.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/GcodeViewer.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":119}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":52}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":55}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":47}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":58}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":52}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":54}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":52}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":19}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":35}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":37}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":26}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":13}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":31}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":32}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":28}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":31}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":30}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":33}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":19}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":26}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":28}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":7}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":33}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":21}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":19}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":24}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":19}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":31}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":27}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":40}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":65}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":50}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":33}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":44}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":13}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":11}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":51}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":9}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":31}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":8}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":22}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":36}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":51}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":31}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":32}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":25}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":26}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":8}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":21}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":30}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":26}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":9}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":32}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":33}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":66}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":34}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":36}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":25}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":7}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":6}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":19}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":52}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":18}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":57}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":24}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":6}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":30}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":48}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":36}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":63}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":30}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":32}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":4}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":74}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":52}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":4}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":10}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":66}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":80}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":15}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":25}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":35}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":10}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":21}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":94}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":41}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":88}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":74}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":18}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":16}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":23}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":94}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":55}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":80}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":81}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":53}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":18}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":18}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":16}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":33}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":94}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":54}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":48}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":18}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":16}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":12}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":63}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":35}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":51}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":72}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":19}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":65}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":42}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":114}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":49}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":21}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":18}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":26}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":21}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":31}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":34}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":43}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":120}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":14}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":19}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":65}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":52}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":114}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":50}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":21}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":78}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":44}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":19}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":16}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":14}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":10}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":1}}},"s":{"0":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"25":0,"26":0,"28":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"44":0,"47":0,"48":0,"49":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"67":0,"70":0,"71":0,"72":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"93":0,"94":0,"96":0,"97":0,"98":0,"99":0,"100":0,"102":0,"103":0,"104":0,"105":0,"107":0,"108":0,"110":0,"111":0,"112":0,"114":0,"115":0,"117":0,"118":0,"119":0,"120":0,"121":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"140":0,"141":0,"142":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"152":0,"155":0,"156":0,"157":0,"158":0,"160":0,"161":0,"162":0,"163":0,"165":0,"166":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"177":0,"178":0,"179":0,"180":0,"182":0,"183":0,"185":0,"186":0,"187":0,"188":0,"189":0,"191":0,"193":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":194,"column":-2000}},"locations":[{"start":{"line":1,"column":0},"end":{"line":194,"column":-2000}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":194,"column":-2000}},"loc":{"start":{"line":1,"column":0},"end":{"line":194,"column":-2000}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/HMSErrorModal.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/HMSErrorModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":62}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":50}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":123}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":116}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":107}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":79}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":61}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":52}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":48}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":54}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":58}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":49}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":65}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":52}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":52}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":52}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":2}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":123}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":21}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":11}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":102}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":11}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":104}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":11}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":108}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":11}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":12}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":94}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":3}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":1}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":61}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":79}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":79}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":78}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":71}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":79}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":79}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":78}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":71}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":55}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":1}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":81}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":46}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":56}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":38}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":88}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":1}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":85}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":72}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":19}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":49}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":40}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":6}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":54}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":70}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":16}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":10}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":89}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":111}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":99}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":51}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":65}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":92}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":16}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":17}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":29}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":85}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":53}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":19}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":14}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":52}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":34}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":62}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":75}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":34}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":18}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":39}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":45}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":88}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":80}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":72}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":120}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":80}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":76}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":24}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":22}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":50}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":82}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":60}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":82}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":54}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":70}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":93}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":99}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":35}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":33}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":30}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":85}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":26}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":40}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":41}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":51}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":109}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":62}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":28}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":28}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":26}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":24}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":17}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":18}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":14}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":65}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":49}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":14}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":14}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":12}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":10}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":1}}},"s":{"0":0,"13":0,"15":0,"16":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"46":0,"50":0,"51":0,"52":0,"53":0,"55":0,"56":0,"57":0,"58":0,"60":0,"61":0,"63":0,"65":0,"68":0,"69":0,"71":0,"72":0,"74":0,"76":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"87":0,"88":0,"89":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"100":0,"101":0,"102":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"121":0,"122":0,"123":0,"124":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"142":0,"144":0,"145":0,"146":0,"147":0,"149":0,"150":0,"152":0,"155":0,"156":0,"158":0,"159":0,"160":0,"161":0,"163":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":164,"column":-1619}},"locations":[{"start":{"line":1,"column":0},"end":{"line":164,"column":-1619}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":164,"column":-1619}},"loc":{"start":{"line":1,"column":0},"end":{"line":164,"column":-1619}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/IconPicker.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/IconPicker.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":33}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":70}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":33}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":31}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":48}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":31}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":40}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":31}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":31}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":33}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":39}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":48}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":33}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":33}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":33}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":35}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":29}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":37}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":35}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":31}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":35}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":29}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":33}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":39}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":35}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":31}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":33}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":31}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":33}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":35}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":39}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":31}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":2}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":57}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":61}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":29}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":1}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":66}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":46}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":44}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":10}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":30}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":13}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":21}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":42}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":198}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":44}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":81}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":15}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":18}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":10}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":14}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":42}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":44}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":12}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":157}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":56}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":62}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":23}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":28}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":31}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":34}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":35}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":37}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":20}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":98}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":34}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":51}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":87}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":21}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":30}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":46}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":25}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":17}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":18}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":16}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":11}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":10}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":1}}},"s":{"0":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"70":0,"71":0,"72":0,"73":0,"80":0,"81":0,"83":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"92":0,"93":0,"94":0,"96":0,"97":0,"99":0,"100":0,"101":0,"102":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"129":0,"131":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":132,"column":-1293}},"locations":[{"start":{"line":1,"column":0},"end":{"line":132,"column":-1293}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":132,"column":-1293}},"loc":{"start":{"line":1,"column":0},"end":{"line":132,"column":-1293}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/KProfilesView.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/KProfilesView.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":64}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":38}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":32}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":52}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":2}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":48}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":59}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":41}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":2}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":51}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":51}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":35}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":2}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":54}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":20}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":55}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":29}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":17}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":15}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":4}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":34}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":41}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":46}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":5}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":3}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":49}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":26}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":48}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":3}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":21}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":2}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":120}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":55}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":43}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":29}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":42}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":23}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":12}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":15}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":5}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":4}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":10}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":45}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":25}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":15}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":34}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":76}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":25}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":64}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":42}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":17}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":13}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":29}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":164}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":49}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":91}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":40}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":17}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":84}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":39}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":17}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":20}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":35}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":64}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":19}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":70}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":33}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":17}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":14}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":18}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":83}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":75}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":16}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":15}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":36}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":15}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":27}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":32}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":21}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":12}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":76}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":30}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":38}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":17}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":10}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":1}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":24}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":10}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":12}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":17}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":24}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":23}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":19}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":24}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":10}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":9}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":13}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":24}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":35}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":56}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":39}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":59}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":4}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":75}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":47}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":72}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":4}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":53}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":46}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":4}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":71}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":122}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":4}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":52}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":81}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":48}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":46}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":72}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":39}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":61}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":63}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":40}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":28}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":46}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":11}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":7}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":5}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":58}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":34}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":6}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":25}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":36}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":43}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":47}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":46}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":6}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":28}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":54}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":35}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":47}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":31}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":44}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":38}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":52}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":117}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":16}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":52}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":9}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":37}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":7}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":25}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":24}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":28}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":17}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":15}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":6}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":32}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":53}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":40}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":26}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":6}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":5}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":38}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":43}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":52}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":49}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":6}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":28}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":56}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":37}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":25}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":24}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":28}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":18}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":15}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":6}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":32}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":55}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":40}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":26}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":6}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":5}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":68}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":30}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":25}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":27}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":31}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":39}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":35}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":47}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":39}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":37}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":7}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":4}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":54}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":23}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":69}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":64}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":13}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":5}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":58}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":54}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":52}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":23}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":19}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":33}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":32}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":28}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":39}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":74}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":40}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":39}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":8}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":57}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":35}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":13}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":5}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":23}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":71}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":63}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":17}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":31}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":30}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":26}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":37}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":30}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":28}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":17}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":8}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":93}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":9}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":59}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":76}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":31}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":56}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":37}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":7}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":21}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":63}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":54}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":26}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":50}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":13}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":5}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":94}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":22}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":26}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":50}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":15}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":13}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":4}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":10}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":89}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":49}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":23}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":129}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":78}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":50}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":39}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":91}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":44}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":16}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":71}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":16}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":37}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":101}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":61}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":60}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":17}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":19}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":31}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":76}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":34}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":39}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":21}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":16}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":66}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":17}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":88}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":20}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":27}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":28}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":57}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":36}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":210}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":44}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":35}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":16}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":18}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":17}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":83}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":20}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":27}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":35}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":30}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":34}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":45}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":62}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":35}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":19}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":18}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":32}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":57}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":36}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":74}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":19}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":18}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":168}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":35}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":24}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":16}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":58}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":18}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":18}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":17}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":84}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":21}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":34}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":34}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":55}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":47}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":59}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":94}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":43}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":75}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":71}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":21}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":19}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":18}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":36}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":210}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":35}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":60}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":42}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":80}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":105}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":27}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":56}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":50}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":28}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":27}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":19}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":23}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":59}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":60}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":20}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":18}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":52}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":19}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":87}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":23}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":36}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":36}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":57}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":49}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":58}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":93}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":45}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":80}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":73}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":23}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":21}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":20}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":38}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":212}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":57}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":56}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":25}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":20}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":19}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":89}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":23}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":39}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":68}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":38}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":212}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":52}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":52}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":52}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":52}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":25}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":20}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":18}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":30}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":19}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":70}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":54}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":24}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":28}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":126}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":66}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":24}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":46}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":78}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":28}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":39}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":63}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":42}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":49}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":76}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":34}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":91}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":27}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":26}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":171}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":24}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":62}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":28}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":78}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":28}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":39}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":63}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":42}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":49}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":76}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":34}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":91}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":27}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":26}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":171}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":24}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":63}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":28}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":24}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":20}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":17}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":98}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":23}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":28}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":57}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":61}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":24}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":193}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":16}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":58}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":18}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":18}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":45}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":27}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":23}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":31}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":37}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":60}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":66}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":62}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":47}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":64}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":50}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":25}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":21}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":29}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":35}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":33}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":36}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":34}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":15}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":23}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":21}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":29}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":62}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":34}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":43}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":62}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":47}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":18}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":23}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":18}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":17}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":22}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":13}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":29}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":91}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":44}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":41}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":60}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":103}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":61}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":22}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":21}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":86}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":82}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":22}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":20}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":50}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":131}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":18}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":42}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":23}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":37}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":61}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":36}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":17}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":25}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":23}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":34}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":48}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":35}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":20}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":53}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":75}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":47}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":64}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":50}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":20}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":25}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":20}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":26}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":17}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":14}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":10}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":1}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":22}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":46}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":40}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":2}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":33}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":35}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":78}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":62}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":69}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":26}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":5}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":78}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":58}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":78}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":53}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":78}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":78}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":66}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":65}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":43}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":5}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":60}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":83}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":76}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":74}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":91}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":19}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":71}},"719":{"start":{"line":720,"column":0},"end":{"line":720,"column":23}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":19}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":63}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":19}},"727":{"start":{"line":728,"column":0},"end":{"line":728,"column":67}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":27}},"729":{"start":{"line":730,"column":0},"end":{"line":730,"column":29}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":5}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":9}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":20}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":32}},"736":{"start":{"line":737,"column":0},"end":{"line":737,"column":15}},"737":{"start":{"line":738,"column":0},"end":{"line":738,"column":26}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":29}},"739":{"start":{"line":740,"column":0},"end":{"line":740,"column":16}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":61}},"741":{"start":{"line":742,"column":0},"end":{"line":742,"column":26}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":106}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":78}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":95}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":20}},"746":{"start":{"line":747,"column":0},"end":{"line":747,"column":6}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":31}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":17}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":70}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":38}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":70}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":5}},"755":{"start":{"line":756,"column":0},"end":{"line":756,"column":42}},"756":{"start":{"line":757,"column":0},"end":{"line":757,"column":52}},"757":{"start":{"line":758,"column":0},"end":{"line":758,"column":61}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":31}},"759":{"start":{"line":760,"column":0},"end":{"line":760,"column":44}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":5}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":9}},"764":{"start":{"line":765,"column":0},"end":{"line":765,"column":20}},"765":{"start":{"line":766,"column":0},"end":{"line":766,"column":26}},"766":{"start":{"line":767,"column":0},"end":{"line":767,"column":16}},"767":{"start":{"line":768,"column":0},"end":{"line":768,"column":50}},"768":{"start":{"line":769,"column":0},"end":{"line":769,"column":58}},"769":{"start":{"line":770,"column":0},"end":{"line":770,"column":31}},"770":{"start":{"line":771,"column":0},"end":{"line":771,"column":46}},"771":{"start":{"line":772,"column":0},"end":{"line":772,"column":5}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":76}},"777":{"start":{"line":778,"column":0},"end":{"line":778,"column":19}},"778":{"start":{"line":779,"column":0},"end":{"line":779,"column":62}},"779":{"start":{"line":780,"column":0},"end":{"line":780,"column":62}},"780":{"start":{"line":781,"column":0},"end":{"line":781,"column":26}},"781":{"start":{"line":782,"column":0},"end":{"line":782,"column":45}},"782":{"start":{"line":783,"column":0},"end":{"line":783,"column":7}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":5}},"784":{"start":{"line":785,"column":0},"end":{"line":785,"column":34}},"787":{"start":{"line":788,"column":0},"end":{"line":788,"column":19}},"788":{"start":{"line":789,"column":0},"end":{"line":789,"column":26}},"790":{"start":{"line":791,"column":0},"end":{"line":791,"column":38}},"791":{"start":{"line":792,"column":0},"end":{"line":792,"column":26}},"792":{"start":{"line":793,"column":0},"end":{"line":793,"column":14}},"793":{"start":{"line":794,"column":0},"end":{"line":794,"column":39}},"794":{"start":{"line":795,"column":0},"end":{"line":795,"column":5}},"795":{"start":{"line":796,"column":0},"end":{"line":796,"column":91}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":71}},"802":{"start":{"line":803,"column":0},"end":{"line":803,"column":48}},"803":{"start":{"line":804,"column":0},"end":{"line":804,"column":40}},"805":{"start":{"line":806,"column":0},"end":{"line":806,"column":55}},"807":{"start":{"line":808,"column":0},"end":{"line":808,"column":46}},"808":{"start":{"line":809,"column":0},"end":{"line":809,"column":27}},"809":{"start":{"line":810,"column":0},"end":{"line":810,"column":17}},"810":{"start":{"line":811,"column":0},"end":{"line":811,"column":47}},"811":{"start":{"line":812,"column":0},"end":{"line":812,"column":52}},"814":{"start":{"line":815,"column":0},"end":{"line":815,"column":29}},"815":{"start":{"line":816,"column":0},"end":{"line":816,"column":35}},"816":{"start":{"line":817,"column":0},"end":{"line":817,"column":61}},"817":{"start":{"line":818,"column":0},"end":{"line":818,"column":60}},"820":{"start":{"line":821,"column":0},"end":{"line":821,"column":29}},"821":{"start":{"line":822,"column":0},"end":{"line":822,"column":35}},"822":{"start":{"line":823,"column":0},"end":{"line":823,"column":68}},"823":{"start":{"line":824,"column":0},"end":{"line":824,"column":65}},"825":{"start":{"line":826,"column":0},"end":{"line":826,"column":65}},"826":{"start":{"line":827,"column":0},"end":{"line":827,"column":7}},"829":{"start":{"line":830,"column":0},"end":{"line":830,"column":36}},"830":{"start":{"line":831,"column":0},"end":{"line":831,"column":27}},"831":{"start":{"line":832,"column":0},"end":{"line":832,"column":23}},"832":{"start":{"line":833,"column":0},"end":{"line":833,"column":63}},"833":{"start":{"line":834,"column":0},"end":{"line":834,"column":24}},"834":{"start":{"line":835,"column":0},"end":{"line":835,"column":88}},"835":{"start":{"line":836,"column":0},"end":{"line":836,"column":20}},"836":{"start":{"line":837,"column":0},"end":{"line":837,"column":16}},"837":{"start":{"line":838,"column":0},"end":{"line":838,"column":46}},"838":{"start":{"line":839,"column":0},"end":{"line":839,"column":7}},"839":{"start":{"line":840,"column":0},"end":{"line":840,"column":7}},"840":{"start":{"line":841,"column":0},"end":{"line":841,"column":85}},"843":{"start":{"line":844,"column":0},"end":{"line":844,"column":78}},"844":{"start":{"line":845,"column":0},"end":{"line":845,"column":63}},"847":{"start":{"line":848,"column":0},"end":{"line":848,"column":19}},"848":{"start":{"line":849,"column":0},"end":{"line":849,"column":49}},"850":{"start":{"line":851,"column":0},"end":{"line":851,"column":133}},"851":{"start":{"line":852,"column":0},"end":{"line":852,"column":15}},"852":{"start":{"line":853,"column":0},"end":{"line":853,"column":7}},"854":{"start":{"line":855,"column":0},"end":{"line":855,"column":61}},"855":{"start":{"line":856,"column":0},"end":{"line":856,"column":15}},"856":{"start":{"line":857,"column":0},"end":{"line":857,"column":7}},"858":{"start":{"line":859,"column":0},"end":{"line":859,"column":43}},"859":{"start":{"line":860,"column":0},"end":{"line":860,"column":27}},"860":{"start":{"line":861,"column":0},"end":{"line":861,"column":26}},"861":{"start":{"line":862,"column":0},"end":{"line":862,"column":50}},"862":{"start":{"line":863,"column":0},"end":{"line":863,"column":27}},"863":{"start":{"line":864,"column":0},"end":{"line":864,"column":30}},"864":{"start":{"line":865,"column":0},"end":{"line":865,"column":55}},"865":{"start":{"line":866,"column":0},"end":{"line":866,"column":27}},"866":{"start":{"line":867,"column":0},"end":{"line":867,"column":32}},"867":{"start":{"line":868,"column":0},"end":{"line":868,"column":39}},"868":{"start":{"line":869,"column":0},"end":{"line":869,"column":7}},"869":{"start":{"line":870,"column":0},"end":{"line":870,"column":6}},"871":{"start":{"line":872,"column":0},"end":{"line":872,"column":54}},"872":{"start":{"line":873,"column":0},"end":{"line":873,"column":70}},"873":{"start":{"line":874,"column":0},"end":{"line":874,"column":85}},"876":{"start":{"line":877,"column":0},"end":{"line":877,"column":42}},"877":{"start":{"line":878,"column":0},"end":{"line":878,"column":66}},"878":{"start":{"line":879,"column":0},"end":{"line":879,"column":50}},"879":{"start":{"line":880,"column":0},"end":{"line":880,"column":13}},"880":{"start":{"line":881,"column":0},"end":{"line":881,"column":5}},"882":{"start":{"line":883,"column":0},"end":{"line":883,"column":24}},"883":{"start":{"line":884,"column":0},"end":{"line":884,"column":17}},"884":{"start":{"line":885,"column":0},"end":{"line":885,"column":44}},"885":{"start":{"line":886,"column":0},"end":{"line":886,"column":54}},"886":{"start":{"line":887,"column":0},"end":{"line":887,"column":38}},"887":{"start":{"line":888,"column":0},"end":{"line":888,"column":46}},"888":{"start":{"line":889,"column":0},"end":{"line":889,"column":21}},"889":{"start":{"line":890,"column":0},"end":{"line":890,"column":27}},"890":{"start":{"line":891,"column":0},"end":{"line":891,"column":35}},"891":{"start":{"line":892,"column":0},"end":{"line":892,"column":31}},"892":{"start":{"line":893,"column":0},"end":{"line":893,"column":43}},"893":{"start":{"line":894,"column":0},"end":{"line":894,"column":35}},"894":{"start":{"line":895,"column":0},"end":{"line":895,"column":10}},"895":{"start":{"line":896,"column":0},"end":{"line":896,"column":6}},"897":{"start":{"line":898,"column":0},"end":{"line":898,"column":95}},"898":{"start":{"line":899,"column":0},"end":{"line":899,"column":42}},"899":{"start":{"line":900,"column":0},"end":{"line":900,"column":42}},"900":{"start":{"line":901,"column":0},"end":{"line":901,"column":17}},"901":{"start":{"line":902,"column":0},"end":{"line":902,"column":138}},"902":{"start":{"line":903,"column":0},"end":{"line":903,"column":33}},"903":{"start":{"line":904,"column":0},"end":{"line":904,"column":14}},"904":{"start":{"line":905,"column":0},"end":{"line":905,"column":33}},"905":{"start":{"line":906,"column":0},"end":{"line":906,"column":29}},"906":{"start":{"line":907,"column":0},"end":{"line":907,"column":64}},"907":{"start":{"line":908,"column":0},"end":{"line":908,"column":76}},"910":{"start":{"line":911,"column":0},"end":{"line":911,"column":42}},"911":{"start":{"line":912,"column":0},"end":{"line":912,"column":50}},"912":{"start":{"line":913,"column":0},"end":{"line":913,"column":24}},"913":{"start":{"line":914,"column":0},"end":{"line":914,"column":27}},"914":{"start":{"line":915,"column":0},"end":{"line":915,"column":35}},"915":{"start":{"line":916,"column":0},"end":{"line":916,"column":61}},"916":{"start":{"line":917,"column":0},"end":{"line":917,"column":24}},"918":{"start":{"line":919,"column":0},"end":{"line":919,"column":11}},"919":{"start":{"line":920,"column":0},"end":{"line":920,"column":39}},"920":{"start":{"line":921,"column":0},"end":{"line":921,"column":38}},"922":{"start":{"line":923,"column":0},"end":{"line":923,"column":62}},"923":{"start":{"line":924,"column":0},"end":{"line":924,"column":52}},"924":{"start":{"line":925,"column":0},"end":{"line":925,"column":17}},"925":{"start":{"line":926,"column":0},"end":{"line":926,"column":9}},"928":{"start":{"line":929,"column":0},"end":{"line":929,"column":25}},"929":{"start":{"line":930,"column":0},"end":{"line":930,"column":40}},"930":{"start":{"line":931,"column":0},"end":{"line":931,"column":64}},"932":{"start":{"line":933,"column":0},"end":{"line":933,"column":15}},"933":{"start":{"line":934,"column":0},"end":{"line":934,"column":53}},"934":{"start":{"line":935,"column":0},"end":{"line":935,"column":27}},"935":{"start":{"line":936,"column":0},"end":{"line":936,"column":56}},"936":{"start":{"line":937,"column":0},"end":{"line":937,"column":41}},"937":{"start":{"line":938,"column":0},"end":{"line":938,"column":65}},"938":{"start":{"line":939,"column":0},"end":{"line":939,"column":67}},"939":{"start":{"line":940,"column":0},"end":{"line":940,"column":46}},"940":{"start":{"line":941,"column":0},"end":{"line":941,"column":46}},"941":{"start":{"line":942,"column":0},"end":{"line":942,"column":15}},"942":{"start":{"line":943,"column":0},"end":{"line":943,"column":23}},"944":{"start":{"line":945,"column":0},"end":{"line":945,"column":67}},"945":{"start":{"line":946,"column":0},"end":{"line":946,"column":25}},"946":{"start":{"line":947,"column":0},"end":{"line":947,"column":68}},"947":{"start":{"line":948,"column":0},"end":{"line":948,"column":11}},"948":{"start":{"line":949,"column":0},"end":{"line":949,"column":9}},"950":{"start":{"line":951,"column":0},"end":{"line":951,"column":78}},"951":{"start":{"line":952,"column":0},"end":{"line":952,"column":26}},"952":{"start":{"line":953,"column":0},"end":{"line":953,"column":21}},"953":{"start":{"line":954,"column":0},"end":{"line":954,"column":44}},"954":{"start":{"line":955,"column":0},"end":{"line":955,"column":58}},"955":{"start":{"line":956,"column":0},"end":{"line":956,"column":7}},"956":{"start":{"line":957,"column":0},"end":{"line":957,"column":6}},"957":{"start":{"line":958,"column":0},"end":{"line":958,"column":18}},"958":{"start":{"line":959,"column":0},"end":{"line":959,"column":68}},"961":{"start":{"line":962,"column":0},"end":{"line":962,"column":70}},"962":{"start":{"line":963,"column":0},"end":{"line":963,"column":33}},"963":{"start":{"line":964,"column":0},"end":{"line":964,"column":33}},"964":{"start":{"line":965,"column":0},"end":{"line":965,"column":33}},"965":{"start":{"line":966,"column":0},"end":{"line":966,"column":32}},"966":{"start":{"line":967,"column":0},"end":{"line":967,"column":14}},"967":{"start":{"line":968,"column":0},"end":{"line":968,"column":29}},"968":{"start":{"line":969,"column":0},"end":{"line":969,"column":7}},"969":{"start":{"line":970,"column":0},"end":{"line":970,"column":18}},"970":{"start":{"line":971,"column":0},"end":{"line":971,"column":7}},"971":{"start":{"line":972,"column":0},"end":{"line":972,"column":9}},"974":{"start":{"line":975,"column":0},"end":{"line":975,"column":47}},"975":{"start":{"line":976,"column":0},"end":{"line":976,"column":78}},"976":{"start":{"line":977,"column":0},"end":{"line":977,"column":40}},"979":{"start":{"line":980,"column":0},"end":{"line":980,"column":46}},"980":{"start":{"line":981,"column":0},"end":{"line":981,"column":44}},"981":{"start":{"line":982,"column":0},"end":{"line":982,"column":35}},"982":{"start":{"line":983,"column":0},"end":{"line":983,"column":30}},"985":{"start":{"line":986,"column":0},"end":{"line":986,"column":53}},"986":{"start":{"line":987,"column":0},"end":{"line":987,"column":98}},"987":{"start":{"line":988,"column":0},"end":{"line":988,"column":34}},"989":{"start":{"line":990,"column":0},"end":{"line":990,"column":20}},"990":{"start":{"line":991,"column":0},"end":{"line":991,"column":45}},"991":{"start":{"line":992,"column":0},"end":{"line":992,"column":11}},"992":{"start":{"line":993,"column":0},"end":{"line":993,"column":52}},"993":{"start":{"line":994,"column":0},"end":{"line":994,"column":35}},"994":{"start":{"line":995,"column":0},"end":{"line":995,"column":43}},"995":{"start":{"line":996,"column":0},"end":{"line":996,"column":39}},"996":{"start":{"line":997,"column":0},"end":{"line":997,"column":51}},"997":{"start":{"line":998,"column":0},"end":{"line":998,"column":43}},"998":{"start":{"line":999,"column":0},"end":{"line":999,"column":41}},"999":{"start":{"line":1000,"column":0},"end":{"line":1000,"column":11}},"1000":{"start":{"line":1001,"column":0},"end":{"line":1001,"column":18}},"1002":{"start":{"line":1003,"column":0},"end":{"line":1003,"column":63}},"1003":{"start":{"line":1004,"column":0},"end":{"line":1004,"column":21}},"1004":{"start":{"line":1005,"column":0},"end":{"line":1005,"column":70}},"1005":{"start":{"line":1006,"column":0},"end":{"line":1006,"column":7}},"1006":{"start":{"line":1007,"column":0},"end":{"line":1007,"column":5}},"1008":{"start":{"line":1009,"column":0},"end":{"line":1009,"column":45}},"1009":{"start":{"line":1010,"column":0},"end":{"line":1010,"column":35}},"1010":{"start":{"line":1011,"column":0},"end":{"line":1011,"column":36}},"1011":{"start":{"line":1012,"column":0},"end":{"line":1012,"column":28}},"1012":{"start":{"line":1013,"column":0},"end":{"line":1013,"column":35}},"1013":{"start":{"line":1014,"column":0},"end":{"line":1014,"column":22}},"1014":{"start":{"line":1015,"column":0},"end":{"line":1015,"column":103}},"1018":{"start":{"line":1019,"column":0},"end":{"line":1019,"column":71}},"1019":{"start":{"line":1020,"column":0},"end":{"line":1020,"column":30}},"1020":{"start":{"line":1021,"column":0},"end":{"line":1021,"column":29}},"1021":{"start":{"line":1022,"column":0},"end":{"line":1022,"column":36}},"1022":{"start":{"line":1023,"column":0},"end":{"line":1023,"column":5}},"1024":{"start":{"line":1025,"column":0},"end":{"line":1025,"column":87}},"1026":{"start":{"line":1027,"column":0},"end":{"line":1027,"column":61}},"1027":{"start":{"line":1028,"column":0},"end":{"line":1028,"column":16}},"1028":{"start":{"line":1029,"column":0},"end":{"line":1029,"column":9}},"1031":{"start":{"line":1032,"column":0},"end":{"line":1032,"column":86}},"1032":{"start":{"line":1033,"column":0},"end":{"line":1033,"column":33}},"1033":{"start":{"line":1034,"column":0},"end":{"line":1034,"column":9}},"1034":{"start":{"line":1035,"column":0},"end":{"line":1035,"column":71}},"1035":{"start":{"line":1036,"column":0},"end":{"line":1036,"column":21}},"1036":{"start":{"line":1037,"column":0},"end":{"line":1037,"column":19}},"1037":{"start":{"line":1038,"column":0},"end":{"line":1038,"column":49}},"1038":{"start":{"line":1039,"column":0},"end":{"line":1039,"column":48}},"1039":{"start":{"line":1040,"column":0},"end":{"line":1040,"column":5}},"1040":{"start":{"line":1041,"column":0},"end":{"line":1041,"column":49}},"1044":{"start":{"line":1045,"column":0},"end":{"line":1045,"column":99}},"1045":{"start":{"line":1046,"column":0},"end":{"line":1046,"column":58}},"1046":{"start":{"line":1047,"column":0},"end":{"line":1047,"column":41}},"1047":{"start":{"line":1048,"column":0},"end":{"line":1048,"column":29}},"1048":{"start":{"line":1049,"column":0},"end":{"line":1049,"column":33}},"1049":{"start":{"line":1050,"column":0},"end":{"line":1050,"column":51}},"1050":{"start":{"line":1051,"column":0},"end":{"line":1051,"column":7}},"1051":{"start":{"line":1052,"column":0},"end":{"line":1052,"column":5}},"1052":{"start":{"line":1053,"column":0},"end":{"line":1053,"column":35}},"1053":{"start":{"line":1054,"column":0},"end":{"line":1054,"column":34}},"1056":{"start":{"line":1057,"column":0},"end":{"line":1057,"column":54}},"1057":{"start":{"line":1058,"column":0},"end":{"line":1058,"column":40}},"1058":{"start":{"line":1059,"column":0},"end":{"line":1059,"column":23}},"1060":{"start":{"line":1061,"column":0},"end":{"line":1061,"column":24}},"1061":{"start":{"line":1062,"column":0},"end":{"line":1062,"column":12}},"1062":{"start":{"line":1063,"column":0},"end":{"line":1063,"column":49}},"1063":{"start":{"line":1064,"column":0},"end":{"line":1064,"column":69}},"1064":{"start":{"line":1065,"column":0},"end":{"line":1065,"column":12}},"1066":{"start":{"line":1067,"column":0},"end":{"line":1067,"column":3}},"1068":{"start":{"line":1069,"column":0},"end":{"line":1069,"column":43}},"1069":{"start":{"line":1070,"column":0},"end":{"line":1070,"column":12}},"1070":{"start":{"line":1071,"column":0},"end":{"line":1071,"column":12}},"1071":{"start":{"line":1072,"column":0},"end":{"line":1072,"column":51}},"1072":{"start":{"line":1073,"column":0},"end":{"line":1073,"column":76}},"1073":{"start":{"line":1074,"column":0},"end":{"line":1074,"column":91}},"1074":{"start":{"line":1075,"column":0},"end":{"line":1075,"column":41}},"1076":{"start":{"line":1077,"column":0},"end":{"line":1077,"column":14}},"1077":{"start":{"line":1078,"column":0},"end":{"line":1078,"column":22}},"1078":{"start":{"line":1079,"column":0},"end":{"line":1079,"column":13}},"1080":{"start":{"line":1081,"column":0},"end":{"line":1081,"column":3}},"1082":{"start":{"line":1083,"column":0},"end":{"line":1083,"column":39}},"1083":{"start":{"line":1084,"column":0},"end":{"line":1084,"column":12}},"1084":{"start":{"line":1085,"column":0},"end":{"line":1085,"column":12}},"1085":{"start":{"line":1086,"column":0},"end":{"line":1086,"column":51}},"1086":{"start":{"line":1087,"column":0},"end":{"line":1087,"column":72}},"1087":{"start":{"line":1088,"column":0},"end":{"line":1088,"column":87}},"1088":{"start":{"line":1089,"column":0},"end":{"line":1089,"column":41}},"1090":{"start":{"line":1091,"column":0},"end":{"line":1091,"column":14}},"1091":{"start":{"line":1092,"column":0},"end":{"line":1092,"column":22}},"1092":{"start":{"line":1093,"column":0},"end":{"line":1093,"column":13}},"1094":{"start":{"line":1095,"column":0},"end":{"line":1095,"column":3}},"1096":{"start":{"line":1097,"column":0},"end":{"line":1097,"column":10}},"1097":{"start":{"line":1098,"column":0},"end":{"line":1098,"column":6}},"1099":{"start":{"line":1100,"column":0},"end":{"line":1100,"column":43}},"1100":{"start":{"line":1101,"column":0},"end":{"line":1101,"column":98}},"1101":{"start":{"line":1102,"column":0},"end":{"line":1102,"column":78}},"1102":{"start":{"line":1103,"column":0},"end":{"line":1103,"column":73}},"1103":{"start":{"line":1104,"column":0},"end":{"line":1104,"column":14}},"1107":{"start":{"line":1108,"column":0},"end":{"line":1108,"column":49}},"1108":{"start":{"line":1109,"column":0},"end":{"line":1109,"column":41}},"1109":{"start":{"line":1110,"column":0},"end":{"line":1110,"column":79}},"1110":{"start":{"line":1111,"column":0},"end":{"line":1111,"column":17}},"1111":{"start":{"line":1112,"column":0},"end":{"line":1112,"column":41}},"1112":{"start":{"line":1113,"column":0},"end":{"line":1113,"column":74}},"1113":{"start":{"line":1114,"column":0},"end":{"line":1114,"column":154}},"1115":{"start":{"line":1116,"column":0},"end":{"line":1116,"column":49}},"1116":{"start":{"line":1117,"column":0},"end":{"line":1117,"column":58}},"1117":{"start":{"line":1118,"column":0},"end":{"line":1118,"column":30}},"1118":{"start":{"line":1119,"column":0},"end":{"line":1119,"column":23}},"1119":{"start":{"line":1120,"column":0},"end":{"line":1120,"column":15}},"1120":{"start":{"line":1121,"column":0},"end":{"line":1121,"column":19}},"1121":{"start":{"line":1122,"column":0},"end":{"line":1122,"column":14}},"1123":{"start":{"line":1124,"column":0},"end":{"line":1124,"column":30}},"1124":{"start":{"line":1125,"column":0},"end":{"line":1125,"column":78}},"1125":{"start":{"line":1126,"column":0},"end":{"line":1126,"column":17}},"1126":{"start":{"line":1127,"column":0},"end":{"line":1127,"column":34}},"1127":{"start":{"line":1128,"column":0},"end":{"line":1128,"column":63}},"1128":{"start":{"line":1129,"column":0},"end":{"line":1129,"column":154}},"1130":{"start":{"line":1131,"column":0},"end":{"line":1131,"column":46}},"1131":{"start":{"line":1132,"column":0},"end":{"line":1132,"column":46}},"1132":{"start":{"line":1133,"column":0},"end":{"line":1133,"column":46}},"1133":{"start":{"line":1134,"column":0},"end":{"line":1134,"column":46}},"1134":{"start":{"line":1135,"column":0},"end":{"line":1135,"column":19}},"1135":{"start":{"line":1136,"column":0},"end":{"line":1136,"column":14}},"1137":{"start":{"line":1138,"column":0},"end":{"line":1138,"column":46}},"1138":{"start":{"line":1139,"column":0},"end":{"line":1139,"column":17}},"1139":{"start":{"line":1140,"column":0},"end":{"line":1140,"column":31}},"1140":{"start":{"line":1141,"column":0},"end":{"line":1141,"column":45}},"1141":{"start":{"line":1142,"column":0},"end":{"line":1142,"column":33}},"1143":{"start":{"line":1144,"column":0},"end":{"line":1144,"column":83}},"1145":{"start":{"line":1146,"column":0},"end":{"line":1146,"column":19}},"1146":{"start":{"line":1147,"column":0},"end":{"line":1147,"column":56}},"1147":{"start":{"line":1148,"column":0},"end":{"line":1148,"column":40}},"1149":{"start":{"line":1150,"column":0},"end":{"line":1150,"column":19}},"1150":{"start":{"line":1151,"column":0},"end":{"line":1151,"column":14}},"1151":{"start":{"line":1152,"column":0},"end":{"line":1152,"column":12}},"1154":{"start":{"line":1155,"column":0},"end":{"line":1155,"column":49}},"1155":{"start":{"line":1156,"column":0},"end":{"line":1156,"column":50}},"1156":{"start":{"line":1157,"column":0},"end":{"line":1157,"column":97}},"1157":{"start":{"line":1158,"column":0},"end":{"line":1158,"column":16}},"1158":{"start":{"line":1159,"column":0},"end":{"line":1159,"column":23}},"1159":{"start":{"line":1160,"column":0},"end":{"line":1160,"column":31}},"1160":{"start":{"line":1161,"column":0},"end":{"line":1161,"column":60}},"1161":{"start":{"line":1162,"column":0},"end":{"line":1162,"column":55}},"1162":{"start":{"line":1163,"column":0},"end":{"line":1163,"column":183}},"1163":{"start":{"line":1164,"column":0},"end":{"line":1164,"column":12}},"1164":{"start":{"line":1165,"column":0},"end":{"line":1165,"column":14}},"1165":{"start":{"line":1166,"column":0},"end":{"line":1166,"column":26}},"1166":{"start":{"line":1167,"column":0},"end":{"line":1167,"column":32}},"1167":{"start":{"line":1168,"column":0},"end":{"line":1168,"column":19}},"1168":{"start":{"line":1169,"column":0},"end":{"line":1169,"column":36}},"1169":{"start":{"line":1170,"column":0},"end":{"line":1170,"column":83}},"1170":{"start":{"line":1171,"column":0},"end":{"line":1171,"column":156}},"1172":{"start":{"line":1173,"column":0},"end":{"line":1173,"column":56}},"1173":{"start":{"line":1174,"column":0},"end":{"line":1174,"column":53}},"1174":{"start":{"line":1175,"column":0},"end":{"line":1175,"column":55}},"1175":{"start":{"line":1176,"column":0},"end":{"line":1176,"column":21}},"1176":{"start":{"line":1177,"column":0},"end":{"line":1177,"column":16}},"1178":{"start":{"line":1179,"column":0},"end":{"line":1179,"column":30}},"1179":{"start":{"line":1180,"column":0},"end":{"line":1180,"column":17}},"1180":{"start":{"line":1181,"column":0},"end":{"line":1181,"column":34}},"1181":{"start":{"line":1182,"column":0},"end":{"line":1182,"column":81}},"1182":{"start":{"line":1183,"column":0},"end":{"line":1183,"column":154}},"1184":{"start":{"line":1185,"column":0},"end":{"line":1185,"column":49}},"1185":{"start":{"line":1186,"column":0},"end":{"line":1186,"column":47}},"1186":{"start":{"line":1187,"column":0},"end":{"line":1187,"column":45}},"1187":{"start":{"line":1188,"column":0},"end":{"line":1188,"column":19}},"1188":{"start":{"line":1189,"column":0},"end":{"line":1189,"column":14}},"1189":{"start":{"line":1190,"column":0},"end":{"line":1190,"column":30}},"1190":{"start":{"line":1191,"column":0},"end":{"line":1191,"column":17}},"1191":{"start":{"line":1192,"column":0},"end":{"line":1192,"column":30}},"1192":{"start":{"line":1193,"column":0},"end":{"line":1193,"column":73}},"1193":{"start":{"line":1194,"column":0},"end":{"line":1194,"column":154}},"1195":{"start":{"line":1196,"column":0},"end":{"line":1196,"column":52}},"1196":{"start":{"line":1197,"column":0},"end":{"line":1197,"column":58}},"1197":{"start":{"line":1198,"column":0},"end":{"line":1198,"column":60}},"1198":{"start":{"line":1199,"column":0},"end":{"line":1199,"column":19}},"1199":{"start":{"line":1200,"column":0},"end":{"line":1200,"column":14}},"1200":{"start":{"line":1201,"column":0},"end":{"line":1201,"column":12}},"1203":{"start":{"line":1204,"column":0},"end":{"line":1204,"column":49}},"1204":{"start":{"line":1205,"column":0},"end":{"line":1205,"column":15}},"1205":{"start":{"line":1206,"column":0},"end":{"line":1206,"column":29}},"1206":{"start":{"line":1207,"column":0},"end":{"line":1207,"column":32}},"1207":{"start":{"line":1208,"column":0},"end":{"line":1208,"column":49}},"1208":{"start":{"line":1209,"column":0},"end":{"line":1209,"column":41}},"1210":{"start":{"line":1211,"column":0},"end":{"line":1211,"column":42}},"1212":{"start":{"line":1213,"column":0},"end":{"line":1213,"column":17}},"1213":{"start":{"line":1214,"column":0},"end":{"line":1214,"column":15}},"1214":{"start":{"line":1215,"column":0},"end":{"line":1215,"column":29}},"1215":{"start":{"line":1216,"column":0},"end":{"line":1216,"column":32}},"1216":{"start":{"line":1217,"column":0},"end":{"line":1217,"column":43}},"1218":{"start":{"line":1219,"column":0},"end":{"line":1219,"column":40}},"1220":{"start":{"line":1221,"column":0},"end":{"line":1221,"column":17}},"1221":{"start":{"line":1222,"column":0},"end":{"line":1222,"column":34}},"1222":{"start":{"line":1223,"column":0},"end":{"line":1223,"column":26}},"1223":{"start":{"line":1224,"column":0},"end":{"line":1224,"column":12}},"1224":{"start":{"line":1225,"column":0},"end":{"line":1225,"column":19}},"1225":{"start":{"line":1226,"column":0},"end":{"line":1226,"column":33}},"1226":{"start":{"line":1227,"column":0},"end":{"line":1227,"column":41}},"1227":{"start":{"line":1228,"column":0},"end":{"line":1228,"column":49}},"1229":{"start":{"line":1230,"column":0},"end":{"line":1230,"column":49}},"1231":{"start":{"line":1232,"column":0},"end":{"line":1232,"column":21}},"1232":{"start":{"line":1233,"column":0},"end":{"line":1233,"column":19}},"1233":{"start":{"line":1234,"column":0},"end":{"line":1234,"column":33}},"1234":{"start":{"line":1235,"column":0},"end":{"line":1235,"column":40}},"1235":{"start":{"line":1236,"column":0},"end":{"line":1236,"column":52}},"1236":{"start":{"line":1237,"column":0},"end":{"line":1237,"column":58}},"1237":{"start":{"line":1238,"column":0},"end":{"line":1238,"column":73}},"1239":{"start":{"line":1240,"column":0},"end":{"line":1240,"column":44}},"1240":{"start":{"line":1241,"column":0},"end":{"line":1241,"column":46}},"1241":{"start":{"line":1242,"column":0},"end":{"line":1242,"column":21}},"1242":{"start":{"line":1243,"column":0},"end":{"line":1243,"column":19}},"1243":{"start":{"line":1244,"column":0},"end":{"line":1244,"column":33}},"1244":{"start":{"line":1245,"column":0},"end":{"line":1245,"column":30}},"1245":{"start":{"line":1246,"column":0},"end":{"line":1246,"column":40}},"1246":{"start":{"line":1247,"column":0},"end":{"line":1247,"column":47}},"1247":{"start":{"line":1248,"column":0},"end":{"line":1248,"column":16}},"1249":{"start":{"line":1250,"column":0},"end":{"line":1250,"column":39}},"1251":{"start":{"line":1252,"column":0},"end":{"line":1252,"column":21}},"1252":{"start":{"line":1253,"column":0},"end":{"line":1253,"column":13}},"1254":{"start":{"line":1255,"column":0},"end":{"line":1255,"column":17}},"1255":{"start":{"line":1256,"column":0},"end":{"line":1256,"column":31}},"1256":{"start":{"line":1257,"column":0},"end":{"line":1257,"column":50}},"1257":{"start":{"line":1258,"column":0},"end":{"line":1258,"column":47}},"1258":{"start":{"line":1259,"column":0},"end":{"line":1259,"column":56}},"1260":{"start":{"line":1261,"column":0},"end":{"line":1261,"column":47}},"1262":{"start":{"line":1263,"column":0},"end":{"line":1263,"column":19}},"1264":{"start":{"line":1265,"column":0},"end":{"line":1265,"column":12}},"1267":{"start":{"line":1268,"column":0},"end":{"line":1268,"column":27}},"1268":{"start":{"line":1269,"column":0},"end":{"line":1269,"column":51}},"1269":{"start":{"line":1270,"column":0},"end":{"line":1270,"column":71}},"1270":{"start":{"line":1271,"column":0},"end":{"line":1271,"column":14}},"1271":{"start":{"line":1272,"column":0},"end":{"line":1272,"column":28}},"1272":{"start":{"line":1273,"column":0},"end":{"line":1273,"column":14}},"1273":{"start":{"line":1274,"column":0},"end":{"line":1274,"column":53}},"1274":{"start":{"line":1275,"column":0},"end":{"line":1275,"column":74}},"1275":{"start":{"line":1276,"column":0},"end":{"line":1276,"column":86}},"1276":{"start":{"line":1277,"column":0},"end":{"line":1277,"column":48}},"1278":{"start":{"line":1279,"column":0},"end":{"line":1279,"column":16}},"1279":{"start":{"line":1280,"column":0},"end":{"line":1280,"column":74}},"1280":{"start":{"line":1281,"column":0},"end":{"line":1281,"column":47}},"1282":{"start":{"line":1283,"column":0},"end":{"line":1283,"column":21}},"1283":{"start":{"line":1284,"column":0},"end":{"line":1284,"column":24}},"1284":{"start":{"line":1285,"column":0},"end":{"line":1285,"column":15}},"1285":{"start":{"line":1286,"column":0},"end":{"line":1286,"column":41}},"1286":{"start":{"line":1287,"column":0},"end":{"line":1287,"column":24}},"1288":{"start":{"line":1289,"column":0},"end":{"line":1289,"column":50}},"1290":{"start":{"line":1291,"column":0},"end":{"line":1291,"column":17}},"1291":{"start":{"line":1292,"column":0},"end":{"line":1292,"column":94}},"1292":{"start":{"line":1293,"column":0},"end":{"line":1293,"column":41}},"1293":{"start":{"line":1294,"column":0},"end":{"line":1294,"column":33}},"1294":{"start":{"line":1295,"column":0},"end":{"line":1295,"column":53}},"1295":{"start":{"line":1296,"column":0},"end":{"line":1296,"column":37}},"1296":{"start":{"line":1297,"column":0},"end":{"line":1297,"column":33}},"1297":{"start":{"line":1298,"column":0},"end":{"line":1298,"column":50}},"1298":{"start":{"line":1299,"column":0},"end":{"line":1299,"column":39}},"1299":{"start":{"line":1300,"column":0},"end":{"line":1300,"column":63}},"1300":{"start":{"line":1301,"column":0},"end":{"line":1301,"column":63}},"1301":{"start":{"line":1302,"column":0},"end":{"line":1302,"column":51}},"1302":{"start":{"line":1303,"column":0},"end":{"line":1303,"column":79}},"1303":{"start":{"line":1304,"column":0},"end":{"line":1304,"column":91}},"1304":{"start":{"line":1305,"column":0},"end":{"line":1305,"column":45}},"1305":{"start":{"line":1306,"column":0},"end":{"line":1306,"column":22}},"1306":{"start":{"line":1307,"column":0},"end":{"line":1307,"column":21}},"1307":{"start":{"line":1308,"column":0},"end":{"line":1308,"column":20}},"1308":{"start":{"line":1309,"column":0},"end":{"line":1309,"column":18}},"1310":{"start":{"line":1311,"column":0},"end":{"line":1311,"column":17}},"1311":{"start":{"line":1312,"column":0},"end":{"line":1312,"column":95}},"1312":{"start":{"line":1313,"column":0},"end":{"line":1313,"column":41}},"1313":{"start":{"line":1314,"column":0},"end":{"line":1314,"column":33}},"1314":{"start":{"line":1315,"column":0},"end":{"line":1315,"column":53}},"1315":{"start":{"line":1316,"column":0},"end":{"line":1316,"column":37}},"1316":{"start":{"line":1317,"column":0},"end":{"line":1317,"column":33}},"1317":{"start":{"line":1318,"column":0},"end":{"line":1318,"column":50}},"1318":{"start":{"line":1319,"column":0},"end":{"line":1319,"column":39}},"1319":{"start":{"line":1320,"column":0},"end":{"line":1320,"column":63}},"1320":{"start":{"line":1321,"column":0},"end":{"line":1321,"column":63}},"1321":{"start":{"line":1322,"column":0},"end":{"line":1322,"column":51}},"1322":{"start":{"line":1323,"column":0},"end":{"line":1323,"column":79}},"1323":{"start":{"line":1324,"column":0},"end":{"line":1324,"column":91}},"1324":{"start":{"line":1325,"column":0},"end":{"line":1325,"column":45}},"1325":{"start":{"line":1326,"column":0},"end":{"line":1326,"column":22}},"1326":{"start":{"line":1327,"column":0},"end":{"line":1327,"column":21}},"1327":{"start":{"line":1328,"column":0},"end":{"line":1328,"column":20}},"1328":{"start":{"line":1329,"column":0},"end":{"line":1329,"column":18}},"1329":{"start":{"line":1330,"column":0},"end":{"line":1330,"column":16}},"1332":{"start":{"line":1333,"column":0},"end":{"line":1333,"column":37}},"1333":{"start":{"line":1334,"column":0},"end":{"line":1334,"column":48}},"1334":{"start":{"line":1335,"column":0},"end":{"line":1335,"column":27}},"1335":{"start":{"line":1336,"column":0},"end":{"line":1336,"column":44}},"1336":{"start":{"line":1337,"column":0},"end":{"line":1337,"column":33}},"1337":{"start":{"line":1338,"column":0},"end":{"line":1338,"column":57}},"1338":{"start":{"line":1339,"column":0},"end":{"line":1339,"column":57}},"1339":{"start":{"line":1340,"column":0},"end":{"line":1340,"column":45}},"1340":{"start":{"line":1341,"column":0},"end":{"line":1341,"column":73}},"1341":{"start":{"line":1342,"column":0},"end":{"line":1342,"column":85}},"1342":{"start":{"line":1343,"column":0},"end":{"line":1343,"column":39}},"1343":{"start":{"line":1344,"column":0},"end":{"line":1344,"column":16}},"1344":{"start":{"line":1345,"column":0},"end":{"line":1345,"column":15}},"1345":{"start":{"line":1346,"column":0},"end":{"line":1346,"column":16}},"1347":{"start":{"line":1348,"column":0},"end":{"line":1348,"column":81}},"1348":{"start":{"line":1349,"column":0},"end":{"line":1349,"column":14}},"1349":{"start":{"line":1350,"column":0},"end":{"line":1350,"column":53}},"1350":{"start":{"line":1351,"column":0},"end":{"line":1351,"column":73}},"1351":{"start":{"line":1352,"column":0},"end":{"line":1352,"column":91}},"1352":{"start":{"line":1353,"column":0},"end":{"line":1353,"column":43}},"1354":{"start":{"line":1355,"column":0},"end":{"line":1355,"column":16}},"1355":{"start":{"line":1356,"column":0},"end":{"line":1356,"column":24}},"1356":{"start":{"line":1357,"column":0},"end":{"line":1357,"column":15}},"1358":{"start":{"line":1359,"column":0},"end":{"line":1359,"column":14}},"1359":{"start":{"line":1360,"column":0},"end":{"line":1360,"column":53}},"1360":{"start":{"line":1361,"column":0},"end":{"line":1361,"column":72}},"1361":{"start":{"line":1362,"column":0},"end":{"line":1362,"column":84}},"1362":{"start":{"line":1363,"column":0},"end":{"line":1363,"column":48}},"1363":{"start":{"line":1364,"column":0},"end":{"line":1364,"column":78}},"1364":{"start":{"line":1365,"column":0},"end":{"line":1365,"column":16}},"1365":{"start":{"line":1366,"column":0},"end":{"line":1366,"column":58}},"1366":{"start":{"line":1367,"column":0},"end":{"line":1367,"column":42}},"1368":{"start":{"line":1369,"column":0},"end":{"line":1369,"column":21}},"1369":{"start":{"line":1370,"column":0},"end":{"line":1370,"column":24}},"1370":{"start":{"line":1371,"column":0},"end":{"line":1371,"column":15}},"1374":{"start":{"line":1375,"column":0},"end":{"line":1375,"column":52}},"1375":{"start":{"line":1376,"column":0},"end":{"line":1376,"column":61}},"1376":{"start":{"line":1377,"column":0},"end":{"line":1377,"column":16}},"1377":{"start":{"line":1378,"column":0},"end":{"line":1378,"column":24}},"1378":{"start":{"line":1379,"column":0},"end":{"line":1379,"column":36}},"1379":{"start":{"line":1380,"column":0},"end":{"line":1380,"column":39}},"1380":{"start":{"line":1381,"column":0},"end":{"line":1381,"column":43}},"1381":{"start":{"line":1382,"column":0},"end":{"line":1382,"column":75}},"1382":{"start":{"line":1383,"column":0},"end":{"line":1383,"column":39}},"1383":{"start":{"line":1384,"column":0},"end":{"line":1384,"column":30}},"1384":{"start":{"line":1385,"column":0},"end":{"line":1385,"column":32}},"1385":{"start":{"line":1386,"column":0},"end":{"line":1386,"column":39}},"1386":{"start":{"line":1387,"column":0},"end":{"line":1387,"column":28}},"1387":{"start":{"line":1388,"column":0},"end":{"line":1388,"column":85}},"1388":{"start":{"line":1389,"column":0},"end":{"line":1389,"column":38}},"1389":{"start":{"line":1390,"column":0},"end":{"line":1390,"column":78}},"1390":{"start":{"line":1391,"column":0},"end":{"line":1391,"column":14}},"1391":{"start":{"line":1392,"column":0},"end":{"line":1392,"column":27}},"1392":{"start":{"line":1393,"column":0},"end":{"line":1393,"column":38}},"1393":{"start":{"line":1394,"column":0},"end":{"line":1394,"column":32}},"1394":{"start":{"line":1395,"column":0},"end":{"line":1395,"column":14}},"1395":{"start":{"line":1396,"column":0},"end":{"line":1396,"column":12}},"1397":{"start":{"line":1398,"column":0},"end":{"line":1398,"column":11}},"1400":{"start":{"line":1401,"column":0},"end":{"line":1401,"column":43}},"1401":{"start":{"line":1402,"column":0},"end":{"line":1402,"column":22}},"1402":{"start":{"line":1403,"column":0},"end":{"line":1403,"column":37}},"1403":{"start":{"line":1404,"column":0},"end":{"line":1404,"column":41}},"1404":{"start":{"line":1405,"column":0},"end":{"line":1405,"column":73}},"1405":{"start":{"line":1406,"column":0},"end":{"line":1406,"column":37}},"1406":{"start":{"line":1407,"column":0},"end":{"line":1407,"column":37}},"1407":{"start":{"line":1408,"column":0},"end":{"line":1408,"column":26}},"1408":{"start":{"line":1409,"column":0},"end":{"line":1409,"column":35}},"1409":{"start":{"line":1410,"column":0},"end":{"line":1410,"column":54}},"1410":{"start":{"line":1411,"column":0},"end":{"line":1411,"column":12}},"1411":{"start":{"line":1412,"column":0},"end":{"line":1412,"column":25}},"1412":{"start":{"line":1413,"column":0},"end":{"line":1413,"column":35}},"1413":{"start":{"line":1414,"column":0},"end":{"line":1414,"column":30}},"1414":{"start":{"line":1415,"column":0},"end":{"line":1415,"column":12}},"1415":{"start":{"line":1416,"column":0},"end":{"line":1416,"column":10}},"1419":{"start":{"line":1420,"column":0},"end":{"line":1420,"column":45}},"1420":{"start":{"line":1421,"column":0},"end":{"line":1421,"column":22}},"1421":{"start":{"line":1422,"column":0},"end":{"line":1422,"column":37}},"1422":{"start":{"line":1423,"column":0},"end":{"line":1423,"column":41}},"1423":{"start":{"line":1424,"column":0},"end":{"line":1424,"column":73}},"1424":{"start":{"line":1425,"column":0},"end":{"line":1425,"column":37}},"1425":{"start":{"line":1426,"column":0},"end":{"line":1426,"column":37}},"1427":{"start":{"line":1428,"column":0},"end":{"line":1428,"column":20}},"1428":{"start":{"line":1429,"column":0},"end":{"line":1429,"column":30}},"1429":{"start":{"line":1430,"column":0},"end":{"line":1430,"column":54}},"1430":{"start":{"line":1431,"column":0},"end":{"line":1431,"column":75}},"1431":{"start":{"line":1432,"column":0},"end":{"line":1432,"column":12}},"1432":{"start":{"line":1433,"column":0},"end":{"line":1433,"column":26}},"1433":{"start":{"line":1434,"column":0},"end":{"line":1434,"column":36}},"1434":{"start":{"line":1435,"column":0},"end":{"line":1435,"column":30}},"1435":{"start":{"line":1436,"column":0},"end":{"line":1436,"column":12}},"1436":{"start":{"line":1437,"column":0},"end":{"line":1437,"column":25}},"1437":{"start":{"line":1438,"column":0},"end":{"line":1438,"column":36}},"1438":{"start":{"line":1439,"column":0},"end":{"line":1439,"column":30}},"1439":{"start":{"line":1440,"column":0},"end":{"line":1440,"column":12}},"1440":{"start":{"line":1441,"column":0},"end":{"line":1441,"column":10}},"1444":{"start":{"line":1445,"column":0},"end":{"line":1445,"column":33}},"1445":{"start":{"line":1446,"column":0},"end":{"line":1446,"column":93}},"1446":{"start":{"line":1447,"column":0},"end":{"line":1447,"column":44}},"1447":{"start":{"line":1448,"column":0},"end":{"line":1448,"column":41}},"1448":{"start":{"line":1449,"column":0},"end":{"line":1449,"column":60}},"1449":{"start":{"line":1450,"column":0},"end":{"line":1450,"column":103}},"1450":{"start":{"line":1451,"column":0},"end":{"line":1451,"column":61}},"1451":{"start":{"line":1452,"column":0},"end":{"line":1452,"column":22}},"1452":{"start":{"line":1453,"column":0},"end":{"line":1453,"column":21}},"1453":{"start":{"line":1454,"column":0},"end":{"line":1454,"column":87}},"1454":{"start":{"line":1455,"column":0},"end":{"line":1455,"column":82}},"1455":{"start":{"line":1456,"column":0},"end":{"line":1456,"column":22}},"1456":{"start":{"line":1457,"column":0},"end":{"line":1457,"column":20}},"1457":{"start":{"line":1458,"column":0},"end":{"line":1458,"column":50}},"1458":{"start":{"line":1459,"column":0},"end":{"line":1459,"column":155}},"1459":{"start":{"line":1460,"column":0},"end":{"line":1460,"column":18}},"1460":{"start":{"line":1461,"column":0},"end":{"line":1461,"column":42}},"1461":{"start":{"line":1462,"column":0},"end":{"line":1462,"column":23}},"1462":{"start":{"line":1463,"column":0},"end":{"line":1463,"column":37}},"1463":{"start":{"line":1464,"column":0},"end":{"line":1464,"column":65}},"1464":{"start":{"line":1465,"column":0},"end":{"line":1465,"column":49}},"1465":{"start":{"line":1466,"column":0},"end":{"line":1466,"column":36}},"1466":{"start":{"line":1467,"column":0},"end":{"line":1467,"column":17}},"1468":{"start":{"line":1469,"column":0},"end":{"line":1469,"column":25}},"1469":{"start":{"line":1470,"column":0},"end":{"line":1470,"column":23}},"1470":{"start":{"line":1471,"column":0},"end":{"line":1471,"column":45}},"1471":{"start":{"line":1472,"column":0},"end":{"line":1472,"column":49}},"1472":{"start":{"line":1473,"column":0},"end":{"line":1473,"column":75}},"1474":{"start":{"line":1475,"column":0},"end":{"line":1475,"column":43}},"1475":{"start":{"line":1476,"column":0},"end":{"line":1476,"column":64}},"1477":{"start":{"line":1478,"column":0},"end":{"line":1478,"column":50}},"1478":{"start":{"line":1479,"column":0},"end":{"line":1479,"column":20}},"1480":{"start":{"line":1481,"column":0},"end":{"line":1481,"column":25}},"1481":{"start":{"line":1482,"column":0},"end":{"line":1482,"column":20}},"1482":{"start":{"line":1483,"column":0},"end":{"line":1483,"column":26}},"1483":{"start":{"line":1484,"column":0},"end":{"line":1484,"column":17}},"1484":{"start":{"line":1485,"column":0},"end":{"line":1485,"column":14}},"1486":{"start":{"line":1487,"column":0},"end":{"line":1487,"column":7}},"1488":{"start":{"line":1489,"column":0},"end":{"line":1489,"column":1}}},"s":{"0":0,"37":0,"38":0,"39":0,"40":0,"43":0,"44":0,"45":0,"46":0,"49":0,"50":0,"51":0,"52":0,"55":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"77":0,"78":0,"79":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"96":0,"97":0,"99":0,"101":0,"103":0,"104":0,"105":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"138":0,"139":0,"141":0,"143":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"172":0,"173":0,"174":0,"175":0,"176":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"220":0,"221":0,"222":0,"224":0,"225":0,"227":0,"228":0,"230":0,"231":0,"232":0,"233":0,"235":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"259":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"274":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"288":0,"289":0,"292":0,"293":0,"294":0,"295":0,"298":0,"300":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"320":0,"321":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"335":0,"337":0,"338":0,"339":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"353":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"363":0,"364":0,"365":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"388":0,"389":0,"390":0,"392":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"434":0,"435":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"459":0,"461":0,"462":0,"463":0,"464":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"476":0,"478":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"530":0,"531":0,"532":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"568":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"583":0,"584":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"595":0,"596":0,"598":0,"600":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"610":0,"611":0,"612":0,"613":0,"614":0,"616":0,"617":0,"619":0,"620":0,"622":0,"623":0,"624":0,"625":0,"626":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"652":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"661":0,"662":0,"664":0,"665":0,"667":0,"668":0,"669":0,"670":0,"671":0,"673":0,"675":0,"682":0,"683":0,"684":0,"685":0,"687":0,"688":0,"689":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":0,"697":0,"698":0,"699":0,"700":0,"702":0,"703":0,"704":0,"705":0,"708":0,"709":0,"710":0,"711":0,"714":0,"717":0,"718":0,"719":0,"722":0,"723":0,"724":0,"727":0,"728":0,"729":0,"730":0,"733":0,"734":0,"735":0,"736":0,"737":0,"738":0,"739":0,"740":0,"741":0,"742":0,"743":0,"744":0,"745":0,"746":0,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"755":0,"756":0,"757":0,"758":0,"759":0,"760":0,"763":0,"764":0,"765":0,"766":0,"767":0,"768":0,"769":0,"770":0,"771":0,"774":0,"777":0,"778":0,"779":0,"780":0,"781":0,"782":0,"783":0,"784":0,"787":0,"788":0,"790":0,"791":0,"792":0,"793":0,"794":0,"795":0,"798":0,"802":0,"803":0,"805":0,"807":0,"808":0,"809":0,"810":0,"811":0,"814":0,"815":0,"816":0,"817":0,"820":0,"821":0,"822":0,"823":0,"825":0,"826":0,"829":0,"830":0,"831":0,"832":0,"833":0,"834":0,"835":0,"836":0,"837":0,"838":0,"839":0,"840":0,"843":0,"844":0,"847":0,"848":0,"850":0,"851":0,"852":0,"854":0,"855":0,"856":0,"858":0,"859":0,"860":0,"861":0,"862":0,"863":0,"864":0,"865":0,"866":0,"867":0,"868":0,"869":0,"871":0,"872":0,"873":0,"876":0,"877":0,"878":0,"879":0,"880":0,"882":0,"883":0,"884":0,"885":0,"886":0,"887":0,"888":0,"889":0,"890":0,"891":0,"892":0,"893":0,"894":0,"895":0,"897":0,"898":0,"899":0,"900":0,"901":0,"902":0,"903":0,"904":0,"905":0,"906":0,"907":0,"910":0,"911":0,"912":0,"913":0,"914":0,"915":0,"916":0,"918":0,"919":0,"920":0,"922":0,"923":0,"924":0,"925":0,"928":0,"929":0,"930":0,"932":0,"933":0,"934":0,"935":0,"936":0,"937":0,"938":0,"939":0,"940":0,"941":0,"942":0,"944":0,"945":0,"946":0,"947":0,"948":0,"950":0,"951":0,"952":0,"953":0,"954":0,"955":0,"956":0,"957":0,"958":0,"961":0,"962":0,"963":0,"964":0,"965":0,"966":0,"967":0,"968":0,"969":0,"970":0,"971":0,"974":0,"975":0,"976":0,"979":0,"980":0,"981":0,"982":0,"985":0,"986":0,"987":0,"989":0,"990":0,"991":0,"992":0,"993":0,"994":0,"995":0,"996":0,"997":0,"998":0,"999":0,"1000":0,"1002":0,"1003":0,"1004":0,"1005":0,"1006":0,"1008":0,"1009":0,"1010":0,"1011":0,"1012":0,"1013":0,"1014":0,"1018":0,"1019":0,"1020":0,"1021":0,"1022":0,"1024":0,"1026":0,"1027":0,"1028":0,"1031":0,"1032":0,"1033":0,"1034":0,"1035":0,"1036":0,"1037":0,"1038":0,"1039":0,"1040":0,"1044":0,"1045":0,"1046":0,"1047":0,"1048":0,"1049":0,"1050":0,"1051":0,"1052":0,"1053":0,"1056":0,"1057":0,"1058":0,"1060":0,"1061":0,"1062":0,"1063":0,"1064":0,"1066":0,"1068":0,"1069":0,"1070":0,"1071":0,"1072":0,"1073":0,"1074":0,"1076":0,"1077":0,"1078":0,"1080":0,"1082":0,"1083":0,"1084":0,"1085":0,"1086":0,"1087":0,"1088":0,"1090":0,"1091":0,"1092":0,"1094":0,"1096":0,"1097":0,"1099":0,"1100":0,"1101":0,"1102":0,"1103":0,"1107":0,"1108":0,"1109":0,"1110":0,"1111":0,"1112":0,"1113":0,"1115":0,"1116":0,"1117":0,"1118":0,"1119":0,"1120":0,"1121":0,"1123":0,"1124":0,"1125":0,"1126":0,"1127":0,"1128":0,"1130":0,"1131":0,"1132":0,"1133":0,"1134":0,"1135":0,"1137":0,"1138":0,"1139":0,"1140":0,"1141":0,"1143":0,"1145":0,"1146":0,"1147":0,"1149":0,"1150":0,"1151":0,"1154":0,"1155":0,"1156":0,"1157":0,"1158":0,"1159":0,"1160":0,"1161":0,"1162":0,"1163":0,"1164":0,"1165":0,"1166":0,"1167":0,"1168":0,"1169":0,"1170":0,"1172":0,"1173":0,"1174":0,"1175":0,"1176":0,"1178":0,"1179":0,"1180":0,"1181":0,"1182":0,"1184":0,"1185":0,"1186":0,"1187":0,"1188":0,"1189":0,"1190":0,"1191":0,"1192":0,"1193":0,"1195":0,"1196":0,"1197":0,"1198":0,"1199":0,"1200":0,"1203":0,"1204":0,"1205":0,"1206":0,"1207":0,"1208":0,"1210":0,"1212":0,"1213":0,"1214":0,"1215":0,"1216":0,"1218":0,"1220":0,"1221":0,"1222":0,"1223":0,"1224":0,"1225":0,"1226":0,"1227":0,"1229":0,"1231":0,"1232":0,"1233":0,"1234":0,"1235":0,"1236":0,"1237":0,"1239":0,"1240":0,"1241":0,"1242":0,"1243":0,"1244":0,"1245":0,"1246":0,"1247":0,"1249":0,"1251":0,"1252":0,"1254":0,"1255":0,"1256":0,"1257":0,"1258":0,"1260":0,"1262":0,"1264":0,"1267":0,"1268":0,"1269":0,"1270":0,"1271":0,"1272":0,"1273":0,"1274":0,"1275":0,"1276":0,"1278":0,"1279":0,"1280":0,"1282":0,"1283":0,"1284":0,"1285":0,"1286":0,"1288":0,"1290":0,"1291":0,"1292":0,"1293":0,"1294":0,"1295":0,"1296":0,"1297":0,"1298":0,"1299":0,"1300":0,"1301":0,"1302":0,"1303":0,"1304":0,"1305":0,"1306":0,"1307":0,"1308":0,"1310":0,"1311":0,"1312":0,"1313":0,"1314":0,"1315":0,"1316":0,"1317":0,"1318":0,"1319":0,"1320":0,"1321":0,"1322":0,"1323":0,"1324":0,"1325":0,"1326":0,"1327":0,"1328":0,"1329":0,"1332":0,"1333":0,"1334":0,"1335":0,"1336":0,"1337":0,"1338":0,"1339":0,"1340":0,"1341":0,"1342":0,"1343":0,"1344":0,"1345":0,"1347":0,"1348":0,"1349":0,"1350":0,"1351":0,"1352":0,"1354":0,"1355":0,"1356":0,"1358":0,"1359":0,"1360":0,"1361":0,"1362":0,"1363":0,"1364":0,"1365":0,"1366":0,"1368":0,"1369":0,"1370":0,"1374":0,"1375":0,"1376":0,"1377":0,"1378":0,"1379":0,"1380":0,"1381":0,"1382":0,"1383":0,"1384":0,"1385":0,"1386":0,"1387":0,"1388":0,"1389":0,"1390":0,"1391":0,"1392":0,"1393":0,"1394":0,"1395":0,"1397":0,"1400":0,"1401":0,"1402":0,"1403":0,"1404":0,"1405":0,"1406":0,"1407":0,"1408":0,"1409":0,"1410":0,"1411":0,"1412":0,"1413":0,"1414":0,"1415":0,"1419":0,"1420":0,"1421":0,"1422":0,"1423":0,"1424":0,"1425":0,"1427":0,"1428":0,"1429":0,"1430":0,"1431":0,"1432":0,"1433":0,"1434":0,"1435":0,"1436":0,"1437":0,"1438":0,"1439":0,"1440":0,"1444":0,"1445":0,"1446":0,"1447":0,"1448":0,"1449":0,"1450":0,"1451":0,"1452":0,"1453":0,"1454":0,"1455":0,"1456":0,"1457":0,"1458":0,"1459":0,"1460":0,"1461":0,"1462":0,"1463":0,"1464":0,"1465":0,"1466":0,"1468":0,"1469":0,"1470":0,"1471":0,"1472":0,"1474":0,"1475":0,"1477":0,"1478":0,"1480":0,"1481":0,"1482":0,"1483":0,"1484":0,"1486":0,"1488":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":1489,"column":-19128}},"locations":[{"start":{"line":1,"column":0},"end":{"line":1489,"column":-19128}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":1489,"column":-19128}},"loc":{"start":{"line":1,"column":0},"end":{"line":1489,"column":-19128}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/KeyboardShortcutsModal.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/KeyboardShortcutsModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":34}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":22}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":42}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":34}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":28}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":3}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":35}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":54}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":34}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":45}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":32}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":69}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":45}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":9}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":14}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":38}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":34}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":49}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":26}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":9}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":7}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":74}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":74}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":71}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":76}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":80}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":74}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":8}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":10}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":52}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":36}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":70}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":75}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":88}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":89}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":7}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":38}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":74}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":69}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":79}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":7}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":35}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":72}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":7}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":4}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":1}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":55}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":10}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":116}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":16}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":10}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":1}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":106}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":33}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":60}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":19}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":49}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":40}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":6}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":54}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":70}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":16}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":10}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":107}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":77}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":37}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":101}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":53}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":63}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":86}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":18}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":19}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":31}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":76}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":39}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":21}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":16}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":70}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":41}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":42}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":96}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":43}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":52}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":98}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":85}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":46}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":49}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":78}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":29}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":50}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":53}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":62}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":27}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":28}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":26}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":21}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":22}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":20}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":15}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":16}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":67}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":63}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":70}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":16}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":16}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":22}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":13}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":10}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":1}}},"s":{"0":0,"23":0,"24":0,"25":0,"26":0,"27":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"71":0,"72":0,"73":0,"74":0,"75":0,"77":0,"79":0,"80":0,"81":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"92":0,"93":0,"94":0,"95":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"106":0,"107":0,"108":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"146":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":147,"column":-1487}},"locations":[{"start":{"line":1,"column":0},"end":{"line":147,"column":-1487}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":147,"column":-1487}},"loc":{"start":{"line":1,"column":0},"end":{"line":147,"column":-1487}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/Layout.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/Layout.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":65}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":43}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":71}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":79}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":71}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":72}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":77}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":87}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":84}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":80}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":2}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":38}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":54}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":15}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":9}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":32}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":13}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":44}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":5}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":3}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":40}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":1}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":44}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":62}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":1}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":48}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":31}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":1}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":42}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":52}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":1}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":46}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":44}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":1}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":26}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":33}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":33}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":44}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":33}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":33}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":64}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":59}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":30}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":5}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":66}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":60}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":78}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":66}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":68}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":38}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":91}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":52}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":4}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":42}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":26}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":28}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":24}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":5}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":39}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":27}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":29}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":42}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":5}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":42}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":30}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":33}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":47}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":40}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":56}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":5}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":44}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":33}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":34}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":5}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":76}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":91}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":36}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":32}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":35}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":36}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":55}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":24}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":21}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":7}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":5}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":41}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":31}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":29}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":26}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":7}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":5}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":45}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":37}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":29}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":27}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":24}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":7}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":5}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":18}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":7}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":63}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":21}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":42}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":45}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":4}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":62}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":23}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":39}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":22}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":4}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":33}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":24}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":4}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":64}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":23}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":55}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":25}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":26}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":13}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":5}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":48}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":57}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":55}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":52}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":25}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":26}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":13}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":5}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":41}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":51}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":34}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":35}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":23}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":24}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":4}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":31}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":23}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":24}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":4}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":59}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":33}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":58}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":37}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":38}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":83}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":60}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":5}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":4}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":19}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":62}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":43}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":32}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":37}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":49}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":7}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":5}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":36}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":19}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":69}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":24}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":19}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":19}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":33}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":5}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":36}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":59}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":43}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":98}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":13}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":5}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":48}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":37}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":77}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":49}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":27}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":35}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":48}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":42}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":16}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":46}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":24}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":33}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":11}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":9}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":15}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":7}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":22}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":17}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":29}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":33}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":16}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":22}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":34}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":16}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":7}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":5}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":49}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":19}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":56}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":72}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":22}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":10}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":39}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":20}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":148}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":17}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":53}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":91}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":34}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":51}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":19}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":14}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":99}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":26}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":32}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":12}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":17}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":40}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":12}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":71}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":52}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":10}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":12}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":124}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":18}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":118}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":80}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":11}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":143}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":14}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":99}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":26}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":104}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":12}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":14}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":36}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":36}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":44}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":54}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":31}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":49}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":39}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":84}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":24}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":21}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":28}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":29}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":63}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":61}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":49}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":53}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":45}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":43}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":58}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":24}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":59}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":120}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":28}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":23}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":28}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":49}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":50}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":155}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":34}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":57}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":99}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":26}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":83}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":56}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":148}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":43}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":28}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":72}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":32}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":122}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":26}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":82}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":81}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":30}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":23}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":22}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":52}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":42}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":61}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":24}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":21}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":28}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":29}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":63}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":61}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":49}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":53}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":45}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":43}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":58}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":24}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":59}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":120}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":28}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":23}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":28}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":29}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":50}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":155}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":34}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":57}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":99}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":26}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":85}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":56}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":148}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":64}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":83}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":30}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":23}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":15}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":15}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":15}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":14}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":23}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":17}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":64}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":167}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":87}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":32}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":49}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":50}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":19}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":65}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":42}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":68}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":55}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":97}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":51}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":25}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":57}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":124}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":93}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":57}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":50}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":27}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":20}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":55}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":18}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":60}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":33}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":43}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":130}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":47}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":48}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":20}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":23}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":56}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":130}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":52}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":50}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":25}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":23}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":39}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":130}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":91}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":97}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":25}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":20}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":18}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":62}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":49}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":23}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":55}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":134}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":91}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":55}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":25}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":16}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":58}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":31}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":41}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":128}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":45}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":46}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":18}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":21}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":54}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":128}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":50}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":48}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":23}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":21}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":37}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":128}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":89}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":95}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":23}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":18}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":14}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":14}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":89}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":64}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":10}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":30}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":120}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":61}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":68}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":20}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":49}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":55}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":86}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":19}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":21}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":21}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":53}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":92}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":70}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":23}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":18}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":19}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":43}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":84}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":70}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":39}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":21}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":16}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":18}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":13}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":25}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":31}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":49}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":53}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":39}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":50}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":89}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":20}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":50}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":116}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":13}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":97}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":10}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":10}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":1}}},"s":{"0":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"43":0,"44":0,"45":0,"48":0,"49":0,"50":0,"53":0,"54":0,"55":0,"58":0,"59":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"83":0,"84":0,"85":0,"86":0,"87":0,"89":0,"90":0,"91":0,"92":0,"93":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"104":0,"105":0,"106":0,"107":0,"110":0,"111":0,"114":0,"115":0,"116":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"143":0,"144":0,"147":0,"148":0,"149":0,"150":0,"151":0,"153":0,"154":0,"155":0,"156":0,"157":0,"159":0,"160":0,"161":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"171":0,"172":0,"173":0,"175":0,"176":0,"177":0,"178":0,"179":0,"182":0,"183":0,"186":0,"187":0,"189":0,"190":0,"191":0,"193":0,"194":0,"195":0,"196":0,"199":0,"200":0,"201":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"221":0,"222":0,"223":0,"226":0,"227":0,"228":0,"229":0,"230":0,"233":0,"234":0,"236":0,"237":0,"238":0,"241":0,"242":0,"243":0,"244":0,"245":0,"247":0,"249":0,"250":0,"251":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"273":0,"274":0,"275":0,"276":0,"278":0,"279":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"299":0,"300":0,"301":0,"302":0,"303":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"324":0,"325":0,"326":0,"327":0,"329":0,"331":0,"332":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"361":0,"363":0,"364":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"373":0,"375":0,"376":0,"377":0,"379":0,"381":0,"382":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"411":0,"413":0,"414":0,"416":0,"417":0,"418":0,"419":0,"421":0,"422":0,"423":0,"424":0,"427":0,"428":0,"429":0,"430":0,"431":0,"433":0,"434":0,"436":0,"438":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"453":0,"454":0,"455":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"480":0,"481":0,"482":0,"483":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"492":0,"493":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"516":0,"517":0,"518":0,"520":0,"521":0,"524":0,"525":0,"526":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"550":0,"551":0,"552":0,"554":0,"555":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"572":0,"574":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":575,"column":-6689}},"locations":[{"start":{"line":1,"column":0},"end":{"line":575,"column":-6689}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":575,"column":-6689}},"loc":{"start":{"line":1,"column":0},"end":{"line":575,"column":-6689}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/MQTTDebugModal.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/MQTTDebugModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":78}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":90}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":39}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":53}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":75}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":53}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":86}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":55}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":49}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":39}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":46}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":71}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":5}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":38}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":55}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":22}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":76}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":6}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":5}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":39}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":56}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":22}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":76}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":6}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":5}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":37}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":51}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":22}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":76}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":6}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":5}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":19}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":49}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":40}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":6}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":54}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":70}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":16}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":19}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":48}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":79}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":5}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":31}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":43}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":31}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":35}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":30}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":29}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":14}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":26}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":7}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":20}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":7}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":4}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":50}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":37}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":90}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":4}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":74}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":52}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":23}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":5}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":76}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":61}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":41}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":44}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":5}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":16}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":4}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":56}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":32}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":38}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":33}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":75}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":21}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":7}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":31}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":48}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":67}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":69}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":56}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":42}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":7}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":18}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":7}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":43}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":10}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":89}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":102}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":99}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":15}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":80}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":68}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":16}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":17}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":29}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":74}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":37}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":19}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":14}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":85}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":51}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":31}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":21}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":25}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":35}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":56}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":52}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":46}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":23}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":21}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":25}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":55}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":51}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":44}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":23}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":19}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":23}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":33}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":52}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":69}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":44}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":21}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":19}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":23}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":33}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":39}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":34}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":84}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":21}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":38}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":94}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":20}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":31}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":36}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":65}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":62}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":16}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":20}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":54}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":49}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":19}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":16}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":51}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":45}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":103}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":20}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":27}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":56}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":35}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":64}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":193}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":16}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":31}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":23}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":52}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":104}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":43}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":25}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":18}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":109}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":21}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":57}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":78}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":43}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":49}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":56}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":19}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":15}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":23}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":21}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":56}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":92}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":42}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":46}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":56}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":19}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":49}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":23}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":21}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":57}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":102}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":43}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":47}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":56}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":19}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":47}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":23}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":18}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":16}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":14}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":12}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":31}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":87}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":32}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":94}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":60}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":35}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":97}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":18}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":43}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":94}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":67}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":85}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":18}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":39}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":71}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":59}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":58}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":24}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":22}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":31}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":109}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":65}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":23}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":55}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":60}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":65}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":56}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":29}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":27}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":47}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":73}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":27}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":68}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":39}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":59}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":57}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":29}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":83}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":26}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":35}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":185}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":58}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":28}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":67}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":59}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":28}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":24}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":17}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":18}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":14}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":99}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":51}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":31}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":56}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":84}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":21}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":42}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":16}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":56}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":19}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":14}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":12}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":10}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":1}}},"s":{"0":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"20":0,"21":0,"22":0,"23":0,"24":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"57":0,"58":0,"59":0,"60":0,"61":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"75":0,"76":0,"77":0,"78":0,"80":0,"81":0,"82":0,"83":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"93":0,"94":0,"97":0,"98":0,"100":0,"101":0,"102":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"115":0,"116":0,"117":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"128":0,"129":0,"130":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"142":0,"144":0,"146":0,"147":0,"148":0,"149":0,"151":0,"153":0,"155":0,"156":0,"157":0,"158":0,"159":0,"161":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"181":0,"182":0,"183":0,"184":0,"185":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"203":0,"204":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"226":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"237":0,"239":0,"240":0,"241":0,"242":0,"245":0,"246":0,"247":0,"249":0,"250":0,"251":0,"252":0,"253":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"262":0,"263":0,"264":0,"265":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"285":0,"286":0,"288":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"298":0,"299":0,"300":0,"302":0,"304":0,"305":0,"307":0,"310":0,"311":0,"312":0,"313":0,"314":0,"316":0,"318":0,"320":0,"321":0,"323":0,"324":0,"325":0,"326":0,"328":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":329,"column":-5881}},"locations":[{"start":{"line":1,"column":0},"end":{"line":329,"column":-5881}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":329,"column":-5881}},"loc":{"start":{"line":1,"column":0},"end":{"line":329,"column":-5881}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/ModelViewer.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/ModelViewer.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":72}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":37}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":22}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":37}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":3}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":66}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":28}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":15}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":72}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":72}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":72}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":16}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":6}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":3}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":16}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":1}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":41}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":69}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":32}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":56}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":49}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":35}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":34}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":35}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":65}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":53}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":34}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":20}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":47}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":47}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":46}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":8}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":5}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":69}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":55}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":36}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":21}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":46}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":46}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":45}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":8}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":5}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":54}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":43}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":5}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":3}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":16}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":1}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":123}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":49}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":48}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":37}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":33}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":72}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":71}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":43}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":27}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":47}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":62}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":3}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":52}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":76}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":4}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":23}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":88}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":23}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":52}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":16}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":51}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":32}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":48}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":9}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":7}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":5}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":35}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":3}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":53}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":47}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":64}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":51}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":36}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":46}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":28}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":34}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":63}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":54}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":40}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":36}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":37}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":67}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":55}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":36}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":22}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":49}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":49}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":48}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":10}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":7}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":71}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":57}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":38}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":23}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":48}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":48}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":47}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":10}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":7}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":56}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":45}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":7}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":5}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":70}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":56}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":42}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":152}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":20}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":52}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":21}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":59}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":68}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":65}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":41}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":35}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":55}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":65}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":106}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":46}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":56}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":15}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":88}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":20}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":32}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":13}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":11}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":9}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":7}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":5}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":28}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":54}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":5}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":3}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":62}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":33}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":71}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":51}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":37}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":55}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":30}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":73}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":47}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":5}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":3}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":33}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":1}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":71}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":46}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":59}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":53}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":55}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":64}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":59}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":3}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":77}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":36}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":34}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":18}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":1}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":114}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":52}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":63}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":52}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":65}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":57}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":47}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":58}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":19}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":38}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":43}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":40}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":42}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":36}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":49}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":29}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":79}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":39}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":31}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":66}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":36}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":52}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":47}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":35}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":68}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":34}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":34}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":35}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":63}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":28}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":71}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":49}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":32}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":72}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":51}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":33}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":60}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":51}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":89}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":26}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":80}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":55}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":22}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":24}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":20}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":29}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":7}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":63}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":36}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":71}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":21}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":28}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":27}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":51}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":24}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":37}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":6}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":14}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":14}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":22}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":60}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":33}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":8}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":21}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":42}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":33}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":57}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":9}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":54}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":26}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":24}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":29}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":11}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":40}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":57}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":36}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":42}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":58}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":38}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":55}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":55}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":69}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":44}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":39}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":43}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":42}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":18}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":47}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":56}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":15}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":55}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":46}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":46}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":17}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":43}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":13}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":11}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":16}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":54}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":55}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":64}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":43}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":13}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":11}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":9}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":39}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":59}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":30}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":52}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":31}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":66}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":28}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":11}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":41}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":47}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":29}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":13}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":11}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":9}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":58}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":58}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":38}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":38}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":39}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":39}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":9}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":25}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":63}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":68}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":64}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":71}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":44}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":28}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":47}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":47}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":46}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":10}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":42}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":26}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":26}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":8}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":23}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":30}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":26}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":9}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":32}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":29}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":38}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":39}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":28}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":38}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":29}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":6}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":52}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":18}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":57}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":40}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":25}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":25}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":49}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":6}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":25}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":27}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":51}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":52}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":47}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":35}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":5}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":4}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":36}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":28}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":56}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":5}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":4}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":10}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":45}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":72}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":19}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":92}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":71}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":14}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":17}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":92}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":49}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":14}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":30}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":62}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":74}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":42}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":19}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":75}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":43}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":19}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":68}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":45}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":19}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":14}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":10}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":1}}},"s":{"0":0,"36":0,"37":0,"38":0,"39":0,"40":0,"45":0,"46":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"61":0,"63":0,"64":0,"65":0,"67":0,"68":0,"69":0,"70":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"99":0,"100":0,"101":0,"102":0,"103":0,"106":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"116":0,"117":0,"118":0,"120":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"135":0,"136":0,"139":0,"140":0,"141":0,"142":0,"143":0,"145":0,"148":0,"149":0,"150":0,"151":0,"152":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"174":0,"175":0,"176":0,"177":0,"180":0,"181":0,"182":0,"184":0,"186":0,"187":0,"188":0,"189":0,"192":0,"193":0,"195":0,"196":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"213":0,"214":0,"215":0,"216":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"227":0,"228":0,"229":0,"230":0,"232":0,"233":0,"235":0,"236":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"247":0,"248":0,"251":0,"253":0,"254":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"265":0,"266":0,"268":0,"269":0,"270":0,"273":0,"274":0,"275":0,"278":0,"279":0,"280":0,"283":0,"284":0,"285":0,"286":0,"287":0,"290":0,"291":0,"292":0,"293":0,"296":0,"297":0,"299":0,"300":0,"301":0,"303":0,"304":0,"305":0,"308":0,"309":0,"310":0,"311":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"347":0,"348":0,"349":0,"350":0,"351":0,"353":0,"354":0,"357":0,"358":0,"359":0,"360":0,"362":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"393":0,"394":0,"395":0,"396":0,"398":0,"399":0,"400":0,"401":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"412":0,"413":0,"416":0,"419":0,"420":0,"421":0,"422":0,"424":0,"427":0,"428":0,"429":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"477":0,"478":0,"479":0,"480":0,"481":0,"483":0,"484":0,"485":0,"487":0,"488":0,"489":0,"490":0,"493":0,"494":0,"495":0,"496":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"512":0,"514":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":515,"column":-93}},"locations":[{"start":{"line":1,"column":0},"end":{"line":515,"column":-93}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":515,"column":-93}},"loc":{"start":{"line":1,"column":0},"end":{"line":515,"column":-93}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/ModelViewerModal.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/ModelViewerModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":88}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":67}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":78}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":47}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":19}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":49}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":40}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":6}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":54}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":70}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":16}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":19}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":41}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":21}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":30}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":29}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":29}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":36}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":32}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":9}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":26}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":8}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":20}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":105}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":27}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":26}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":9}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":18}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":36}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":38}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":99}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":82}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":4}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":10}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":8}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":85}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":23}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":10}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":128}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":44}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":105}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":92}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":51}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":79}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":50}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":21}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":64}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":39}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":21}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":16}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":14}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":26}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":68}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":19}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":74}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":48}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":100}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":34}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":68}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":42}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":56}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":61}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":17}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":41}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":91}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":21}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":19}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":77}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":48}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":100}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":37}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":68}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":42}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":56}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":61}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":17}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":43}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":88}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":21}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":16}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":52}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":22}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":76}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":75}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":18}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":52}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":24}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":53}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":53}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":39}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":14}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":55}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":24}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":55}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":53}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":39}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":14}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":92}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":18}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":14}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":12}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":10}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":1}}},"s":{"0":0,"21":0,"22":0,"23":0,"24":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"35":0,"36":0,"37":0,"38":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"49":0,"50":0,"51":0,"52":0,"53":0,"55":0,"58":0,"59":0,"60":0,"61":0,"63":0,"64":0,"65":0,"66":0,"68":0,"69":0,"70":0,"73":0,"74":0,"75":0,"76":0,"77":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"100":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"115":0,"117":0,"118":0,"119":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"141":0,"143":0,"145":0,"146":0,"147":0,"149":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":150,"column":-2232}},"locations":[{"start":{"line":1,"column":0},"end":{"line":150,"column":-2232}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":150,"column":-2232}},"loc":{"start":{"line":1,"column":0},"end":{"line":150,"column":-2232}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/NotificationLogViewer.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/NotificationLogViewer.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":33}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":46}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":31}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":35}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":31}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":33}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":29}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":37}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":33}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":31}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":37}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":15}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":2}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":46}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":31}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":37}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":31}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":35}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":36}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":35}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":33}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":32}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":37}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":26}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":2}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":80}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":39}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":35}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":38}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":68}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":62}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":69}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":58}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":44}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":11}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":17}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":50}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":7}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":5}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":36}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":47}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":53}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":5}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":37}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":52}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":26}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":41}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":73}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":78}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":6}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":32}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":67}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":6}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":5}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":43}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":35}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":27}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":48}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":40}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":66}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":69}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":113}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":4}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":10}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":89}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":136}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":99}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":51}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":60}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":82}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":16}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":17}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":29}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":74}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":11}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":19}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":14}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":19}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":90}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":61}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":48}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":109}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":21}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":73}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":51}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":42}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":21}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":43}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":71}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":49}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":46}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":23}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":18}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":16}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":95}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":17}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":24}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":61}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":165}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":52}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":50}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":52}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":52}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":19}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":92}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":18}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":29}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":38}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":67}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":114}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":14}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":18}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":36}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":17}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":21}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":31}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":37}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":35}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":29}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":58}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":47}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":14}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":19}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":17}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":21}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":31}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":50}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":46}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":55}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":40}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":58}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":44}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":14}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":19}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":14}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":52}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":24}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":55}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":75}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":18}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":41}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":39}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":34}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":25}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":30}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":27}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":52}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":87}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":41}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":18}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":17}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":18}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":63}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":71}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":37}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":88}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":18}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":18}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":14}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":12}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":10}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":1}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":19}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":6}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":13}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":11}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":13}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":4}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":4}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":10}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":8}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":72}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":19}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":57}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":44}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":9}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":13}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":111}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":26}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":24}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":71}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":63}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":101}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":58}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":15}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":61}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":51}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":15}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":30}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":52}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":30}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":17}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":59}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":38}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":15}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":23}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":68}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":70}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":15}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":22}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":98}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":15}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":65}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":61}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":16}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":15}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":67}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":83}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":16}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":49}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":17}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":64}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":73}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":18}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":67}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":54}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":74}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":16}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":14}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":10}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":1}}},"s":{"0":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"54":0,"55":0,"56":0,"57":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"71":0,"72":0,"73":0,"74":0,"76":0,"77":0,"78":0,"80":0,"81":0,"83":0,"84":0,"85":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"97":0,"98":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"117":0,"118":0,"122":0,"123":0,"124":0,"125":0,"126":0,"128":0,"129":0,"130":0,"131":0,"132":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"142":0,"144":0,"146":0,"147":0,"148":0,"149":0,"150":0,"152":0,"153":0,"155":0,"156":0,"158":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"167":0,"168":0,"170":0,"171":0,"173":0,"174":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"202":0,"203":0,"204":0,"206":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"227":0,"228":0,"229":0,"231":0,"232":0,"234":0,"237":0,"238":0,"239":0,"241":0,"242":0,"243":0,"245":0,"246":0,"247":0,"248":0,"251":0,"252":0,"253":0,"255":0,"256":0,"258":0,"260":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"278":0,"279":0,"280":0,"281":0,"282":0,"284":0,"286":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":287,"column":-5395}},"locations":[{"start":{"line":1,"column":0},"end":{"line":287,"column":-5395}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":287,"column":-5395}},"loc":{"start":{"line":1,"column":0},"end":{"line":287,"column":-5395}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/NotificationProviderCard.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/NotificationProviderCard.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":33}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":49}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":34}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":15}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":23}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":23}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":17}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":21}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":21}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":2}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":95}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":39}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":68}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":54}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":99}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":39}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":27}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":29}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":5}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":74}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":38}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":104}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":22}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":78}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":6}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":5}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":38}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":66}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":22}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":78}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":6}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":5}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":36}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":64}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":28}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":28}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":78}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":6}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":30}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":62}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":6}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":5}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":47}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":25}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":16}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":4}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":10}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":6}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":33}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":37}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":65}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":53}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":108}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":107}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":20}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":19}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":75}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":126}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":20}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":18}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":53}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":41}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":143}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":65}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":108}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":95}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":21}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":42}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":83}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":16}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":18}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":16}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":29}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":71}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":72}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":78}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":18}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":54}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":71}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":75}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":18}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":53}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":41}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":101}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":44}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":110}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":42}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":100}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":43}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":107}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":44}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":108}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":45}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":103}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":43}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":101}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":42}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":108}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":45}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":111}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":47}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":104}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":50}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":111}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":46}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":117}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":44}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":21}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":47}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":119}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":48}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":51}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":21}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":16}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":32}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":19}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":23}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":33}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":47}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":30}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":36}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":38}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":16}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":32}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":41}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":60}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":44}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":16}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":21}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":16}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":26}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":83}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":32}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":54}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":46}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":16}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":37}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":51}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":47}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":47}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":18}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":17}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":54}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":164}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":54}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":47}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":19}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":27}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":47}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":49}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":19}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":26}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":80}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":65}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":21}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":63}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":98}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":22}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":23}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":44}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":85}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":18}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":20}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":41}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":95}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":67}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":69}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":25}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":53}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":94}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":20}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":22}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":67}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":71}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":25}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":56}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":97}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":20}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":22}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":67}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":68}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":25}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":54}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":95}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":20}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":22}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":67}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":69}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":25}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":55}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":96}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":20}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":22}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":67}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":23}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":77}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":86}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":24}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":25}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":56}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":97}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":20}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":22}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":20}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":41}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":97}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":67}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":71}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":25}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":57}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":98}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":20}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":22}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":67}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":69}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":25}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":55}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":96}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":20}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":22}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":67}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":68}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":25}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":54}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":95}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":20}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":22}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":67}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":23}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":73}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":96}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":24}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":25}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":66}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":98}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":20}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":22}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":20}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":41}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":93}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":67}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":23}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":71}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":101}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":24}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":25}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":68}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":100}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":20}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":22}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":67}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":23}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":74}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":104}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":24}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":25}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":71}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":103}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":20}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":22}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":20}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":41}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":67}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":59}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":64}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":69}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":24}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":25}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":58}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":99}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":20}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":22}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":50}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":88}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":98}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":61}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":67}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":59}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":127}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":29}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":26}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":98}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":24}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":20}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":41}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":67}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":59}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":69}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":70}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":24}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":25}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":59}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":100}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":20}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":22}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":51}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":88}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":110}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":61}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":67}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":59}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":83}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":29}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":26}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":98}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":24}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":20}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":47}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":23}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":27}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":37}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":50}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":36}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":47}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":25}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":23}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":27}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":37}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":60}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":61}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":48}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":25}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":20}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":18}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":22}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":13}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":29}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":21}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":46}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":96}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":30}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":26}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":28}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":36}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":40}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":12}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":54}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":10}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":7}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":1}}},"s":{"0":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"25":0,"26":0,"27":0,"28":0,"29":0,"32":0,"33":0,"34":0,"35":0,"37":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"68":0,"69":0,"70":0,"71":0,"73":0,"74":0,"75":0,"76":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"90":0,"91":0,"92":0,"95":0,"96":0,"98":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"108":0,"109":0,"110":0,"111":0,"112":0,"114":0,"115":0,"116":0,"117":0,"121":0,"122":0,"123":0,"125":0,"126":0,"128":0,"129":0,"131":0,"132":0,"134":0,"135":0,"137":0,"138":0,"140":0,"141":0,"143":0,"144":0,"146":0,"147":0,"149":0,"150":0,"152":0,"153":0,"155":0,"156":0,"157":0,"159":0,"161":0,"162":0,"163":0,"164":0,"165":0,"167":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"181":0,"182":0,"184":0,"185":0,"187":0,"188":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"200":0,"202":0,"203":0,"207":0,"208":0,"209":0,"211":0,"212":0,"214":0,"215":0,"216":0,"218":0,"220":0,"223":0,"224":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"238":0,"239":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"286":0,"287":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"326":0,"327":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"377":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"404":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"414":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"423":0,"424":0,"425":0,"426":0,"428":0,"429":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"445":0,"447":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":448,"column":-10167}},"locations":[{"start":{"line":1,"column":0},"end":{"line":448,"column":-10167}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":448,"column":-10167}},"loc":{"start":{"line":1,"column":0},"end":{"line":448,"column":-10167}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/NotificationTemplateEditor.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/NotificationTemplateEditor.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":100}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":39}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":52}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":78}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":75}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":58}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":55}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":44}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":37}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":38}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":5}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":88}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":65}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":85}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":40}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":38}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":36}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":34}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":7}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":80}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":5}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":19}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":49}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":40}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":6}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":54}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":70}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":16}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":38}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":104}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":22}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":78}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":16}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":6}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":30}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":28}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":6}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":5}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":37}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":65}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":35}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":53}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":51}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":78}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":6}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":30}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":28}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":6}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":5}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":48}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":23}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":19}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":32}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":36}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":13}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":5}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":31}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":35}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":13}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":5}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":27}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":36}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":34}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":7}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":4}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":48}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":37}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":26}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":42}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":38}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":30}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":44}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":38}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":54}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":30}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":22}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":23}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":52}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":55}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":10}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":4}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":106}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":10}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":89}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":102}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":108}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":59}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":42}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":15}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":17}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":29}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":82}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":53}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":19}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":14}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":87}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":21}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":101}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":21}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":18}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":15}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":78}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":20}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":18}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":25}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":35}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":64}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":164}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":49}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":14}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":16}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":15}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":78}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":20}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":21}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":27}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":34}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":63}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":22}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":194}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":48}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":14}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":16}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":30}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":17}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":80}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":22}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":52}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":61}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":25}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":34}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":33}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":60}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":216}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":48}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":30}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":27}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":19}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":20}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":61}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":18}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":18}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":15}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":68}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":93}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":43}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":22}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":21}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":29}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":60}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":81}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":47}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":23}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":18}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":29}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":101}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":35}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":83}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":64}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":24}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":31}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":20}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":25}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":77}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":83}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":26}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":25}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":76}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":98}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":26}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":21}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":59}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":24}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":20}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":16}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":15}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":108}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":17}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":25}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":27}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":50}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":46}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":61}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":40}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":63}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":52}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":14}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":19}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":38}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":72}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":21}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":19}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":36}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":64}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":43}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":65}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":49}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":16}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":21}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":16}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":14}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":12}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":10}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":1}}},"s":{"0":0,"12":0,"13":0,"14":0,"16":0,"17":0,"18":0,"19":0,"22":0,"23":0,"24":0,"25":0,"28":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"75":0,"76":0,"77":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"88":0,"89":0,"90":0,"91":0,"92":0,"94":0,"95":0,"96":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"105":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"115":0,"117":0,"118":0,"119":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"129":0,"130":0,"131":0,"134":0,"135":0,"136":0,"137":0,"138":0,"142":0,"143":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"156":0,"157":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"171":0,"172":0,"173":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"191":0,"192":0,"196":0,"197":0,"198":0,"199":0,"201":0,"202":0,"203":0,"204":0,"205":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"229":0,"231":0,"233":0,"235":0,"236":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"247":0,"248":0,"250":0,"251":0,"253":0,"255":0,"256":0,"258":0,"259":0,"260":0,"261":0,"263":0,"264":0,"266":0,"267":0,"269":0,"270":0,"271":0,"272":0,"273":0,"275":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":276,"column":-3307}},"locations":[{"start":{"line":1,"column":0},"end":{"line":276,"column":-3307}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":276,"column":-3307}},"loc":{"start":{"line":1,"column":0},"end":{"line":276,"column":-3307}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/PhotoGalleryModal.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/PhotoGalleryModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":35}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":12}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":14}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":9}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":10}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":11}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":28}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":54}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":68}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":19}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":49}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":40}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":76}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":93}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":6}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":54}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":70}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":31}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":19}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":40}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":54}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":5}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":36}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":28}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":14}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":16}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":3}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":44}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":67}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":32}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":45}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":25}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":67}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":17}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":4}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":30}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":19}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":33}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":5}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":4}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":10}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":8}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":81}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":23}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":10}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":56}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":44}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":81}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":15}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":79}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":51}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":57}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":16}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":16}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":51}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":75}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":46}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":21}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":26}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":119}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":46}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":23}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":19}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":31}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":80}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":39}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":21}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":16}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":14}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":102}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":32}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":19}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":59}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":111}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":60}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":21}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":14}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":26}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":45}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":71}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":56}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":12}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":48}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":19}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":59}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":112}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":61}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":21}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":14}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":31}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":69}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":43}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":21}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":27}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":54}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":94}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":40}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":42}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":66}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":19}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":20}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":64}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":48}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":56}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":18}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":23}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":15}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":16}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":12}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":29}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":21}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":30}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":61}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":30}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":26}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":28}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":37}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":40}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":12}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":54}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":10}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":10}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":1}}},"s":{"0":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"36":0,"37":0,"38":0,"39":0,"40":0,"42":0,"43":0,"44":0,"45":0,"47":0,"48":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"57":0,"58":0,"59":0,"60":0,"61":0,"63":0,"64":0,"65":0,"66":0,"68":0,"69":0,"70":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"84":0,"85":0,"86":0,"87":0,"88":0,"90":0,"91":0,"92":0,"94":0,"95":0,"96":0,"97":0,"100":0,"102":0,"103":0,"104":0,"105":0,"107":0,"108":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"120":0,"121":0,"122":0,"123":0,"125":0,"126":0,"128":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"152":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"168":0,"170":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":171,"column":-2890}},"locations":[{"start":{"line":1,"column":0},"end":{"line":171,"column":-2890}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":171,"column":-2890}},"loc":{"start":{"line":1,"column":0},"end":{"line":171,"column":-2890}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/PrintCalendar.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/PrintCalendar.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":32}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":79}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":61}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":46}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":34}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":37}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":43}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":7}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":29}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":38}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":54}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":85}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":31}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":67}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":33}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":23}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":40}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":22}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":30}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":61}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":32}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":25}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":20}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":7}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":45}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":26}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":73}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":20}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":11}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":39}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":7}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":42}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":45}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":5}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":33}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":30}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":5}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":55}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":27}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":62}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":39}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":44}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":39}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":54}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":53}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":54}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":28}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":4}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":70}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":10}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":37}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":38}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":55}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":14}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":19}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":47}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":117}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":19}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":16}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":11}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":12}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":36}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":52}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":38}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":16}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":23}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":71}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":72}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":19}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":18}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":13}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":14}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":41}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":65}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":55}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":69}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":25}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":67}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":15}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":62}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":54}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":81}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":22}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":20}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":33}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":107}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":96}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":18}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":15}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":16}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":11}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":12}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":76}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":25}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":38}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":62}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":66}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":66}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":66}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":63}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":14}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":25}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":12}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":10}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":1}}},"s":{"0":0,"7":0,"8":0,"10":0,"11":0,"12":0,"13":0,"14":0,"17":0,"18":0,"19":0,"20":0,"22":0,"23":0,"24":0,"25":0,"27":0,"28":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"46":0,"47":0,"48":0,"50":0,"51":0,"52":0,"54":0,"55":0,"57":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"68":0,"70":0,"71":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"80":0,"81":0,"82":0,"83":0,"85":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"94":0,"95":0,"96":0,"97":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"108":0,"109":0,"110":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"119":0,"120":0,"121":0,"122":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"138":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":139,"column":-899}},"locations":[{"start":{"line":1,"column":0},"end":{"line":139,"column":-899}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":139,"column":-899}},"loc":{"start":{"line":1,"column":0},"end":{"line":139,"column":-899}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/PrinterQueueWidget.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/PrinterQueueWidget.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":49}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":64}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":33}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":36}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":25}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":46}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":29}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":39}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":66}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":66}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":35}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":1}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":76}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":36}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":46}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":54}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":27}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":5}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":30}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":42}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":27}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":16}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":3}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":10}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":9}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":17}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":104}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":63}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":64}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":72}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":42}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":68}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":55}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":76}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":16}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":16}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":14}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":63}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":76}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":41}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":66}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":17}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":32}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":93}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":33}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":19}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":62}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":14}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":12}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":11}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":1}}},"s":{"0":0,"9":0,"10":0,"11":0,"12":0,"13":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"29":0,"30":0,"32":0,"33":0,"34":0,"36":0,"37":0,"38":0,"39":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"61":0,"62":0,"63":0,"64":0,"66":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":67,"column":-822}},"locations":[{"start":{"line":1,"column":0},"end":{"line":67,"column":-822}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":67,"column":-822}},"loc":{"start":{"line":1,"column":0},"end":{"line":67,"column":-822}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/ProjectPageModal.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/ProjectPageModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":94}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":39}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":52}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":84}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":44}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":9}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":60}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":50}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":56}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":5}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":38}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":89}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":22}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":87}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":26}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":22}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":6}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":5}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":19}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":49}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":31}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":42}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":38}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":31}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":29}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":16}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":20}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":9}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":7}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":6}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":56}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":72}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":47}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":21}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":43}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":45}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":4}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":33}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":17}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":38}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":50}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":44}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":42}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":54}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":66}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":7}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":23}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":4}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":28}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":36}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":4}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":34}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":24}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":20}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":4}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":42}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":103}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":67}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":43}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":45}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":38}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":7}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":48}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":35}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":45}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":37}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":63}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":9}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":23}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":53}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":47}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":55}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":80}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":11}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":9}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":28}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":45}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":55}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":56}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":11}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":73}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":9}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":71}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":42}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":38}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":9}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":54}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":7}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":16}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":6}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":63}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":4}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":37}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":24}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":30}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":27}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":32}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":24}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":56}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":39}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":16}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":5}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":4}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":10}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":8}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":85}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":35}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":118}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":99}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":51}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":61}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":61}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":92}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":17}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":16}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":51}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":42}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":74}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":50}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":23}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":27}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":16}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":77}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":25}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":23}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":35}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":27}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":38}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":53}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":51}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":25}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":17}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":19}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":31}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":87}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":55}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":21}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":16}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":14}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":52}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":25}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":68}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":116}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":18}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":21}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":60}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":18}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":42}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":63}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":72}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":65}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":42}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":18}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":18}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":41}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":39}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":41}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":30}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":24}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":31}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":48}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":89}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":39}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":140}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":20}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":40}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":93}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":62}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":32}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":61}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":66}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":28}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":35}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":55}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":96}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":46}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":112}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":24}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":26}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":45}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":79}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":52}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":59}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":58}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":28}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":95}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":43}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":53}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":72}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":64}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":30}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":28}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":49}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":77}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":54}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":62}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":26}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":32}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":61}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":70}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":28}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":35}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":54}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":95}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":45}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":112}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":24}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":26}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":44}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":79}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":56}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":58}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":28}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":42}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":88}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":42}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":27}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":22}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":20}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":58}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":43}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":94}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":23}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":32}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":35}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":58}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":90}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":56}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":22}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":24}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":94}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":48}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":76}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":24}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":22}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":22}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":95}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":72}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":94}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":23}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":32}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":47}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":28}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":35}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":60}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":101}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":51}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":129}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":24}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":37}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":68}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":100}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":60}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":24}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":26}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":22}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":53}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":93}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":59}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":28}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":98}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":52}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":82}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":28}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":26}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":57}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":63}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":60}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":28}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":23}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":22}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":40}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":43}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":118}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":49}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":47}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":23}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":88}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":52}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":29}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":38}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":68}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":153}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":28}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":39}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":40}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":64}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":26}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":31}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":23}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":24}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":22}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":47}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":74}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":20}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":92}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":35}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":45}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":95}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":56}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":22}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":22}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":18}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":14}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":12}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":72}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":12}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":85}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":53}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":17}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":29}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":34}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":73}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":14}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":47}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":129}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":58}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":19}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":14}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":51}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":52}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":64}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":48}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":12}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":17}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":29}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":34}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":92}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":14}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":66}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":130}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":59}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":19}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":17}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":55}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":116}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":48}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":19}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":64}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":57}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":16}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":14}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":10}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":1}}},"s":{"0":0,"24":0,"25":0,"26":0,"27":0,"28":0,"35":0,"37":0,"38":0,"39":0,"40":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"69":0,"70":0,"71":0,"72":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"86":0,"87":0,"88":0,"90":0,"91":0,"92":0,"93":0,"96":0,"98":0,"99":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"109":0,"111":0,"112":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"125":0,"126":0,"127":0,"128":0,"129":0,"131":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"141":0,"142":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"153":0,"154":0,"155":0,"156":0,"157":0,"159":0,"160":0,"161":0,"162":0,"164":0,"166":0,"167":0,"168":0,"169":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"179":0,"181":0,"182":0,"183":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"192":0,"194":0,"195":0,"197":0,"198":0,"199":0,"201":0,"202":0,"203":0,"204":0,"207":0,"208":0,"209":0,"210":0,"211":0,"214":0,"215":0,"217":0,"220":0,"221":0,"222":0,"223":0,"224":0,"226":0,"227":0,"230":0,"231":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"243":0,"244":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"272":0,"273":0,"275":0,"279":0,"280":0,"281":0,"282":0,"283":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"298":0,"299":0,"300":0,"301":0,"302":0,"306":0,"307":0,"308":0,"309":0,"311":0,"312":0,"315":0,"316":0,"317":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"334":0,"338":0,"339":0,"340":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"359":0,"360":0,"361":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"371":0,"372":0,"373":0,"374":0,"376":0,"378":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"415":0,"417":0,"418":0,"420":0,"422":0,"423":0,"426":0,"427":0,"428":0,"429":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"439":0,"440":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"457":0,"458":0,"460":0,"461":0,"462":0,"464":0,"465":0,"467":0,"468":0,"469":0,"470":0,"472":0,"474":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":475,"column":-8498}},"locations":[{"start":{"line":1,"column":0},"end":{"line":475,"column":-8498}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":475,"column":-8498}},"loc":{"start":{"line":1,"column":0},"end":{"line":475,"column":-8498}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/QRCodeModal.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/QRCodeModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":34}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":84}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":60}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":19}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":49}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":40}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":6}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":54}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":70}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":16}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":32}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":45}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":26}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":48}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":17}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":4}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":10}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":8}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":85}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":23}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":10}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":104}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":44}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":105}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":71}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":17}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":29}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":74}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":37}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":19}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":14}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":56}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":86}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":25}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":14}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":56}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":16}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":29}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":27}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":35}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":14}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":16}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":66}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":14}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":62}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":44}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":19}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":14}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":12}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":10}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":1}}},"s":{"0":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"30":0,"31":0,"32":0,"33":0,"35":0,"36":0,"37":0,"40":0,"41":0,"42":0,"43":0,"44":0,"46":0,"47":0,"48":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"64":0,"65":0,"66":0,"68":0,"69":0,"70":0,"71":0,"73":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":74,"column":-817}},"locations":[{"start":{"line":1,"column":0},"end":{"line":74,"column":-817}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":74,"column":-817}},"loc":{"start":{"line":1,"column":0},"end":{"line":74,"column":-817}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/ReprintModal.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/ReprintModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":97}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":78}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":19}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":49}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":40}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":6}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":54}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":70}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":16}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":67}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":27}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":29}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":5}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":39}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":23}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":67}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":60}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":6}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":22}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":18}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":16}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":6}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":5}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":68}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":10}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":89}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":40}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":21}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":66}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":74}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":64}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":39}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":21}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":16}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":54}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":79}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":14}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":30}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":54}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":75}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":18}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":45}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":62}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":18}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":44}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":48}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":23}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":34}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":64}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":103}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":50}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":62}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":90}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":21}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":22}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":49}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":52}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":45}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":50}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":23}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":28}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":44}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":54}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":46}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":45}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":25}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":22}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":24}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":45}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":76}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":59}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":79}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":24}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":24}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":25}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":17}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":18}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":39}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":109}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":83}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":18}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":38}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":77}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":21}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":19}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":54}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":70}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":32}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":44}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":18}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":62}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":19}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":18}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":49}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":19}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":21}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":16}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":22}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":13}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":10}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":1}}},"s":{"0":0,"14":0,"15":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"26":0,"27":0,"28":0,"29":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"42":0,"44":0,"45":0,"46":0,"47":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"56":0,"57":0,"58":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"68":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"108":0,"109":0,"110":0,"111":0,"115":0,"116":0,"118":0,"119":0,"120":0,"121":0,"122":0,"124":0,"125":0,"126":0,"128":0,"130":0,"131":0,"133":0,"135":0,"136":0,"137":0,"138":0,"139":0,"141":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":142,"column":-2572}},"locations":[{"start":{"line":1,"column":0},"end":{"line":142,"column":-2572}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":142,"column":-2572}},"loc":{"start":{"line":1,"column":0},"end":{"line":142,"column":-2572}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/RestoreModal.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/RestoreModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":49}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":23}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":51}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":51}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":29}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":23}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":25}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":41}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":23}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":2}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":84}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":60}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":52}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":70}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":67}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":87}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":54}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":19}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":49}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":65}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":6}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":54}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":70}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":23}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":72}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":37}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":15}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":28}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":5}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":4}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":37}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":30}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":26}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":9}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":69}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":31}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":25}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":34}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":20}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":7}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":13}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":17}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":23}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":75}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":9}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":25}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":5}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":4}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":48}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":35}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":33}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":31}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":30}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":14}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":27}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":7}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":18}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":7}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":4}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":40}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":94}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":8}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":50}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":10}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":8}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":85}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":27}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":68}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":20}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":9}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":8}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":40}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":37}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":101}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":53}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":50}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":53}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":56}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":58}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":48}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":50}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":18}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":58}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":53}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":62}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":55}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":48}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":20}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":19}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":65}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":59}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":59}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":99}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":21}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":55}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":79}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":92}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":57}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":20}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":20}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":18}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":39}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":21}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":33}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":89}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":41}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":23}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":16}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":35}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":14}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":45}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":21}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":24}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":38}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":31}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":39}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":38}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":47}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":20}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":25}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":33}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":65}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":97}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":34}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":64}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":78}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":23}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":37}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":95}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":59}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":80}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":28}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":88}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":54}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":80}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":28}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":27}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":22}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":89}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":66}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":111}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":70}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":87}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":92}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":85}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":85}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":90}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":92}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":101}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":91}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":27}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":26}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":24}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":22}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":96}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":69}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":25}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":84}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":38}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":75}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":77}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":84}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":26}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":66}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":34}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":81}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":75}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":26}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":26}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":74}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":24}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":22}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":31}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":95}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":68}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":117}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":76}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":206}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":28}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":26}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":24}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":20}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":107}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":76}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":25}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":23}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":31}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":41}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":42}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":90}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":53}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":25}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":20}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":15}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":37}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":66}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":77}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":74}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":18}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":44}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":14}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":75}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":56}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":97}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":94}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":81}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":24}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":95}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":92}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":80}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":24}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":22}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":103}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":45}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":96}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":74}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":25}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":47}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":54}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":57}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":48}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":121}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":93}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":89}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":32}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":27}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":60}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":109}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":91}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":103}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":30}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":26}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":24}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":101}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":45}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":96}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":73}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":25}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":47}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":53}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":57}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":48}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":78}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":73}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":34}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":43}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":37}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":89}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":121}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":105}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":35}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":85}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":63}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":58}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":120}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":39}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":92}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":39}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":68}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":128}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":74}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":61}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":37}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":59}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":111}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":38}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":34}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":27}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":26}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":24}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":63}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":67}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":24}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":20}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":107}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":42}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":25}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":20}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":15}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":22}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":13}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":10}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":1}}},"s":{"0":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"58":0,"59":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"90":0,"91":0,"92":0,"93":0,"95":0,"96":0,"97":0,"98":0,"100":0,"101":0,"102":0,"103":0,"105":0,"106":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"122":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"143":0,"144":0,"146":0,"149":0,"150":0,"151":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"170":0,"171":0,"172":0,"173":0,"174":0,"176":0,"177":0,"178":0,"179":0,"181":0,"182":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"210":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"234":0,"237":0,"238":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"247":0,"249":0,"250":0,"251":0,"255":0,"256":0,"257":0,"258":0,"259":0,"263":0,"264":0,"265":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"279":0,"280":0,"281":0,"282":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"300":0,"301":0,"305":0,"306":0,"307":0,"308":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"325":0,"326":0,"327":0,"328":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"341":0,"343":0,"345":0,"346":0,"347":0,"350":0,"351":0,"353":0,"355":0,"358":0,"359":0,"361":0,"362":0,"363":0,"365":0,"366":0,"367":0,"369":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":370,"column":-8727}},"locations":[{"start":{"line":1,"column":0},"end":{"line":370,"column":-8727}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":370,"column":-8727}},"loc":{"start":{"line":1,"column":0},"end":{"line":370,"column":-8727}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/RichTextEditor.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/RichTextEditor.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":57}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":89}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":28}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":17}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":28}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":23}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":25}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":20}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":9}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":16}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":22}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":27}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":25}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":27}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":37}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":10}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":9}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":27}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":29}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":9}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":16}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":12}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":23}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":25}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":50}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":10}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":9}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":6}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":12}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":31}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":33}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":6}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":18}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":19}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":99}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":39}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":8}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":6}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":5}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":16}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":16}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":3}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":26}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":12}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":21}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":13}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":10}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":6}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":11}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":19}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":23}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":19}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":81}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":80}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":9}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":16}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":13}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":25}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":44}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":14}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":58}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":5}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":4}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":10}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":96}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":115}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":22}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":67}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":44}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":22}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":38}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":24}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":22}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":69}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":46}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":24}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":40}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":24}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":22}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":72}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":49}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":27}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":47}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":24}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":64}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":22}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":73}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":50}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":29}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":38}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":24}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":22}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":74}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":51}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":31}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":45}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":24}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":64}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":22}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":75}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":59}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":28}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":43}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":24}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":22}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":77}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":61}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":30}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":45}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":24}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":22}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":76}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":60}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":29}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":44}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":24}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":64}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":22}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":27}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":44}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":26}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":42}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":24}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":37}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":24}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":68}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":31}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":42}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":26}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":12}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":39}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":10}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":1}}},"s":{"0":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"66":0,"67":0,"68":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"89":0,"90":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"100":0,"101":0,"103":0,"104":0,"105":0,"106":0,"107":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"123":0,"124":0,"126":0,"128":0,"129":0,"130":0,"131":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"140":0,"141":0,"143":0,"145":0,"146":0,"147":0,"148":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"164":0,"165":0,"167":0,"169":0,"170":0,"171":0,"172":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"181":0,"182":0,"184":0,"187":0,"188":0,"190":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":191,"column":-2140}},"locations":[{"start":{"line":1,"column":0},"end":{"line":191,"column":-2140}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":191,"column":-2140}},"loc":{"start":{"line":1,"column":0},"end":{"line":191,"column":-2140}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/SmartPlugCard.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/SmartPlugCard.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":33}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":69}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":39}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":68}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":70}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":72}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":54}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":87}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":45}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":51}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":55}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":5}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":39}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":27}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":29}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":5}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":70}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":39}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":91}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":22}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":22}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":6}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":5}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":38}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":78}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":22}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":67}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":28}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":93}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":7}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":6}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":5}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":38}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":51}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":22}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":67}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":6}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":5}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":38}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":49}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":46}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":10}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":6}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":33}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":37}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":65}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":53}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":130}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":128}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":20}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":19}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":71}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":76}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":20}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":18}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":53}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":32}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":76}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":33}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":65}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":63}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":117}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":22}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":78}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":49}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":38}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":22}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":18}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":16}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":29}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":71}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":74}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":78}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":18}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":67}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":57}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":44}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":124}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":46}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":23}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":41}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":120}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":50}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":66}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":76}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":43}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":53}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":56}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":23}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":18}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":43}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":19}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":23}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":54}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":50}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":57}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":32}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":104}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":21}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":19}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":23}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":55}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":50}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":58}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":32}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":107}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":21}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":16}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":17}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":54}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":128}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":54}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":47}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":19}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":49}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":19}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":26}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":80}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":65}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":21}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":63}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":92}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":22}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":84}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":24}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":35}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":42}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":90}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":44}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":20}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":320}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":24}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":20}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":65}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":21}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":63}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":86}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":22}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":84}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":24}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":35}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":42}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":90}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":44}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":20}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":320}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":24}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":20}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":65}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":21}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":64}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":101}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":22}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":84}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":24}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":35}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":43}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":91}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":44}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":20}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":320}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":24}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":20}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":33}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":86}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":23}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":82}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":48}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":29}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":89}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":131}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":56}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":57}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":78}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":27}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":53}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":31}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":29}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":96}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":131}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":63}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":57}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":78}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":27}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":59}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":31}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":26}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":24}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":53}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":25}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":99}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":28}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":37}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":31}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":32}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":54}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":117}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":174}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":24}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":26}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":25}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":109}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":28}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":37}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":32}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":33}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":55}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":119}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":174}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":24}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":120}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":26}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":22}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":47}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":23}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":27}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":37}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":46}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":36}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":47}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":25}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":23}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":27}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":37}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":60}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":61}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":48}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":25}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":20}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":18}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":22}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":13}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":29}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":21}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":35}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":92}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":30}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":26}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":28}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":36}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":40}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":12}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":54}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":10}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":30}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":21}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":36}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":70}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":31}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":27}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":28}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":41}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":41}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":12}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":55}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":10}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":31}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":21}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":37}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":116}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":32}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":26}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":28}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":42}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":42}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":12}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":56}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":10}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":7}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":1}}},"s":{"0":1,"14":1,"15":27,"16":27,"17":27,"18":27,"19":27,"22":27,"23":27,"24":27,"25":27,"26":27,"29":27,"30":27,"31":27,"32":27,"34":27,"37":27,"38":27,"39":27,"40":0,"41":0,"42":27,"45":27,"46":27,"47":27,"48":0,"50":0,"51":0,"52":0,"53":0,"54":27,"57":27,"58":27,"59":27,"60":0,"61":0,"62":27,"64":27,"65":27,"66":27,"68":27,"69":27,"70":27,"71":27,"73":27,"74":27,"75":27,"76":27,"77":27,"78":27,"79":27,"80":27,"81":27,"82":27,"85":27,"86":27,"87":13,"88":14,"89":14,"90":14,"91":14,"92":14,"94":0,"95":0,"96":0,"97":0,"99":27,"100":27,"103":27,"104":14,"105":14,"106":14,"107":14,"111":27,"112":1,"113":1,"114":0,"115":0,"117":0,"119":1,"120":1,"121":1,"122":1,"123":1,"124":0,"125":0,"126":0,"127":1,"129":1,"133":27,"134":27,"135":27,"136":27,"137":27,"138":27,"139":27,"141":27,"143":27,"144":27,"145":27,"146":27,"147":27,"148":27,"149":27,"151":27,"153":27,"154":27,"157":27,"158":27,"159":27,"161":27,"162":27,"164":27,"165":27,"166":27,"169":27,"170":6,"172":6,"173":6,"174":6,"175":6,"176":6,"177":6,"178":6,"179":6,"180":6,"181":6,"182":6,"183":6,"184":6,"185":6,"186":6,"189":6,"190":6,"191":6,"192":6,"193":6,"194":6,"195":6,"196":6,"197":6,"198":6,"199":6,"200":6,"201":6,"202":6,"203":6,"206":6,"207":6,"208":6,"209":6,"210":6,"211":6,"212":6,"213":6,"214":6,"215":6,"216":6,"217":6,"218":6,"219":6,"220":6,"223":6,"224":4,"225":4,"226":4,"227":4,"228":4,"229":4,"230":4,"231":4,"232":4,"233":0,"234":4,"236":4,"238":4,"239":4,"240":4,"241":4,"242":4,"243":0,"244":4,"245":4,"247":4,"249":4,"250":4,"251":4,"253":4,"254":4,"255":4,"256":4,"257":4,"258":4,"259":4,"260":4,"261":4,"262":4,"263":4,"264":4,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"279":4,"283":6,"284":6,"285":6,"286":6,"287":6,"288":6,"290":6,"292":6,"293":6,"294":6,"295":6,"296":6,"297":6,"299":6,"300":6,"301":6,"302":6,"304":27,"305":27,"308":27,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"323":27,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"338":27,"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":0,"346":0,"347":0,"348":1,"349":1,"351":27,"353":27},"branchMap":{"0":{"type":"branch","line":15,"loc":{"start":{"line":15,"column":7},"end":{"line":354,"column":1}},"locations":[{"start":{"line":15,"column":7},"end":{"line":354,"column":1}}]},"1":{"type":"branch","line":35,"loc":{"start":{"line":35,"column":24},"end":{"line":35,"column":39}},"locations":[{"start":{"line":35,"column":24},"end":{"line":35,"column":39}}]},"2":{"type":"branch","line":65,"loc":{"start":{"line":65,"column":15},"end":{"line":65,"column":33}},"locations":[{"start":{"line":65,"column":15},"end":{"line":65,"column":33}}]},"3":{"type":"branch","line":66,"loc":{"start":{"line":66,"column":22},"end":{"line":66,"column":43}},"locations":[{"start":{"line":66,"column":22},"end":{"line":66,"column":43}}]},"4":{"type":"branch","line":66,"loc":{"start":{"line":66,"column":30},"end":{"line":66,"column":49}},"locations":[{"start":{"line":66,"column":30},"end":{"line":66,"column":49}}]},"5":{"type":"branch","line":76,"loc":{"start":{"line":76,"column":48},"end":{"line":76,"column":111}},"locations":[{"start":{"line":76,"column":48},"end":{"line":76,"column":111}}]},"6":{"type":"branch","line":76,"loc":{"start":{"line":76,"column":70},"end":{"line":76,"column":111}},"locations":[{"start":{"line":76,"column":70},"end":{"line":76,"column":111}}]},"7":{"type":"branch","line":76,"loc":{"start":{"line":76,"column":92},"end":{"line":76,"column":126}},"locations":[{"start":{"line":76,"column":92},"end":{"line":76,"column":126}}]},"8":{"type":"branch","line":77,"loc":{"start":{"line":77,"column":44},"end":{"line":77,"column":108}},"locations":[{"start":{"line":77,"column":44},"end":{"line":77,"column":108}}]},"9":{"type":"branch","line":77,"loc":{"start":{"line":77,"column":66},"end":{"line":77,"column":108}},"locations":[{"start":{"line":77,"column":66},"end":{"line":77,"column":108}}]},"10":{"type":"branch","line":77,"loc":{"start":{"line":77,"column":87},"end":{"line":77,"column":122}},"locations":[{"start":{"line":77,"column":87},"end":{"line":77,"column":122}}]},"11":{"type":"branch","line":87,"loc":{"start":{"line":87,"column":15},"end":{"line":88,"column":76}},"locations":[{"start":{"line":87,"column":15},"end":{"line":88,"column":76}}]},"12":{"type":"branch","line":88,"loc":{"start":{"line":88,"column":74},"end":{"line":98,"column":22}},"locations":[{"start":{"line":88,"column":74},"end":{"line":98,"column":22}}]},"13":{"type":"branch","line":92,"loc":{"start":{"line":92,"column":42},"end":{"line":92,"column":83}},"locations":[{"start":{"line":92,"column":42},"end":{"line":92,"column":83}}]},"14":{"type":"branch","line":92,"loc":{"start":{"line":92,"column":91},"end":{"line":92,"column":110}},"locations":[{"start":{"line":92,"column":91},"end":{"line":92,"column":110}}]},"15":{"type":"branch","line":93,"loc":{"start":{"line":93,"column":16},"end":{"line":98,"column":22}},"locations":[{"start":{"line":93,"column":16},"end":{"line":98,"column":22}}]},"16":{"type":"branch","line":104,"loc":{"start":{"line":104,"column":11},"end":{"line":108,"column":18}},"locations":[{"start":{"line":104,"column":11},"end":{"line":108,"column":18}}]},"17":{"type":"branch","line":112,"loc":{"start":{"line":112,"column":45},"end":{"line":130,"column":18}},"locations":[{"start":{"line":112,"column":45},"end":{"line":130,"column":18}}]},"18":{"type":"branch","line":114,"loc":{"start":{"line":114,"column":20},"end":{"line":118,"column":23}},"locations":[{"start":{"line":114,"column":20},"end":{"line":118,"column":23}}]},"19":{"type":"branch","line":124,"loc":{"start":{"line":124,"column":74},"end":{"line":127,"column":56}},"locations":[{"start":{"line":124,"column":74},"end":{"line":127,"column":56}}]},"20":{"type":"branch","line":137,"loc":{"start":{"line":137,"column":23},"end":{"line":137,"column":42}},"locations":[{"start":{"line":137,"column":23},"end":{"line":137,"column":42}}]},"21":{"type":"branch","line":137,"loc":{"start":{"line":137,"column":30},"end":{"line":137,"column":54}},"locations":[{"start":{"line":137,"column":30},"end":{"line":137,"column":54}}]},"22":{"type":"branch","line":138,"loc":{"start":{"line":138,"column":25},"end":{"line":138,"column":50}},"locations":[{"start":{"line":138,"column":25},"end":{"line":138,"column":50}}]},"23":{"type":"branch","line":142,"loc":{"start":{"line":142,"column":15},"end":{"line":142,"column":74}},"locations":[{"start":{"line":142,"column":15},"end":{"line":142,"column":74}}]},"24":{"type":"branch","line":147,"loc":{"start":{"line":147,"column":24},"end":{"line":147,"column":43}},"locations":[{"start":{"line":147,"column":24},"end":{"line":147,"column":43}}]},"25":{"type":"branch","line":147,"loc":{"start":{"line":147,"column":31},"end":{"line":147,"column":55}},"locations":[{"start":{"line":147,"column":31},"end":{"line":147,"column":55}}]},"26":{"type":"branch","line":148,"loc":{"start":{"line":148,"column":25},"end":{"line":148,"column":50}},"locations":[{"start":{"line":148,"column":25},"end":{"line":148,"column":50}}]},"27":{"type":"branch","line":152,"loc":{"start":{"line":152,"column":15},"end":{"line":152,"column":74}},"locations":[{"start":{"line":152,"column":15},"end":{"line":152,"column":74}}]},"28":{"type":"branch","line":166,"loc":{"start":{"line":166,"column":19},"end":{"line":166,"column":38}},"locations":[{"start":{"line":166,"column":19},"end":{"line":166,"column":38}}]},"29":{"type":"branch","line":166,"loc":{"start":{"line":166,"column":32},"end":{"line":166,"column":42}},"locations":[{"start":{"line":166,"column":32},"end":{"line":166,"column":42}}]},"30":{"type":"branch","line":170,"loc":{"start":{"line":170,"column":11},"end":{"line":303,"column":18}},"locations":[{"start":{"line":170,"column":11},"end":{"line":303,"column":18}}]},"31":{"type":"branch","line":224,"loc":{"start":{"line":224,"column":20},"end":{"line":280,"column":22}},"locations":[{"start":{"line":224,"column":20},"end":{"line":280,"column":22}}]},"32":{"type":"branch","line":233,"loc":{"start":{"line":233,"column":30},"end":{"line":234,"column":78}},"locations":[{"start":{"line":233,"column":30},"end":{"line":234,"column":78}}]},"33":{"type":"branch","line":243,"loc":{"start":{"line":243,"column":50},"end":{"line":244,"column":57}},"locations":[{"start":{"line":243,"column":50},"end":{"line":244,"column":57}}]},"34":{"type":"branch","line":265,"loc":{"start":{"line":265,"column":20},"end":{"line":278,"column":26}},"locations":[{"start":{"line":265,"column":20},"end":{"line":278,"column":26}}]},"35":{"type":"branch","line":309,"loc":{"start":{"line":309,"column":7},"end":{"line":320,"column":10}},"locations":[{"start":{"line":309,"column":7},"end":{"line":320,"column":10}}]},"36":{"type":"branch","line":324,"loc":{"start":{"line":324,"column":7},"end":{"line":335,"column":10}},"locations":[{"start":{"line":324,"column":7},"end":{"line":335,"column":10}}]},"37":{"type":"branch","line":339,"loc":{"start":{"line":339,"column":7},"end":{"line":350,"column":10}},"locations":[{"start":{"line":339,"column":7},"end":{"line":350,"column":10}}]},"38":{"type":"branch","line":25,"loc":{"start":{"line":25,"column":13},"end":{"line":25,"column":51}},"locations":[{"start":{"line":25,"column":13},"end":{"line":25,"column":51}}]},"39":{"type":"branch","line":35,"loc":{"start":{"line":35,"column":39},"end":{"line":35,"column":68}},"locations":[{"start":{"line":35,"column":39},"end":{"line":35,"column":68}}]},"40":{"type":"branch","line":149,"loc":{"start":{"line":149,"column":23},"end":{"line":149,"column":58}},"locations":[{"start":{"line":149,"column":23},"end":{"line":149,"column":58}}]},"41":{"type":"branch","line":159,"loc":{"start":{"line":159,"column":21},"end":{"line":159,"column":54}},"locations":[{"start":{"line":159,"column":21},"end":{"line":159,"column":54}}]},"42":{"type":"branch","line":288,"loc":{"start":{"line":288,"column":27},"end":{"line":288,"column":46}},"locations":[{"start":{"line":288,"column":27},"end":{"line":288,"column":46}}]}},"b":{"0":[27],"1":[14],"2":[14],"3":[14],"4":[13],"5":[14],"6":[0],"7":[13],"8":[14],"9":[0],"10":[13],"11":[13],"12":[14],"13":[0],"14":[0],"15":[0],"16":[14],"17":[1],"18":[0],"19":[0],"20":[14],"21":[13],"22":[14],"23":[0],"24":[13],"25":[14],"26":[14],"27":[0],"28":[6],"29":[21],"30":[6],"31":[4],"32":[0],"33":[0],"34":[0],"35":[0],"36":[0],"37":[1],"38":[13],"39":[14],"40":[1],"41":[6],"42":[1]},"fnMap":{"0":{"name":"SmartPlugCard","decl":{"start":{"line":15,"column":7},"end":{"line":354,"column":1}},"loc":{"start":{"line":15,"column":7},"end":{"line":354,"column":1}},"line":15},"1":{"name":"queryFn","decl":{"start":{"line":25,"column":13},"end":{"line":25,"column":51}},"loc":{"start":{"line":25,"column":13},"end":{"line":25,"column":51}},"line":25},"2":{"name":"mutationFn","decl":{"start":{"line":39,"column":16},"end":{"line":39,"column":91}},"loc":{"start":{"line":39,"column":16},"end":{"line":39,"column":91}},"line":39},"3":{"name":"onSuccess","decl":{"start":{"line":40,"column":15},"end":{"line":42,"column":6}},"loc":{"start":{"line":40,"column":15},"end":{"line":42,"column":6}},"line":40},"4":{"name":"mutationFn","decl":{"start":{"line":47,"column":16},"end":{"line":47,"column":78}},"loc":{"start":{"line":47,"column":16},"end":{"line":47,"column":78}},"line":47},"5":{"name":"onSuccess","decl":{"start":{"line":48,"column":15},"end":{"line":54,"column":6}},"loc":{"start":{"line":48,"column":15},"end":{"line":54,"column":6}},"line":48},"6":{"name":"mutationFn","decl":{"start":{"line":59,"column":16},"end":{"line":59,"column":51}},"loc":{"start":{"line":59,"column":16},"end":{"line":59,"column":51}},"line":59},"7":{"name":"onSuccess","decl":{"start":{"line":60,"column":15},"end":{"line":62,"column":6}},"loc":{"start":{"line":60,"column":15},"end":{"line":62,"column":6}},"line":60},"8":{"name":"onClick","decl":{"start":{"line":139,"column":23},"end":{"line":139,"column":57}},"loc":{"start":{"line":139,"column":23},"end":{"line":139,"column":57}},"line":139},"9":{"name":"onClick","decl":{"start":{"line":149,"column":23},"end":{"line":149,"column":58}},"loc":{"start":{"line":149,"column":23},"end":{"line":149,"column":58}},"line":149},"10":{"name":"onClick","decl":{"start":{"line":159,"column":21},"end":{"line":159,"column":54}},"loc":{"start":{"line":159,"column":21},"end":{"line":159,"column":54}},"line":159},"11":{"name":"onChange","decl":{"start":{"line":182,"column":30},"end":{"line":182,"column":90}},"loc":{"start":{"line":182,"column":30},"end":{"line":182,"column":90}},"line":182},"12":{"name":"onChange","decl":{"start":{"line":199,"column":30},"end":{"line":199,"column":90}},"loc":{"start":{"line":199,"column":30},"end":{"line":199,"column":90}},"line":199},"13":{"name":"onChange","decl":{"start":{"line":216,"column":30},"end":{"line":216,"column":91}},"loc":{"start":{"line":216,"column":30},"end":{"line":216,"column":91}},"line":216},"14":{"name":"onClick","decl":{"start":{"line":230,"column":33},"end":{"line":230,"column":89}},"loc":{"start":{"line":230,"column":33},"end":{"line":230,"column":89}},"line":230},"15":{"name":"onClick","decl":{"start":{"line":241,"column":33},"end":{"line":241,"column":96}},"loc":{"start":{"line":241,"column":33},"end":{"line":241,"column":96}},"line":241},"16":{"name":"onChange","decl":{"start":{"line":262,"column":34},"end":{"line":262,"column":117}},"loc":{"start":{"line":262,"column":34},"end":{"line":262,"column":117}},"line":262},"17":{"name":"onChange","decl":{"start":{"line":274,"column":34},"end":{"line":274,"column":119}},"loc":{"start":{"line":274,"column":34},"end":{"line":274,"column":119}},"line":274},"18":{"name":"onClick","decl":{"start":{"line":288,"column":27},"end":{"line":288,"column":46}},"loc":{"start":{"line":288,"column":27},"end":{"line":288,"column":46}},"line":288},"19":{"name":"onClick","decl":{"start":{"line":297,"column":27},"end":{"line":297,"column":60}},"loc":{"start":{"line":297,"column":27},"end":{"line":297,"column":60}},"line":297},"20":{"name":"onConfirm","decl":{"start":{"line":315,"column":21},"end":{"line":318,"column":12}},"loc":{"start":{"line":315,"column":21},"end":{"line":318,"column":12}},"line":315},"21":{"name":"onCancel","decl":{"start":{"line":319,"column":20},"end":{"line":319,"column":54}},"loc":{"start":{"line":319,"column":20},"end":{"line":319,"column":54}},"line":319},"22":{"name":"onConfirm","decl":{"start":{"line":330,"column":21},"end":{"line":333,"column":12}},"loc":{"start":{"line":330,"column":21},"end":{"line":333,"column":12}},"line":330},"23":{"name":"onCancel","decl":{"start":{"line":334,"column":20},"end":{"line":334,"column":55}},"loc":{"start":{"line":334,"column":20},"end":{"line":334,"column":55}},"line":334},"24":{"name":"onConfirm","decl":{"start":{"line":345,"column":21},"end":{"line":348,"column":12}},"loc":{"start":{"line":345,"column":21},"end":{"line":348,"column":12}},"line":345},"25":{"name":"onCancel","decl":{"start":{"line":349,"column":20},"end":{"line":349,"column":56}},"loc":{"start":{"line":349,"column":20},"end":{"line":349,"column":56}},"line":349}},"f":{"0":27,"1":13,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":1,"10":6,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":1,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/SpoolmanSettings.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/SpoolmanSettings.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":69}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":60}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":21}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":56}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":3}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":25}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":1}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":107}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":61}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":18}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":52}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":31}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":5}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":21}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":56}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":3}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":25}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":1}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":36}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":39}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":58}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":47}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":61}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":52}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":84}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":60}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":67}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":36}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":33}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":5}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":87}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":34}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":35}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":55}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":5}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":39}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":27}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":29}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":5}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":19}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":19}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":60}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":47}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":62}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":29}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":5}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":17}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":19}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":44}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":22}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":64}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":51}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":64}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":21}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":42}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":30}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":14}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":43}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":5}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":61}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":36}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":21}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":30}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":58}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":31}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":42}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":9}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":22}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":73}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":71}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":25}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":50}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":6}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":5}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":39}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":36}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":22}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":22}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":6}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":5}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":42}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":39}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":22}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":22}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":6}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":5}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":39}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":39}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":46}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":25}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":7}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":6}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":5}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":43}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":69}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":46}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":25}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":7}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":6}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":5}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":28}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":38}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":31}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":12}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":52}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":5}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":4}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":79}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":99}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":110}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":24}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":12}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":12}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":20}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":51}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":61}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":86}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":16}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":21}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":21}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":52}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":73}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":16}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":22}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":13}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":3}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":10}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":10}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":18}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":59}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":51}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":61}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":86}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":16}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":38}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":73}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":25}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":58}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":14}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":19}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":41}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":47}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":12}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":59}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":15}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":57}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":51}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":16}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":16}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":78}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":18}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":29}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":36}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":65}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":38}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":14}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":347}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":18}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":14}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":13}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":64}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":18}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":16}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":23}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":51}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":28}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":57}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":36}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":200}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":12}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":54}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":14}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":14}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":13}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":64}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":18}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":17}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":33}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":62}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":36}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":174}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":51}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":55}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":19}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":54}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":37}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":72}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":52}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":14}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":14}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":26}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":68}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":68}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":55}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":72}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":34}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":78}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":41}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":83}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":49}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":25}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":81}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":45}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":25}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":20}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":42}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":38}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":25}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":39}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":29}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":63}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":59}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":53}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":66}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":54}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":22}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":27}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":25}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":29}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":60}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":69}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":50}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":66}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":51}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":22}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":27}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":20}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":18}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":41}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":108}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":58}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":20}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":35}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":41}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":21}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":69}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":57}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":22}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":22}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":57}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":51}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":27}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":47}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":119}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":208}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":63}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":60}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":68}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":40}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":33}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":25}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":29}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":133}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":24}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":25}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":39}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":29}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":40}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":40}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":34}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":66}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":55}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":22}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":27}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":22}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":20}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":43}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":18}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":55}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":36}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":81}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":84}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":19}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":35}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":74}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":102}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":20}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":16}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":20}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":11}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":1}}},"s":{"0":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"44":0,"45":0,"46":0,"47":0,"50":0,"51":0,"52":0,"53":0,"54":0,"57":0,"58":0,"59":0,"60":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"73":0,"74":0,"76":0,"77":0,"78":0,"79":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"122":0,"123":0,"124":0,"125":0,"127":0,"128":0,"129":0,"132":0,"133":0,"134":0,"135":0,"137":0,"138":0,"139":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"151":0,"152":0,"153":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"171":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"184":0,"185":0,"187":0,"188":0,"189":0,"190":0,"192":0,"195":0,"196":0,"197":0,"198":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"214":0,"215":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"228":0,"229":0,"232":0,"233":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"264":0,"266":0,"267":0,"269":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"280":0,"281":0,"283":0,"284":0,"286":0,"288":0,"289":0,"290":0,"291":0,"293":0,"294":0,"296":0,"297":0,"299":0,"301":0,"302":0,"305":0,"306":0,"307":0,"308":0,"312":0,"313":0,"314":0,"315":0,"316":0,"318":0,"319":0,"320":0,"322":0,"323":0,"324":0,"325":0,"326":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"338":0,"339":0,"340":0,"341":0,"342":0,"344":0,"345":0,"347":0,"348":0,"350":0,"351":0,"352":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"364":0,"365":0,"366":0,"367":0,"369":0,"371":0,"372":0,"374":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":375,"column":-6111}},"locations":[{"start":{"line":1,"column":0},"end":{"line":375,"column":-6111}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":375,"column":-6111}},"loc":{"start":{"line":1,"column":0},"end":{"line":375,"column":-6111}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/ThemeContext.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/ThemeContext.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":87}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":76}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":70}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":56}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":65}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":30}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":18}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":5}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":19}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":42}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":27}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":33}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":12}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":36}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":5}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":41}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":14}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":29}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":66}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":4}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":41}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":28}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":4}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":10}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":68}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":16}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":28}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":1}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":28}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":43}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":17}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":68}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":3}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":17}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":1}}},"s":{"0":0,"10":0,"12":0,"13":0,"14":0,"15":0,"17":0,"18":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"30":0,"31":0,"32":0,"34":0,"35":0,"36":0,"38":0,"39":0,"40":0,"41":0,"43":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":1326},"end":{"line":52,"column":1}},"locations":[{"start":{"line":1,"column":1326},"end":{"line":52,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":1326},"end":{"line":52,"column":1}},"loc":{"start":{"line":1,"column":1326},"end":{"line":52,"column":1}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/TimelapseViewer.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/TimelapseViewer.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":57}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":98}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":50}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":51}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":89}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":52}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":46}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":19}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":35}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":16}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":40}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":5}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":21}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":19}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":49}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":31}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":18}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":7}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":6}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":54}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":70}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":16}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":19}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":35}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":23}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":69}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":67}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":48}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":50}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":59}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":67}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":47}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":49}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":18}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":64}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":72}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":52}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":54}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":6}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":9}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":28}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":35}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":23}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":20}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":20}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":12}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":19}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":5}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":4}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":66}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":35}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":23}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":51}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":4}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":30}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":35}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":23}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":59}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":4}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":29}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":35}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":23}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":66}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":4}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":40}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":42}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":42}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":63}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":4}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":32}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":45}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":20}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":37}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":17}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":4}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":10}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":85}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":105}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":99}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":83}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":57}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":19}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":15}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":51}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":75}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":46}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":21}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":19}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":31}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":84}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":55}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":21}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":16}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":14}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":29}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":16}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":26}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":21}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":20}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":41}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":32}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":12}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":42}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":53}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":72}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":41}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":21}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":20}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":28}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":23}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":37}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":35}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":37}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":102}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":16}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":61}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":38}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":21}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":18}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":63}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":55}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":23}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":40}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":91}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":38}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":66}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":25}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":23}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":38}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":103}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":32}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":60}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":59}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":25}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":23}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":39}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":91}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":41}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":69}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":25}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":20}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":55}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":71}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":44}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":49}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":27}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":33}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":60}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":80}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":46}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":55}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":100}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":25}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":30}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":29}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":21}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":22}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":20}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":18}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":16}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":14}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":12}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":10}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":1}}},"s":{"0":0,"11":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"38":0,"39":0,"40":0,"42":0,"43":0,"44":0,"45":0,"47":0,"48":0,"49":0,"50":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"70":0,"71":0,"72":0,"73":0,"74":0,"76":0,"77":0,"78":0,"79":0,"80":0,"82":0,"83":0,"84":0,"85":0,"86":0,"88":0,"89":0,"90":0,"91":0,"92":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"101":0,"102":0,"103":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"114":0,"115":0,"116":0,"117":0,"119":0,"120":0,"121":0,"122":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"135":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"151":0,"152":0,"153":0,"154":0,"155":0,"158":0,"160":0,"161":0,"162":0,"163":0,"164":0,"166":0,"167":0,"168":0,"169":0,"170":0,"172":0,"173":0,"175":0,"177":0,"178":0,"179":0,"180":0,"181":0,"183":0,"184":0,"185":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"212":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":213,"column":-2892}},"locations":[{"start":{"line":1,"column":0},"end":{"line":213,"column":-2892}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":213,"column":-2892}},"loc":{"start":{"line":1,"column":0},"end":{"line":213,"column":-2892}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/Toggle.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/Toggle.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":23}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":70}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":48}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":23}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":24}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":20}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":25}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":5}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":4}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":10}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":11}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":19}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":19}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":28}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":25}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":27}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":213}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":16}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":69}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":19}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":43}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":83}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":9}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":11}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":196}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":53}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":11}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":8}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":13}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":1}}},"s":{"0":1,"6":1,"7":10,"8":3,"9":3,"10":3,"11":3,"12":3,"13":3,"15":10,"16":10,"17":10,"18":10,"19":10,"20":10,"21":10,"22":10,"23":10,"24":3,"25":7,"26":3,"27":4,"28":10,"30":10,"31":10,"32":10,"33":10,"34":10,"35":10,"37":10},"branchMap":{"0":{"type":"branch","line":7,"loc":{"start":{"line":7,"column":7},"end":{"line":38,"column":1}},"locations":[{"start":{"line":7,"column":7},"end":{"line":38,"column":1}}]},"1":{"type":"branch","line":24,"loc":{"start":{"line":24,"column":8},"end":{"line":25,"column":69}},"locations":[{"start":{"line":24,"column":8},"end":{"line":25,"column":69}}]},"2":{"type":"branch","line":25,"loc":{"start":{"line":25,"column":12},"end":{"line":28,"column":83}},"locations":[{"start":{"line":25,"column":12},"end":{"line":28,"column":83}}]},"3":{"type":"branch","line":26,"loc":{"start":{"line":26,"column":12},"end":{"line":27,"column":43}},"locations":[{"start":{"line":26,"column":12},"end":{"line":27,"column":43}}]},"4":{"type":"branch","line":27,"loc":{"start":{"line":27,"column":12},"end":{"line":28,"column":83}},"locations":[{"start":{"line":27,"column":12},"end":{"line":28,"column":83}}]},"5":{"type":"branch","line":33,"loc":{"start":{"line":33,"column":10},"end":{"line":33,"column":38}},"locations":[{"start":{"line":33,"column":10},"end":{"line":33,"column":38}}]},"6":{"type":"branch","line":33,"loc":{"start":{"line":33,"column":20},"end":{"line":33,"column":53}},"locations":[{"start":{"line":33,"column":20},"end":{"line":33,"column":53}}]},"7":{"type":"branch","line":8,"loc":{"start":{"line":8,"column":22},"end":{"line":14,"column":4}},"locations":[{"start":{"line":8,"column":22},"end":{"line":14,"column":4}}]}},"b":{"0":[10],"1":[3],"2":[7],"3":[3],"4":[4],"5":[3],"6":[7],"7":[3]},"fnMap":{"0":{"name":"Toggle","decl":{"start":{"line":7,"column":7},"end":{"line":38,"column":1}},"loc":{"start":{"line":7,"column":7},"end":{"line":38,"column":1}},"line":7},"1":{"name":"handleClick","decl":{"start":{"line":8,"column":22},"end":{"line":14,"column":4}},"loc":{"start":{"line":8,"column":22},"end":{"line":14,"column":4}},"line":8}},"f":{"0":10,"1":3}} -,"/opt/claude/projects/bambuddy/frontend/src/components/UploadModal.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/UploadModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":65}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":74}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":39}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":35}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":54}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":60}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":112}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":4}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":54}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":79}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":82}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":19}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":49}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":40}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":6}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":54}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":70}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":16}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":39}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":27}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":29}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":5}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":38}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":42}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":61}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":28}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":30}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":64}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":68}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":24}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":25}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":81}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":78}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":24}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":70}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":11}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":22}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":65}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":11}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":19}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":10}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":8}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":32}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":89}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":41}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":102}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":14}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":85}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":7}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":6}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":20}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":24}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":76}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":8}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":42}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":6}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":5}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":62}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":23}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":24}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":9}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":63}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":23}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":25}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":9}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":58}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":23}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":25}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":71}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":29}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":6}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":34}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":26}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":16}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":78}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":9}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":5}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":9}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":84}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":72}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":29}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":6}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":35}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":26}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":16}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":79}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":9}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":5}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":31}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":38}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":5}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":9}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":53}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":59}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":9}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":30}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":35}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":69}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":42}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":22}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":21}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":66}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":7}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":6}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":59}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":4}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":74}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":47}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":10}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":89}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":68}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":58}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":101}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":82}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":19}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":31}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":76}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":39}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":21}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":16}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":31}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":16}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":96}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":26}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":58}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":72}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":17}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":41}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":43}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":33}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":75}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":45}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":18}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":64}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":21}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":35}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":61}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":38}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":15}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":23}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":20}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":34}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":27}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":29}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":24}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":34}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":43}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":16}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":18}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":16}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":37}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":66}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":20}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":19}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":156}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":43}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":30}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":87}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":36}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":50}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":37}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":48}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":26}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":25}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":17}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":21}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":16}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":32}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":64}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":41}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":42}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":22}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":51}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":84}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":78}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":73}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":35}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":27}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":62}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":67}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":27}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":48}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":29}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":57}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":88}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":46}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":49}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":31}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":50}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":83}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":48}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":74}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":46}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":63}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":79}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":72}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":28}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":24}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":19}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":20}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":18}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":28}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":39}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":60}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":50}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":92}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":47}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":93}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":20}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":20}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":18}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":78}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":77}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":49}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":21}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":31}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":21}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":38}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":60}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":34}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":32}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":20}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":64}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":21}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":20}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":50}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":68}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":21}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":23}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":16}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":22}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":13}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":10}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":1}}},"s":{"0":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"41":0,"42":0,"43":0,"44":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"86":0,"87":0,"88":0,"89":0,"91":0,"92":0,"93":0,"94":0,"96":0,"97":0,"98":0,"100":0,"101":0,"102":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"112":0,"113":0,"114":0,"115":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"125":0,"126":0,"127":0,"128":0,"130":0,"131":0,"132":0,"134":0,"135":0,"137":0,"138":0,"140":0,"141":0,"142":0,"143":0,"144":0,"146":0,"147":0,"149":0,"150":0,"152":0,"153":0,"154":0,"155":0,"157":0,"158":0,"159":0,"160":0,"161":0,"163":0,"164":0,"165":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"179":0,"180":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"203":0,"204":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"213":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"246":0,"247":0,"249":0,"250":0,"252":0,"253":0,"255":0,"256":0,"257":0,"258":0,"259":0,"261":0,"262":0,"263":0,"264":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"276":0,"277":0,"278":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"292":0,"293":0,"294":0,"296":0,"298":0,"299":0,"300":0,"301":0,"303":0,"305":0,"306":0,"307":0,"308":0,"310":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":311,"column":-3621}},"locations":[{"start":{"line":1,"column":0},"end":{"line":311,"column":-3621}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":311,"column":-3621}},"loc":{"start":{"line":1,"column":0},"end":{"line":311,"column":-3621}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/components/icons/WifiSignal.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/components/icons/WifiSignal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":80}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":15}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":23}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":32}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":37}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":37}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":18}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":3}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":48}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":48}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":10}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":8}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":25}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":17}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":27}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":21}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":27}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":28}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":27}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":13}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":15}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":15}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":13}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":54}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":56}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":8}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":11}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":35}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":56}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":19}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":8}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":11}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":34}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":56}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":19}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":8}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":11}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":37}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":56}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":19}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":8}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":10}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":1}}},"s":{"0":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"22":0,"23":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"44":0,"45":0,"46":0,"47":0,"48":0,"50":0,"51":0,"52":0,"53":0,"54":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"63":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":64,"column":-471}},"locations":[{"start":{"line":1,"column":0},"end":{"line":64,"column":-471}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":64,"column":-471}},"loc":{"start":{"line":1,"column":0},"end":{"line":64,"column":-471}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/contexts/ThemeContext.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/contexts/ThemeContext.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":87}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":76}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":70}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":56}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":65}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":30}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":18}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":5}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":19}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":42}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":27}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":33}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":12}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":36}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":5}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":41}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":14}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":29}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":66}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":4}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":41}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":28}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":4}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":10}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":68}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":16}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":28}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":1}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":28}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":43}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":17}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":68}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":3}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":17}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":1}}},"s":{"0":1,"10":1,"12":1,"13":45,"14":45,"15":45,"17":45,"18":45,"20":45,"21":45,"22":45,"23":45,"24":45,"25":0,"26":0,"27":45,"28":45,"30":45,"31":0,"32":0,"34":45,"35":0,"36":0,"38":45,"39":45,"40":45,"41":45,"43":45,"45":1,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0},"branchMap":{"0":{"type":"branch","line":13,"loc":{"start":{"line":13,"column":7},"end":{"line":44,"column":1}},"locations":[{"start":{"line":13,"column":7},"end":{"line":44,"column":1}}]},"1":{"type":"branch","line":14,"loc":{"start":{"line":14,"column":49},"end":{"line":19,"column":3}},"locations":[{"start":{"line":14,"column":49},"end":{"line":19,"column":3}}]},"2":{"type":"branch","line":16,"loc":{"start":{"line":16,"column":16},"end":{"line":16,"column":30}},"locations":[{"start":{"line":16,"column":16},"end":{"line":16,"column":30}}]},"3":{"type":"branch","line":21,"loc":{"start":{"line":21,"column":12},"end":{"line":29,"column":5}},"locations":[{"start":{"line":21,"column":12},"end":{"line":29,"column":5}}]},"4":{"type":"branch","line":25,"loc":{"start":{"line":25,"column":4},"end":{"line":27,"column":5}},"locations":[{"start":{"line":25,"column":4},"end":{"line":27,"column":5}}]}},"b":{"0":[45],"1":[45],"2":[0],"3":[45],"4":[0]},"fnMap":{"0":{"name":"ThemeProvider","decl":{"start":{"line":13,"column":7},"end":{"line":44,"column":1}},"loc":{"start":{"line":13,"column":7},"end":{"line":44,"column":1}},"line":13},"1":{"name":"toggleTheme","decl":{"start":{"line":31,"column":22},"end":{"line":33,"column":4}},"loc":{"start":{"line":31,"column":22},"end":{"line":33,"column":4}},"line":31},"2":{"name":"setTheme","decl":{"start":{"line":35,"column":19},"end":{"line":37,"column":4}},"loc":{"start":{"line":35,"column":19},"end":{"line":37,"column":4}},"line":35},"3":{"name":"useTheme","decl":{"start":{"line":46,"column":7},"end":{"line":52,"column":1}},"loc":{"start":{"line":46,"column":7},"end":{"line":52,"column":1}},"line":46}},"f":{"0":45,"1":0,"2":0,"3":0}} -,"/opt/claude/projects/bambuddy/frontend/src/contexts/ToastContext.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/contexts/ToastContext.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":89}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":76}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":28}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":43}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":17}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":68}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":3}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":17}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":1}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":15}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":62}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":54}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":63}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":51}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":2}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":18}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":49}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":43}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":51}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":44}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":2}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":70}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":52}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":83}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":55}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":58}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":22}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":59}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":13}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":9}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":52}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":57}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":9}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":10}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":49}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":16}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":71}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":32}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":14}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":26}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":145}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":31}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":71}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":19}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":52}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":81}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":39}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":21}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":16}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":11}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":12}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":28}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":1}}},"s":{"0":1,"15":1,"17":1,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"39":1,"40":45,"42":45,"43":0,"44":0,"47":0,"48":0,"49":0,"50":45,"52":45,"53":0,"54":45,"56":45,"57":45,"58":45,"61":45,"62":45,"63":0,"64":0,"65":0,"67":0,"68":0,"69":0,"70":0,"71":0,"73":0,"74":0,"75":0,"76":45,"77":45,"78":45,"80":45},"branchMap":{"0":{"type":"branch","line":40,"loc":{"start":{"line":40,"column":7},"end":{"line":81,"column":1}},"locations":[{"start":{"line":40,"column":7},"end":{"line":81,"column":1}}]}},"b":{"0":[45]},"fnMap":{"0":{"name":"useToast","decl":{"start":{"line":18,"column":7},"end":{"line":24,"column":1}},"loc":{"start":{"line":18,"column":7},"end":{"line":24,"column":1}},"line":18},"1":{"name":"ToastProvider","decl":{"start":{"line":40,"column":7},"end":{"line":81,"column":1}},"loc":{"start":{"line":40,"column":7},"end":{"line":81,"column":1}},"line":40}},"f":{"0":0,"1":45}} -,"/opt/claude/projects/bambuddy/frontend/src/hooks/useIsMobile.ts": {"path":"/opt/claude/projects/bambuddy/frontend/src/hooks/useIsMobile.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":47}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":40}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":48}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":81}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":4}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":19}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":84}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":54}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":29}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":6}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":36}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":56}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":72}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":9}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":18}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":1}}},"s":{"0":0,"2":0,"4":0,"5":0,"6":0,"7":0,"9":0,"10":0,"12":0,"13":0,"14":0,"17":0,"20":0,"21":0,"22":0,"24":0,"25":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":744},"end":{"line":26,"column":1}},"locations":[{"start":{"line":1,"column":744},"end":{"line":26,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":744},"end":{"line":26,"column":1}},"loc":{"start":{"line":1,"column":744},"end":{"line":26,"column":1}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/hooks/useLongPress.ts": {"path":"/opt/claude/projects/bambuddy/frontend/src/hooks/useLongPress.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":87}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":49}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":53}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":43}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":28}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":49}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":41}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":35}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":52}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":42}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":23}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":16}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":6}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":24}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":4}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":28}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":76}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":31}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":41}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":34}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":7}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":107}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":18}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":7}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":6}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":13}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":4}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":10}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":23}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":55}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":59}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":24}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":56}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":4}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":1}}},"s":{"0":0,"8":0,"9":0,"10":0,"11":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":1378},"end":{"line":46,"column":1}},"locations":[{"start":{"line":1,"column":1378},"end":{"line":46,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":1378},"end":{"line":46,"column":1}},"loc":{"start":{"line":1,"column":1378},"end":{"line":46,"column":1}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/hooks/useWebSocket.ts": {"path":"/opt/claude/projects/bambuddy/frontend/src/hooks/useWebSocket.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":65}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":32}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":47}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":58}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":39}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":56}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":37}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":55}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":13}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":5}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":76}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":67}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":36}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":43}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":23}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":43}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":27}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":47}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":47}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":52}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":9}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":16}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":6}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":31}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":11}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":65}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":31}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":15}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":7}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":6}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":29}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":66}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":25}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":36}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":28}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":7}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":28}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":27}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":61}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":18}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":15}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":6}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":29}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":48}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":17}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":6}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":23}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":9}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":68}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":27}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":28}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":47}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":35}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":50}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":59}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":30}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":23}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":32}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":16}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":75}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":53}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":15}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":28}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":13}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":12}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":9}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":14}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":28}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":66}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":70}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":14}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":29}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":66}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":70}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":14}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":18}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":14}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":5}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":20}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":19}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":14}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":18}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":40}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":50}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":7}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":26}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":30}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":7}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":6}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":16}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":73}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":55}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":50}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":5}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":9}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":38}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":1}}},"s":{"0":1,"9":1,"10":0,"11":0,"12":0,"13":0,"15":0,"16":0,"17":0,"18":0,"20":0,"21":0,"23":0,"25":0,"27":0,"28":0,"29":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"38":0,"39":0,"40":0,"41":0,"42":0,"44":0,"45":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"57":0,"58":0,"59":0,"60":0,"62":0,"63":0,"64":0,"65":0,"67":0,"68":0,"70":0,"71":0,"72":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"92":0,"94":0,"95":0,"96":0,"98":0,"100":0,"101":0,"102":0,"104":0,"106":0,"107":0,"108":0,"110":0,"111":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"123":0,"124":0,"125":0,"126":0,"127":0,"129":0,"130":0},"branchMap":{},"b":{},"fnMap":{"0":{"name":"useWebSocket","decl":{"start":{"line":10,"column":7},"end":{"line":131,"column":1}},"loc":{"start":{"line":10,"column":7},"end":{"line":131,"column":1}},"line":10}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/i18n/index.ts": {"path":"/opt/claude/projects/bambuddy/frontend/src/i18n/index.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":19}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":26}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":26}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":2}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":4}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":24}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":24}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":9}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":14}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":22}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":32}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":16}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":54}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":48}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":31}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":6}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":20}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":50}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":6}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":12}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":25}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":6}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":5}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":20}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":35}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":57}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":56}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":2}}},"s":{"0":0,"8":0,"9":0,"10":0,"11":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"21":0,"23":0,"25":0,"27":0,"28":0,"30":0,"31":0,"32":0,"34":0,"35":0,"36":0,"37":0,"39":0,"42":0,"43":0,"44":0,"45":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":46,"column":-413}},"locations":[{"start":{"line":1,"column":0},"end":{"line":46,"column":-413}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":46,"column":-413}},"loc":{"start":{"line":1,"column":0},"end":{"line":46,"column":-413}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/i18n/locales/de.ts": {"path":"/opt/claude/projects/bambuddy/frontend/src/i18n/locales/de.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":16}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":8}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":24}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":23}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":27}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":25}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":24}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":27}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":25}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":30}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":47}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":45}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":21}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":54}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":39}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":44}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":47}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":47}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":4}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":11}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":22}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":24}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":22}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":23}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":22}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":23}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":26}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":23}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":20}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":22}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":23}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":25}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":28}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":14}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":15}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":13}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":15}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":16}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":18}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":21}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":22}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":22}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":29}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":30}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":24}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":24}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":21}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":17}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":32}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":18}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":17}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":21}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":23}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":24}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":45}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":36}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":29}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":25}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":4}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":13}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":21}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":37}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":38}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":37}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":31}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":33}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":28}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":30}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":20}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":31}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":45}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":13}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":21}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":25}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":25}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":25}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":22}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":25}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":27}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":6}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":19}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":21}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":23}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":24}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":6}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":43}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":35}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":62}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":32}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":44}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":53}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":39}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":46}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":4}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":13}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":25}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":47}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":44}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":42}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":29}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":33}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":33}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":21}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":26}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":41}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":27}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":42}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":19}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":30}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":24}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":36}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":65}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":24}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":42}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":36}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":13}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":33}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":31}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":26}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":6}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":4}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":10}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":32}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":47}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":39}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":41}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":25}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":35}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":24}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":27}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":24}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":30}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":13}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":28}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":25}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":33}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":31}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":31}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":6}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":4}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":10}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":25}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":26}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":32}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":31}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":38}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":46}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":30}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":52}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":35}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":30}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":32}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":26}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":31}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":33}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":33}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":22}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":4}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":13}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":30}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":36}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":37}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":36}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":25}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":19}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":19}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":28}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":22}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":31}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":33}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":45}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":65}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":4}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":16}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":21}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":26}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":36}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":41}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":49}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":38}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":47}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":38}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":39}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":32}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":22}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":42}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":26}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":45}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":42}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":39}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":46}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":23}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":38}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":46}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":37}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":12}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":49}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":42}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":42}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":44}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":48}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":44}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":49}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":6}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":4}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":13}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":27}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":25}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":35}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":40}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":30}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":25}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":23}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":24}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":62}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":20}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":23}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":24}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":26}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":35}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":76}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":43}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":39}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":39}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":37}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":48}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":40}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":53}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":75}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":55}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":39}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":40}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":32}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":45}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":61}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":68}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":29}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":67}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":30}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":26}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":13}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":43}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":36}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":43}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":42}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":37}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":45}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":68}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":40}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":36}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":38}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":39}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":78}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":6}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":16}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":27}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":35}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":36}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":19}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":30}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":43}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":40}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":55}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":41}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":55}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":39}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":44}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":49}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":39}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":28}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":29}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":6}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":55}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":32}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":35}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":44}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":4}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":17}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":19}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":31}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":54}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":6}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":21}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":35}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":66}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":6}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":18}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":36}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":59}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":6}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":19}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":30}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":55}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":6}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":20}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":32}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":74}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":6}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":21}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":31}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":38}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":6}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":19}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":29}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":37}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":6}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":18}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":32}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":51}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":6}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":21}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":30}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":62}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":6}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":4}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":11}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":40}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":74}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":31}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":38}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":32}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":57}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":69}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":43}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":43}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":49}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":4}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":12}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":49}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":91}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":65}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":4}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":2}}},"s":{"0":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"292":0,"293":0,"294":0,"295":0,"296":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":11018},"end":{"line":359,"column":2}},"locations":[{"start":{"line":1,"column":11018},"end":{"line":359,"column":2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":11018},"end":{"line":359,"column":2}},"loc":{"start":{"line":1,"column":11018},"end":{"line":359,"column":2}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/i18n/locales/en.ts": {"path":"/opt/claude/projects/bambuddy/frontend/src/i18n/locales/en.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":16}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":8}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":25}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":25}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":19}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":24}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":25}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":31}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":25}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":25}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":40}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":36}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":21}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":54}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":35}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":48}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":42}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":40}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":4}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":11}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":17}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":21}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":21}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":17}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":15}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":19}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":23}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":26}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":19}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":23}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":23}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":23}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":25}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":15}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":13}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":13}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":15}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":15}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":17}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":21}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":21}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":17}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":23}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":25}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":21}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":23}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":21}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":17}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":31}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":17}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":17}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":19}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":23}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":23}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":41}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":32}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":25}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":25}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":4}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":13}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":22}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":30}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":32}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":36}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":32}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":34}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":28}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":30}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":19}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":32}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":32}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":13}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":19}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":27}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":23}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":25}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":21}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":27}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":25}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":6}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":19}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":23}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":17}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":25}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":6}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":38}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":40}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":65}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":36}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":44}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":52}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":36}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":43}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":4}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":13}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":28}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":44}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":41}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":39}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":22}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":31}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":31}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":21}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":29}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":36}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":28}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":34}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":17}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":23}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":23}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":36}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":67}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":25}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":40}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":32}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":13}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":29}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":23}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":25}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":6}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":4}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":10}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":25}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":31}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":30}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":33}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":25}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":36}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":22}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":26}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":21}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":26}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":13}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":25}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":27}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":29}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":23}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":29}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":6}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":4}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":10}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":24}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":25}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":32}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":32}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":39}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":41}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":28}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":43}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":35}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":28}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":30}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":24}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":29}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":31}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":31}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":24}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":4}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":13}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":31}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":30}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":32}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":36}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":25}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":19}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":19}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":25}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":23}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":29}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":32}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":41}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":67}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":4}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":16}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":25}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":25}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":40}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":35}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":43}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":38}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":46}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":39}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":40}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":30}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":19}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":36}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":25}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":43}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":39}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":29}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":46}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":23}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":40}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":39}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":34}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":12}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":47}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":41}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":39}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":43}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":44}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":41}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":46}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":6}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":4}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":13}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":22}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":23}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":29}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":35}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":30}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":25}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":23}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":25}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":58}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":19}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":24}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":22}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":26}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":32}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":64}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":41}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":30}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":38}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":36}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":35}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":40}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":50}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":71}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":52}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":32}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":34}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":34}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":42}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":55}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":51}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":30}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":63}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":29}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":25}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":13}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":35}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":34}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":39}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":34}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":36}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":43}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":58}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":40}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":36}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":34}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":40}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":69}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":6}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":16}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":27}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":28}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":30}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":19}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":30}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":38}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":30}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":53}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":32}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":59}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":28}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":45}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":52}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":36}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":24}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":26}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":6}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":51}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":32}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":35}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":41}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":4}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":17}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":19}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":29}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":61}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":6}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":21}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":31}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":63}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":6}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":18}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":28}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":51}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":6}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":19}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":29}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":52}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":6}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":20}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":30}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":65}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":6}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":21}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":31}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":37}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":6}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":19}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":29}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":37}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":6}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":18}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":28}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":51}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":6}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":21}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":31}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":52}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":6}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":4}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":11}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":36}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":65}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":26}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":33}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":32}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":47}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":60}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":41}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":37}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":38}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":4}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":12}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":52}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":80}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":60}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":4}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":2}}},"s":{"0":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"292":0,"293":0,"294":0,"295":0,"296":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":10324},"end":{"line":359,"column":2}},"locations":[{"start":{"line":1,"column":10324},"end":{"line":359,"column":2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":10324},"end":{"line":359,"column":2}},"loc":{"start":{"line":1,"column":10324},"end":{"line":359,"column":2}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/pages/ArchivesPage.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/pages/ArchivesPage.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":65}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":48}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":40}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":68}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":52}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":1}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":50}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":43}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":52}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":48}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":23}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":1}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":46}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":56}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":20}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":19}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":19}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":20}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":22}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":5}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":1}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":22}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":10}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":14}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":13}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":11}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":16}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":11}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":4}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":4}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":39}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":35}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":33}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":54}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":56}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":68}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":50}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":60}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":72}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":144}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":54}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":54}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":64}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":58}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":86}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":88}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":59}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":47}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":70}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":26}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":64}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":57}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":6}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":32}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":73}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":6}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":5}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":47}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":54}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":22}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":64}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":38}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":6}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":32}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":73}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":6}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":5}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":45}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":59}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":26}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":39}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":66}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":58}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":44}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":48}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":106}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":53}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":37}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":14}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":76}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":7}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":6}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":32}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":74}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":6}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":5}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":47}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":87}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":26}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":64}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":56}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":36}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":33}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":6}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":32}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":72}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":6}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":5}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":38}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":52}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":22}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":64}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":35}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":6}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":20}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":53}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":6}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":5}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":40}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":53}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":26}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":64}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":84}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":6}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":5}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":45}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":103}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":22}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":64}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":64}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":35}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":6}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":20}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":53}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":6}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":5}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":54}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":23}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":51}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":4}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":47}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":5}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":21}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":44}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":42}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":6}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":5}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":24}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":45}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":43}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":6}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":5}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":36}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":49}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":22}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":75}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":104}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":86}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":8}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":6}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":5}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":34}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":42}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":93}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":40}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":6}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":52}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":5}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":26}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":40}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":41}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":6}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":5}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":30}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":41}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":44}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":40}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":6}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":5}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":34}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":47}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":52}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":99}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":6}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":52}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":5}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":83}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":45}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":22}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":38}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":51}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":62}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":81}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":23}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":16}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":45}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":9}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":8}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":6}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":36}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":34}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":43}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":56}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":6}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":5}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":33}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":43}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":57}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":19}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":13}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":52}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":5}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":24}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":45}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":22}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":49}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":55}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":72}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":21}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":8}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":6}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":5}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":34}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":41}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":22}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":85}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":55}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":48}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":24}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":52}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":11}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":8}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":6}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":5}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":23}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":43}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":41}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":6}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":5}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":89}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":43}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":41}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":40}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":6}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":5}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":28}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":45}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":46}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":6}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":52}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":5}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":80}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":107}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":47}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":6}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":5}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":20}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":43}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":39}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":6}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":55}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":54}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":66}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":56}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":13}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":5}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":30}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":49}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":24}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":23}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":44}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":33}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":22}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":41}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":44}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":62}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":13}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":9}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":24}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":22}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":32}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":63}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":30}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":27}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":13}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":16}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":77}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":44}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":24}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":45}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":68}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":32}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":29}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":15}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":18}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":41}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":26}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":30}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":124}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":66}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":54}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":17}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":15}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":11}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":9}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":21}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":11}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":6}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":5}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":48}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":94}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":42}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":6}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":52}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":5}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":22}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":43}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":48}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":19}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":6}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":4}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":10}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":9}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":130}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":39}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":70}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":25}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":15}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":108}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":73}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":25}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":64}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":53}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":17}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":102}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":35}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":14}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":53}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":56}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":50}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":12}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":74}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":68}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":16}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":22}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":17}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":109}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":29}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":34}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":67}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":67}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":14}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":24}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":59}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":19}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":15}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":104}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":27}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":32}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":38}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":12}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":84}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":15}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":107}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":12}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":17}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":41}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":101}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":16}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":41}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":14}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":124}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":54}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":40}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":16}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":37}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":17}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":110}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":29}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":34}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":128}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":114}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":92}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":14}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":82}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":60}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":19}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":36}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":17}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":111}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":29}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":34}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":37}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":14}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":34}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":57}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":19}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":57}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":17}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":156}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":29}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":34}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":34}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":14}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":96}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":56}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":43}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":146}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":39}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":21}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":19}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":12}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":56}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":61}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":50}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":13}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":54}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":66}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":36}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":17}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":83}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":22}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":109}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":91}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":16}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":56}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":36}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":19}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":14}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":74}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":75}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":78}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":35}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":190}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":45}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":76}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":83}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":43}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":94}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":41}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":61}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":77}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":58}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":49}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":54}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":58}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":20}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":101}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":23}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":18}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":43}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":71}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":45}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":55}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":18}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":62}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":71}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":44}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":82}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":109}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":77}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":18}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":37}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":66}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":86}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":42}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":69}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":72}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":24}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":29}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":77}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":56}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":35}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":22}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":21}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":22}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":18}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":14}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":45}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":68}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":31}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":18}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":110}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":37}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":50}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":20}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":55}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":19}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":23}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":102}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":28}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":21}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":15}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":16}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":34}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":124}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":55}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":58}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":14}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":41}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":17}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":29}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":21}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":38}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":48}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":57}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":59}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":19}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":17}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":31}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":21}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":44}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":28}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":81}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":110}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":92}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":14}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":40}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":62}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":19}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":17}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":31}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":21}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":44}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":99}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":46}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":120}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":104}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":19}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":17}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":31}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":21}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":44}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":47}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":30}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":53}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":19}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":17}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":31}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":21}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":44}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":28}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":55}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":61}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":78}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":27}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":14}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":28}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":58}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":19}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":17}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":27}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":21}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":44}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":45}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":24}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":56}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":19}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":17}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":27}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":21}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":44}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":54}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":26}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":69}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":19}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":14}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":20}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":20}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":25}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":27}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":44}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":10}},"721":{"start":{"line":722,"column":0},"end":{"line":722,"column":22}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":25}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":32}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":56}},"725":{"start":{"line":726,"column":0},"end":{"line":726,"column":46}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":10}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":23}},"731":{"start":{"line":732,"column":0},"end":{"line":732,"column":21}},"732":{"start":{"line":733,"column":0},"end":{"line":733,"column":32}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":62}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":47}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":28}},"737":{"start":{"line":738,"column":0},"end":{"line":738,"column":12}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":10}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":29}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":21}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":32}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":128}},"746":{"start":{"line":747,"column":0},"end":{"line":747,"column":30}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":26}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":28}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":36}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":40}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":12}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":54}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":10}},"757":{"start":{"line":758,"column":0},"end":{"line":758,"column":38}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":21}},"759":{"start":{"line":760,"column":0},"end":{"line":760,"column":35}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":174}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":30}},"762":{"start":{"line":763,"column":0},"end":{"line":763,"column":26}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":28}},"764":{"start":{"line":765,"column":0},"end":{"line":765,"column":45}},"765":{"start":{"line":766,"column":0},"end":{"line":766,"column":49}},"766":{"start":{"line":767,"column":0},"end":{"line":767,"column":12}},"767":{"start":{"line":768,"column":0},"end":{"line":768,"column":63}},"768":{"start":{"line":769,"column":0},"end":{"line":769,"column":10}},"772":{"start":{"line":773,"column":0},"end":{"line":773,"column":23}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":20}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":27}},"775":{"start":{"line":776,"column":0},"end":{"line":776,"column":27}},"776":{"start":{"line":777,"column":0},"end":{"line":777,"column":34}},"777":{"start":{"line":778,"column":0},"end":{"line":778,"column":46}},"778":{"start":{"line":779,"column":0},"end":{"line":779,"column":10}},"782":{"start":{"line":783,"column":0},"end":{"line":783,"column":51}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":24}},"784":{"start":{"line":785,"column":0},"end":{"line":785,"column":51}},"785":{"start":{"line":786,"column":0},"end":{"line":786,"column":73}},"786":{"start":{"line":787,"column":0},"end":{"line":787,"column":86}},"787":{"start":{"line":788,"column":0},"end":{"line":788,"column":49}},"788":{"start":{"line":789,"column":0},"end":{"line":789,"column":10}},"792":{"start":{"line":793,"column":0},"end":{"line":793,"column":65}},"793":{"start":{"line":794,"column":0},"end":{"line":794,"column":93}},"794":{"start":{"line":795,"column":0},"end":{"line":795,"column":94}},"795":{"start":{"line":796,"column":0},"end":{"line":796,"column":92}},"796":{"start":{"line":797,"column":0},"end":{"line":797,"column":19}},"797":{"start":{"line":798,"column":0},"end":{"line":798,"column":86}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":58}},"800":{"start":{"line":801,"column":0},"end":{"line":801,"column":20}},"801":{"start":{"line":802,"column":0},"end":{"line":802,"column":20}},"802":{"start":{"line":803,"column":0},"end":{"line":803,"column":21}},"803":{"start":{"line":804,"column":0},"end":{"line":804,"column":32}},"804":{"start":{"line":805,"column":0},"end":{"line":805,"column":48}},"805":{"start":{"line":806,"column":0},"end":{"line":806,"column":45}},"806":{"start":{"line":807,"column":0},"end":{"line":807,"column":18}},"807":{"start":{"line":808,"column":0},"end":{"line":808,"column":62}},"809":{"start":{"line":810,"column":0},"end":{"line":810,"column":41}},"810":{"start":{"line":811,"column":0},"end":{"line":811,"column":23}},"811":{"start":{"line":812,"column":0},"end":{"line":812,"column":18}},"812":{"start":{"line":813,"column":0},"end":{"line":813,"column":56}},"813":{"start":{"line":814,"column":0},"end":{"line":814,"column":50}},"814":{"start":{"line":815,"column":0},"end":{"line":815,"column":23}},"815":{"start":{"line":816,"column":0},"end":{"line":816,"column":33}},"816":{"start":{"line":817,"column":0},"end":{"line":817,"column":75}},"817":{"start":{"line":818,"column":0},"end":{"line":818,"column":62}},"818":{"start":{"line":819,"column":0},"end":{"line":819,"column":141}},"820":{"start":{"line":821,"column":0},"end":{"line":821,"column":77}},"821":{"start":{"line":822,"column":0},"end":{"line":822,"column":50}},"822":{"start":{"line":823,"column":0},"end":{"line":823,"column":82}},"823":{"start":{"line":824,"column":0},"end":{"line":824,"column":57}},"824":{"start":{"line":825,"column":0},"end":{"line":825,"column":49}},"825":{"start":{"line":826,"column":0},"end":{"line":826,"column":68}},"826":{"start":{"line":827,"column":0},"end":{"line":827,"column":24}},"827":{"start":{"line":828,"column":0},"end":{"line":828,"column":24}},"828":{"start":{"line":829,"column":0},"end":{"line":829,"column":25}},"829":{"start":{"line":830,"column":0},"end":{"line":830,"column":17}},"830":{"start":{"line":831,"column":0},"end":{"line":831,"column":18}},"831":{"start":{"line":832,"column":0},"end":{"line":832,"column":58}},"832":{"start":{"line":833,"column":0},"end":{"line":833,"column":21}},"833":{"start":{"line":834,"column":0},"end":{"line":834,"column":35}},"834":{"start":{"line":835,"column":0},"end":{"line":835,"column":32}},"835":{"start":{"line":836,"column":0},"end":{"line":836,"column":48}},"836":{"start":{"line":837,"column":0},"end":{"line":837,"column":45}},"837":{"start":{"line":838,"column":0},"end":{"line":838,"column":18}},"838":{"start":{"line":839,"column":0},"end":{"line":839,"column":34}},"839":{"start":{"line":840,"column":0},"end":{"line":840,"column":15}},"841":{"start":{"line":842,"column":0},"end":{"line":842,"column":23}},"842":{"start":{"line":843,"column":0},"end":{"line":843,"column":18}},"843":{"start":{"line":844,"column":0},"end":{"line":844,"column":16}},"844":{"start":{"line":845,"column":0},"end":{"line":845,"column":14}},"848":{"start":{"line":849,"column":0},"end":{"line":849,"column":22}},"849":{"start":{"line":850,"column":0},"end":{"line":850,"column":20}},"850":{"start":{"line":851,"column":0},"end":{"line":851,"column":32}},"851":{"start":{"line":852,"column":0},"end":{"line":852,"column":62}},"852":{"start":{"line":853,"column":0},"end":{"line":853,"column":46}},"853":{"start":{"line":854,"column":0},"end":{"line":854,"column":10}},"857":{"start":{"line":858,"column":0},"end":{"line":858,"column":69}},"858":{"start":{"line":859,"column":0},"end":{"line":859,"column":26}},"859":{"start":{"line":860,"column":0},"end":{"line":860,"column":32}},"860":{"start":{"line":861,"column":0},"end":{"line":861,"column":62}},"861":{"start":{"line":862,"column":0},"end":{"line":862,"column":33}},"862":{"start":{"line":863,"column":0},"end":{"line":863,"column":46}},"863":{"start":{"line":864,"column":0},"end":{"line":864,"column":41}},"864":{"start":{"line":865,"column":0},"end":{"line":865,"column":17}},"865":{"start":{"line":866,"column":0},"end":{"line":866,"column":65}},"866":{"start":{"line":867,"column":0},"end":{"line":867,"column":72}},"867":{"start":{"line":868,"column":0},"end":{"line":868,"column":41}},"868":{"start":{"line":869,"column":0},"end":{"line":869,"column":21}},"869":{"start":{"line":870,"column":0},"end":{"line":870,"column":59}},"870":{"start":{"line":871,"column":0},"end":{"line":871,"column":13}},"871":{"start":{"line":872,"column":0},"end":{"line":872,"column":12}},"872":{"start":{"line":873,"column":0},"end":{"line":873,"column":10}},"876":{"start":{"line":877,"column":0},"end":{"line":877,"column":27}},"877":{"start":{"line":878,"column":0},"end":{"line":878,"column":25}},"878":{"start":{"line":879,"column":0},"end":{"line":879,"column":32}},"879":{"start":{"line":880,"column":0},"end":{"line":880,"column":62}},"880":{"start":{"line":881,"column":0},"end":{"line":881,"column":51}},"881":{"start":{"line":882,"column":0},"end":{"line":882,"column":10}},"884":{"start":{"line":885,"column":0},"end":{"line":885,"column":24}},"885":{"start":{"line":886,"column":0},"end":{"line":886,"column":24}},"886":{"start":{"line":887,"column":0},"end":{"line":887,"column":32}},"887":{"start":{"line":888,"column":0},"end":{"line":888,"column":62}},"888":{"start":{"line":889,"column":0},"end":{"line":889,"column":48}},"889":{"start":{"line":890,"column":0},"end":{"line":890,"column":10}},"893":{"start":{"line":894,"column":0},"end":{"line":894,"column":12}},"894":{"start":{"line":895,"column":0},"end":{"line":895,"column":31}},"895":{"start":{"line":896,"column":0},"end":{"line":896,"column":19}},"896":{"start":{"line":897,"column":0},"end":{"line":897,"column":21}},"897":{"start":{"line":898,"column":0},"end":{"line":898,"column":26}},"898":{"start":{"line":899,"column":0},"end":{"line":899,"column":26}},"899":{"start":{"line":900,"column":0},"end":{"line":900,"column":43}},"900":{"start":{"line":901,"column":0},"end":{"line":901,"column":21}},"901":{"start":{"line":902,"column":0},"end":{"line":902,"column":49}},"902":{"start":{"line":903,"column":0},"end":{"line":903,"column":11}},"903":{"start":{"line":904,"column":0},"end":{"line":904,"column":30}},"904":{"start":{"line":905,"column":0},"end":{"line":905,"column":10}},"905":{"start":{"line":906,"column":0},"end":{"line":906,"column":8}},"906":{"start":{"line":907,"column":0},"end":{"line":907,"column":11}},"908":{"start":{"line":909,"column":0},"end":{"line":909,"column":1}},"914":{"start":{"line":915,"column":0},"end":{"line":915,"column":81}},"915":{"start":{"line":916,"column":0},"end":{"line":916,"column":81}},"916":{"start":{"line":917,"column":0},"end":{"line":917,"column":80}},"917":{"start":{"line":918,"column":0},"end":{"line":918,"column":82}},"918":{"start":{"line":919,"column":0},"end":{"line":919,"column":84}},"919":{"start":{"line":920,"column":0},"end":{"line":920,"column":78}},"920":{"start":{"line":921,"column":0},"end":{"line":921,"column":86}},"921":{"start":{"line":922,"column":0},"end":{"line":922,"column":80}},"922":{"start":{"line":923,"column":0},"end":{"line":923,"column":2}},"924":{"start":{"line":925,"column":0},"end":{"line":925,"column":32}},"925":{"start":{"line":926,"column":0},"end":{"line":926,"column":39}},"926":{"start":{"line":927,"column":0},"end":{"line":927,"column":35}},"927":{"start":{"line":928,"column":0},"end":{"line":928,"column":56}},"928":{"start":{"line":929,"column":0},"end":{"line":929,"column":43}},"929":{"start":{"line":930,"column":0},"end":{"line":930,"column":74}},"930":{"start":{"line":931,"column":0},"end":{"line":931,"column":76}},"931":{"start":{"line":932,"column":0},"end":{"line":932,"column":75}},"932":{"start":{"line":933,"column":0},"end":{"line":933,"column":77}},"933":{"start":{"line":934,"column":0},"end":{"line":934,"column":64}},"934":{"start":{"line":935,"column":0},"end":{"line":935,"column":66}},"935":{"start":{"line":936,"column":0},"end":{"line":936,"column":54}},"936":{"start":{"line":937,"column":0},"end":{"line":937,"column":61}},"937":{"start":{"line":938,"column":0},"end":{"line":938,"column":62}},"938":{"start":{"line":939,"column":0},"end":{"line":939,"column":73}},"939":{"start":{"line":940,"column":0},"end":{"line":940,"column":64}},"940":{"start":{"line":941,"column":0},"end":{"line":941,"column":76}},"941":{"start":{"line":942,"column":0},"end":{"line":942,"column":58}},"942":{"start":{"line":943,"column":0},"end":{"line":943,"column":61}},"943":{"start":{"line":944,"column":0},"end":{"line":944,"column":64}},"944":{"start":{"line":945,"column":0},"end":{"line":945,"column":66}},"945":{"start":{"line":946,"column":0},"end":{"line":946,"column":62}},"946":{"start":{"line":947,"column":0},"end":{"line":947,"column":56}},"947":{"start":{"line":948,"column":0},"end":{"line":948,"column":66}},"949":{"start":{"line":950,"column":0},"end":{"line":950,"column":50}},"950":{"start":{"line":951,"column":0},"end":{"line":951,"column":42}},"951":{"start":{"line":952,"column":0},"end":{"line":952,"column":63}},"952":{"start":{"line":953,"column":0},"end":{"line":953,"column":5}},"954":{"start":{"line":955,"column":0},"end":{"line":955,"column":39}},"955":{"start":{"line":956,"column":0},"end":{"line":956,"column":27}},"956":{"start":{"line":957,"column":0},"end":{"line":957,"column":29}},"957":{"start":{"line":958,"column":0},"end":{"line":958,"column":5}},"959":{"start":{"line":960,"column":0},"end":{"line":960,"column":39}},"960":{"start":{"line":961,"column":0},"end":{"line":961,"column":27}},"961":{"start":{"line":962,"column":0},"end":{"line":962,"column":37}},"962":{"start":{"line":963,"column":0},"end":{"line":963,"column":5}},"964":{"start":{"line":965,"column":0},"end":{"line":965,"column":42}},"965":{"start":{"line":966,"column":0},"end":{"line":966,"column":42}},"966":{"start":{"line":967,"column":0},"end":{"line":967,"column":64}},"967":{"start":{"line":968,"column":0},"end":{"line":968,"column":24}},"968":{"start":{"line":969,"column":0},"end":{"line":969,"column":6}},"969":{"start":{"line":970,"column":0},"end":{"line":970,"column":27}},"970":{"start":{"line":971,"column":0},"end":{"line":971,"column":64}},"971":{"start":{"line":972,"column":0},"end":{"line":972,"column":32}},"972":{"start":{"line":973,"column":0},"end":{"line":973,"column":69}},"973":{"start":{"line":974,"column":0},"end":{"line":974,"column":6}},"974":{"start":{"line":975,"column":0},"end":{"line":975,"column":20}},"975":{"start":{"line":976,"column":0},"end":{"line":976,"column":54}},"976":{"start":{"line":977,"column":0},"end":{"line":977,"column":6}},"977":{"start":{"line":978,"column":0},"end":{"line":978,"column":5}},"979":{"start":{"line":980,"column":0},"end":{"line":980,"column":73}},"982":{"start":{"line":983,"column":0},"end":{"line":983,"column":38}},"983":{"start":{"line":984,"column":0},"end":{"line":984,"column":84}},"984":{"start":{"line":985,"column":0},"end":{"line":985,"column":12}},"986":{"start":{"line":987,"column":0},"end":{"line":987,"column":35}},"987":{"start":{"line":988,"column":0},"end":{"line":988,"column":84}},"988":{"start":{"line":989,"column":0},"end":{"line":989,"column":5}},"990":{"start":{"line":991,"column":0},"end":{"line":991,"column":33}},"991":{"start":{"line":992,"column":0},"end":{"line":992,"column":93}},"992":{"start":{"line":993,"column":0},"end":{"line":993,"column":12}},"994":{"start":{"line":995,"column":0},"end":{"line":995,"column":35}},"995":{"start":{"line":996,"column":0},"end":{"line":996,"column":21}},"997":{"start":{"line":998,"column":0},"end":{"line":998,"column":29}},"998":{"start":{"line":999,"column":0},"end":{"line":999,"column":49}},"999":{"start":{"line":1000,"column":0},"end":{"line":1000,"column":35}},"1001":{"start":{"line":1002,"column":0},"end":{"line":1002,"column":27}},"1002":{"start":{"line":1003,"column":0},"end":{"line":1003,"column":22}},"1003":{"start":{"line":1004,"column":0},"end":{"line":1004,"column":92}},"1004":{"start":{"line":1005,"column":0},"end":{"line":1005,"column":16}},"1005":{"start":{"line":1006,"column":0},"end":{"line":1006,"column":25}},"1006":{"start":{"line":1007,"column":0},"end":{"line":1007,"column":96}},"1007":{"start":{"line":1008,"column":0},"end":{"line":1008,"column":16}},"1008":{"start":{"line":1009,"column":0},"end":{"line":1009,"column":26}},"1009":{"start":{"line":1010,"column":0},"end":{"line":1010,"column":123}},"1010":{"start":{"line":1011,"column":0},"end":{"line":1011,"column":16}},"1011":{"start":{"line":1012,"column":0},"end":{"line":1012,"column":25}},"1012":{"start":{"line":1013,"column":0},"end":{"line":1013,"column":53}},"1013":{"start":{"line":1014,"column":0},"end":{"line":1014,"column":16}},"1014":{"start":{"line":1015,"column":0},"end":{"line":1015,"column":22}},"1015":{"start":{"line":1016,"column":0},"end":{"line":1016,"column":52}},"1016":{"start":{"line":1017,"column":0},"end":{"line":1017,"column":16}},"1017":{"start":{"line":1018,"column":0},"end":{"line":1018,"column":26}},"1018":{"start":{"line":1019,"column":0},"end":{"line":1019,"column":52}},"1019":{"start":{"line":1020,"column":0},"end":{"line":1020,"column":16}},"1020":{"start":{"line":1021,"column":0},"end":{"line":1021,"column":7}},"1023":{"start":{"line":1024,"column":0},"end":{"line":1024,"column":102}},"1026":{"start":{"line":1027,"column":0},"end":{"line":1027,"column":48}},"1027":{"start":{"line":1028,"column":0},"end":{"line":1028,"column":64}},"1030":{"start":{"line":1031,"column":0},"end":{"line":1031,"column":63}},"1031":{"start":{"line":1032,"column":0},"end":{"line":1032,"column":53}},"1032":{"start":{"line":1033,"column":0},"end":{"line":1033,"column":33}},"1033":{"start":{"line":1034,"column":0},"end":{"line":1034,"column":56}},"1034":{"start":{"line":1035,"column":0},"end":{"line":1035,"column":69}},"1037":{"start":{"line":1038,"column":0},"end":{"line":1038,"column":95}},"1040":{"start":{"line":1041,"column":0},"end":{"line":1041,"column":70}},"1041":{"start":{"line":1042,"column":0},"end":{"line":1042,"column":71}},"1043":{"start":{"line":1044,"column":0},"end":{"line":1044,"column":117}},"1044":{"start":{"line":1045,"column":0},"end":{"line":1045,"column":6}},"1045":{"start":{"line":1046,"column":0},"end":{"line":1046,"column":21}},"1046":{"start":{"line":1047,"column":0},"end":{"line":1047,"column":23}},"1047":{"start":{"line":1048,"column":0},"end":{"line":1048,"column":25}},"1048":{"start":{"line":1049,"column":0},"end":{"line":1049,"column":85}},"1049":{"start":{"line":1050,"column":0},"end":{"line":1050,"column":24}},"1050":{"start":{"line":1051,"column":0},"end":{"line":1051,"column":85}},"1051":{"start":{"line":1052,"column":0},"end":{"line":1052,"column":24}},"1052":{"start":{"line":1053,"column":0},"end":{"line":1053,"column":88}},"1053":{"start":{"line":1054,"column":0},"end":{"line":1054,"column":25}},"1054":{"start":{"line":1055,"column":0},"end":{"line":1055,"column":88}},"1055":{"start":{"line":1056,"column":0},"end":{"line":1056,"column":25}},"1056":{"start":{"line":1057,"column":0},"end":{"line":1057,"column":43}},"1057":{"start":{"line":1058,"column":0},"end":{"line":1058,"column":24}},"1058":{"start":{"line":1059,"column":0},"end":{"line":1059,"column":43}},"1059":{"start":{"line":1060,"column":0},"end":{"line":1060,"column":16}},"1060":{"start":{"line":1061,"column":0},"end":{"line":1061,"column":19}},"1061":{"start":{"line":1062,"column":0},"end":{"line":1062,"column":7}},"1062":{"start":{"line":1063,"column":0},"end":{"line":1063,"column":7}},"1064":{"start":{"line":1065,"column":0},"end":{"line":1065,"column":64}},"1066":{"start":{"line":1067,"column":0},"end":{"line":1067,"column":40}},"1067":{"start":{"line":1068,"column":0},"end":{"line":1068,"column":30}},"1068":{"start":{"line":1069,"column":0},"end":{"line":1069,"column":33}},"1069":{"start":{"line":1070,"column":0},"end":{"line":1070,"column":25}},"1070":{"start":{"line":1071,"column":0},"end":{"line":1071,"column":24}},"1071":{"start":{"line":1072,"column":0},"end":{"line":1072,"column":14}},"1072":{"start":{"line":1073,"column":0},"end":{"line":1073,"column":21}},"1073":{"start":{"line":1074,"column":0},"end":{"line":1074,"column":7}},"1074":{"start":{"line":1075,"column":0},"end":{"line":1075,"column":18}},"1075":{"start":{"line":1076,"column":0},"end":{"line":1076,"column":7}},"1076":{"start":{"line":1077,"column":0},"end":{"line":1077,"column":4}},"1078":{"start":{"line":1079,"column":0},"end":{"line":1079,"column":27}},"1079":{"start":{"line":1080,"column":0},"end":{"line":1080,"column":27}},"1080":{"start":{"line":1081,"column":0},"end":{"line":1081,"column":65}},"1081":{"start":{"line":1082,"column":0},"end":{"line":1082,"column":5}},"1082":{"start":{"line":1083,"column":0},"end":{"line":1083,"column":4}},"1084":{"start":{"line":1085,"column":0},"end":{"line":1085,"column":32}},"1085":{"start":{"line":1086,"column":0},"end":{"line":1086,"column":30}},"1086":{"start":{"line":1087,"column":0},"end":{"line":1087,"column":30}},"1087":{"start":{"line":1088,"column":0},"end":{"line":1088,"column":4}},"1089":{"start":{"line":1090,"column":0},"end":{"line":1090,"column":42}},"1090":{"start":{"line":1091,"column":0},"end":{"line":1091,"column":31}},"1091":{"start":{"line":1092,"column":0},"end":{"line":1092,"column":33}},"1092":{"start":{"line":1093,"column":0},"end":{"line":1093,"column":28}},"1093":{"start":{"line":1094,"column":0},"end":{"line":1094,"column":27}},"1094":{"start":{"line":1095,"column":0},"end":{"line":1095,"column":14}},"1095":{"start":{"line":1096,"column":0},"end":{"line":1096,"column":24}},"1096":{"start":{"line":1097,"column":0},"end":{"line":1097,"column":7}},"1097":{"start":{"line":1098,"column":0},"end":{"line":1098,"column":18}},"1098":{"start":{"line":1099,"column":0},"end":{"line":1099,"column":7}},"1099":{"start":{"line":1100,"column":0},"end":{"line":1100,"column":4}},"1101":{"start":{"line":1102,"column":0},"end":{"line":1102,"column":34}},"1102":{"start":{"line":1103,"column":0},"end":{"line":1103,"column":31}},"1103":{"start":{"line":1104,"column":0},"end":{"line":1104,"column":4}},"1105":{"start":{"line":1106,"column":0},"end":{"line":1106,"column":33}},"1106":{"start":{"line":1107,"column":0},"end":{"line":1107,"column":18}},"1107":{"start":{"line":1108,"column":0},"end":{"line":1108,"column":27}},"1108":{"start":{"line":1109,"column":0},"end":{"line":1109,"column":28}},"1109":{"start":{"line":1110,"column":0},"end":{"line":1110,"column":30}},"1110":{"start":{"line":1111,"column":0},"end":{"line":1111,"column":23}},"1111":{"start":{"line":1112,"column":0},"end":{"line":1112,"column":4}},"1113":{"start":{"line":1114,"column":0},"end":{"line":1114,"column":98}},"1116":{"start":{"line":1117,"column":0},"end":{"line":1117,"column":62}},"1117":{"start":{"line":1118,"column":0},"end":{"line":1118,"column":23}},"1118":{"start":{"line":1119,"column":0},"end":{"line":1119,"column":49}},"1119":{"start":{"line":1120,"column":0},"end":{"line":1120,"column":30}},"1120":{"start":{"line":1121,"column":0},"end":{"line":1121,"column":5}},"1121":{"start":{"line":1122,"column":0},"end":{"line":1122,"column":9}},"1123":{"start":{"line":1124,"column":0},"end":{"line":1124,"column":63}},"1124":{"start":{"line":1125,"column":0},"end":{"line":1125,"column":23}},"1126":{"start":{"line":1127,"column":0},"end":{"line":1127,"column":39}},"1127":{"start":{"line":1128,"column":0},"end":{"line":1128,"column":31}},"1128":{"start":{"line":1129,"column":0},"end":{"line":1129,"column":5}},"1129":{"start":{"line":1130,"column":0},"end":{"line":1130,"column":9}},"1131":{"start":{"line":1132,"column":0},"end":{"line":1132,"column":58}},"1132":{"start":{"line":1133,"column":0},"end":{"line":1133,"column":23}},"1133":{"start":{"line":1134,"column":0},"end":{"line":1134,"column":29}},"1135":{"start":{"line":1136,"column":0},"end":{"line":1136,"column":95}},"1136":{"start":{"line":1137,"column":0},"end":{"line":1137,"column":34}},"1137":{"start":{"line":1138,"column":0},"end":{"line":1138,"column":35}},"1138":{"start":{"line":1139,"column":0},"end":{"line":1139,"column":26}},"1139":{"start":{"line":1140,"column":0},"end":{"line":1140,"column":49}},"1140":{"start":{"line":1141,"column":0},"end":{"line":1141,"column":60}},"1141":{"start":{"line":1142,"column":0},"end":{"line":1142,"column":5}},"1142":{"start":{"line":1143,"column":0},"end":{"line":1143,"column":18}},"1145":{"start":{"line":1146,"column":0},"end":{"line":1146,"column":59}},"1146":{"start":{"line":1147,"column":0},"end":{"line":1147,"column":43}},"1148":{"start":{"line":1149,"column":0},"end":{"line":1149,"column":98}},"1149":{"start":{"line":1150,"column":0},"end":{"line":1150,"column":31}},"1150":{"start":{"line":1151,"column":0},"end":{"line":1151,"column":22}},"1151":{"start":{"line":1152,"column":0},"end":{"line":1152,"column":7}},"1152":{"start":{"line":1153,"column":0},"end":{"line":1153,"column":13}},"1153":{"start":{"line":1154,"column":0},"end":{"line":1154,"column":5}},"1155":{"start":{"line":1156,"column":0},"end":{"line":1156,"column":20}},"1156":{"start":{"line":1157,"column":0},"end":{"line":1157,"column":15}},"1157":{"start":{"line":1158,"column":0},"end":{"line":1158,"column":27}},"1158":{"start":{"line":1159,"column":0},"end":{"line":1159,"column":40}},"1159":{"start":{"line":1160,"column":0},"end":{"line":1160,"column":14}},"1160":{"start":{"line":1161,"column":0},"end":{"line":1161,"column":15}},"1161":{"start":{"line":1162,"column":0},"end":{"line":1162,"column":15}},"1162":{"start":{"line":1163,"column":0},"end":{"line":1163,"column":39}},"1163":{"start":{"line":1164,"column":0},"end":{"line":1164,"column":29}},"1164":{"start":{"line":1165,"column":0},"end":{"line":1165,"column":30}},"1165":{"start":{"line":1166,"column":0},"end":{"line":1166,"column":9}},"1166":{"start":{"line":1167,"column":0},"end":{"line":1167,"column":14}},"1167":{"start":{"line":1168,"column":0},"end":{"line":1168,"column":20}},"1168":{"start":{"line":1169,"column":0},"end":{"line":1169,"column":28}},"1169":{"start":{"line":1170,"column":0},"end":{"line":1170,"column":27}},"1170":{"start":{"line":1171,"column":0},"end":{"line":1171,"column":9}},"1171":{"start":{"line":1172,"column":0},"end":{"line":1172,"column":14}},"1172":{"start":{"line":1173,"column":0},"end":{"line":1173,"column":5}},"1173":{"start":{"line":1174,"column":0},"end":{"line":1174,"column":22}},"1175":{"start":{"line":1176,"column":0},"end":{"line":1176,"column":19}},"1176":{"start":{"line":1177,"column":0},"end":{"line":1177,"column":56}},"1177":{"start":{"line":1178,"column":0},"end":{"line":1178,"column":72}},"1178":{"start":{"line":1179,"column":0},"end":{"line":1179,"column":22}},"1180":{"start":{"line":1181,"column":0},"end":{"line":1181,"column":10}},"1181":{"start":{"line":1182,"column":0},"end":{"line":1182,"column":8}},"1182":{"start":{"line":1183,"column":0},"end":{"line":1183,"column":48}},"1183":{"start":{"line":1184,"column":0},"end":{"line":1184,"column":33}},"1184":{"start":{"line":1185,"column":0},"end":{"line":1185,"column":35}},"1185":{"start":{"line":1186,"column":0},"end":{"line":1186,"column":25}},"1188":{"start":{"line":1189,"column":0},"end":{"line":1189,"column":26}},"1189":{"start":{"line":1190,"column":0},"end":{"line":1190,"column":114}},"1190":{"start":{"line":1191,"column":0},"end":{"line":1191,"column":97}},"1191":{"start":{"line":1192,"column":0},"end":{"line":1192,"column":74}},"1192":{"start":{"line":1193,"column":0},"end":{"line":1193,"column":90}},"1193":{"start":{"line":1194,"column":0},"end":{"line":1194,"column":64}},"1194":{"start":{"line":1195,"column":0},"end":{"line":1195,"column":16}},"1195":{"start":{"line":1196,"column":0},"end":{"line":1196,"column":14}},"1199":{"start":{"line":1200,"column":0},"end":{"line":1200,"column":25}},"1200":{"start":{"line":1201,"column":0},"end":{"line":1201,"column":184}},"1201":{"start":{"line":1202,"column":0},"end":{"line":1202,"column":73}},"1202":{"start":{"line":1203,"column":0},"end":{"line":1203,"column":37}},"1204":{"start":{"line":1205,"column":0},"end":{"line":1205,"column":19}},"1205":{"start":{"line":1206,"column":0},"end":{"line":1206,"column":61}},"1206":{"start":{"line":1207,"column":0},"end":{"line":1207,"column":51}},"1207":{"start":{"line":1208,"column":0},"end":{"line":1208,"column":39}},"1208":{"start":{"line":1209,"column":0},"end":{"line":1209,"column":17}},"1209":{"start":{"line":1210,"column":0},"end":{"line":1210,"column":61}},"1210":{"start":{"line":1211,"column":0},"end":{"line":1211,"column":68}},"1212":{"start":{"line":1213,"column":0},"end":{"line":1213,"column":19}},"1213":{"start":{"line":1214,"column":0},"end":{"line":1214,"column":61}},"1214":{"start":{"line":1215,"column":0},"end":{"line":1215,"column":17}},"1215":{"start":{"line":1216,"column":0},"end":{"line":1216,"column":31}},"1216":{"start":{"line":1217,"column":0},"end":{"line":1217,"column":21}},"1217":{"start":{"line":1218,"column":0},"end":{"line":1218,"column":49}},"1219":{"start":{"line":1220,"column":0},"end":{"line":1220,"column":39}},"1221":{"start":{"line":1222,"column":0},"end":{"line":1222,"column":19}},"1222":{"start":{"line":1223,"column":0},"end":{"line":1223,"column":17}},"1223":{"start":{"line":1224,"column":0},"end":{"line":1224,"column":31}},"1224":{"start":{"line":1225,"column":0},"end":{"line":1225,"column":21}},"1225":{"start":{"line":1226,"column":0},"end":{"line":1226,"column":28}},"1226":{"start":{"line":1227,"column":0},"end":{"line":1227,"column":50}},"1227":{"start":{"line":1228,"column":0},"end":{"line":1228,"column":64}},"1228":{"start":{"line":1229,"column":0},"end":{"line":1229,"column":29}},"1229":{"start":{"line":1230,"column":0},"end":{"line":1230,"column":76}},"1230":{"start":{"line":1231,"column":0},"end":{"line":1231,"column":105}},"1231":{"start":{"line":1232,"column":0},"end":{"line":1232,"column":18}},"1232":{"start":{"line":1233,"column":0},"end":{"line":1233,"column":30}},"1233":{"start":{"line":1234,"column":0},"end":{"line":1234,"column":67}},"1234":{"start":{"line":1235,"column":0},"end":{"line":1235,"column":19}},"1235":{"start":{"line":1236,"column":0},"end":{"line":1236,"column":14}},"1237":{"start":{"line":1238,"column":0},"end":{"line":1238,"column":40}},"1239":{"start":{"line":1240,"column":0},"end":{"line":1240,"column":19}},"1240":{"start":{"line":1241,"column":0},"end":{"line":1241,"column":17}},"1241":{"start":{"line":1242,"column":0},"end":{"line":1242,"column":21}},"1242":{"start":{"line":1243,"column":0},"end":{"line":1243,"column":51}},"1243":{"start":{"line":1244,"column":0},"end":{"line":1244,"column":58}},"1245":{"start":{"line":1246,"column":0},"end":{"line":1246,"column":42}},"1247":{"start":{"line":1248,"column":0},"end":{"line":1248,"column":19}},"1248":{"start":{"line":1249,"column":0},"end":{"line":1249,"column":14}},"1251":{"start":{"line":1252,"column":0},"end":{"line":1252,"column":62}},"1252":{"start":{"line":1253,"column":0},"end":{"line":1253,"column":13}},"1253":{"start":{"line":1254,"column":0},"end":{"line":1254,"column":51}},"1254":{"start":{"line":1255,"column":0},"end":{"line":1255,"column":71}},"1255":{"start":{"line":1256,"column":0},"end":{"line":1256,"column":19}},"1256":{"start":{"line":1257,"column":0},"end":{"line":1257,"column":170}},"1257":{"start":{"line":1258,"column":0},"end":{"line":1258,"column":32}},"1258":{"start":{"line":1259,"column":0},"end":{"line":1259,"column":75}},"1260":{"start":{"line":1261,"column":0},"end":{"line":1261,"column":39}},"1261":{"start":{"line":1262,"column":0},"end":{"line":1262,"column":48}},"1262":{"start":{"line":1263,"column":0},"end":{"line":1263,"column":27}},"1263":{"start":{"line":1264,"column":0},"end":{"line":1264,"column":25}},"1264":{"start":{"line":1265,"column":0},"end":{"line":1265,"column":17}},"1265":{"start":{"line":1266,"column":0},"end":{"line":1266,"column":21}},"1266":{"start":{"line":1267,"column":0},"end":{"line":1267,"column":16}},"1267":{"start":{"line":1268,"column":0},"end":{"line":1268,"column":41}},"1268":{"start":{"line":1269,"column":0},"end":{"line":1269,"column":77}},"1269":{"start":{"line":1270,"column":0},"end":{"line":1270,"column":14}},"1270":{"start":{"line":1271,"column":0},"end":{"line":1271,"column":14}},"1271":{"start":{"line":1272,"column":0},"end":{"line":1272,"column":49}},"1273":{"start":{"line":1274,"column":0},"end":{"line":1274,"column":36}},"1274":{"start":{"line":1275,"column":0},"end":{"line":1275,"column":19}},"1275":{"start":{"line":1276,"column":0},"end":{"line":1276,"column":33}},"1276":{"start":{"line":1277,"column":0},"end":{"line":1277,"column":64}},"1277":{"start":{"line":1278,"column":0},"end":{"line":1278,"column":36}},"1279":{"start":{"line":1280,"column":0},"end":{"line":1280,"column":30}},"1280":{"start":{"line":1281,"column":0},"end":{"line":1281,"column":60}},"1282":{"start":{"line":1283,"column":0},"end":{"line":1283,"column":55}},"1283":{"start":{"line":1284,"column":0},"end":{"line":1284,"column":16}},"1285":{"start":{"line":1286,"column":0},"end":{"line":1286,"column":21}},"1286":{"start":{"line":1287,"column":0},"end":{"line":1287,"column":32}},"1287":{"start":{"line":1288,"column":0},"end":{"line":1288,"column":151}},"1288":{"start":{"line":1289,"column":0},"end":{"line":1289,"column":23}},"1289":{"start":{"line":1290,"column":0},"end":{"line":1290,"column":151}},"1290":{"start":{"line":1291,"column":0},"end":{"line":1291,"column":40}},"1291":{"start":{"line":1292,"column":0},"end":{"line":1292,"column":45}},"1292":{"start":{"line":1293,"column":0},"end":{"line":1293,"column":41}},"1293":{"start":{"line":1294,"column":0},"end":{"line":1294,"column":25}},"1294":{"start":{"line":1295,"column":0},"end":{"line":1295,"column":75}},"1295":{"start":{"line":1296,"column":0},"end":{"line":1296,"column":38}},"1296":{"start":{"line":1297,"column":0},"end":{"line":1297,"column":62}},"1297":{"start":{"line":1298,"column":0},"end":{"line":1298,"column":79}},"1298":{"start":{"line":1299,"column":0},"end":{"line":1299,"column":52}},"1299":{"start":{"line":1300,"column":0},"end":{"line":1300,"column":25}},"1300":{"start":{"line":1301,"column":0},"end":{"line":1301,"column":60}},"1301":{"start":{"line":1302,"column":0},"end":{"line":1302,"column":60}},"1302":{"start":{"line":1303,"column":0},"end":{"line":1303,"column":35}},"1303":{"start":{"line":1304,"column":0},"end":{"line":1304,"column":44}},"1304":{"start":{"line":1305,"column":0},"end":{"line":1305,"column":32}},"1305":{"start":{"line":1306,"column":0},"end":{"line":1306,"column":47}},"1306":{"start":{"line":1307,"column":0},"end":{"line":1307,"column":53}},"1307":{"start":{"line":1308,"column":0},"end":{"line":1308,"column":35}},"1308":{"start":{"line":1309,"column":0},"end":{"line":1309,"column":58}},"1309":{"start":{"line":1310,"column":0},"end":{"line":1310,"column":31}},"1310":{"start":{"line":1311,"column":0},"end":{"line":1311,"column":44}},"1311":{"start":{"line":1312,"column":0},"end":{"line":1312,"column":21}},"1312":{"start":{"line":1313,"column":0},"end":{"line":1313,"column":20}},"1314":{"start":{"line":1315,"column":0},"end":{"line":1315,"column":50}},"1316":{"start":{"line":1317,"column":0},"end":{"line":1317,"column":25}},"1317":{"start":{"line":1318,"column":0},"end":{"line":1318,"column":23}},"1318":{"start":{"line":1319,"column":0},"end":{"line":1319,"column":151}},"1319":{"start":{"line":1320,"column":0},"end":{"line":1320,"column":40}},"1320":{"start":{"line":1321,"column":0},"end":{"line":1321,"column":45}},"1321":{"start":{"line":1322,"column":0},"end":{"line":1322,"column":41}},"1322":{"start":{"line":1323,"column":0},"end":{"line":1323,"column":25}},"1323":{"start":{"line":1324,"column":0},"end":{"line":1324,"column":75}},"1324":{"start":{"line":1325,"column":0},"end":{"line":1325,"column":39}},"1325":{"start":{"line":1326,"column":0},"end":{"line":1326,"column":62}},"1326":{"start":{"line":1327,"column":0},"end":{"line":1327,"column":79}},"1327":{"start":{"line":1328,"column":0},"end":{"line":1328,"column":52}},"1328":{"start":{"line":1329,"column":0},"end":{"line":1329,"column":25}},"1329":{"start":{"line":1330,"column":0},"end":{"line":1330,"column":60}},"1330":{"start":{"line":1331,"column":0},"end":{"line":1331,"column":60}},"1331":{"start":{"line":1332,"column":0},"end":{"line":1332,"column":35}},"1332":{"start":{"line":1333,"column":0},"end":{"line":1333,"column":44}},"1333":{"start":{"line":1334,"column":0},"end":{"line":1334,"column":32}},"1334":{"start":{"line":1335,"column":0},"end":{"line":1335,"column":47}},"1335":{"start":{"line":1336,"column":0},"end":{"line":1336,"column":53}},"1336":{"start":{"line":1337,"column":0},"end":{"line":1337,"column":35}},"1337":{"start":{"line":1338,"column":0},"end":{"line":1338,"column":58}},"1338":{"start":{"line":1339,"column":0},"end":{"line":1339,"column":31}},"1339":{"start":{"line":1340,"column":0},"end":{"line":1340,"column":44}},"1340":{"start":{"line":1341,"column":0},"end":{"line":1341,"column":21}},"1341":{"start":{"line":1342,"column":0},"end":{"line":1342,"column":20}},"1343":{"start":{"line":1344,"column":0},"end":{"line":1344,"column":57}},"1345":{"start":{"line":1346,"column":0},"end":{"line":1346,"column":25}},"1346":{"start":{"line":1347,"column":0},"end":{"line":1347,"column":20}},"1348":{"start":{"line":1349,"column":0},"end":{"line":1349,"column":16}},"1350":{"start":{"line":1351,"column":0},"end":{"line":1351,"column":62}},"1351":{"start":{"line":1352,"column":0},"end":{"line":1352,"column":19}},"1352":{"start":{"line":1353,"column":0},"end":{"line":1353,"column":33}},"1353":{"start":{"line":1354,"column":0},"end":{"line":1354,"column":55}},"1355":{"start":{"line":1356,"column":0},"end":{"line":1356,"column":48}},"1356":{"start":{"line":1357,"column":0},"end":{"line":1357,"column":42}},"1357":{"start":{"line":1358,"column":0},"end":{"line":1358,"column":21}},"1359":{"start":{"line":1360,"column":0},"end":{"line":1360,"column":30}},"1360":{"start":{"line":1361,"column":0},"end":{"line":1361,"column":81}},"1361":{"start":{"line":1362,"column":0},"end":{"line":1362,"column":49}},"1363":{"start":{"line":1364,"column":0},"end":{"line":1364,"column":21}},"1365":{"start":{"line":1366,"column":0},"end":{"line":1366,"column":54}},"1366":{"start":{"line":1367,"column":0},"end":{"line":1367,"column":42}},"1368":{"start":{"line":1369,"column":0},"end":{"line":1369,"column":19}},"1369":{"start":{"line":1370,"column":0},"end":{"line":1370,"column":14}},"1370":{"start":{"line":1371,"column":0},"end":{"line":1371,"column":12}},"1373":{"start":{"line":1374,"column":0},"end":{"line":1374,"column":29}},"1374":{"start":{"line":1375,"column":0},"end":{"line":1375,"column":38}},"1375":{"start":{"line":1376,"column":0},"end":{"line":1376,"column":97}},"1377":{"start":{"line":1378,"column":0},"end":{"line":1378,"column":72}},"1378":{"start":{"line":1379,"column":0},"end":{"line":1379,"column":101}},"1379":{"start":{"line":1380,"column":0},"end":{"line":1380,"column":20}},"1380":{"start":{"line":1381,"column":0},"end":{"line":1381,"column":36}},"1381":{"start":{"line":1382,"column":0},"end":{"line":1382,"column":27}},"1382":{"start":{"line":1383,"column":0},"end":{"line":1383,"column":48}},"1383":{"start":{"line":1384,"column":0},"end":{"line":1384,"column":172}},"1384":{"start":{"line":1385,"column":0},"end":{"line":1385,"column":30}},"1385":{"start":{"line":1386,"column":0},"end":{"line":1386,"column":59}},"1386":{"start":{"line":1387,"column":0},"end":{"line":1387,"column":16}},"1387":{"start":{"line":1388,"column":0},"end":{"line":1388,"column":18}},"1389":{"start":{"line":1390,"column":0},"end":{"line":1390,"column":133}},"1390":{"start":{"line":1391,"column":0},"end":{"line":1391,"column":67}},"1391":{"start":{"line":1392,"column":0},"end":{"line":1392,"column":76}},"1392":{"start":{"line":1393,"column":0},"end":{"line":1393,"column":21}},"1393":{"start":{"line":1394,"column":0},"end":{"line":1394,"column":151}},"1394":{"start":{"line":1395,"column":0},"end":{"line":1395,"column":43}},"1395":{"start":{"line":1396,"column":0},"end":{"line":1396,"column":32}},"1396":{"start":{"line":1397,"column":0},"end":{"line":1397,"column":82}},"1399":{"start":{"line":1400,"column":0},"end":{"line":1400,"column":54}},"1400":{"start":{"line":1401,"column":0},"end":{"line":1401,"column":39}},"1401":{"start":{"line":1402,"column":0},"end":{"line":1402,"column":50}},"1402":{"start":{"line":1403,"column":0},"end":{"line":1403,"column":28}},"1403":{"start":{"line":1404,"column":0},"end":{"line":1404,"column":27}},"1404":{"start":{"line":1405,"column":0},"end":{"line":1405,"column":19}},"1405":{"start":{"line":1406,"column":0},"end":{"line":1406,"column":23}},"1406":{"start":{"line":1407,"column":0},"end":{"line":1407,"column":18}},"1407":{"start":{"line":1408,"column":0},"end":{"line":1408,"column":67}},"1408":{"start":{"line":1409,"column":0},"end":{"line":1409,"column":77}},"1409":{"start":{"line":1410,"column":0},"end":{"line":1410,"column":21}},"1410":{"start":{"line":1411,"column":0},"end":{"line":1411,"column":151}},"1411":{"start":{"line":1412,"column":0},"end":{"line":1412,"column":44}},"1412":{"start":{"line":1413,"column":0},"end":{"line":1413,"column":32}},"1413":{"start":{"line":1414,"column":0},"end":{"line":1414,"column":59}},"1416":{"start":{"line":1417,"column":0},"end":{"line":1417,"column":55}},"1417":{"start":{"line":1418,"column":0},"end":{"line":1418,"column":45}},"1418":{"start":{"line":1419,"column":0},"end":{"line":1419,"column":44}},"1419":{"start":{"line":1420,"column":0},"end":{"line":1420,"column":23}},"1420":{"start":{"line":1421,"column":0},"end":{"line":1421,"column":27}},"1421":{"start":{"line":1422,"column":0},"end":{"line":1422,"column":19}},"1422":{"start":{"line":1423,"column":0},"end":{"line":1423,"column":23}},"1423":{"start":{"line":1424,"column":0},"end":{"line":1424,"column":18}},"1424":{"start":{"line":1425,"column":0},"end":{"line":1425,"column":19}},"1425":{"start":{"line":1426,"column":0},"end":{"line":1426,"column":66}},"1426":{"start":{"line":1427,"column":0},"end":{"line":1427,"column":112}},"1427":{"start":{"line":1428,"column":0},"end":{"line":1428,"column":31}},"1428":{"start":{"line":1429,"column":0},"end":{"line":1429,"column":72}},"1429":{"start":{"line":1430,"column":0},"end":{"line":1430,"column":95}},"1430":{"start":{"line":1431,"column":0},"end":{"line":1431,"column":17}},"1431":{"start":{"line":1432,"column":0},"end":{"line":1432,"column":74}},"1433":{"start":{"line":1434,"column":0},"end":{"line":1434,"column":88}},"1434":{"start":{"line":1435,"column":0},"end":{"line":1435,"column":73}},"1435":{"start":{"line":1436,"column":0},"end":{"line":1436,"column":21}},"1436":{"start":{"line":1437,"column":0},"end":{"line":1437,"column":39}},"1437":{"start":{"line":1438,"column":0},"end":{"line":1438,"column":69}},"1438":{"start":{"line":1439,"column":0},"end":{"line":1439,"column":75}},"1439":{"start":{"line":1440,"column":0},"end":{"line":1440,"column":23}},"1440":{"start":{"line":1441,"column":0},"end":{"line":1441,"column":153}},"1441":{"start":{"line":1442,"column":0},"end":{"line":1442,"column":41}},"1442":{"start":{"line":1443,"column":0},"end":{"line":1443,"column":72}},"1444":{"start":{"line":1445,"column":0},"end":{"line":1445,"column":52}},"1445":{"start":{"line":1446,"column":0},"end":{"line":1446,"column":42}},"1446":{"start":{"line":1447,"column":0},"end":{"line":1447,"column":46}},"1447":{"start":{"line":1448,"column":0},"end":{"line":1448,"column":25}},"1448":{"start":{"line":1449,"column":0},"end":{"line":1449,"column":29}},"1449":{"start":{"line":1450,"column":0},"end":{"line":1450,"column":21}},"1450":{"start":{"line":1451,"column":0},"end":{"line":1451,"column":25}},"1451":{"start":{"line":1452,"column":0},"end":{"line":1452,"column":20}},"1453":{"start":{"line":1454,"column":0},"end":{"line":1454,"column":67}},"1454":{"start":{"line":1455,"column":0},"end":{"line":1455,"column":81}},"1455":{"start":{"line":1456,"column":0},"end":{"line":1456,"column":21}},"1456":{"start":{"line":1457,"column":0},"end":{"line":1457,"column":151}},"1457":{"start":{"line":1458,"column":0},"end":{"line":1458,"column":30}},"1458":{"start":{"line":1459,"column":0},"end":{"line":1459,"column":73}},"1460":{"start":{"line":1461,"column":0},"end":{"line":1461,"column":63}},"1461":{"start":{"line":1462,"column":0},"end":{"line":1462,"column":62}},"1462":{"start":{"line":1463,"column":0},"end":{"line":1463,"column":58}},"1463":{"start":{"line":1464,"column":0},"end":{"line":1464,"column":59}},"1464":{"start":{"line":1465,"column":0},"end":{"line":1465,"column":64}},"1465":{"start":{"line":1466,"column":0},"end":{"line":1466,"column":64}},"1466":{"start":{"line":1467,"column":0},"end":{"line":1467,"column":23}},"1467":{"start":{"line":1468,"column":0},"end":{"line":1468,"column":18}},"1468":{"start":{"line":1469,"column":0},"end":{"line":1469,"column":122}},"1469":{"start":{"line":1470,"column":0},"end":{"line":1470,"column":21}},"1470":{"start":{"line":1471,"column":0},"end":{"line":1471,"column":137}},"1471":{"start":{"line":1472,"column":0},"end":{"line":1472,"column":51}},"1472":{"start":{"line":1473,"column":0},"end":{"line":1473,"column":33}},"1474":{"start":{"line":1475,"column":0},"end":{"line":1475,"column":50}},"1475":{"start":{"line":1476,"column":0},"end":{"line":1476,"column":23}},"1476":{"start":{"line":1477,"column":0},"end":{"line":1477,"column":21}},"1477":{"start":{"line":1478,"column":0},"end":{"line":1478,"column":137}},"1478":{"start":{"line":1479,"column":0},"end":{"line":1479,"column":51}},"1479":{"start":{"line":1480,"column":0},"end":{"line":1480,"column":33}},"1481":{"start":{"line":1482,"column":0},"end":{"line":1482,"column":44}},"1482":{"start":{"line":1483,"column":0},"end":{"line":1483,"column":23}},"1483":{"start":{"line":1484,"column":0},"end":{"line":1484,"column":21}},"1484":{"start":{"line":1485,"column":0},"end":{"line":1485,"column":141}},"1485":{"start":{"line":1486,"column":0},"end":{"line":1486,"column":55}},"1486":{"start":{"line":1487,"column":0},"end":{"line":1487,"column":37}},"1488":{"start":{"line":1489,"column":0},"end":{"line":1489,"column":52}},"1489":{"start":{"line":1490,"column":0},"end":{"line":1490,"column":23}},"1490":{"start":{"line":1491,"column":0},"end":{"line":1491,"column":18}},"1491":{"start":{"line":1492,"column":0},"end":{"line":1492,"column":18}},"1492":{"start":{"line":1493,"column":0},"end":{"line":1493,"column":31}},"1493":{"start":{"line":1494,"column":0},"end":{"line":1494,"column":21}},"1494":{"start":{"line":1495,"column":0},"end":{"line":1495,"column":31}},"1495":{"start":{"line":1496,"column":0},"end":{"line":1496,"column":25}},"1496":{"start":{"line":1497,"column":0},"end":{"line":1497,"column":41}},"1497":{"start":{"line":1498,"column":0},"end":{"line":1498,"column":60}},"1499":{"start":{"line":1500,"column":0},"end":{"line":1500,"column":41}},"1501":{"start":{"line":1502,"column":0},"end":{"line":1502,"column":23}},"1503":{"start":{"line":1504,"column":0},"end":{"line":1504,"column":16}},"1505":{"start":{"line":1506,"column":0},"end":{"line":1506,"column":39}},"1506":{"start":{"line":1507,"column":0},"end":{"line":1507,"column":99}},"1507":{"start":{"line":1508,"column":0},"end":{"line":1508,"column":70}},"1508":{"start":{"line":1509,"column":0},"end":{"line":1509,"column":41}},"1509":{"start":{"line":1510,"column":0},"end":{"line":1510,"column":23}},"1510":{"start":{"line":1511,"column":0},"end":{"line":1511,"column":84}},"1511":{"start":{"line":1512,"column":0},"end":{"line":1512,"column":78}},"1512":{"start":{"line":1513,"column":0},"end":{"line":1513,"column":45}},"1513":{"start":{"line":1514,"column":0},"end":{"line":1514,"column":51}},"1514":{"start":{"line":1515,"column":0},"end":{"line":1515,"column":81}},"1515":{"start":{"line":1516,"column":0},"end":{"line":1516,"column":21}},"1516":{"start":{"line":1517,"column":0},"end":{"line":1517,"column":109}},"1518":{"start":{"line":1519,"column":0},"end":{"line":1519,"column":49}},"1519":{"start":{"line":1520,"column":0},"end":{"line":1520,"column":25}},"1521":{"start":{"line":1522,"column":0},"end":{"line":1522,"column":67}},"1522":{"start":{"line":1523,"column":0},"end":{"line":1523,"column":46}},"1523":{"start":{"line":1524,"column":0},"end":{"line":1524,"column":25}},"1524":{"start":{"line":1525,"column":0},"end":{"line":1525,"column":31}},"1525":{"start":{"line":1526,"column":0},"end":{"line":1526,"column":54}},"1526":{"start":{"line":1527,"column":0},"end":{"line":1527,"column":79}},"1527":{"start":{"line":1528,"column":0},"end":{"line":1528,"column":45}},"1528":{"start":{"line":1529,"column":0},"end":{"line":1529,"column":56}},"1529":{"start":{"line":1530,"column":0},"end":{"line":1530,"column":65}},"1530":{"start":{"line":1531,"column":0},"end":{"line":1531,"column":23}},"1531":{"start":{"line":1532,"column":0},"end":{"line":1532,"column":54}},"1532":{"start":{"line":1533,"column":0},"end":{"line":1533,"column":33}},"1533":{"start":{"line":1534,"column":0},"end":{"line":1534,"column":20}},"1534":{"start":{"line":1535,"column":0},"end":{"line":1535,"column":19}},"1535":{"start":{"line":1536,"column":0},"end":{"line":1536,"column":20}},"1536":{"start":{"line":1537,"column":0},"end":{"line":1537,"column":41}},"1537":{"start":{"line":1538,"column":0},"end":{"line":1538,"column":23}},"1538":{"start":{"line":1539,"column":0},"end":{"line":1539,"column":44}},"1539":{"start":{"line":1540,"column":0},"end":{"line":1540,"column":94}},"1541":{"start":{"line":1542,"column":0},"end":{"line":1542,"column":43}},"1543":{"start":{"line":1544,"column":0},"end":{"line":1544,"column":25}},"1545":{"start":{"line":1546,"column":0},"end":{"line":1546,"column":18}},"1547":{"start":{"line":1548,"column":0},"end":{"line":1548,"column":22}},"1548":{"start":{"line":1549,"column":0},"end":{"line":1549,"column":13}},"1551":{"start":{"line":1552,"column":0},"end":{"line":1552,"column":20}},"1552":{"start":{"line":1553,"column":0},"end":{"line":1553,"column":84}},"1553":{"start":{"line":1554,"column":0},"end":{"line":1554,"column":44}},"1554":{"start":{"line":1555,"column":0},"end":{"line":1555,"column":14}},"1555":{"start":{"line":1556,"column":0},"end":{"line":1556,"column":53}},"1556":{"start":{"line":1557,"column":0},"end":{"line":1557,"column":43}},"1557":{"start":{"line":1558,"column":0},"end":{"line":1558,"column":76}},"1558":{"start":{"line":1559,"column":0},"end":{"line":1559,"column":16}},"1559":{"start":{"line":1560,"column":0},"end":{"line":1560,"column":56}},"1561":{"start":{"line":1562,"column":0},"end":{"line":1562,"column":16}},"1562":{"start":{"line":1563,"column":0},"end":{"line":1563,"column":24}},"1563":{"start":{"line":1564,"column":0},"end":{"line":1564,"column":15}},"1564":{"start":{"line":1565,"column":0},"end":{"line":1565,"column":37}},"1565":{"start":{"line":1566,"column":0},"end":{"line":1566,"column":30}},"1566":{"start":{"line":1567,"column":0},"end":{"line":1567,"column":23}},"1567":{"start":{"line":1568,"column":0},"end":{"line":1568,"column":45}},"1568":{"start":{"line":1569,"column":0},"end":{"line":1569,"column":42}},"1570":{"start":{"line":1571,"column":0},"end":{"line":1571,"column":64}},"1571":{"start":{"line":1572,"column":0},"end":{"line":1572,"column":34}},"1572":{"start":{"line":1573,"column":0},"end":{"line":1573,"column":14}},"1573":{"start":{"line":1574,"column":0},"end":{"line":1574,"column":12}},"1574":{"start":{"line":1575,"column":0},"end":{"line":1575,"column":15}},"1575":{"start":{"line":1576,"column":0},"end":{"line":1576,"column":33}},"1576":{"start":{"line":1577,"column":0},"end":{"line":1577,"column":93}},"1577":{"start":{"line":1578,"column":0},"end":{"line":1578,"column":47}},"1578":{"start":{"line":1579,"column":0},"end":{"line":1579,"column":24}},"1579":{"start":{"line":1580,"column":0},"end":{"line":1580,"column":30}},"1580":{"start":{"line":1581,"column":0},"end":{"line":1581,"column":31}},"1581":{"start":{"line":1582,"column":0},"end":{"line":1582,"column":111}},"1582":{"start":{"line":1583,"column":0},"end":{"line":1583,"column":54}},"1583":{"start":{"line":1584,"column":0},"end":{"line":1584,"column":37}},"1584":{"start":{"line":1585,"column":0},"end":{"line":1585,"column":43}},"1585":{"start":{"line":1586,"column":0},"end":{"line":1586,"column":33}},"1586":{"start":{"line":1587,"column":0},"end":{"line":1587,"column":14}},"1587":{"start":{"line":1588,"column":0},"end":{"line":1588,"column":13}},"1588":{"start":{"line":1589,"column":0},"end":{"line":1589,"column":14}},"1589":{"start":{"line":1590,"column":0},"end":{"line":1590,"column":33}},"1590":{"start":{"line":1591,"column":0},"end":{"line":1591,"column":14}},"1591":{"start":{"line":1592,"column":0},"end":{"line":1592,"column":63}},"1593":{"start":{"line":1594,"column":0},"end":{"line":1594,"column":99}},"1594":{"start":{"line":1595,"column":0},"end":{"line":1595,"column":48}},"1595":{"start":{"line":1596,"column":0},"end":{"line":1596,"column":52}},"1596":{"start":{"line":1597,"column":0},"end":{"line":1597,"column":55}},"1597":{"start":{"line":1598,"column":0},"end":{"line":1598,"column":52}},"1598":{"start":{"line":1599,"column":0},"end":{"line":1599,"column":52}},"1599":{"start":{"line":1600,"column":0},"end":{"line":1600,"column":66}},"1600":{"start":{"line":1601,"column":0},"end":{"line":1601,"column":18}},"1602":{"start":{"line":1603,"column":0},"end":{"line":1603,"column":49}},"1603":{"start":{"line":1604,"column":0},"end":{"line":1604,"column":18}},"1604":{"start":{"line":1605,"column":0},"end":{"line":1605,"column":32}},"1605":{"start":{"line":1606,"column":0},"end":{"line":1606,"column":109}},"1606":{"start":{"line":1607,"column":0},"end":{"line":1607,"column":72}},"1607":{"start":{"line":1608,"column":0},"end":{"line":1608,"column":19}},"1609":{"start":{"line":1610,"column":0},"end":{"line":1610,"column":68}},"1610":{"start":{"line":1611,"column":0},"end":{"line":1611,"column":37}},"1611":{"start":{"line":1612,"column":0},"end":{"line":1612,"column":69}},"1612":{"start":{"line":1613,"column":0},"end":{"line":1613,"column":54}},"1613":{"start":{"line":1614,"column":0},"end":{"line":1614,"column":76}},"1615":{"start":{"line":1616,"column":0},"end":{"line":1616,"column":70}},"1617":{"start":{"line":1618,"column":0},"end":{"line":1618,"column":29}},"1619":{"start":{"line":1620,"column":0},"end":{"line":1620,"column":45}},"1620":{"start":{"line":1621,"column":0},"end":{"line":1621,"column":24}},"1621":{"start":{"line":1622,"column":0},"end":{"line":1622,"column":63}},"1622":{"start":{"line":1623,"column":0},"end":{"line":1623,"column":28}},"1623":{"start":{"line":1624,"column":0},"end":{"line":1624,"column":64}},"1624":{"start":{"line":1625,"column":0},"end":{"line":1625,"column":22}},"1626":{"start":{"line":1627,"column":0},"end":{"line":1627,"column":102}},"1627":{"start":{"line":1628,"column":0},"end":{"line":1628,"column":76}},"1628":{"start":{"line":1629,"column":0},"end":{"line":1629,"column":26}},"1630":{"start":{"line":1631,"column":0},"end":{"line":1631,"column":22}},"1631":{"start":{"line":1632,"column":0},"end":{"line":1632,"column":44}},"1632":{"start":{"line":1633,"column":0},"end":{"line":1633,"column":59}},"1633":{"start":{"line":1634,"column":0},"end":{"line":1634,"column":107}},"1634":{"start":{"line":1635,"column":0},"end":{"line":1635,"column":48}},"1635":{"start":{"line":1636,"column":0},"end":{"line":1636,"column":50}},"1636":{"start":{"line":1637,"column":0},"end":{"line":1637,"column":87}},"1637":{"start":{"line":1638,"column":0},"end":{"line":1638,"column":29}},"1639":{"start":{"line":1640,"column":0},"end":{"line":1640,"column":24}},"1640":{"start":{"line":1641,"column":0},"end":{"line":1641,"column":45}},"1641":{"start":{"line":1642,"column":0},"end":{"line":1642,"column":70}},"1642":{"start":{"line":1643,"column":0},"end":{"line":1643,"column":94}},"1643":{"start":{"line":1644,"column":0},"end":{"line":1644,"column":50}},"1644":{"start":{"line":1645,"column":0},"end":{"line":1645,"column":77}},"1645":{"start":{"line":1646,"column":0},"end":{"line":1646,"column":80}},"1646":{"start":{"line":1647,"column":0},"end":{"line":1647,"column":32}},"1647":{"start":{"line":1648,"column":0},"end":{"line":1648,"column":37}},"1648":{"start":{"line":1649,"column":0},"end":{"line":1649,"column":89}},"1649":{"start":{"line":1650,"column":0},"end":{"line":1650,"column":64}},"1650":{"start":{"line":1651,"column":0},"end":{"line":1651,"column":43}},"1651":{"start":{"line":1652,"column":0},"end":{"line":1652,"column":30}},"1652":{"start":{"line":1653,"column":0},"end":{"line":1653,"column":29}},"1653":{"start":{"line":1654,"column":0},"end":{"line":1654,"column":30}},"1655":{"start":{"line":1656,"column":0},"end":{"line":1656,"column":26}},"1657":{"start":{"line":1658,"column":0},"end":{"line":1658,"column":22}},"1658":{"start":{"line":1659,"column":0},"end":{"line":1659,"column":77}},"1659":{"start":{"line":1660,"column":0},"end":{"line":1660,"column":103}},"1660":{"start":{"line":1661,"column":0},"end":{"line":1661,"column":22}},"1661":{"start":{"line":1662,"column":0},"end":{"line":1662,"column":68}},"1662":{"start":{"line":1663,"column":0},"end":{"line":1663,"column":69}},"1663":{"start":{"line":1664,"column":0},"end":{"line":1664,"column":22}},"1664":{"start":{"line":1665,"column":0},"end":{"line":1665,"column":68}},"1665":{"start":{"line":1666,"column":0},"end":{"line":1666,"column":53}},"1666":{"start":{"line":1667,"column":0},"end":{"line":1667,"column":22}},"1667":{"start":{"line":1668,"column":0},"end":{"line":1668,"column":67}},"1668":{"start":{"line":1669,"column":0},"end":{"line":1669,"column":25}},"1669":{"start":{"line":1670,"column":0},"end":{"line":1670,"column":35}},"1670":{"start":{"line":1671,"column":0},"end":{"line":1671,"column":29}},"1671":{"start":{"line":1672,"column":0},"end":{"line":1672,"column":36}},"1672":{"start":{"line":1673,"column":0},"end":{"line":1673,"column":89}},"1673":{"start":{"line":1674,"column":0},"end":{"line":1674,"column":118}},"1674":{"start":{"line":1675,"column":0},"end":{"line":1675,"column":100}},"1675":{"start":{"line":1676,"column":0},"end":{"line":1676,"column":22}},"1676":{"start":{"line":1677,"column":0},"end":{"line":1677,"column":42}},"1678":{"start":{"line":1679,"column":0},"end":{"line":1679,"column":56}},"1679":{"start":{"line":1680,"column":0},"end":{"line":1680,"column":27}},"1680":{"start":{"line":1681,"column":0},"end":{"line":1681,"column":46}},"1681":{"start":{"line":1682,"column":0},"end":{"line":1682,"column":27}},"1682":{"start":{"line":1683,"column":0},"end":{"line":1683,"column":37}},"1683":{"start":{"line":1684,"column":0},"end":{"line":1684,"column":31}},"1684":{"start":{"line":1685,"column":0},"end":{"line":1685,"column":84}},"1685":{"start":{"line":1686,"column":0},"end":{"line":1686,"column":40}},"1687":{"start":{"line":1688,"column":0},"end":{"line":1688,"column":51}},"1688":{"start":{"line":1689,"column":0},"end":{"line":1689,"column":29}},"1690":{"start":{"line":1691,"column":0},"end":{"line":1691,"column":25}},"1691":{"start":{"line":1692,"column":0},"end":{"line":1692,"column":35}},"1692":{"start":{"line":1693,"column":0},"end":{"line":1693,"column":29}},"1693":{"start":{"line":1694,"column":0},"end":{"line":1694,"column":36}},"1694":{"start":{"line":1695,"column":0},"end":{"line":1695,"column":63}},"1695":{"start":{"line":1696,"column":0},"end":{"line":1696,"column":69}},"1696":{"start":{"line":1697,"column":0},"end":{"line":1697,"column":86}},"1697":{"start":{"line":1698,"column":0},"end":{"line":1698,"column":35}},"1698":{"start":{"line":1699,"column":0},"end":{"line":1699,"column":22}},"1699":{"start":{"line":1700,"column":0},"end":{"line":1700,"column":36}},"1701":{"start":{"line":1702,"column":0},"end":{"line":1702,"column":52}},"1702":{"start":{"line":1703,"column":0},"end":{"line":1703,"column":27}},"1703":{"start":{"line":1704,"column":0},"end":{"line":1704,"column":22}},"1704":{"start":{"line":1705,"column":0},"end":{"line":1705,"column":20}},"1705":{"start":{"line":1706,"column":0},"end":{"line":1706,"column":15}},"1706":{"start":{"line":1707,"column":0},"end":{"line":1707,"column":16}},"1707":{"start":{"line":1708,"column":0},"end":{"line":1708,"column":15}},"1708":{"start":{"line":1709,"column":0},"end":{"line":1709,"column":15}},"1711":{"start":{"line":1712,"column":0},"end":{"line":1712,"column":22}},"1712":{"start":{"line":1713,"column":0},"end":{"line":1713,"column":20}},"1713":{"start":{"line":1714,"column":0},"end":{"line":1714,"column":26}},"1714":{"start":{"line":1715,"column":0},"end":{"line":1715,"column":33}},"1715":{"start":{"line":1716,"column":0},"end":{"line":1716,"column":31}},"1716":{"start":{"line":1717,"column":0},"end":{"line":1717,"column":12}},"1717":{"start":{"line":1718,"column":0},"end":{"line":1718,"column":36}},"1718":{"start":{"line":1719,"column":0},"end":{"line":1719,"column":10}},"1722":{"start":{"line":1723,"column":0},"end":{"line":1723,"column":33}},"1723":{"start":{"line":1724,"column":0},"end":{"line":1724,"column":21}},"1724":{"start":{"line":1725,"column":0},"end":{"line":1725,"column":33}},"1725":{"start":{"line":1726,"column":0},"end":{"line":1726,"column":146}},"1726":{"start":{"line":1727,"column":0},"end":{"line":1727,"column":52}},"1727":{"start":{"line":1728,"column":0},"end":{"line":1728,"column":26}},"1728":{"start":{"line":1729,"column":0},"end":{"line":1729,"column":28}},"1729":{"start":{"line":1730,"column":0},"end":{"line":1730,"column":63}},"1730":{"start":{"line":1731,"column":0},"end":{"line":1731,"column":44}},"1731":{"start":{"line":1732,"column":0},"end":{"line":1732,"column":12}},"1732":{"start":{"line":1733,"column":0},"end":{"line":1733,"column":58}},"1733":{"start":{"line":1734,"column":0},"end":{"line":1734,"column":10}},"1737":{"start":{"line":1738,"column":0},"end":{"line":1738,"column":24}},"1738":{"start":{"line":1739,"column":0},"end":{"line":1739,"column":22}},"1739":{"start":{"line":1740,"column":0},"end":{"line":1740,"column":47}},"1740":{"start":{"line":1741,"column":0},"end":{"line":1741,"column":35}},"1741":{"start":{"line":1742,"column":0},"end":{"line":1742,"column":48}},"1742":{"start":{"line":1743,"column":0},"end":{"line":1743,"column":10}},"1746":{"start":{"line":1747,"column":0},"end":{"line":1747,"column":78}},"1747":{"start":{"line":1748,"column":0},"end":{"line":1748,"column":29}},"1748":{"start":{"line":1749,"column":0},"end":{"line":1749,"column":46}},"1749":{"start":{"line":1750,"column":0},"end":{"line":1750,"column":26}},"1750":{"start":{"line":1751,"column":0},"end":{"line":1751,"column":39}},"1751":{"start":{"line":1752,"column":0},"end":{"line":1752,"column":38}},"1752":{"start":{"line":1753,"column":0},"end":{"line":1753,"column":38}},"1753":{"start":{"line":1754,"column":0},"end":{"line":1754,"column":12}},"1754":{"start":{"line":1755,"column":0},"end":{"line":1755,"column":10}},"1756":{"start":{"line":1757,"column":0},"end":{"line":1757,"column":10}},"1758":{"start":{"line":1759,"column":0},"end":{"line":1759,"column":1}}},"s":{"0":0,"64":0,"65":0,"66":0,"67":0,"68":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"207":0,"208":0,"209":0,"210":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"399":0,"400":0,"401":0,"402":0,"403":0,"406":0,"407":0,"408":0,"409":0,"411":0,"412":0,"414":0,"416":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"428":0,"429":0,"430":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"443":0,"444":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"462":0,"465":0,"466":0,"467":0,"468":0,"470":0,"472":0,"475":0,"476":0,"477":0,"478":0,"479":0,"481":0,"482":0,"483":0,"484":0,"485":0,"487":0,"488":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"500":0,"501":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"513":0,"514":0,"515":0,"516":0,"517":0,"519":0,"521":0,"523":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"539":0,"540":0,"542":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"567":0,"569":0,"570":0,"571":0,"572":0,"573":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"598":0,"600":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"610":0,"611":0,"613":0,"614":0,"615":0,"616":0,"618":0,"619":0,"620":0,"621":0,"625":0,"628":0,"629":0,"630":0,"631":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"650":0,"651":0,"652":0,"653":0,"654":0,"656":0,"657":0,"658":0,"659":0,"660":0,"661":0,"662":0,"663":0,"664":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0,"672":0,"673":0,"675":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":0,"682":0,"683":0,"684":0,"685":0,"686":0,"687":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"707":0,"708":0,"709":0,"710":0,"713":0,"714":0,"715":0,"716":0,"717":0,"721":0,"722":0,"723":0,"724":0,"725":0,"726":0,"730":0,"731":0,"732":0,"733":0,"734":0,"735":0,"737":0,"738":0,"742":0,"743":0,"744":0,"745":0,"746":0,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"753":0,"757":0,"758":0,"759":0,"760":0,"761":0,"762":0,"763":0,"764":0,"765":0,"766":0,"767":0,"768":0,"772":0,"773":0,"774":0,"775":0,"776":0,"777":0,"778":0,"782":0,"783":0,"784":0,"785":0,"786":0,"787":0,"788":0,"792":0,"793":0,"794":0,"795":0,"796":0,"797":0,"798":0,"800":0,"801":0,"802":0,"803":0,"804":0,"805":0,"806":0,"807":0,"809":0,"810":0,"811":0,"812":0,"813":0,"814":0,"815":0,"816":0,"817":0,"818":0,"820":0,"821":0,"822":0,"823":0,"824":0,"825":0,"826":0,"827":0,"828":0,"829":0,"830":0,"831":0,"832":0,"833":0,"834":0,"835":0,"836":0,"837":0,"838":0,"839":0,"841":0,"842":0,"843":0,"844":0,"848":0,"849":0,"850":0,"851":0,"852":0,"853":0,"857":0,"858":0,"859":0,"860":0,"861":0,"862":0,"863":0,"864":0,"865":0,"866":0,"867":0,"868":0,"869":0,"870":0,"871":0,"872":0,"876":0,"877":0,"878":0,"879":0,"880":0,"881":0,"884":0,"885":0,"886":0,"887":0,"888":0,"889":0,"893":0,"894":0,"895":0,"896":0,"897":0,"898":0,"899":0,"900":0,"901":0,"902":0,"903":0,"904":0,"905":0,"906":0,"908":0,"914":0,"915":0,"916":0,"917":0,"918":0,"919":0,"920":0,"921":0,"922":0,"924":0,"925":0,"926":0,"927":0,"928":0,"929":0,"930":0,"931":0,"932":0,"933":0,"934":0,"935":0,"936":0,"937":0,"938":0,"939":0,"940":0,"941":0,"942":0,"943":0,"944":0,"945":0,"946":0,"947":0,"949":0,"950":0,"951":0,"952":0,"954":0,"955":0,"956":0,"957":0,"959":0,"960":0,"961":0,"962":0,"964":0,"965":0,"966":0,"967":0,"968":0,"969":0,"970":0,"971":0,"972":0,"973":0,"974":0,"975":0,"976":0,"977":0,"979":0,"982":0,"983":0,"984":0,"986":0,"987":0,"988":0,"990":0,"991":0,"992":0,"994":0,"995":0,"997":0,"998":0,"999":0,"1001":0,"1002":0,"1003":0,"1004":0,"1005":0,"1006":0,"1007":0,"1008":0,"1009":0,"1010":0,"1011":0,"1012":0,"1013":0,"1014":0,"1015":0,"1016":0,"1017":0,"1018":0,"1019":0,"1020":0,"1023":0,"1026":0,"1027":0,"1030":0,"1031":0,"1032":0,"1033":0,"1034":0,"1037":0,"1040":0,"1041":0,"1043":0,"1044":0,"1045":0,"1046":0,"1047":0,"1048":0,"1049":0,"1050":0,"1051":0,"1052":0,"1053":0,"1054":0,"1055":0,"1056":0,"1057":0,"1058":0,"1059":0,"1060":0,"1061":0,"1062":0,"1064":0,"1066":0,"1067":0,"1068":0,"1069":0,"1070":0,"1071":0,"1072":0,"1073":0,"1074":0,"1075":0,"1076":0,"1078":0,"1079":0,"1080":0,"1081":0,"1082":0,"1084":0,"1085":0,"1086":0,"1087":0,"1089":0,"1090":0,"1091":0,"1092":0,"1093":0,"1094":0,"1095":0,"1096":0,"1097":0,"1098":0,"1099":0,"1101":0,"1102":0,"1103":0,"1105":0,"1106":0,"1107":0,"1108":0,"1109":0,"1110":0,"1111":0,"1113":0,"1116":0,"1117":0,"1118":0,"1119":0,"1120":0,"1121":0,"1123":0,"1124":0,"1126":0,"1127":0,"1128":0,"1129":0,"1131":0,"1132":0,"1133":0,"1135":0,"1136":0,"1137":0,"1138":0,"1139":0,"1140":0,"1141":0,"1142":0,"1145":0,"1146":0,"1148":0,"1149":0,"1150":0,"1151":0,"1152":0,"1153":0,"1155":0,"1156":0,"1157":0,"1158":0,"1159":0,"1160":0,"1161":0,"1162":0,"1163":0,"1164":0,"1165":0,"1166":0,"1167":0,"1168":0,"1169":0,"1170":0,"1171":0,"1172":0,"1173":0,"1175":0,"1176":0,"1177":0,"1178":0,"1180":0,"1181":0,"1182":0,"1183":0,"1184":0,"1185":0,"1188":0,"1189":0,"1190":0,"1191":0,"1192":0,"1193":0,"1194":0,"1195":0,"1199":0,"1200":0,"1201":0,"1202":0,"1204":0,"1205":0,"1206":0,"1207":0,"1208":0,"1209":0,"1210":0,"1212":0,"1213":0,"1214":0,"1215":0,"1216":0,"1217":0,"1219":0,"1221":0,"1222":0,"1223":0,"1224":0,"1225":0,"1226":0,"1227":0,"1228":0,"1229":0,"1230":0,"1231":0,"1232":0,"1233":0,"1234":0,"1235":0,"1237":0,"1239":0,"1240":0,"1241":0,"1242":0,"1243":0,"1245":0,"1247":0,"1248":0,"1251":0,"1252":0,"1253":0,"1254":0,"1255":0,"1256":0,"1257":0,"1258":0,"1260":0,"1261":0,"1262":0,"1263":0,"1264":0,"1265":0,"1266":0,"1267":0,"1268":0,"1269":0,"1270":0,"1271":0,"1273":0,"1274":0,"1275":0,"1276":0,"1277":0,"1279":0,"1280":0,"1282":0,"1283":0,"1285":0,"1286":0,"1287":0,"1288":0,"1289":0,"1290":0,"1291":0,"1292":0,"1293":0,"1294":0,"1295":0,"1296":0,"1297":0,"1298":0,"1299":0,"1300":0,"1301":0,"1302":0,"1303":0,"1304":0,"1305":0,"1306":0,"1307":0,"1308":0,"1309":0,"1310":0,"1311":0,"1312":0,"1314":0,"1316":0,"1317":0,"1318":0,"1319":0,"1320":0,"1321":0,"1322":0,"1323":0,"1324":0,"1325":0,"1326":0,"1327":0,"1328":0,"1329":0,"1330":0,"1331":0,"1332":0,"1333":0,"1334":0,"1335":0,"1336":0,"1337":0,"1338":0,"1339":0,"1340":0,"1341":0,"1343":0,"1345":0,"1346":0,"1348":0,"1350":0,"1351":0,"1352":0,"1353":0,"1355":0,"1356":0,"1357":0,"1359":0,"1360":0,"1361":0,"1363":0,"1365":0,"1366":0,"1368":0,"1369":0,"1370":0,"1373":0,"1374":0,"1375":0,"1377":0,"1378":0,"1379":0,"1380":0,"1381":0,"1382":0,"1383":0,"1384":0,"1385":0,"1386":0,"1387":0,"1389":0,"1390":0,"1391":0,"1392":0,"1393":0,"1394":0,"1395":0,"1396":0,"1399":0,"1400":0,"1401":0,"1402":0,"1403":0,"1404":0,"1405":0,"1406":0,"1407":0,"1408":0,"1409":0,"1410":0,"1411":0,"1412":0,"1413":0,"1416":0,"1417":0,"1418":0,"1419":0,"1420":0,"1421":0,"1422":0,"1423":0,"1424":0,"1425":0,"1426":0,"1427":0,"1428":0,"1429":0,"1430":0,"1431":0,"1433":0,"1434":0,"1435":0,"1436":0,"1437":0,"1438":0,"1439":0,"1440":0,"1441":0,"1442":0,"1444":0,"1445":0,"1446":0,"1447":0,"1448":0,"1449":0,"1450":0,"1451":0,"1453":0,"1454":0,"1455":0,"1456":0,"1457":0,"1458":0,"1460":0,"1461":0,"1462":0,"1463":0,"1464":0,"1465":0,"1466":0,"1467":0,"1468":0,"1469":0,"1470":0,"1471":0,"1472":0,"1474":0,"1475":0,"1476":0,"1477":0,"1478":0,"1479":0,"1481":0,"1482":0,"1483":0,"1484":0,"1485":0,"1486":0,"1488":0,"1489":0,"1490":0,"1491":0,"1492":0,"1493":0,"1494":0,"1495":0,"1496":0,"1497":0,"1499":0,"1501":0,"1503":0,"1505":0,"1506":0,"1507":0,"1508":0,"1509":0,"1510":0,"1511":0,"1512":0,"1513":0,"1514":0,"1515":0,"1516":0,"1518":0,"1519":0,"1521":0,"1522":0,"1523":0,"1524":0,"1525":0,"1526":0,"1527":0,"1528":0,"1529":0,"1530":0,"1531":0,"1532":0,"1533":0,"1534":0,"1535":0,"1536":0,"1537":0,"1538":0,"1539":0,"1541":0,"1543":0,"1545":0,"1547":0,"1548":0,"1551":0,"1552":0,"1553":0,"1554":0,"1555":0,"1556":0,"1557":0,"1558":0,"1559":0,"1561":0,"1562":0,"1563":0,"1564":0,"1565":0,"1566":0,"1567":0,"1568":0,"1570":0,"1571":0,"1572":0,"1573":0,"1574":0,"1575":0,"1576":0,"1577":0,"1578":0,"1579":0,"1580":0,"1581":0,"1582":0,"1583":0,"1584":0,"1585":0,"1586":0,"1587":0,"1588":0,"1589":0,"1590":0,"1591":0,"1593":0,"1594":0,"1595":0,"1596":0,"1597":0,"1598":0,"1599":0,"1600":0,"1602":0,"1603":0,"1604":0,"1605":0,"1606":0,"1607":0,"1609":0,"1610":0,"1611":0,"1612":0,"1613":0,"1615":0,"1617":0,"1619":0,"1620":0,"1621":0,"1622":0,"1623":0,"1624":0,"1626":0,"1627":0,"1628":0,"1630":0,"1631":0,"1632":0,"1633":0,"1634":0,"1635":0,"1636":0,"1637":0,"1639":0,"1640":0,"1641":0,"1642":0,"1643":0,"1644":0,"1645":0,"1646":0,"1647":0,"1648":0,"1649":0,"1650":0,"1651":0,"1652":0,"1653":0,"1655":0,"1657":0,"1658":0,"1659":0,"1660":0,"1661":0,"1662":0,"1663":0,"1664":0,"1665":0,"1666":0,"1667":0,"1668":0,"1669":0,"1670":0,"1671":0,"1672":0,"1673":0,"1674":0,"1675":0,"1676":0,"1678":0,"1679":0,"1680":0,"1681":0,"1682":0,"1683":0,"1684":0,"1685":0,"1687":0,"1688":0,"1690":0,"1691":0,"1692":0,"1693":0,"1694":0,"1695":0,"1696":0,"1697":0,"1698":0,"1699":0,"1701":0,"1702":0,"1703":0,"1704":0,"1705":0,"1706":0,"1707":0,"1708":0,"1711":0,"1712":0,"1713":0,"1714":0,"1715":0,"1716":0,"1717":0,"1718":0,"1722":0,"1723":0,"1724":0,"1725":0,"1726":0,"1727":0,"1728":0,"1729":0,"1730":0,"1731":0,"1732":0,"1733":0,"1737":0,"1738":0,"1739":0,"1740":0,"1741":0,"1742":0,"1746":0,"1747":0,"1748":0,"1749":0,"1750":0,"1751":0,"1752":0,"1753":0,"1754":0,"1756":0,"1758":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":1759,"column":-33788}},"locations":[{"start":{"line":1,"column":0},"end":{"line":1759,"column":-33788}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":1759,"column":-33788}},"loc":{"start":{"line":1,"column":0},"end":{"line":1759,"column":-33788}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/pages/CameraPage.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/pages/CameraPage.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":30}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":59}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":44}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":80}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":56}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":59}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":55}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":60}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":58}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":48}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":52}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":38}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":30}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":38}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":20}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":5}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":19}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":18}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":50}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":5}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":18}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":34}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":6}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":16}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":19}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":18}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":27}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":32}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":7}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":6}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":9}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":19}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":42}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":61}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":38}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":32}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":18}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":39}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":5}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":59}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":19}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":42}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":52}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":6}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":74}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":90}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":9}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":35}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":25}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":28}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":4}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":34}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":28}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":26}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":4}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":60}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":56}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":27}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":27}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":26}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":25}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":30}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":5}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":22}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":29}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":30}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":30}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":12}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":4}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":25}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":30}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":27}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":27}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":26}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":25}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":30}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":5}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":22}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":30}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":30}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":12}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":4}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":34}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":38}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":37}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":32}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":12}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":47}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":5}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":4}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":34}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":8}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":29}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":67}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":63}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":52}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":12}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":12}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":78}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":56}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":12}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":3}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":10}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":76}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":127}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":79}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":40}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":44}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":13}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":49}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":60}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":19}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":52}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":35}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":72}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":39}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":47}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":74}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":17}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":13}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":21}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":19}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":54}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":35}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":72}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":41}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":47}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":74}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":17}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":13}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":21}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":16}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":17}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":29}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":33}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":86}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":83}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":99}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":19}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":17}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":38}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":66}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":67}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":29}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":62}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":62}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":19}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":14}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":12}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":67}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":81}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":48}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":96}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":43}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":91}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":55}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":97}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":20}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":20}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":18}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":27}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":93}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":47}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":84}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":69}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":69}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":20}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":23}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":35}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":115}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":17}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":25}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":20}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":18}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":14}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":24}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":26}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":28}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":31}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":60}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":64}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":62}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":12}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":14}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":12}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":10}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":1}}},"s":{"0":0,"6":0,"7":0,"8":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"20":0,"21":0,"22":0,"23":0,"24":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"65":0,"66":0,"67":0,"68":0,"70":0,"71":0,"72":0,"73":0,"75":0,"76":0,"77":0,"78":0,"79":0,"81":0,"82":0,"83":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"92":0,"93":0,"94":0,"95":0,"96":0,"98":0,"99":0,"100":0,"102":0,"103":0,"104":0,"105":0,"106":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"117":0,"118":0,"119":0,"120":0,"121":0,"123":0,"125":0,"126":0,"127":0,"128":0,"129":0,"131":0,"133":0,"134":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"180":0,"181":0,"183":0,"185":0,"186":0,"187":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"209":0,"210":0,"211":0,"212":0,"213":0,"215":0,"216":0,"217":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"232":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":233,"column":-2312}},"locations":[{"start":{"line":1,"column":0},"end":{"line":233,"column":-2312}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":233,"column":-2312}},"loc":{"start":{"line":1,"column":0},"end":{"line":233,"column":-2312}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/pages/ExternalLinkPage.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/pages/ExternalLinkPage.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":45}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":36}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":45}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":31}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":53}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":36}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":51}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":18}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":5}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":18}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":12}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":63}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":69}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":12}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":3}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":23}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":12}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":94}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":47}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":29}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":12}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":3}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":10}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":11}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":20}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":40}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":36}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":23}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":103}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":6}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":1}}},"s":{"0":0,"6":0,"7":0,"8":0,"10":0,"11":0,"12":0,"13":0,"14":0,"16":0,"17":0,"18":0,"19":0,"20":0,"22":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"31":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"42":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":43,"column":-583}},"locations":[{"start":{"line":1,"column":0},"end":{"line":43,"column":-583}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":43,"column":-583}},"loc":{"start":{"line":1,"column":0},"end":{"line":43,"column":-583}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/pages/MaintenancePage.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/pages/MaintenancePage.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":33}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":78}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":10}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":8}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":8}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":11}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":9}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":8}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":9}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":11}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":8}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":6}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":6}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":6}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":7}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":14}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":9}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":6}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":9}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":12}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":11}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":9}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":12}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":2}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":43}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":31}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":37}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":1}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":72}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":24}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":34}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":36}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":54}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":60}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":46}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":10}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":55}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":50}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":35}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":3}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":1}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":77}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":24}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":36}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":37}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":39}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":39}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":40}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":40}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":41}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":39}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":27}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":3}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":21}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":1}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":26}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":7}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":12}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":11}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":4}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":4}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":51}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":53}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":29}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":34}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":57}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":81}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":5}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":36}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":80}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":7}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":4}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":40}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":32}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":48}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":43}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":49}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":30}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":4}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":34}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":49}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":41}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":47}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":28}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":4}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":28}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":59}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":61}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":69}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":64}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":4}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":31}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":41}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":34}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":49}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":90}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":80}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":57}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":12}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":102}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":92}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":69}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":5}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":4}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":10}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":76}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":46}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":53}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":41}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":47}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":61}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":12}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":60}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":64}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":82}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":57}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":32}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":14}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":40}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":51}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":102}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":42}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":17}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":41}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":48}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":77}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":21}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":16}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":39}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":85}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":18}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":99}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":56}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":16}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":18}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":16}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":81}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":66}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":78}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":95}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":29}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":16}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":14}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":58}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":17}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":34}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":62}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":12}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":17}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":21}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":59}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":46}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":36}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":29}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":49}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":19}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":14}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":12}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":10}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":1}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":25}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":11}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":12}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":11}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":13}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":4}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":4}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":49}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":58}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":86}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":70}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":41}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":40}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":49}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":48}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":57}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":5}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":94}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":33}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":41}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":38}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":45}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":29}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":5}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":4}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":10}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":38}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":27}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":59}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":51}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":89}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":53}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":42}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":132}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":55}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":46}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":23}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":46}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":136}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":47}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":51}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":23}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":76}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":140}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":47}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":23}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":18}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":16}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":17}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":50}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":151}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":96}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":46}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":19}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":14}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":54}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":51}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":61}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":59}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":18}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":29}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":55}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":22}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":31}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":36}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":65}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":37}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":61}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":67}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":20}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":119}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":25}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":26}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":27}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":18}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":70}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":73}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":108}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":20}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":21}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":32}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":83}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":40}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":18}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":33}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":135}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":64}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":92}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":22}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":79}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":23}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":16}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":62}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":24}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":53}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":48}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":69}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":18}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":25}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":71}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":111}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":21}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":20}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":19}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":110}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":50}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":22}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":104}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":60}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":22}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":20}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":18}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":14}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":12}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":20}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":74}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":70}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":40}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":30}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":29}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":27}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":37}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":35}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":16}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":15}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":16}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":22}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":11}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":1}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":26}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":11}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":8}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":19}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":12}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":15}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":15}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":4}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":4}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":78}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":57}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":88}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":56}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":53}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":64}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":92}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":59}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":79}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":55}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":63}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":94}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":61}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":52}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":25}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":31}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":64}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":59}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":43}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":4}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":36}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":81}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":36}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":34}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":61}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":44}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":27}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":9}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":27}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":5}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":4}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":114}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":50}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":49}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":97}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":102}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":32}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":46}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":48}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":9}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":5}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":29}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":4}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":49}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":23}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":64}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":17}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":33}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":60}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":43}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":26}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":9}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":25}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":32}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":38}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":28}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":5}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":4}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":44}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":28}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":32}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":93}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":71}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":53}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":54}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":10}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":31}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":11}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":64}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":15}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":83}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":106}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":16}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":63}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":40}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":19}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":14}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":25}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":33}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":42}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":45}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":86}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":49}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":88}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":26}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":33}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":41}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":70}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":172}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":61}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":31}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":22}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":24}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":23}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":97}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":27}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":49}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":40}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":83}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":56}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":51}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":32}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":52}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":25}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":24}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":172}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":64}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":65}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":29}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":24}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":23}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":76}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":84}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":28}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":26}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":35}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":45}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":74}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":172}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":29}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":22}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":24}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":22}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":69}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":23}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":88}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":48}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":63}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":59}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":32}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":33}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":42}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":41}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":68}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":75}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":54}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":61}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":111}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":31}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":60}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":35}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":25}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":26}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":24}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":46}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":100}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":29}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":73}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":29}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":24}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":22}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":21}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":26}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":17}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":78}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":38}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":44}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":63}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":20}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":118}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":57}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":66}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":64}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":24}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":50}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":94}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":92}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":114}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":86}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":26}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":24}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":22}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":20}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":13}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":38}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":44}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":63}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":58}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":28}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":22}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":112}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":45}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":26}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":33}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":42}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":71}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":172}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":40}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":31}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":22}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":48}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":29}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":52}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":101}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":174}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":66}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":67}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":31}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":28}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":37}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":48}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":77}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":172}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":31}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":24}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":26}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":58}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":63}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":59}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":32}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":33}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":42}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":41}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":69}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":74}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":55}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":61}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":82}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":31}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":64}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":35}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":25}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":26}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":48}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":101}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":31}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":97}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":31}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":26}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":24}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":22}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":13}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":20}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":113}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":57}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":70}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":65}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":24}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":50}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":61}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":98}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":121}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":29}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":26}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":92}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":114}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":86}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":26}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":24}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":25}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":55}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":117}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":49}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":27}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":25}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":36}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":62}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":46}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":23}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":22}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":119}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":50}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":27}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":22}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":20}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":13}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":14}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":12}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":35}},"719":{"start":{"line":720,"column":0},"end":{"line":720,"column":13}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":32}},"721":{"start":{"line":722,"column":0},"end":{"line":722,"column":84}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":101}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":16}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":37}},"725":{"start":{"line":726,"column":0},"end":{"line":726,"column":44}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":44}},"727":{"start":{"line":728,"column":0},"end":{"line":728,"column":46}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":96}},"729":{"start":{"line":730,"column":0},"end":{"line":730,"column":88}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":50}},"731":{"start":{"line":732,"column":0},"end":{"line":732,"column":71}},"732":{"start":{"line":733,"column":0},"end":{"line":733,"column":90}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":102}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":85}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":73}},"736":{"start":{"line":737,"column":0},"end":{"line":737,"column":68}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":30}},"739":{"start":{"line":740,"column":0},"end":{"line":740,"column":110}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":79}},"741":{"start":{"line":742,"column":0},"end":{"line":742,"column":119}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":40}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":69}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":63}},"746":{"start":{"line":747,"column":0},"end":{"line":747,"column":93}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":90}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":37}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":57}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":106}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":140}},"755":{"start":{"line":756,"column":0},"end":{"line":756,"column":74}},"756":{"start":{"line":757,"column":0},"end":{"line":757,"column":75}},"757":{"start":{"line":758,"column":0},"end":{"line":758,"column":39}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":36}},"759":{"start":{"line":760,"column":0},"end":{"line":760,"column":45}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":53}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":82}},"762":{"start":{"line":763,"column":0},"end":{"line":763,"column":51}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":123}},"764":{"start":{"line":765,"column":0},"end":{"line":765,"column":83}},"765":{"start":{"line":766,"column":0},"end":{"line":766,"column":34}},"766":{"start":{"line":767,"column":0},"end":{"line":767,"column":143}},"767":{"start":{"line":768,"column":0},"end":{"line":768,"column":39}},"768":{"start":{"line":769,"column":0},"end":{"line":769,"column":32}},"769":{"start":{"line":770,"column":0},"end":{"line":770,"column":141}},"770":{"start":{"line":771,"column":0},"end":{"line":771,"column":34}},"772":{"start":{"line":773,"column":0},"end":{"line":773,"column":35}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":46}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":60}},"775":{"start":{"line":776,"column":0},"end":{"line":776,"column":81}},"776":{"start":{"line":777,"column":0},"end":{"line":777,"column":67}},"777":{"start":{"line":778,"column":0},"end":{"line":778,"column":32}},"778":{"start":{"line":779,"column":0},"end":{"line":779,"column":244}},"780":{"start":{"line":781,"column":0},"end":{"line":781,"column":122}},"781":{"start":{"line":782,"column":0},"end":{"line":782,"column":86}},"782":{"start":{"line":783,"column":0},"end":{"line":783,"column":75}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":37}},"785":{"start":{"line":786,"column":0},"end":{"line":786,"column":30}},"787":{"start":{"line":788,"column":0},"end":{"line":788,"column":23}},"788":{"start":{"line":789,"column":0},"end":{"line":789,"column":24}},"789":{"start":{"line":790,"column":0},"end":{"line":790,"column":30}},"790":{"start":{"line":791,"column":0},"end":{"line":791,"column":21}},"791":{"start":{"line":792,"column":0},"end":{"line":792,"column":15}},"792":{"start":{"line":793,"column":0},"end":{"line":793,"column":16}},"793":{"start":{"line":794,"column":0},"end":{"line":794,"column":14}},"796":{"start":{"line":797,"column":0},"end":{"line":797,"column":37}},"797":{"start":{"line":798,"column":0},"end":{"line":798,"column":14}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":53}},"799":{"start":{"line":800,"column":0},"end":{"line":800,"column":75}},"800":{"start":{"line":801,"column":0},"end":{"line":801,"column":69}},"801":{"start":{"line":802,"column":0},"end":{"line":802,"column":59}},"803":{"start":{"line":804,"column":0},"end":{"line":804,"column":16}},"804":{"start":{"line":805,"column":0},"end":{"line":805,"column":24}},"805":{"start":{"line":806,"column":0},"end":{"line":806,"column":15}},"807":{"start":{"line":808,"column":0},"end":{"line":808,"column":10}},"809":{"start":{"line":810,"column":0},"end":{"line":810,"column":1}},"813":{"start":{"line":814,"column":0},"end":{"line":814,"column":35}},"814":{"start":{"line":815,"column":0},"end":{"line":815,"column":39}},"815":{"start":{"line":816,"column":0},"end":{"line":816,"column":35}},"816":{"start":{"line":817,"column":0},"end":{"line":817,"column":64}},"818":{"start":{"line":819,"column":0},"end":{"line":819,"column":50}},"819":{"start":{"line":820,"column":0},"end":{"line":820,"column":38}},"820":{"start":{"line":821,"column":0},"end":{"line":821,"column":40}},"821":{"start":{"line":822,"column":0},"end":{"line":822,"column":5}},"823":{"start":{"line":824,"column":0},"end":{"line":824,"column":36}},"824":{"start":{"line":825,"column":0},"end":{"line":825,"column":35}},"825":{"start":{"line":826,"column":0},"end":{"line":826,"column":37}},"826":{"start":{"line":827,"column":0},"end":{"line":827,"column":5}},"828":{"start":{"line":829,"column":0},"end":{"line":829,"column":39}},"829":{"start":{"line":830,"column":0},"end":{"line":830,"column":66}},"830":{"start":{"line":831,"column":0},"end":{"line":831,"column":40}},"831":{"start":{"line":832,"column":0},"end":{"line":832,"column":22}},"832":{"start":{"line":833,"column":0},"end":{"line":833,"column":75}},"833":{"start":{"line":834,"column":0},"end":{"line":834,"column":74}},"834":{"start":{"line":835,"column":0},"end":{"line":835,"column":50}},"835":{"start":{"line":836,"column":0},"end":{"line":836,"column":6}},"836":{"start":{"line":837,"column":0},"end":{"line":837,"column":32}},"837":{"start":{"line":838,"column":0},"end":{"line":838,"column":40}},"838":{"start":{"line":839,"column":0},"end":{"line":839,"column":6}},"839":{"start":{"line":840,"column":0},"end":{"line":840,"column":5}},"841":{"start":{"line":842,"column":0},"end":{"line":842,"column":38}},"842":{"start":{"line":843,"column":0},"end":{"line":843,"column":165}},"843":{"start":{"line":844,"column":0},"end":{"line":844,"column":42}},"844":{"start":{"line":845,"column":0},"end":{"line":845,"column":22}},"845":{"start":{"line":846,"column":0},"end":{"line":846,"column":75}},"846":{"start":{"line":847,"column":0},"end":{"line":847,"column":6}},"847":{"start":{"line":848,"column":0},"end":{"line":848,"column":32}},"848":{"start":{"line":849,"column":0},"end":{"line":849,"column":40}},"849":{"start":{"line":850,"column":0},"end":{"line":850,"column":6}},"850":{"start":{"line":851,"column":0},"end":{"line":851,"column":5}},"852":{"start":{"line":853,"column":0},"end":{"line":853,"column":39}},"853":{"start":{"line":854,"column":0},"end":{"line":854,"column":42}},"854":{"start":{"line":855,"column":0},"end":{"line":855,"column":22}},"855":{"start":{"line":856,"column":0},"end":{"line":856,"column":72}},"856":{"start":{"line":857,"column":0},"end":{"line":857,"column":75}},"857":{"start":{"line":858,"column":0},"end":{"line":858,"column":42}},"858":{"start":{"line":859,"column":0},"end":{"line":859,"column":6}},"859":{"start":{"line":860,"column":0},"end":{"line":860,"column":32}},"860":{"start":{"line":861,"column":0},"end":{"line":861,"column":40}},"861":{"start":{"line":862,"column":0},"end":{"line":862,"column":6}},"862":{"start":{"line":863,"column":0},"end":{"line":863,"column":5}},"864":{"start":{"line":865,"column":0},"end":{"line":865,"column":42}},"865":{"start":{"line":866,"column":0},"end":{"line":866,"column":161}},"866":{"start":{"line":867,"column":0},"end":{"line":867,"column":42}},"867":{"start":{"line":868,"column":0},"end":{"line":868,"column":22}},"868":{"start":{"line":869,"column":0},"end":{"line":869,"column":72}},"869":{"start":{"line":870,"column":0},"end":{"line":870,"column":75}},"870":{"start":{"line":871,"column":0},"end":{"line":871,"column":44}},"871":{"start":{"line":872,"column":0},"end":{"line":872,"column":6}},"872":{"start":{"line":873,"column":0},"end":{"line":873,"column":32}},"873":{"start":{"line":874,"column":0},"end":{"line":874,"column":40}},"874":{"start":{"line":875,"column":0},"end":{"line":875,"column":6}},"875":{"start":{"line":876,"column":0},"end":{"line":876,"column":5}},"877":{"start":{"line":878,"column":0},"end":{"line":878,"column":42}},"878":{"start":{"line":879,"column":0},"end":{"line":879,"column":42}},"879":{"start":{"line":880,"column":0},"end":{"line":880,"column":22}},"880":{"start":{"line":881,"column":0},"end":{"line":881,"column":72}},"881":{"start":{"line":882,"column":0},"end":{"line":882,"column":75}},"882":{"start":{"line":883,"column":0},"end":{"line":883,"column":44}},"883":{"start":{"line":884,"column":0},"end":{"line":884,"column":6}},"884":{"start":{"line":885,"column":0},"end":{"line":885,"column":32}},"885":{"start":{"line":886,"column":0},"end":{"line":886,"column":40}},"886":{"start":{"line":887,"column":0},"end":{"line":887,"column":6}},"887":{"start":{"line":888,"column":0},"end":{"line":888,"column":5}},"889":{"start":{"line":890,"column":0},"end":{"line":890,"column":40}},"890":{"start":{"line":891,"column":0},"end":{"line":891,"column":79}},"891":{"start":{"line":892,"column":0},"end":{"line":892,"column":44}},"892":{"start":{"line":893,"column":0},"end":{"line":893,"column":22}},"893":{"start":{"line":894,"column":0},"end":{"line":894,"column":75}},"894":{"start":{"line":895,"column":0},"end":{"line":895,"column":74}},"895":{"start":{"line":896,"column":0},"end":{"line":896,"column":39}},"896":{"start":{"line":897,"column":0},"end":{"line":897,"column":6}},"897":{"start":{"line":898,"column":0},"end":{"line":898,"column":32}},"898":{"start":{"line":899,"column":0},"end":{"line":899,"column":40}},"899":{"start":{"line":900,"column":0},"end":{"line":900,"column":6}},"900":{"start":{"line":901,"column":0},"end":{"line":901,"column":5}},"902":{"start":{"line":903,"column":0},"end":{"line":903,"column":41}},"903":{"start":{"line":904,"column":0},"end":{"line":904,"column":35}},"904":{"start":{"line":905,"column":0},"end":{"line":905,"column":4}},"906":{"start":{"line":907,"column":0},"end":{"line":907,"column":58}},"907":{"start":{"line":908,"column":0},"end":{"line":908,"column":53}},"908":{"start":{"line":909,"column":0},"end":{"line":909,"column":4}},"910":{"start":{"line":911,"column":0},"end":{"line":911,"column":64}},"911":{"start":{"line":912,"column":0},"end":{"line":912,"column":50}},"912":{"start":{"line":913,"column":0},"end":{"line":913,"column":4}},"914":{"start":{"line":915,"column":0},"end":{"line":915,"column":18}},"915":{"start":{"line":916,"column":0},"end":{"line":916,"column":12}},"916":{"start":{"line":917,"column":0},"end":{"line":917,"column":54}},"917":{"start":{"line":918,"column":0},"end":{"line":918,"column":69}},"918":{"start":{"line":919,"column":0},"end":{"line":919,"column":12}},"920":{"start":{"line":921,"column":0},"end":{"line":921,"column":3}},"922":{"start":{"line":923,"column":0},"end":{"line":923,"column":75}},"923":{"start":{"line":924,"column":0},"end":{"line":924,"column":83}},"925":{"start":{"line":926,"column":0},"end":{"line":926,"column":10}},"926":{"start":{"line":927,"column":0},"end":{"line":927,"column":32}},"928":{"start":{"line":929,"column":0},"end":{"line":929,"column":28}},"929":{"start":{"line":930,"column":0},"end":{"line":930,"column":70}},"930":{"start":{"line":931,"column":0},"end":{"line":931,"column":52}},"931":{"start":{"line":932,"column":0},"end":{"line":932,"column":37}},"932":{"start":{"line":933,"column":0},"end":{"line":933,"column":14}},"933":{"start":{"line":934,"column":0},"end":{"line":934,"column":120}},"934":{"start":{"line":935,"column":0},"end":{"line":935,"column":57}},"935":{"start":{"line":936,"column":0},"end":{"line":936,"column":99}},"936":{"start":{"line":937,"column":0},"end":{"line":937,"column":124}},"937":{"start":{"line":938,"column":0},"end":{"line":938,"column":15}},"939":{"start":{"line":940,"column":0},"end":{"line":940,"column":55}},"941":{"start":{"line":942,"column":0},"end":{"line":942,"column":12}},"942":{"start":{"line":943,"column":0},"end":{"line":943,"column":12}},"945":{"start":{"line":946,"column":0},"end":{"line":946,"column":75}},"946":{"start":{"line":947,"column":0},"end":{"line":947,"column":15}},"947":{"start":{"line":948,"column":0},"end":{"line":948,"column":48}},"948":{"start":{"line":949,"column":0},"end":{"line":949,"column":90}},"949":{"start":{"line":950,"column":0},"end":{"line":950,"column":34}},"950":{"start":{"line":951,"column":0},"end":{"line":951,"column":53}},"951":{"start":{"line":952,"column":0},"end":{"line":952,"column":69}},"952":{"start":{"line":953,"column":0},"end":{"line":953,"column":13}},"953":{"start":{"line":954,"column":0},"end":{"line":954,"column":9}},"955":{"start":{"line":956,"column":0},"end":{"line":956,"column":17}},"956":{"start":{"line":957,"column":0},"end":{"line":957,"column":15}},"957":{"start":{"line":958,"column":0},"end":{"line":958,"column":50}},"958":{"start":{"line":959,"column":0},"end":{"line":959,"column":90}},"959":{"start":{"line":960,"column":0},"end":{"line":960,"column":36}},"960":{"start":{"line":961,"column":0},"end":{"line":961,"column":53}},"961":{"start":{"line":962,"column":0},"end":{"line":962,"column":69}},"962":{"start":{"line":963,"column":0},"end":{"line":963,"column":13}},"963":{"start":{"line":964,"column":0},"end":{"line":964,"column":9}},"965":{"start":{"line":966,"column":0},"end":{"line":966,"column":17}},"966":{"start":{"line":967,"column":0},"end":{"line":967,"column":12}},"969":{"start":{"line":970,"column":0},"end":{"line":970,"column":33}},"970":{"start":{"line":971,"column":0},"end":{"line":971,"column":35}},"971":{"start":{"line":972,"column":0},"end":{"line":972,"column":46}},"972":{"start":{"line":973,"column":0},"end":{"line":973,"column":42}},"974":{"start":{"line":975,"column":0},"end":{"line":975,"column":64}},"975":{"start":{"line":976,"column":0},"end":{"line":976,"column":64}},"976":{"start":{"line":977,"column":0},"end":{"line":977,"column":60}},"977":{"start":{"line":978,"column":0},"end":{"line":978,"column":66}},"978":{"start":{"line":979,"column":0},"end":{"line":979,"column":41}},"979":{"start":{"line":980,"column":0},"end":{"line":980,"column":29}},"980":{"start":{"line":981,"column":0},"end":{"line":981,"column":48}},"981":{"start":{"line":982,"column":0},"end":{"line":982,"column":42}},"982":{"start":{"line":983,"column":0},"end":{"line":983,"column":41}},"983":{"start":{"line":984,"column":0},"end":{"line":984,"column":39}},"984":{"start":{"line":985,"column":0},"end":{"line":985,"column":43}},"985":{"start":{"line":986,"column":0},"end":{"line":986,"column":16}},"986":{"start":{"line":987,"column":0},"end":{"line":987,"column":14}},"988":{"start":{"line":989,"column":0},"end":{"line":989,"column":18}},"989":{"start":{"line":990,"column":0},"end":{"line":990,"column":57}},"990":{"start":{"line":991,"column":0},"end":{"line":991,"column":80}},"991":{"start":{"line":992,"column":0},"end":{"line":992,"column":93}},"992":{"start":{"line":993,"column":0},"end":{"line":993,"column":93}},"993":{"start":{"line":994,"column":0},"end":{"line":994,"column":28}},"994":{"start":{"line":995,"column":0},"end":{"line":995,"column":19}},"996":{"start":{"line":997,"column":0},"end":{"line":997,"column":14}},"998":{"start":{"line":999,"column":0},"end":{"line":999,"column":24}},"999":{"start":{"line":1000,"column":0},"end":{"line":1000,"column":29}},"1000":{"start":{"line":1001,"column":0},"end":{"line":1001,"column":29}},"1001":{"start":{"line":1002,"column":0},"end":{"line":1002,"column":41}},"1002":{"start":{"line":1003,"column":0},"end":{"line":1003,"column":47}},"1004":{"start":{"line":1005,"column":0},"end":{"line":1005,"column":60}},"1005":{"start":{"line":1006,"column":0},"end":{"line":1006,"column":78}},"1006":{"start":{"line":1007,"column":0},"end":{"line":1007,"column":62}},"1007":{"start":{"line":1008,"column":0},"end":{"line":1008,"column":10}},"1009":{"start":{"line":1010,"column":0},"end":{"line":1010,"column":10}},"1011":{"start":{"line":1012,"column":0},"end":{"line":1012,"column":1}}},"s":{"0":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"67":0,"68":0,"69":0,"70":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"102":0,"103":0,"104":0,"105":0,"106":0,"110":0,"111":0,"112":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"125":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"148":0,"149":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"163":0,"164":0,"165":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"178":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"191":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"225":0,"227":0,"228":0,"229":0,"230":0,"232":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"245":0,"246":0,"247":0,"248":0,"250":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"259":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"269":0,"270":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"283":0,"284":0,"285":0,"286":0,"287":0,"289":0,"290":0,"291":0,"293":0,"295":0,"296":0,"297":0,"298":0,"299":0,"301":0,"302":0,"303":0,"304":0,"307":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"347":0,"350":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"373":0,"374":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"391":0,"393":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"421":0,"422":0,"423":0,"424":0,"425":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"476":0,"477":0,"478":0,"479":0,"480":0,"482":0,"483":0,"485":0,"486":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"497":0,"498":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"566":0,"567":0,"569":0,"570":0,"571":0,"572":0,"573":0,"575":0,"576":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"587":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"608":0,"610":0,"611":0,"612":0,"613":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"653":0,"654":0,"655":0,"656":0,"658":0,"659":0,"661":0,"662":0,"663":0,"664":0,"666":0,"667":0,"669":0,"670":0,"671":0,"672":0,"674":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":0,"682":0,"683":0,"684":0,"685":0,"687":0,"688":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"706":0,"708":0,"709":0,"710":0,"711":0,"713":0,"714":0,"715":0,"718":0,"719":0,"720":0,"721":0,"722":0,"723":0,"724":0,"725":0,"726":0,"727":0,"728":0,"729":0,"730":0,"731":0,"732":0,"733":0,"734":0,"735":0,"736":0,"738":0,"739":0,"740":0,"741":0,"743":0,"744":0,"745":0,"746":0,"748":0,"750":0,"751":0,"752":0,"753":0,"755":0,"756":0,"757":0,"758":0,"759":0,"760":0,"761":0,"762":0,"763":0,"764":0,"765":0,"766":0,"767":0,"768":0,"769":0,"770":0,"772":0,"773":0,"774":0,"775":0,"776":0,"777":0,"778":0,"780":0,"781":0,"782":0,"783":0,"785":0,"787":0,"788":0,"789":0,"790":0,"791":0,"792":0,"793":0,"796":0,"797":0,"798":0,"799":0,"800":0,"801":0,"803":0,"804":0,"805":0,"807":0,"809":0,"813":0,"814":0,"815":0,"816":0,"818":0,"819":0,"820":0,"821":0,"823":0,"824":0,"825":0,"826":0,"828":0,"829":0,"830":0,"831":0,"832":0,"833":0,"834":0,"835":0,"836":0,"837":0,"838":0,"839":0,"841":0,"842":0,"843":0,"844":0,"845":0,"846":0,"847":0,"848":0,"849":0,"850":0,"852":0,"853":0,"854":0,"855":0,"856":0,"857":0,"858":0,"859":0,"860":0,"861":0,"862":0,"864":0,"865":0,"866":0,"867":0,"868":0,"869":0,"870":0,"871":0,"872":0,"873":0,"874":0,"875":0,"877":0,"878":0,"879":0,"880":0,"881":0,"882":0,"883":0,"884":0,"885":0,"886":0,"887":0,"889":0,"890":0,"891":0,"892":0,"893":0,"894":0,"895":0,"896":0,"897":0,"898":0,"899":0,"900":0,"902":0,"903":0,"904":0,"906":0,"907":0,"908":0,"910":0,"911":0,"912":0,"914":0,"915":0,"916":0,"917":0,"918":0,"920":0,"922":0,"923":0,"925":0,"926":0,"928":0,"929":0,"930":0,"931":0,"932":0,"933":0,"934":0,"935":0,"936":0,"937":0,"939":0,"941":0,"942":0,"945":0,"946":0,"947":0,"948":0,"949":0,"950":0,"951":0,"952":0,"953":0,"955":0,"956":0,"957":0,"958":0,"959":0,"960":0,"961":0,"962":0,"963":0,"965":0,"966":0,"969":0,"970":0,"971":0,"972":0,"974":0,"975":0,"976":0,"977":0,"978":0,"979":0,"980":0,"981":0,"982":0,"983":0,"984":0,"985":0,"986":0,"988":0,"989":0,"990":0,"991":0,"992":0,"993":0,"994":0,"996":0,"998":0,"999":0,"1000":0,"1001":0,"1002":0,"1004":0,"1005":0,"1006":0,"1007":0,"1009":0,"1011":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":1012,"column":-20428}},"locations":[{"start":{"line":1,"column":0},"end":{"line":1012,"column":-20428}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":1012,"column":-20428}},"loc":{"start":{"line":1,"column":0},"end":{"line":1012,"column":-20428}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/pages/PrintersPage.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/pages/PrintersPage.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":61}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":53}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":31}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":59}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":10}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":9}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":95}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":60}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":12}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":11}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":1}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":65}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":22}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":25}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":26}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":26}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":26}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":4}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":10}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":121}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":11}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":26}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":26}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":147}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":22}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":8}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":36}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":21}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":83}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":21}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":74}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":98}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":14}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":9}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":11}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":26}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":26}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":430}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":22}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":8}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":11}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":26}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":26}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":504}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":22}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":8}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":10}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":1}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":64}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":10}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":121}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":16}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":78}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":11}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":82}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":91}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":12}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":180}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":95}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":177}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":10}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":1}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":64}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":10}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":98}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":515}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":10}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":1}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":63}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":10}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":98}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":516}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":255}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":10}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":1}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":63}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":10}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":98}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":146}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":516}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":10}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":1}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":66}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":10}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":98}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":208}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":83}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":10}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":1}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":65}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":10}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":98}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":74}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":51}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":208}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":10}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":1}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":65}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":10}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":98}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":74}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":51}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":208}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":10}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":1}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":115}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":89}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":70}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":70}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":24}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":25}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":29}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":26}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":27}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":37}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":42}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":24}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":37}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":41}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":24}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":10}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":39}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":23}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":3}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":54}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":29}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":35}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":37}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":62}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":37}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":56}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":10}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":60}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":3}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":10}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":11}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":19}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":23}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":126}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":99}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":43}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":124}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":13}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":1}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":117}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":70}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":70}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":24}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":25}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":56}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":21}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":61}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":24}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":39}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":28}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":60}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":24}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":38}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":10}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":58}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":23}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":38}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":3}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":10}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":11}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":19}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":23}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":114}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":94}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":45}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":97}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":13}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":1}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":73}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":69}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":36}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":31}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":61}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":78}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":49}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":1}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":46}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":43}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":52}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":61}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":1}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":54}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":25}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":69}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":27}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":29}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":31}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":30}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":85}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":91}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":22}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":19}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":29}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":33}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":10}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":76}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":3}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":1}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":68}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":49}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":61}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":65}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":100}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":64}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":65}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":95}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":65}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":65}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":65}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":71}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":63}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":37}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":1}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":107}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":76}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":85}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":80}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":79}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":79}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":64}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":1}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":85}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":46}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":44}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":56}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":10}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":6}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":10}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":169}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":61}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":26}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":12}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":16}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":23}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":33}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":85}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":44}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":44}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":14}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":68}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":13}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":53}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":12}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":30}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":12}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":89}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":47}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":57}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":16}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":23}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":33}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":71}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":14}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":27}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":80}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":16}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":14}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":7}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":1}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":78}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":39}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":32}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":21}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":17}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":20}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":20}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":36}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":123}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":33}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":18}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":37}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":18}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":46}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":19}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":14}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":15}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":7}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":7}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":80}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":30}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":34}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":19}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":69}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":26}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":7}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":31}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":20}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":37}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":10}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":53}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":31}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":51}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":79}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":44}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":86}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":17}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":14}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":27}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":51}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":62}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":44}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":78}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":17}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":14}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":30}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":51}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":62}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":44}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":84}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":17}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":14}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":10}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":1}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":22}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":10}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":21}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":18}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":24}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":16}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":4}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":4}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":39}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":33}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":50}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":68}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":60}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":64}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":60}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":70}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":72}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":58}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":58}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":18}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":37}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":44}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":52}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":76}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":5}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":80}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":19}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":38}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":46}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":5}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":28}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":61}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":66}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":19}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":86}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":61}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":5}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":33}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":102}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":29}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":35}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":46}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":19}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":47}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":41}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":5}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":20}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":94}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":40}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":49}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":57}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":5}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":41}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":49}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":75}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":25}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":69}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":5}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":41}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":47}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":55}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":5}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":45}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":41}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":47}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":53}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":62}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":5}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":36}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":71}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":38}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":52}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":22}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":64}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":6}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":5}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":39}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":53}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":22}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":81}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":6}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":5}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":44}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":41}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":89}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":22}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":86}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":6}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":5}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":45}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":37}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":103}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":22}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":86}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":67}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":6}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":5}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":19}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":16}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":3}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":10}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":31}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":19}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":66}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":66}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":68}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":18}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":52}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":48}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":137}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":16}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":46}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":57}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":141}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":46}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":24}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":71}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":75}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":25}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":73}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":22}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":22}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":55}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":52}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":104}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":111}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":61}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":27}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":107}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":59}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":69}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":70}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":27}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":20}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":20}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":18}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":52}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":21}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":31}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":25}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":54}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":52}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":23}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":28}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":144}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":25}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":119}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":36}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":45}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":41}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":22}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":50}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":27}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":25}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":119}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":36}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":47}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":41}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":22}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":53}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":27}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":25}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":119}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":36}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":45}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":41}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":22}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":52}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":27}},"721":{"start":{"line":722,"column":0},"end":{"line":722,"column":25}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":132}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":36}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":49}},"725":{"start":{"line":726,"column":0},"end":{"line":726,"column":41}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":22}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":50}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":27}},"731":{"start":{"line":732,"column":0},"end":{"line":732,"column":22}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":18}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":16}},"737":{"start":{"line":738,"column":0},"end":{"line":738,"column":39}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":68}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":19}},"741":{"start":{"line":742,"column":0},"end":{"line":742,"column":87}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":35}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":58}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":50}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":19}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":38}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":46}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":48}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":61}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":21}},"755":{"start":{"line":756,"column":0},"end":{"line":756,"column":59}},"756":{"start":{"line":757,"column":0},"end":{"line":757,"column":21}},"757":{"start":{"line":758,"column":0},"end":{"line":758,"column":87}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":37}},"759":{"start":{"line":760,"column":0},"end":{"line":760,"column":60}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":41}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":60}},"762":{"start":{"line":763,"column":0},"end":{"line":763,"column":41}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":56}},"764":{"start":{"line":765,"column":0},"end":{"line":765,"column":41}},"765":{"start":{"line":766,"column":0},"end":{"line":766,"column":58}},"766":{"start":{"line":767,"column":0},"end":{"line":767,"column":52}},"767":{"start":{"line":768,"column":0},"end":{"line":768,"column":21}},"768":{"start":{"line":769,"column":0},"end":{"line":769,"column":90}},"770":{"start":{"line":771,"column":0},"end":{"line":771,"column":48}},"771":{"start":{"line":772,"column":0},"end":{"line":772,"column":33}},"772":{"start":{"line":773,"column":0},"end":{"line":773,"column":23}},"775":{"start":{"line":776,"column":0},"end":{"line":776,"column":37}},"776":{"start":{"line":777,"column":0},"end":{"line":777,"column":23}},"777":{"start":{"line":778,"column":0},"end":{"line":778,"column":55}},"778":{"start":{"line":779,"column":0},"end":{"line":779,"column":138}},"779":{"start":{"line":780,"column":0},"end":{"line":780,"column":69}},"780":{"start":{"line":781,"column":0},"end":{"line":781,"column":68}},"781":{"start":{"line":782,"column":0},"end":{"line":782,"column":54}},"782":{"start":{"line":783,"column":0},"end":{"line":783,"column":60}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":60}},"784":{"start":{"line":785,"column":0},"end":{"line":785,"column":21}},"785":{"start":{"line":786,"column":0},"end":{"line":786,"column":50}},"787":{"start":{"line":788,"column":0},"end":{"line":788,"column":55}},"788":{"start":{"line":789,"column":0},"end":{"line":789,"column":68}},"789":{"start":{"line":790,"column":0},"end":{"line":790,"column":46}},"790":{"start":{"line":791,"column":0},"end":{"line":791,"column":27}},"791":{"start":{"line":792,"column":0},"end":{"line":792,"column":25}},"794":{"start":{"line":795,"column":0},"end":{"line":795,"column":35}},"795":{"start":{"line":796,"column":0},"end":{"line":796,"column":23}},"796":{"start":{"line":797,"column":0},"end":{"line":797,"column":58}},"797":{"start":{"line":798,"column":0},"end":{"line":798,"column":138}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":49}},"799":{"start":{"line":800,"column":0},"end":{"line":800,"column":52}},"800":{"start":{"line":801,"column":0},"end":{"line":801,"column":57}},"801":{"start":{"line":802,"column":0},"end":{"line":802,"column":58}},"802":{"start":{"line":803,"column":0},"end":{"line":803,"column":60}},"803":{"start":{"line":804,"column":0},"end":{"line":804,"column":21}},"804":{"start":{"line":805,"column":0},"end":{"line":805,"column":25}},"805":{"start":{"line":806,"column":0},"end":{"line":806,"column":86}},"806":{"start":{"line":807,"column":0},"end":{"line":807,"column":296}},"807":{"start":{"line":808,"column":0},"end":{"line":808,"column":68}},"810":{"start":{"line":811,"column":0},"end":{"line":811,"column":48}},"811":{"start":{"line":812,"column":0},"end":{"line":812,"column":85}},"812":{"start":{"line":813,"column":0},"end":{"line":813,"column":79}},"813":{"start":{"line":814,"column":0},"end":{"line":814,"column":27}},"814":{"start":{"line":815,"column":0},"end":{"line":815,"column":25}},"817":{"start":{"line":818,"column":0},"end":{"line":818,"column":34}},"818":{"start":{"line":819,"column":0},"end":{"line":819,"column":23}},"819":{"start":{"line":820,"column":0},"end":{"line":820,"column":52}},"820":{"start":{"line":821,"column":0},"end":{"line":821,"column":153}},"821":{"start":{"line":822,"column":0},"end":{"line":822,"column":84}},"823":{"start":{"line":824,"column":0},"end":{"line":824,"column":48}},"824":{"start":{"line":825,"column":0},"end":{"line":825,"column":30}},"825":{"start":{"line":826,"column":0},"end":{"line":826,"column":25}},"827":{"start":{"line":828,"column":0},"end":{"line":828,"column":18}},"829":{"start":{"line":830,"column":0},"end":{"line":830,"column":14}},"832":{"start":{"line":833,"column":0},"end":{"line":833,"column":31}},"833":{"start":{"line":834,"column":0},"end":{"line":834,"column":23}},"834":{"start":{"line":835,"column":0},"end":{"line":835,"column":34}},"835":{"start":{"line":836,"column":0},"end":{"line":836,"column":121}},"836":{"start":{"line":837,"column":0},"end":{"line":837,"column":32}},"837":{"start":{"line":838,"column":0},"end":{"line":838,"column":28}},"838":{"start":{"line":839,"column":0},"end":{"line":839,"column":30}},"839":{"start":{"line":840,"column":0},"end":{"line":840,"column":38}},"840":{"start":{"line":841,"column":0},"end":{"line":841,"column":42}},"841":{"start":{"line":842,"column":0},"end":{"line":842,"column":14}},"842":{"start":{"line":843,"column":0},"end":{"line":843,"column":56}},"843":{"start":{"line":844,"column":0},"end":{"line":844,"column":12}},"847":{"start":{"line":848,"column":0},"end":{"line":848,"column":31}},"848":{"start":{"line":849,"column":0},"end":{"line":849,"column":12}},"850":{"start":{"line":851,"column":0},"end":{"line":851,"column":39}},"851":{"start":{"line":852,"column":0},"end":{"line":852,"column":36}},"852":{"start":{"line":853,"column":0},"end":{"line":853,"column":47}},"853":{"start":{"line":854,"column":0},"end":{"line":854,"column":59}},"854":{"start":{"line":855,"column":0},"end":{"line":855,"column":86}},"855":{"start":{"line":856,"column":0},"end":{"line":856,"column":26}},"856":{"start":{"line":857,"column":0},"end":{"line":857,"column":84}},"857":{"start":{"line":858,"column":0},"end":{"line":858,"column":69}},"858":{"start":{"line":859,"column":0},"end":{"line":859,"column":24}},"859":{"start":{"line":860,"column":0},"end":{"line":860,"column":26}},"860":{"start":{"line":861,"column":0},"end":{"line":861,"column":99}},"861":{"start":{"line":862,"column":0},"end":{"line":862,"column":24}},"863":{"start":{"line":864,"column":0},"end":{"line":864,"column":111}},"865":{"start":{"line":866,"column":0},"end":{"line":866,"column":20}},"868":{"start":{"line":869,"column":0},"end":{"line":869,"column":16}},"870":{"start":{"line":871,"column":0},"end":{"line":871,"column":67}},"871":{"start":{"line":872,"column":0},"end":{"line":872,"column":46}},"873":{"start":{"line":874,"column":0},"end":{"line":874,"column":31}},"874":{"start":{"line":875,"column":0},"end":{"line":875,"column":80}},"875":{"start":{"line":876,"column":0},"end":{"line":876,"column":133}},"876":{"start":{"line":877,"column":0},"end":{"line":877,"column":22}},"878":{"start":{"line":879,"column":0},"end":{"line":879,"column":52}},"879":{"start":{"line":880,"column":0},"end":{"line":880,"column":77}},"880":{"start":{"line":881,"column":0},"end":{"line":881,"column":26}},"881":{"start":{"line":882,"column":0},"end":{"line":882,"column":82}},"882":{"start":{"line":883,"column":0},"end":{"line":883,"column":74}},"883":{"start":{"line":884,"column":0},"end":{"line":884,"column":73}},"884":{"start":{"line":885,"column":0},"end":{"line":885,"column":30}},"885":{"start":{"line":886,"column":0},"end":{"line":886,"column":85}},"886":{"start":{"line":887,"column":0},"end":{"line":887,"column":97}},"887":{"start":{"line":888,"column":0},"end":{"line":888,"column":34}},"888":{"start":{"line":889,"column":0},"end":{"line":889,"column":90}},"889":{"start":{"line":890,"column":0},"end":{"line":890,"column":77}},"890":{"start":{"line":891,"column":0},"end":{"line":891,"column":32}},"891":{"start":{"line":892,"column":0},"end":{"line":892,"column":34}},"892":{"start":{"line":893,"column":0},"end":{"line":893,"column":99}},"893":{"start":{"line":894,"column":0},"end":{"line":894,"column":32}},"894":{"start":{"line":895,"column":0},"end":{"line":895,"column":96}},"895":{"start":{"line":896,"column":0},"end":{"line":896,"column":92}},"896":{"start":{"line":897,"column":0},"end":{"line":897,"column":32}},"897":{"start":{"line":898,"column":0},"end":{"line":898,"column":74}},"898":{"start":{"line":899,"column":0},"end":{"line":899,"column":63}},"899":{"start":{"line":900,"column":0},"end":{"line":900,"column":74}},"900":{"start":{"line":901,"column":0},"end":{"line":901,"column":39}},"901":{"start":{"line":902,"column":0},"end":{"line":902,"column":113}},"902":{"start":{"line":903,"column":0},"end":{"line":903,"column":72}},"903":{"start":{"line":904,"column":0},"end":{"line":904,"column":39}},"904":{"start":{"line":905,"column":0},"end":{"line":905,"column":33}},"906":{"start":{"line":907,"column":0},"end":{"line":907,"column":116}},"907":{"start":{"line":908,"column":0},"end":{"line":908,"column":72}},"908":{"start":{"line":909,"column":0},"end":{"line":909,"column":62}},"909":{"start":{"line":910,"column":0},"end":{"line":910,"column":72}},"910":{"start":{"line":911,"column":0},"end":{"line":911,"column":37}},"912":{"start":{"line":913,"column":0},"end":{"line":913,"column":32}},"913":{"start":{"line":914,"column":0},"end":{"line":914,"column":27}},"915":{"start":{"line":916,"column":0},"end":{"line":916,"column":26}},"916":{"start":{"line":917,"column":0},"end":{"line":917,"column":80}},"917":{"start":{"line":918,"column":0},"end":{"line":918,"column":76}},"918":{"start":{"line":919,"column":0},"end":{"line":919,"column":67}},"919":{"start":{"line":920,"column":0},"end":{"line":920,"column":30}},"920":{"start":{"line":921,"column":0},"end":{"line":921,"column":85}},"921":{"start":{"line":922,"column":0},"end":{"line":922,"column":97}},"922":{"start":{"line":923,"column":0},"end":{"line":923,"column":89}},"923":{"start":{"line":924,"column":0},"end":{"line":924,"column":34}},"924":{"start":{"line":925,"column":0},"end":{"line":925,"column":70}},"925":{"start":{"line":926,"column":0},"end":{"line":926,"column":32}},"926":{"start":{"line":927,"column":0},"end":{"line":927,"column":40}},"927":{"start":{"line":928,"column":0},"end":{"line":928,"column":132}},"928":{"start":{"line":929,"column":0},"end":{"line":929,"column":80}},"929":{"start":{"line":930,"column":0},"end":{"line":930,"column":58}},"930":{"start":{"line":931,"column":0},"end":{"line":931,"column":74}},"931":{"start":{"line":932,"column":0},"end":{"line":932,"column":129}},"932":{"start":{"line":933,"column":0},"end":{"line":933,"column":39}},"934":{"start":{"line":935,"column":0},"end":{"line":935,"column":32}},"936":{"start":{"line":937,"column":0},"end":{"line":937,"column":90}},"938":{"start":{"line":939,"column":0},"end":{"line":939,"column":27}},"940":{"start":{"line":941,"column":0},"end":{"line":941,"column":26}},"941":{"start":{"line":942,"column":0},"end":{"line":942,"column":24}},"942":{"start":{"line":943,"column":0},"end":{"line":943,"column":22}},"945":{"start":{"line":946,"column":0},"end":{"line":946,"column":48}},"946":{"start":{"line":947,"column":0},"end":{"line":947,"column":63}},"948":{"start":{"line":949,"column":0},"end":{"line":949,"column":17}},"952":{"start":{"line":953,"column":0},"end":{"line":953,"column":64}},"953":{"start":{"line":954,"column":0},"end":{"line":954,"column":54}},"955":{"start":{"line":956,"column":0},"end":{"line":956,"column":74}},"956":{"start":{"line":957,"column":0},"end":{"line":957,"column":82}},"957":{"start":{"line":958,"column":0},"end":{"line":958,"column":65}},"958":{"start":{"line":959,"column":0},"end":{"line":959,"column":22}},"959":{"start":{"line":960,"column":0},"end":{"line":960,"column":77}},"960":{"start":{"line":961,"column":0},"end":{"line":961,"column":56}},"961":{"start":{"line":962,"column":0},"end":{"line":962,"column":123}},"962":{"start":{"line":963,"column":0},"end":{"line":963,"column":26}},"963":{"start":{"line":964,"column":0},"end":{"line":964,"column":23}},"965":{"start":{"line":966,"column":0},"end":{"line":966,"column":22}},"966":{"start":{"line":967,"column":0},"end":{"line":967,"column":71}},"967":{"start":{"line":968,"column":0},"end":{"line":968,"column":56}},"968":{"start":{"line":969,"column":0},"end":{"line":969,"column":71}},"969":{"start":{"line":970,"column":0},"end":{"line":970,"column":26}},"970":{"start":{"line":971,"column":0},"end":{"line":971,"column":23}},"972":{"start":{"line":973,"column":0},"end":{"line":973,"column":22}},"973":{"start":{"line":974,"column":0},"end":{"line":974,"column":74}},"974":{"start":{"line":975,"column":0},"end":{"line":975,"column":80}},"975":{"start":{"line":976,"column":0},"end":{"line":976,"column":64}},"976":{"start":{"line":977,"column":0},"end":{"line":977,"column":52}},"977":{"start":{"line":978,"column":0},"end":{"line":978,"column":64}},"978":{"start":{"line":979,"column":0},"end":{"line":979,"column":22}},"979":{"start":{"line":980,"column":0},"end":{"line":980,"column":22}},"980":{"start":{"line":981,"column":0},"end":{"line":981,"column":63}},"981":{"start":{"line":982,"column":0},"end":{"line":982,"column":76}},"982":{"start":{"line":983,"column":0},"end":{"line":983,"column":83}},"983":{"start":{"line":984,"column":0},"end":{"line":984,"column":70}},"984":{"start":{"line":985,"column":0},"end":{"line":985,"column":54}},"985":{"start":{"line":986,"column":0},"end":{"line":986,"column":70}},"986":{"start":{"line":987,"column":0},"end":{"line":987,"column":24}},"987":{"start":{"line":988,"column":0},"end":{"line":988,"column":24}},"989":{"start":{"line":990,"column":0},"end":{"line":990,"column":20}},"993":{"start":{"line":994,"column":0},"end":{"line":994,"column":74}},"994":{"start":{"line":995,"column":0},"end":{"line":995,"column":46}},"995":{"start":{"line":996,"column":0},"end":{"line":996,"column":39}},"998":{"start":{"line":999,"column":0},"end":{"line":999,"column":74}},"1000":{"start":{"line":1001,"column":0},"end":{"line":1001,"column":77}},"1001":{"start":{"line":1002,"column":0},"end":{"line":1002,"column":67}},"1002":{"start":{"line":1003,"column":0},"end":{"line":1003,"column":38}},"1003":{"start":{"line":1004,"column":0},"end":{"line":1004,"column":95}},"1005":{"start":{"line":1006,"column":0},"end":{"line":1006,"column":114}},"1007":{"start":{"line":1008,"column":0},"end":{"line":1008,"column":56}},"1008":{"start":{"line":1009,"column":0},"end":{"line":1009,"column":57}},"1011":{"start":{"line":1012,"column":0},"end":{"line":1012,"column":57}},"1012":{"start":{"line":1013,"column":0},"end":{"line":1013,"column":94}},"1013":{"start":{"line":1014,"column":0},"end":{"line":1014,"column":20}},"1014":{"start":{"line":1015,"column":0},"end":{"line":1015,"column":56}},"1016":{"start":{"line":1017,"column":0},"end":{"line":1017,"column":26}},"1017":{"start":{"line":1018,"column":0},"end":{"line":1018,"column":79}},"1018":{"start":{"line":1019,"column":0},"end":{"line":1019,"column":63}},"1020":{"start":{"line":1021,"column":0},"end":{"line":1021,"column":65}},"1021":{"start":{"line":1022,"column":0},"end":{"line":1022,"column":79}},"1022":{"start":{"line":1023,"column":0},"end":{"line":1023,"column":75}},"1024":{"start":{"line":1025,"column":0},"end":{"line":1025,"column":38}},"1025":{"start":{"line":1026,"column":0},"end":{"line":1026,"column":41}},"1026":{"start":{"line":1027,"column":0},"end":{"line":1027,"column":51}},"1027":{"start":{"line":1028,"column":0},"end":{"line":1028,"column":55}},"1028":{"start":{"line":1029,"column":0},"end":{"line":1029,"column":30}},"1030":{"start":{"line":1031,"column":0},"end":{"line":1031,"column":41}},"1031":{"start":{"line":1032,"column":0},"end":{"line":1032,"column":70}},"1032":{"start":{"line":1033,"column":0},"end":{"line":1033,"column":55}},"1033":{"start":{"line":1034,"column":0},"end":{"line":1034,"column":30}},"1035":{"start":{"line":1036,"column":0},"end":{"line":1036,"column":30}},"1038":{"start":{"line":1039,"column":0},"end":{"line":1039,"column":56}},"1039":{"start":{"line":1040,"column":0},"end":{"line":1040,"column":80}},"1040":{"start":{"line":1041,"column":0},"end":{"line":1041,"column":66}},"1041":{"start":{"line":1042,"column":0},"end":{"line":1042,"column":33}},"1043":{"start":{"line":1044,"column":0},"end":{"line":1044,"column":79}},"1044":{"start":{"line":1045,"column":0},"end":{"line":1045,"column":56}},"1045":{"start":{"line":1046,"column":0},"end":{"line":1046,"column":72}},"1046":{"start":{"line":1047,"column":0},"end":{"line":1047,"column":63}},"1047":{"start":{"line":1048,"column":0},"end":{"line":1048,"column":80}},"1048":{"start":{"line":1049,"column":0},"end":{"line":1049,"column":101}},"1049":{"start":{"line":1050,"column":0},"end":{"line":1050,"column":41}},"1050":{"start":{"line":1051,"column":0},"end":{"line":1051,"column":80}},"1051":{"start":{"line":1052,"column":0},"end":{"line":1052,"column":98}},"1052":{"start":{"line":1053,"column":0},"end":{"line":1053,"column":41}},"1053":{"start":{"line":1054,"column":0},"end":{"line":1054,"column":38}},"1054":{"start":{"line":1055,"column":0},"end":{"line":1055,"column":61}},"1055":{"start":{"line":1056,"column":0},"end":{"line":1056,"column":90}},"1056":{"start":{"line":1057,"column":0},"end":{"line":1057,"column":50}},"1057":{"start":{"line":1058,"column":0},"end":{"line":1058,"column":50}},"1058":{"start":{"line":1059,"column":0},"end":{"line":1059,"column":41}},"1060":{"start":{"line":1061,"column":0},"end":{"line":1061,"column":36}},"1061":{"start":{"line":1062,"column":0},"end":{"line":1062,"column":31}},"1062":{"start":{"line":1063,"column":0},"end":{"line":1063,"column":32}},"1063":{"start":{"line":1064,"column":0},"end":{"line":1064,"column":30}},"1065":{"start":{"line":1066,"column":0},"end":{"line":1066,"column":72}},"1066":{"start":{"line":1067,"column":0},"end":{"line":1067,"column":89}},"1067":{"start":{"line":1068,"column":0},"end":{"line":1068,"column":54}},"1068":{"start":{"line":1069,"column":0},"end":{"line":1069,"column":48}},"1069":{"start":{"line":1070,"column":0},"end":{"line":1070,"column":55}},"1070":{"start":{"line":1071,"column":0},"end":{"line":1071,"column":75}},"1071":{"start":{"line":1072,"column":0},"end":{"line":1072,"column":75}},"1072":{"start":{"line":1073,"column":0},"end":{"line":1073,"column":67}},"1073":{"start":{"line":1074,"column":0},"end":{"line":1074,"column":48}},"1074":{"start":{"line":1075,"column":0},"end":{"line":1075,"column":81}},"1075":{"start":{"line":1076,"column":0},"end":{"line":1076,"column":51}},"1076":{"start":{"line":1077,"column":0},"end":{"line":1077,"column":35}},"1077":{"start":{"line":1078,"column":0},"end":{"line":1078,"column":32}},"1079":{"start":{"line":1080,"column":0},"end":{"line":1080,"column":50}},"1080":{"start":{"line":1081,"column":0},"end":{"line":1081,"column":51}},"1081":{"start":{"line":1082,"column":0},"end":{"line":1082,"column":47}},"1082":{"start":{"line":1083,"column":0},"end":{"line":1083,"column":71}},"1083":{"start":{"line":1084,"column":0},"end":{"line":1084,"column":71}},"1084":{"start":{"line":1085,"column":0},"end":{"line":1085,"column":67}},"1085":{"start":{"line":1086,"column":0},"end":{"line":1086,"column":48}},"1086":{"start":{"line":1087,"column":0},"end":{"line":1087,"column":81}},"1087":{"start":{"line":1088,"column":0},"end":{"line":1088,"column":54}},"1088":{"start":{"line":1089,"column":0},"end":{"line":1089,"column":35}},"1089":{"start":{"line":1090,"column":0},"end":{"line":1090,"column":32}},"1091":{"start":{"line":1092,"column":0},"end":{"line":1092,"column":32}},"1093":{"start":{"line":1094,"column":0},"end":{"line":1094,"column":28}},"1094":{"start":{"line":1095,"column":0},"end":{"line":1095,"column":26}},"1096":{"start":{"line":1097,"column":0},"end":{"line":1097,"column":19}},"1098":{"start":{"line":1099,"column":0},"end":{"line":1099,"column":64}},"1099":{"start":{"line":1100,"column":0},"end":{"line":1100,"column":64}},"1100":{"start":{"line":1101,"column":0},"end":{"line":1101,"column":61}},"1101":{"start":{"line":1102,"column":0},"end":{"line":1102,"column":26}},"1102":{"start":{"line":1103,"column":0},"end":{"line":1103,"column":97}},"1103":{"start":{"line":1104,"column":0},"end":{"line":1104,"column":32}},"1104":{"start":{"line":1105,"column":0},"end":{"line":1105,"column":112}},"1105":{"start":{"line":1106,"column":0},"end":{"line":1106,"column":26}},"1106":{"start":{"line":1107,"column":0},"end":{"line":1107,"column":24}},"1107":{"start":{"line":1108,"column":0},"end":{"line":1108,"column":27}},"1108":{"start":{"line":1109,"column":0},"end":{"line":1109,"column":93}},"1109":{"start":{"line":1110,"column":0},"end":{"line":1110,"column":70}},"1110":{"start":{"line":1111,"column":0},"end":{"line":1111,"column":97}},"1111":{"start":{"line":1112,"column":0},"end":{"line":1112,"column":28}},"1112":{"start":{"line":1113,"column":0},"end":{"line":1113,"column":28}},"1113":{"start":{"line":1114,"column":0},"end":{"line":1114,"column":26}},"1114":{"start":{"line":1115,"column":0},"end":{"line":1115,"column":24}},"1116":{"start":{"line":1117,"column":0},"end":{"line":1117,"column":20}},"1118":{"start":{"line":1119,"column":0},"end":{"line":1119,"column":13}},"1122":{"start":{"line":1123,"column":0},"end":{"line":1123,"column":50}},"1123":{"start":{"line":1124,"column":0},"end":{"line":1124,"column":73}},"1124":{"start":{"line":1125,"column":0},"end":{"line":1125,"column":53}},"1126":{"start":{"line":1127,"column":0},"end":{"line":1127,"column":63}},"1127":{"start":{"line":1128,"column":0},"end":{"line":1128,"column":73}},"1128":{"start":{"line":1129,"column":0},"end":{"line":1129,"column":85}},"1129":{"start":{"line":1130,"column":0},"end":{"line":1130,"column":32}},"1130":{"start":{"line":1131,"column":0},"end":{"line":1131,"column":23}},"1131":{"start":{"line":1132,"column":0},"end":{"line":1132,"column":78}},"1132":{"start":{"line":1133,"column":0},"end":{"line":1133,"column":47}},"1133":{"start":{"line":1134,"column":0},"end":{"line":1134,"column":62}},"1134":{"start":{"line":1135,"column":0},"end":{"line":1135,"column":52}},"1135":{"start":{"line":1136,"column":0},"end":{"line":1136,"column":54}},"1136":{"start":{"line":1137,"column":0},"end":{"line":1137,"column":60}},"1137":{"start":{"line":1138,"column":0},"end":{"line":1138,"column":23}},"1139":{"start":{"line":1140,"column":0},"end":{"line":1140,"column":45}},"1140":{"start":{"line":1141,"column":0},"end":{"line":1141,"column":25}},"1143":{"start":{"line":1144,"column":0},"end":{"line":1144,"column":84}},"1144":{"start":{"line":1145,"column":0},"end":{"line":1145,"column":86}},"1145":{"start":{"line":1146,"column":0},"end":{"line":1146,"column":46}},"1146":{"start":{"line":1147,"column":0},"end":{"line":1147,"column":25}},"1148":{"start":{"line":1149,"column":0},"end":{"line":1149,"column":20}},"1151":{"start":{"line":1152,"column":0},"end":{"line":1152,"column":40}},"1154":{"start":{"line":1155,"column":0},"end":{"line":1155,"column":55}},"1155":{"start":{"line":1156,"column":0},"end":{"line":1156,"column":23}},"1156":{"start":{"line":1157,"column":0},"end":{"line":1157,"column":61}},"1157":{"start":{"line":1158,"column":0},"end":{"line":1158,"column":89}},"1158":{"start":{"line":1159,"column":0},"end":{"line":1159,"column":100}},"1159":{"start":{"line":1160,"column":0},"end":{"line":1160,"column":46}},"1160":{"start":{"line":1161,"column":0},"end":{"line":1161,"column":51}},"1161":{"start":{"line":1162,"column":0},"end":{"line":1162,"column":101}},"1162":{"start":{"line":1163,"column":0},"end":{"line":1163,"column":21}},"1164":{"start":{"line":1165,"column":0},"end":{"line":1165,"column":47}},"1166":{"start":{"line":1167,"column":0},"end":{"line":1167,"column":25}},"1167":{"start":{"line":1168,"column":0},"end":{"line":1168,"column":23}},"1168":{"start":{"line":1169,"column":0},"end":{"line":1169,"column":62}},"1169":{"start":{"line":1170,"column":0},"end":{"line":1170,"column":90}},"1170":{"start":{"line":1171,"column":0},"end":{"line":1171,"column":100}},"1171":{"start":{"line":1172,"column":0},"end":{"line":1172,"column":47}},"1172":{"start":{"line":1173,"column":0},"end":{"line":1173,"column":52}},"1173":{"start":{"line":1174,"column":0},"end":{"line":1174,"column":101}},"1174":{"start":{"line":1175,"column":0},"end":{"line":1175,"column":21}},"1176":{"start":{"line":1177,"column":0},"end":{"line":1177,"column":50}},"1178":{"start":{"line":1179,"column":0},"end":{"line":1179,"column":25}},"1179":{"start":{"line":1180,"column":0},"end":{"line":1180,"column":20}},"1182":{"start":{"line":1183,"column":0},"end":{"line":1183,"column":69}},"1183":{"start":{"line":1184,"column":0},"end":{"line":1184,"column":133}},"1184":{"start":{"line":1185,"column":0},"end":{"line":1185,"column":78}},"1185":{"start":{"line":1186,"column":0},"end":{"line":1186,"column":23}},"1186":{"start":{"line":1187,"column":0},"end":{"line":1187,"column":23}},"1187":{"start":{"line":1188,"column":0},"end":{"line":1188,"column":83}},"1188":{"start":{"line":1189,"column":0},"end":{"line":1189,"column":91}},"1189":{"start":{"line":1190,"column":0},"end":{"line":1190,"column":137}},"1190":{"start":{"line":1191,"column":0},"end":{"line":1191,"column":94}},"1191":{"start":{"line":1192,"column":0},"end":{"line":1192,"column":47}},"1192":{"start":{"line":1193,"column":0},"end":{"line":1193,"column":62}},"1193":{"start":{"line":1194,"column":0},"end":{"line":1194,"column":88}},"1194":{"start":{"line":1195,"column":0},"end":{"line":1195,"column":21}},"1196":{"start":{"line":1197,"column":0},"end":{"line":1197,"column":23}},"1197":{"start":{"line":1198,"column":0},"end":{"line":1198,"column":115}},"1198":{"start":{"line":1199,"column":0},"end":{"line":1199,"column":107}},"1199":{"start":{"line":1200,"column":0},"end":{"line":1200,"column":23}},"1200":{"start":{"line":1201,"column":0},"end":{"line":1201,"column":20}},"1201":{"start":{"line":1202,"column":0},"end":{"line":1202,"column":25}},"1202":{"start":{"line":1203,"column":0},"end":{"line":1203,"column":20}},"1203":{"start":{"line":1204,"column":0},"end":{"line":1204,"column":18}},"1204":{"start":{"line":1205,"column":0},"end":{"line":1205,"column":16}},"1208":{"start":{"line":1209,"column":0},"end":{"line":1209,"column":37}},"1209":{"start":{"line":1210,"column":0},"end":{"line":1210,"column":107}},"1210":{"start":{"line":1211,"column":0},"end":{"line":1211,"column":53}},"1211":{"start":{"line":1212,"column":0},"end":{"line":1212,"column":41}},"1212":{"start":{"line":1213,"column":0},"end":{"line":1213,"column":65}},"1213":{"start":{"line":1214,"column":0},"end":{"line":1214,"column":18}},"1214":{"start":{"line":1215,"column":0},"end":{"line":1215,"column":53}},"1215":{"start":{"line":1216,"column":0},"end":{"line":1216,"column":21}},"1216":{"start":{"line":1217,"column":0},"end":{"line":1217,"column":35}},"1217":{"start":{"line":1218,"column":0},"end":{"line":1218,"column":25}},"1218":{"start":{"line":1219,"column":0},"end":{"line":1219,"column":32}},"1219":{"start":{"line":1220,"column":0},"end":{"line":1220,"column":30}},"1220":{"start":{"line":1221,"column":0},"end":{"line":1221,"column":44}},"1221":{"start":{"line":1222,"column":0},"end":{"line":1222,"column":43}},"1222":{"start":{"line":1223,"column":0},"end":{"line":1223,"column":86}},"1223":{"start":{"line":1224,"column":0},"end":{"line":1224,"column":20}},"1224":{"start":{"line":1225,"column":0},"end":{"line":1225,"column":18}},"1225":{"start":{"line":1226,"column":0},"end":{"line":1226,"column":45}},"1226":{"start":{"line":1227,"column":0},"end":{"line":1227,"column":49}},"1228":{"start":{"line":1229,"column":0},"end":{"line":1229,"column":45}},"1229":{"start":{"line":1230,"column":0},"end":{"line":1230,"column":23}},"1230":{"start":{"line":1231,"column":0},"end":{"line":1231,"column":21}},"1231":{"start":{"line":1232,"column":0},"end":{"line":1232,"column":35}},"1232":{"start":{"line":1233,"column":0},"end":{"line":1233,"column":25}},"1233":{"start":{"line":1234,"column":0},"end":{"line":1234,"column":56}},"1234":{"start":{"line":1235,"column":0},"end":{"line":1235,"column":44}},"1236":{"start":{"line":1237,"column":0},"end":{"line":1237,"column":49}},"1238":{"start":{"line":1239,"column":0},"end":{"line":1239,"column":23}},"1239":{"start":{"line":1240,"column":0},"end":{"line":1240,"column":18}},"1240":{"start":{"line":1241,"column":0},"end":{"line":1241,"column":16}},"1242":{"start":{"line":1243,"column":0},"end":{"line":1243,"column":20}},"1245":{"start":{"line":1246,"column":0},"end":{"line":1246,"column":27}},"1246":{"start":{"line":1247,"column":0},"end":{"line":1247,"column":25}},"1247":{"start":{"line":1248,"column":0},"end":{"line":1248,"column":32}},"1248":{"start":{"line":1249,"column":0},"end":{"line":1249,"column":36}},"1249":{"start":{"line":1250,"column":0},"end":{"line":1250,"column":51}},"1250":{"start":{"line":1251,"column":0},"end":{"line":1251,"column":10}},"1254":{"start":{"line":1255,"column":0},"end":{"line":1255,"column":25}},"1255":{"start":{"line":1256,"column":0},"end":{"line":1256,"column":23}},"1256":{"start":{"line":1257,"column":0},"end":{"line":1257,"column":32}},"1257":{"start":{"line":1258,"column":0},"end":{"line":1258,"column":36}},"1258":{"start":{"line":1259,"column":0},"end":{"line":1259,"column":49}},"1259":{"start":{"line":1260,"column":0},"end":{"line":1260,"column":10}},"1263":{"start":{"line":1264,"column":0},"end":{"line":1264,"column":43}},"1264":{"start":{"line":1265,"column":0},"end":{"line":1265,"column":21}},"1265":{"start":{"line":1266,"column":0},"end":{"line":1266,"column":34}},"1266":{"start":{"line":1267,"column":0},"end":{"line":1267,"column":87}},"1267":{"start":{"line":1268,"column":0},"end":{"line":1268,"column":32}},"1268":{"start":{"line":1269,"column":0},"end":{"line":1269,"column":27}},"1269":{"start":{"line":1270,"column":0},"end":{"line":1270,"column":28}},"1270":{"start":{"line":1271,"column":0},"end":{"line":1271,"column":46}},"1271":{"start":{"line":1272,"column":0},"end":{"line":1272,"column":41}},"1272":{"start":{"line":1273,"column":0},"end":{"line":1273,"column":12}},"1273":{"start":{"line":1274,"column":0},"end":{"line":1274,"column":55}},"1274":{"start":{"line":1275,"column":0},"end":{"line":1275,"column":10}},"1278":{"start":{"line":1279,"column":0},"end":{"line":1279,"column":44}},"1279":{"start":{"line":1280,"column":0},"end":{"line":1280,"column":21}},"1280":{"start":{"line":1281,"column":0},"end":{"line":1281,"column":35}},"1281":{"start":{"line":1282,"column":0},"end":{"line":1282,"column":19}},"1282":{"start":{"line":1283,"column":0},"end":{"line":1283,"column":39}},"1283":{"start":{"line":1284,"column":0},"end":{"line":1284,"column":170}},"1284":{"start":{"line":1285,"column":0},"end":{"line":1285,"column":84}},"1286":{"start":{"line":1287,"column":0},"end":{"line":1287,"column":33}},"1287":{"start":{"line":1288,"column":0},"end":{"line":1288,"column":26}},"1288":{"start":{"line":1289,"column":0},"end":{"line":1289,"column":28}},"1289":{"start":{"line":1290,"column":0},"end":{"line":1290,"column":47}},"1290":{"start":{"line":1291,"column":0},"end":{"line":1291,"column":42}},"1291":{"start":{"line":1292,"column":0},"end":{"line":1292,"column":12}},"1292":{"start":{"line":1293,"column":0},"end":{"line":1293,"column":56}},"1293":{"start":{"line":1294,"column":0},"end":{"line":1294,"column":10}},"1297":{"start":{"line":1298,"column":0},"end":{"line":1298,"column":24}},"1298":{"start":{"line":1299,"column":0},"end":{"line":1299,"column":22}},"1299":{"start":{"line":1300,"column":0},"end":{"line":1300,"column":36}},"1300":{"start":{"line":1301,"column":0},"end":{"line":1301,"column":43}},"1301":{"start":{"line":1302,"column":0},"end":{"line":1302,"column":48}},"1302":{"start":{"line":1303,"column":0},"end":{"line":1303,"column":10}},"1306":{"start":{"line":1307,"column":0},"end":{"line":1307,"column":27}},"1307":{"start":{"line":1308,"column":0},"end":{"line":1308,"column":24}},"1308":{"start":{"line":1309,"column":0},"end":{"line":1309,"column":36}},"1309":{"start":{"line":1310,"column":0},"end":{"line":1310,"column":50}},"1310":{"start":{"line":1311,"column":0},"end":{"line":1311,"column":32}},"1311":{"start":{"line":1312,"column":0},"end":{"line":1312,"column":36}},"1312":{"start":{"line":1313,"column":0},"end":{"line":1313,"column":39}},"1313":{"start":{"line":1314,"column":0},"end":{"line":1314,"column":45}},"1314":{"start":{"line":1315,"column":0},"end":{"line":1315,"column":44}},"1315":{"start":{"line":1316,"column":0},"end":{"line":1316,"column":36}},"1316":{"start":{"line":1317,"column":0},"end":{"line":1317,"column":10}},"1320":{"start":{"line":1321,"column":0},"end":{"line":1321,"column":25}},"1321":{"start":{"line":1322,"column":0},"end":{"line":1322,"column":25}},"1322":{"start":{"line":1323,"column":0},"end":{"line":1323,"column":27}},"1323":{"start":{"line":1324,"column":0},"end":{"line":1324,"column":49}},"1324":{"start":{"line":1325,"column":0},"end":{"line":1325,"column":10}},"1326":{"start":{"line":1327,"column":0},"end":{"line":1327,"column":11}},"1328":{"start":{"line":1329,"column":0},"end":{"line":1329,"column":1}},"1330":{"start":{"line":1331,"column":0},"end":{"line":1331,"column":26}},"1331":{"start":{"line":1332,"column":0},"end":{"line":1332,"column":10}},"1332":{"start":{"line":1333,"column":0},"end":{"line":1333,"column":8}},"1333":{"start":{"line":1334,"column":0},"end":{"line":1334,"column":4}},"1336":{"start":{"line":1337,"column":0},"end":{"line":1337,"column":4}},"1337":{"start":{"line":1338,"column":0},"end":{"line":1338,"column":51}},"1338":{"start":{"line":1339,"column":0},"end":{"line":1339,"column":13}},"1339":{"start":{"line":1340,"column":0},"end":{"line":1340,"column":22}},"1340":{"start":{"line":1341,"column":0},"end":{"line":1341,"column":19}},"1341":{"start":{"line":1342,"column":0},"end":{"line":1342,"column":20}},"1342":{"start":{"line":1343,"column":0},"end":{"line":1343,"column":14}},"1343":{"start":{"line":1344,"column":0},"end":{"line":1344,"column":23}},"1344":{"start":{"line":1345,"column":0},"end":{"line":1345,"column":5}},"1347":{"start":{"line":1348,"column":0},"end":{"line":1348,"column":19}},"1348":{"start":{"line":1349,"column":0},"end":{"line":1349,"column":49}},"1349":{"start":{"line":1350,"column":0},"end":{"line":1350,"column":40}},"1350":{"start":{"line":1351,"column":0},"end":{"line":1351,"column":6}},"1351":{"start":{"line":1352,"column":0},"end":{"line":1352,"column":54}},"1352":{"start":{"line":1353,"column":0},"end":{"line":1353,"column":70}},"1353":{"start":{"line":1354,"column":0},"end":{"line":1354,"column":16}},"1355":{"start":{"line":1356,"column":0},"end":{"line":1356,"column":10}},"1356":{"start":{"line":1357,"column":0},"end":{"line":1357,"column":8}},"1357":{"start":{"line":1358,"column":0},"end":{"line":1358,"column":81}},"1358":{"start":{"line":1359,"column":0},"end":{"line":1359,"column":23}},"1360":{"start":{"line":1361,"column":0},"end":{"line":1361,"column":95}},"1361":{"start":{"line":1362,"column":0},"end":{"line":1362,"column":21}},"1362":{"start":{"line":1363,"column":0},"end":{"line":1363,"column":69}},"1363":{"start":{"line":1364,"column":0},"end":{"line":1364,"column":15}},"1364":{"start":{"line":1365,"column":0},"end":{"line":1365,"column":30}},"1365":{"start":{"line":1366,"column":0},"end":{"line":1366,"column":33}},"1366":{"start":{"line":1367,"column":0},"end":{"line":1367,"column":26}},"1367":{"start":{"line":1368,"column":0},"end":{"line":1368,"column":14}},"1368":{"start":{"line":1369,"column":0},"end":{"line":1369,"column":33}},"1370":{"start":{"line":1371,"column":0},"end":{"line":1371,"column":17}},"1371":{"start":{"line":1372,"column":0},"end":{"line":1372,"column":80}},"1372":{"start":{"line":1373,"column":0},"end":{"line":1373,"column":20}},"1373":{"start":{"line":1374,"column":0},"end":{"line":1374,"column":27}},"1374":{"start":{"line":1375,"column":0},"end":{"line":1375,"column":24}},"1375":{"start":{"line":1376,"column":0},"end":{"line":1376,"column":158}},"1376":{"start":{"line":1377,"column":0},"end":{"line":1377,"column":33}},"1377":{"start":{"line":1378,"column":0},"end":{"line":1378,"column":76}},"1378":{"start":{"line":1379,"column":0},"end":{"line":1379,"column":40}},"1379":{"start":{"line":1380,"column":0},"end":{"line":1380,"column":16}},"1380":{"start":{"line":1381,"column":0},"end":{"line":1381,"column":18}},"1381":{"start":{"line":1382,"column":0},"end":{"line":1382,"column":17}},"1382":{"start":{"line":1383,"column":0},"end":{"line":1383,"column":86}},"1383":{"start":{"line":1384,"column":0},"end":{"line":1384,"column":20}},"1384":{"start":{"line":1385,"column":0},"end":{"line":1385,"column":27}},"1385":{"start":{"line":1386,"column":0},"end":{"line":1386,"column":24}},"1386":{"start":{"line":1387,"column":0},"end":{"line":1387,"column":60}},"1387":{"start":{"line":1388,"column":0},"end":{"line":1388,"column":158}},"1388":{"start":{"line":1389,"column":0},"end":{"line":1389,"column":39}},"1389":{"start":{"line":1390,"column":0},"end":{"line":1390,"column":82}},"1390":{"start":{"line":1391,"column":0},"end":{"line":1391,"column":43}},"1391":{"start":{"line":1392,"column":0},"end":{"line":1392,"column":16}},"1392":{"start":{"line":1393,"column":0},"end":{"line":1393,"column":18}},"1393":{"start":{"line":1394,"column":0},"end":{"line":1394,"column":17}},"1394":{"start":{"line":1395,"column":0},"end":{"line":1395,"column":89}},"1395":{"start":{"line":1396,"column":0},"end":{"line":1396,"column":20}},"1396":{"start":{"line":1397,"column":0},"end":{"line":1397,"column":27}},"1397":{"start":{"line":1398,"column":0},"end":{"line":1398,"column":24}},"1398":{"start":{"line":1399,"column":0},"end":{"line":1399,"column":158}},"1399":{"start":{"line":1400,"column":0},"end":{"line":1400,"column":42}},"1400":{"start":{"line":1401,"column":0},"end":{"line":1401,"column":85}},"1401":{"start":{"line":1402,"column":0},"end":{"line":1402,"column":45}},"1402":{"start":{"line":1403,"column":0},"end":{"line":1403,"column":16}},"1403":{"start":{"line":1404,"column":0},"end":{"line":1404,"column":18}},"1404":{"start":{"line":1405,"column":0},"end":{"line":1405,"column":17}},"1405":{"start":{"line":1406,"column":0},"end":{"line":1406,"column":87}},"1406":{"start":{"line":1407,"column":0},"end":{"line":1407,"column":20}},"1407":{"start":{"line":1408,"column":0},"end":{"line":1408,"column":31}},"1408":{"start":{"line":1409,"column":0},"end":{"line":1409,"column":24}},"1409":{"start":{"line":1410,"column":0},"end":{"line":1410,"column":158}},"1410":{"start":{"line":1411,"column":0},"end":{"line":1411,"column":40}},"1411":{"start":{"line":1412,"column":0},"end":{"line":1412,"column":83}},"1412":{"start":{"line":1413,"column":0},"end":{"line":1413,"column":51}},"1413":{"start":{"line":1414,"column":0},"end":{"line":1414,"column":16}},"1414":{"start":{"line":1415,"column":0},"end":{"line":1415,"column":18}},"1415":{"start":{"line":1416,"column":0},"end":{"line":1416,"column":17}},"1416":{"start":{"line":1417,"column":0},"end":{"line":1417,"column":92}},"1417":{"start":{"line":1418,"column":0},"end":{"line":1418,"column":21}},"1418":{"start":{"line":1419,"column":0},"end":{"line":1419,"column":158}},"1419":{"start":{"line":1420,"column":0},"end":{"line":1420,"column":40}},"1420":{"start":{"line":1421,"column":0},"end":{"line":1421,"column":77}},"1422":{"start":{"line":1423,"column":0},"end":{"line":1423,"column":57}},"1423":{"start":{"line":1424,"column":0},"end":{"line":1424,"column":44}},"1424":{"start":{"line":1425,"column":0},"end":{"line":1425,"column":50}},"1425":{"start":{"line":1426,"column":0},"end":{"line":1426,"column":50}},"1426":{"start":{"line":1427,"column":0},"end":{"line":1427,"column":50}},"1427":{"start":{"line":1428,"column":0},"end":{"line":1428,"column":27}},"1428":{"start":{"line":1429,"column":0},"end":{"line":1429,"column":44}},"1429":{"start":{"line":1430,"column":0},"end":{"line":1430,"column":50}},"1430":{"start":{"line":1431,"column":0},"end":{"line":1431,"column":56}},"1431":{"start":{"line":1432,"column":0},"end":{"line":1432,"column":48}},"1432":{"start":{"line":1433,"column":0},"end":{"line":1433,"column":27}},"1433":{"start":{"line":1434,"column":0},"end":{"line":1434,"column":43}},"1434":{"start":{"line":1435,"column":0},"end":{"line":1435,"column":50}},"1435":{"start":{"line":1436,"column":0},"end":{"line":1436,"column":50}},"1436":{"start":{"line":1437,"column":0},"end":{"line":1437,"column":50}},"1437":{"start":{"line":1438,"column":0},"end":{"line":1438,"column":27}},"1438":{"start":{"line":1439,"column":0},"end":{"line":1439,"column":44}},"1439":{"start":{"line":1440,"column":0},"end":{"line":1440,"column":48}},"1440":{"start":{"line":1441,"column":0},"end":{"line":1441,"column":58}},"1441":{"start":{"line":1442,"column":0},"end":{"line":1442,"column":27}},"1442":{"start":{"line":1443,"column":0},"end":{"line":1443,"column":23}},"1443":{"start":{"line":1444,"column":0},"end":{"line":1444,"column":18}},"1444":{"start":{"line":1445,"column":0},"end":{"line":1445,"column":53}},"1445":{"start":{"line":1446,"column":0},"end":{"line":1446,"column":20}},"1446":{"start":{"line":1447,"column":0},"end":{"line":1447,"column":31}},"1447":{"start":{"line":1448,"column":0},"end":{"line":1448,"column":33}},"1448":{"start":{"line":1449,"column":0},"end":{"line":1449,"column":43}},"1449":{"start":{"line":1450,"column":0},"end":{"line":1450,"column":86}},"1450":{"start":{"line":1451,"column":0},"end":{"line":1451,"column":116}},"1451":{"start":{"line":1452,"column":0},"end":{"line":1452,"column":16}},"1452":{"start":{"line":1453,"column":0},"end":{"line":1453,"column":80}},"1454":{"start":{"line":1455,"column":0},"end":{"line":1455,"column":22}},"1455":{"start":{"line":1456,"column":0},"end":{"line":1456,"column":18}},"1456":{"start":{"line":1457,"column":0},"end":{"line":1457,"column":45}},"1457":{"start":{"line":1458,"column":0},"end":{"line":1458,"column":93}},"1459":{"start":{"line":1460,"column":0},"end":{"line":1460,"column":23}},"1460":{"start":{"line":1461,"column":0},"end":{"line":1461,"column":55}},"1462":{"start":{"line":1463,"column":0},"end":{"line":1463,"column":23}},"1463":{"start":{"line":1464,"column":0},"end":{"line":1464,"column":18}},"1464":{"start":{"line":1465,"column":0},"end":{"line":1465,"column":17}},"1465":{"start":{"line":1466,"column":0},"end":{"line":1466,"column":22}},"1466":{"start":{"line":1467,"column":0},"end":{"line":1467,"column":13}},"1467":{"start":{"line":1468,"column":0},"end":{"line":1468,"column":10}},"1469":{"start":{"line":1470,"column":0},"end":{"line":1470,"column":1}},"1471":{"start":{"line":1472,"column":0},"end":{"line":1472,"column":27}},"1472":{"start":{"line":1473,"column":0},"end":{"line":1473,"column":10}},"1473":{"start":{"line":1474,"column":0},"end":{"line":1474,"column":10}},"1474":{"start":{"line":1475,"column":0},"end":{"line":1475,"column":4}},"1477":{"start":{"line":1478,"column":0},"end":{"line":1478,"column":4}},"1478":{"start":{"line":1479,"column":0},"end":{"line":1479,"column":39}},"1479":{"start":{"line":1480,"column":0},"end":{"line":1480,"column":36}},"1480":{"start":{"line":1481,"column":0},"end":{"line":1481,"column":23}},"1481":{"start":{"line":1482,"column":0},"end":{"line":1482,"column":35}},"1482":{"start":{"line":1483,"column":0},"end":{"line":1483,"column":20}},"1483":{"start":{"line":1484,"column":0},"end":{"line":1484,"column":31}},"1484":{"start":{"line":1485,"column":0},"end":{"line":1485,"column":37}},"1485":{"start":{"line":1486,"column":0},"end":{"line":1486,"column":39}},"1486":{"start":{"line":1487,"column":0},"end":{"line":1487,"column":5}},"1488":{"start":{"line":1489,"column":0},"end":{"line":1489,"column":38}},"1489":{"start":{"line":1490,"column":0},"end":{"line":1490,"column":86}},"1490":{"start":{"line":1491,"column":0},"end":{"line":1491,"column":22}},"1491":{"start":{"line":1492,"column":0},"end":{"line":1492,"column":64}},"1492":{"start":{"line":1493,"column":0},"end":{"line":1493,"column":81}},"1493":{"start":{"line":1494,"column":0},"end":{"line":1494,"column":16}},"1494":{"start":{"line":1495,"column":0},"end":{"line":1495,"column":6}},"1495":{"start":{"line":1496,"column":0},"end":{"line":1496,"column":5}},"1498":{"start":{"line":1499,"column":0},"end":{"line":1499,"column":19}},"1499":{"start":{"line":1500,"column":0},"end":{"line":1500,"column":49}},"1500":{"start":{"line":1501,"column":0},"end":{"line":1501,"column":40}},"1501":{"start":{"line":1502,"column":0},"end":{"line":1502,"column":6}},"1502":{"start":{"line":1503,"column":0},"end":{"line":1503,"column":54}},"1503":{"start":{"line":1504,"column":0},"end":{"line":1504,"column":70}},"1504":{"start":{"line":1505,"column":0},"end":{"line":1505,"column":16}},"1506":{"start":{"line":1507,"column":0},"end":{"line":1507,"column":48}},"1507":{"start":{"line":1508,"column":0},"end":{"line":1508,"column":23}},"1508":{"start":{"line":1509,"column":0},"end":{"line":1509,"column":42}},"1509":{"start":{"line":1510,"column":0},"end":{"line":1510,"column":22}},"1510":{"start":{"line":1511,"column":0},"end":{"line":1511,"column":34}},"1511":{"start":{"line":1512,"column":0},"end":{"line":1512,"column":37}},"1512":{"start":{"line":1513,"column":0},"end":{"line":1513,"column":43}},"1513":{"start":{"line":1514,"column":0},"end":{"line":1514,"column":38}},"1514":{"start":{"line":1515,"column":0},"end":{"line":1515,"column":6}},"1516":{"start":{"line":1517,"column":0},"end":{"line":1517,"column":27}},"1517":{"start":{"line":1518,"column":0},"end":{"line":1518,"column":42}},"1518":{"start":{"line":1519,"column":0},"end":{"line":1519,"column":5}},"1519":{"start":{"line":1520,"column":0},"end":{"line":1520,"column":32}},"1520":{"start":{"line":1521,"column":0},"end":{"line":1521,"column":4}},"1522":{"start":{"line":1523,"column":0},"end":{"line":1523,"column":10}},"1523":{"start":{"line":1524,"column":0},"end":{"line":1524,"column":8}},"1524":{"start":{"line":1525,"column":0},"end":{"line":1525,"column":81}},"1525":{"start":{"line":1526,"column":0},"end":{"line":1526,"column":23}},"1527":{"start":{"line":1528,"column":0},"end":{"line":1528,"column":95}},"1528":{"start":{"line":1529,"column":0},"end":{"line":1529,"column":21}},"1529":{"start":{"line":1530,"column":0},"end":{"line":1530,"column":70}},"1530":{"start":{"line":1531,"column":0},"end":{"line":1531,"column":62}},"1531":{"start":{"line":1532,"column":0},"end":{"line":1532,"column":17}},"1532":{"start":{"line":1533,"column":0},"end":{"line":1533,"column":80}},"1533":{"start":{"line":1534,"column":0},"end":{"line":1534,"column":20}},"1534":{"start":{"line":1535,"column":0},"end":{"line":1535,"column":27}},"1535":{"start":{"line":1536,"column":0},"end":{"line":1536,"column":24}},"1536":{"start":{"line":1537,"column":0},"end":{"line":1537,"column":158}},"1537":{"start":{"line":1538,"column":0},"end":{"line":1538,"column":33}},"1538":{"start":{"line":1539,"column":0},"end":{"line":1539,"column":76}},"1539":{"start":{"line":1540,"column":0},"end":{"line":1540,"column":40}},"1540":{"start":{"line":1541,"column":0},"end":{"line":1541,"column":16}},"1541":{"start":{"line":1542,"column":0},"end":{"line":1542,"column":18}},"1542":{"start":{"line":1543,"column":0},"end":{"line":1543,"column":17}},"1543":{"start":{"line":1544,"column":0},"end":{"line":1544,"column":86}},"1544":{"start":{"line":1545,"column":0},"end":{"line":1545,"column":20}},"1545":{"start":{"line":1546,"column":0},"end":{"line":1546,"column":27}},"1546":{"start":{"line":1547,"column":0},"end":{"line":1547,"column":24}},"1547":{"start":{"line":1548,"column":0},"end":{"line":1548,"column":60}},"1548":{"start":{"line":1549,"column":0},"end":{"line":1549,"column":158}},"1549":{"start":{"line":1550,"column":0},"end":{"line":1550,"column":39}},"1550":{"start":{"line":1551,"column":0},"end":{"line":1551,"column":82}},"1551":{"start":{"line":1552,"column":0},"end":{"line":1552,"column":43}},"1552":{"start":{"line":1553,"column":0},"end":{"line":1553,"column":16}},"1553":{"start":{"line":1554,"column":0},"end":{"line":1554,"column":18}},"1554":{"start":{"line":1555,"column":0},"end":{"line":1555,"column":17}},"1555":{"start":{"line":1556,"column":0},"end":{"line":1556,"column":89}},"1556":{"start":{"line":1557,"column":0},"end":{"line":1557,"column":20}},"1557":{"start":{"line":1558,"column":0},"end":{"line":1558,"column":27}},"1558":{"start":{"line":1559,"column":0},"end":{"line":1559,"column":24}},"1559":{"start":{"line":1560,"column":0},"end":{"line":1560,"column":138}},"1560":{"start":{"line":1561,"column":0},"end":{"line":1561,"column":45}},"1561":{"start":{"line":1562,"column":0},"end":{"line":1562,"column":16}},"1562":{"start":{"line":1563,"column":0},"end":{"line":1563,"column":93}},"1563":{"start":{"line":1564,"column":0},"end":{"line":1564,"column":18}},"1564":{"start":{"line":1565,"column":0},"end":{"line":1565,"column":17}},"1565":{"start":{"line":1566,"column":0},"end":{"line":1566,"column":87}},"1566":{"start":{"line":1567,"column":0},"end":{"line":1567,"column":20}},"1567":{"start":{"line":1568,"column":0},"end":{"line":1568,"column":31}},"1568":{"start":{"line":1569,"column":0},"end":{"line":1569,"column":158}},"1569":{"start":{"line":1570,"column":0},"end":{"line":1570,"column":40}},"1570":{"start":{"line":1571,"column":0},"end":{"line":1571,"column":83}},"1571":{"start":{"line":1572,"column":0},"end":{"line":1572,"column":57}},"1572":{"start":{"line":1573,"column":0},"end":{"line":1573,"column":16}},"1573":{"start":{"line":1574,"column":0},"end":{"line":1574,"column":18}},"1574":{"start":{"line":1575,"column":0},"end":{"line":1575,"column":17}},"1575":{"start":{"line":1576,"column":0},"end":{"line":1576,"column":81}},"1576":{"start":{"line":1577,"column":0},"end":{"line":1577,"column":21}},"1577":{"start":{"line":1578,"column":0},"end":{"line":1578,"column":158}},"1578":{"start":{"line":1579,"column":0},"end":{"line":1579,"column":34}},"1579":{"start":{"line":1580,"column":0},"end":{"line":1580,"column":77}},"1581":{"start":{"line":1582,"column":0},"end":{"line":1582,"column":57}},"1582":{"start":{"line":1583,"column":0},"end":{"line":1583,"column":44}},"1583":{"start":{"line":1584,"column":0},"end":{"line":1584,"column":50}},"1584":{"start":{"line":1585,"column":0},"end":{"line":1585,"column":50}},"1585":{"start":{"line":1586,"column":0},"end":{"line":1586,"column":50}},"1586":{"start":{"line":1587,"column":0},"end":{"line":1587,"column":27}},"1587":{"start":{"line":1588,"column":0},"end":{"line":1588,"column":44}},"1588":{"start":{"line":1589,"column":0},"end":{"line":1589,"column":50}},"1589":{"start":{"line":1590,"column":0},"end":{"line":1590,"column":56}},"1590":{"start":{"line":1591,"column":0},"end":{"line":1591,"column":48}},"1591":{"start":{"line":1592,"column":0},"end":{"line":1592,"column":27}},"1592":{"start":{"line":1593,"column":0},"end":{"line":1593,"column":43}},"1593":{"start":{"line":1594,"column":0},"end":{"line":1594,"column":50}},"1594":{"start":{"line":1595,"column":0},"end":{"line":1595,"column":50}},"1595":{"start":{"line":1596,"column":0},"end":{"line":1596,"column":50}},"1596":{"start":{"line":1597,"column":0},"end":{"line":1597,"column":27}},"1597":{"start":{"line":1598,"column":0},"end":{"line":1598,"column":44}},"1598":{"start":{"line":1599,"column":0},"end":{"line":1599,"column":48}},"1599":{"start":{"line":1600,"column":0},"end":{"line":1600,"column":58}},"1600":{"start":{"line":1601,"column":0},"end":{"line":1601,"column":27}},"1601":{"start":{"line":1602,"column":0},"end":{"line":1602,"column":23}},"1602":{"start":{"line":1603,"column":0},"end":{"line":1603,"column":18}},"1603":{"start":{"line":1604,"column":0},"end":{"line":1604,"column":17}},"1604":{"start":{"line":1605,"column":0},"end":{"line":1605,"column":92}},"1605":{"start":{"line":1606,"column":0},"end":{"line":1606,"column":20}},"1606":{"start":{"line":1607,"column":0},"end":{"line":1607,"column":27}},"1607":{"start":{"line":1608,"column":0},"end":{"line":1608,"column":158}},"1608":{"start":{"line":1609,"column":0},"end":{"line":1609,"column":37}},"1609":{"start":{"line":1610,"column":0},"end":{"line":1610,"column":80}},"1610":{"start":{"line":1611,"column":0},"end":{"line":1611,"column":62}},"1611":{"start":{"line":1612,"column":0},"end":{"line":1612,"column":16}},"1612":{"start":{"line":1613,"column":0},"end":{"line":1613,"column":101}},"1613":{"start":{"line":1614,"column":0},"end":{"line":1614,"column":18}},"1614":{"start":{"line":1615,"column":0},"end":{"line":1615,"column":53}},"1615":{"start":{"line":1616,"column":0},"end":{"line":1616,"column":20}},"1616":{"start":{"line":1617,"column":0},"end":{"line":1617,"column":31}},"1617":{"start":{"line":1618,"column":0},"end":{"line":1618,"column":38}},"1618":{"start":{"line":1619,"column":0},"end":{"line":1619,"column":43}},"1619":{"start":{"line":1620,"column":0},"end":{"line":1620,"column":86}},"1620":{"start":{"line":1621,"column":0},"end":{"line":1621,"column":116}},"1621":{"start":{"line":1622,"column":0},"end":{"line":1622,"column":16}},"1622":{"start":{"line":1623,"column":0},"end":{"line":1623,"column":85}},"1624":{"start":{"line":1625,"column":0},"end":{"line":1625,"column":22}},"1625":{"start":{"line":1626,"column":0},"end":{"line":1626,"column":18}},"1626":{"start":{"line":1627,"column":0},"end":{"line":1627,"column":45}},"1627":{"start":{"line":1628,"column":0},"end":{"line":1628,"column":93}},"1629":{"start":{"line":1630,"column":0},"end":{"line":1630,"column":23}},"1630":{"start":{"line":1631,"column":0},"end":{"line":1631,"column":91}},"1631":{"start":{"line":1632,"column":0},"end":{"line":1632,"column":73}},"1632":{"start":{"line":1633,"column":0},"end":{"line":1633,"column":23}},"1633":{"start":{"line":1634,"column":0},"end":{"line":1634,"column":18}},"1634":{"start":{"line":1635,"column":0},"end":{"line":1635,"column":17}},"1635":{"start":{"line":1636,"column":0},"end":{"line":1636,"column":22}},"1636":{"start":{"line":1637,"column":0},"end":{"line":1637,"column":13}},"1637":{"start":{"line":1638,"column":0},"end":{"line":1638,"column":10}},"1639":{"start":{"line":1640,"column":0},"end":{"line":1640,"column":1}},"1642":{"start":{"line":1643,"column":0},"end":{"line":1643,"column":53}},"1643":{"start":{"line":1644,"column":0},"end":{"line":1644,"column":37}},"1644":{"start":{"line":1645,"column":0},"end":{"line":1645,"column":43}},"1645":{"start":{"line":1646,"column":0},"end":{"line":1646,"column":51}},"1646":{"start":{"line":1647,"column":0},"end":{"line":1647,"column":27}},"1647":{"start":{"line":1648,"column":0},"end":{"line":1648,"column":5}},"1648":{"start":{"line":1649,"column":0},"end":{"line":1649,"column":28}},"1649":{"start":{"line":1650,"column":0},"end":{"line":1650,"column":1}},"1652":{"start":{"line":1653,"column":0},"end":{"line":1653,"column":28}},"1653":{"start":{"line":1654,"column":0},"end":{"line":1654,"column":10}},"1654":{"start":{"line":1655,"column":0},"end":{"line":1655,"column":7}},"1655":{"start":{"line":1656,"column":0},"end":{"line":1656,"column":12}},"1656":{"start":{"line":1657,"column":0},"end":{"line":1657,"column":13}},"1657":{"start":{"line":1658,"column":0},"end":{"line":1658,"column":4}},"1662":{"start":{"line":1663,"column":0},"end":{"line":1663,"column":4}},"1663":{"start":{"line":1664,"column":0},"end":{"line":1664,"column":56}},"1666":{"start":{"line":1667,"column":0},"end":{"line":1667,"column":41}},"1667":{"start":{"line":1668,"column":0},"end":{"line":1668,"column":43}},"1668":{"start":{"line":1669,"column":0},"end":{"line":1669,"column":51}},"1669":{"start":{"line":1670,"column":0},"end":{"line":1670,"column":27}},"1670":{"start":{"line":1671,"column":0},"end":{"line":1671,"column":5}},"1673":{"start":{"line":1674,"column":0},"end":{"line":1674,"column":19}},"1674":{"start":{"line":1675,"column":0},"end":{"line":1675,"column":16}},"1675":{"start":{"line":1676,"column":0},"end":{"line":1676,"column":3}},"1677":{"start":{"line":1678,"column":0},"end":{"line":1678,"column":10}},"1678":{"start":{"line":1679,"column":0},"end":{"line":1679,"column":117}},"1679":{"start":{"line":1680,"column":0},"end":{"line":1680,"column":55}},"1680":{"start":{"line":1681,"column":0},"end":{"line":1681,"column":94}},"1681":{"start":{"line":1682,"column":0},"end":{"line":1682,"column":24}},"1682":{"start":{"line":1683,"column":0},"end":{"line":1683,"column":15}},"1683":{"start":{"line":1684,"column":0},"end":{"line":1684,"column":56}},"1684":{"start":{"line":1685,"column":0},"end":{"line":1685,"column":39}},"1685":{"start":{"line":1686,"column":0},"end":{"line":1686,"column":54}},"1686":{"start":{"line":1687,"column":0},"end":{"line":1687,"column":46}},"1687":{"start":{"line":1688,"column":0},"end":{"line":1688,"column":15}},"1689":{"start":{"line":1690,"column":0},"end":{"line":1690,"column":37}},"1690":{"start":{"line":1691,"column":0},"end":{"line":1691,"column":17}},"1692":{"start":{"line":1693,"column":0},"end":{"line":1693,"column":12}},"1693":{"start":{"line":1694,"column":0},"end":{"line":1694,"column":13}},"1694":{"start":{"line":1695,"column":0},"end":{"line":1695,"column":42}},"1695":{"start":{"line":1696,"column":0},"end":{"line":1696,"column":59}},"1696":{"start":{"line":1697,"column":0},"end":{"line":1697,"column":90}},"1697":{"start":{"line":1698,"column":0},"end":{"line":1698,"column":36}},"1698":{"start":{"line":1699,"column":0},"end":{"line":1699,"column":65}},"1699":{"start":{"line":1700,"column":0},"end":{"line":1700,"column":88}},"1700":{"start":{"line":1701,"column":0},"end":{"line":1701,"column":11}},"1702":{"start":{"line":1703,"column":0},"end":{"line":1703,"column":37}},"1703":{"start":{"line":1704,"column":0},"end":{"line":1704,"column":35}},"1704":{"start":{"line":1705,"column":0},"end":{"line":1705,"column":15}},"1705":{"start":{"line":1706,"column":0},"end":{"line":1706,"column":10}},"1707":{"start":{"line":1708,"column":0},"end":{"line":1708,"column":1}},"1709":{"start":{"line":1710,"column":0},"end":{"line":1710,"column":32}},"1710":{"start":{"line":1711,"column":0},"end":{"line":1711,"column":58}},"1711":{"start":{"line":1712,"column":0},"end":{"line":1712,"column":66}},"1712":{"start":{"line":1713,"column":0},"end":{"line":1713,"column":71}},"1713":{"start":{"line":1714,"column":0},"end":{"line":1714,"column":5}},"1714":{"start":{"line":1715,"column":0},"end":{"line":1715,"column":68}},"1715":{"start":{"line":1716,"column":0},"end":{"line":1716,"column":68}},"1716":{"start":{"line":1717,"column":0},"end":{"line":1717,"column":58}},"1717":{"start":{"line":1718,"column":0},"end":{"line":1718,"column":75}},"1718":{"start":{"line":1719,"column":0},"end":{"line":1719,"column":5}},"1719":{"start":{"line":1720,"column":0},"end":{"line":1720,"column":57}},"1720":{"start":{"line":1721,"column":0},"end":{"line":1721,"column":62}},"1721":{"start":{"line":1722,"column":0},"end":{"line":1722,"column":5}},"1722":{"start":{"line":1723,"column":0},"end":{"line":1723,"column":60}},"1723":{"start":{"line":1724,"column":0},"end":{"line":1724,"column":79}},"1724":{"start":{"line":1725,"column":0},"end":{"line":1725,"column":5}},"1725":{"start":{"line":1726,"column":0},"end":{"line":1726,"column":39}},"1727":{"start":{"line":1728,"column":0},"end":{"line":1728,"column":50}},"1728":{"start":{"line":1729,"column":0},"end":{"line":1729,"column":27}},"1729":{"start":{"line":1730,"column":0},"end":{"line":1730,"column":29}},"1730":{"start":{"line":1731,"column":0},"end":{"line":1731,"column":5}},"1733":{"start":{"line":1734,"column":0},"end":{"line":1734,"column":39}},"1734":{"start":{"line":1735,"column":0},"end":{"line":1735,"column":27}},"1735":{"start":{"line":1736,"column":0},"end":{"line":1736,"column":29}},"1736":{"start":{"line":1737,"column":0},"end":{"line":1737,"column":5}},"1739":{"start":{"line":1740,"column":0},"end":{"line":1740,"column":41}},"1740":{"start":{"line":1741,"column":0},"end":{"line":1741,"column":30}},"1741":{"start":{"line":1742,"column":0},"end":{"line":1742,"column":31}},"1742":{"start":{"line":1743,"column":0},"end":{"line":1743,"column":5}},"1745":{"start":{"line":1746,"column":0},"end":{"line":1746,"column":50}},"1746":{"start":{"line":1747,"column":0},"end":{"line":1747,"column":38}},"1747":{"start":{"line":1748,"column":0},"end":{"line":1748,"column":40}},"1748":{"start":{"line":1749,"column":0},"end":{"line":1749,"column":37}},"1749":{"start":{"line":1750,"column":0},"end":{"line":1750,"column":5}},"1752":{"start":{"line":1753,"column":0},"end":{"line":1753,"column":59}},"1753":{"start":{"line":1754,"column":0},"end":{"line":1754,"column":24}},"1754":{"start":{"line":1755,"column":0},"end":{"line":1755,"column":34}},"1755":{"start":{"line":1756,"column":0},"end":{"line":1756,"column":38}},"1756":{"start":{"line":1757,"column":0},"end":{"line":1757,"column":46}},"1757":{"start":{"line":1758,"column":0},"end":{"line":1758,"column":54}},"1758":{"start":{"line":1759,"column":0},"end":{"line":1759,"column":8}},"1759":{"start":{"line":1760,"column":0},"end":{"line":1760,"column":17}},"1760":{"start":{"line":1761,"column":0},"end":{"line":1761,"column":6}},"1761":{"start":{"line":1762,"column":0},"end":{"line":1762,"column":48}},"1762":{"start":{"line":1763,"column":0},"end":{"line":1763,"column":10}},"1765":{"start":{"line":1766,"column":0},"end":{"line":1766,"column":48}},"1766":{"start":{"line":1767,"column":0},"end":{"line":1767,"column":20}},"1767":{"start":{"line":1768,"column":0},"end":{"line":1768,"column":28}},"1768":{"start":{"line":1769,"column":0},"end":{"line":1769,"column":36}},"1769":{"start":{"line":1770,"column":0},"end":{"line":1770,"column":7}},"1770":{"start":{"line":1771,"column":0},"end":{"line":1771,"column":17}},"1771":{"start":{"line":1772,"column":0},"end":{"line":1772,"column":6}},"1772":{"start":{"line":1773,"column":0},"end":{"line":1773,"column":46}},"1773":{"start":{"line":1774,"column":0},"end":{"line":1774,"column":10}},"1775":{"start":{"line":1776,"column":0},"end":{"line":1776,"column":35}},"1776":{"start":{"line":1777,"column":0},"end":{"line":1777,"column":34}},"1777":{"start":{"line":1778,"column":0},"end":{"line":1778,"column":22}},"1778":{"start":{"line":1779,"column":0},"end":{"line":1779,"column":64}},"1779":{"start":{"line":1780,"column":0},"end":{"line":1780,"column":29}},"1780":{"start":{"line":1781,"column":0},"end":{"line":1781,"column":6}},"1781":{"start":{"line":1782,"column":0},"end":{"line":1782,"column":5}},"1783":{"start":{"line":1784,"column":0},"end":{"line":1784,"column":39}},"1784":{"start":{"line":1785,"column":0},"end":{"line":1785,"column":71}},"1785":{"start":{"line":1786,"column":0},"end":{"line":1786,"column":22}},"1786":{"start":{"line":1787,"column":0},"end":{"line":1787,"column":67}},"1787":{"start":{"line":1788,"column":0},"end":{"line":1788,"column":26}},"1788":{"start":{"line":1789,"column":0},"end":{"line":1789,"column":6}},"1789":{"start":{"line":1790,"column":0},"end":{"line":1790,"column":20}},"1790":{"start":{"line":1791,"column":0},"end":{"line":1791,"column":26}},"1791":{"start":{"line":1792,"column":0},"end":{"line":1792,"column":6}},"1792":{"start":{"line":1793,"column":0},"end":{"line":1793,"column":5}},"1794":{"start":{"line":1795,"column":0},"end":{"line":1795,"column":40}},"1795":{"start":{"line":1796,"column":0},"end":{"line":1796,"column":39}},"1796":{"start":{"line":1797,"column":0},"end":{"line":1797,"column":34}},"1797":{"start":{"line":1798,"column":0},"end":{"line":1798,"column":71}},"1798":{"start":{"line":1799,"column":0},"end":{"line":1799,"column":4}},"1800":{"start":{"line":1801,"column":0},"end":{"line":1801,"column":53}},"1801":{"start":{"line":1802,"column":0},"end":{"line":1802,"column":23}},"1802":{"start":{"line":1803,"column":0},"end":{"line":1803,"column":51}},"1803":{"start":{"line":1804,"column":0},"end":{"line":1804,"column":4}},"1805":{"start":{"line":1806,"column":0},"end":{"line":1806,"column":37}},"1806":{"start":{"line":1807,"column":0},"end":{"line":1807,"column":28}},"1807":{"start":{"line":1808,"column":0},"end":{"line":1808,"column":23}},"1808":{"start":{"line":1809,"column":0},"end":{"line":1809,"column":59}},"1809":{"start":{"line":1810,"column":0},"end":{"line":1810,"column":4}},"1811":{"start":{"line":1812,"column":0},"end":{"line":1812,"column":32}},"1812":{"start":{"line":1813,"column":0},"end":{"line":1813,"column":69}},"1813":{"start":{"line":1814,"column":0},"end":{"line":1814,"column":25}},"1814":{"start":{"line":1815,"column":0},"end":{"line":1815,"column":53}},"1815":{"start":{"line":1816,"column":0},"end":{"line":1816,"column":4}},"1818":{"start":{"line":1819,"column":0},"end":{"line":1819,"column":40}},"1819":{"start":{"line":1820,"column":0},"end":{"line":1820,"column":29}},"1820":{"start":{"line":1821,"column":0},"end":{"line":1821,"column":33}},"1822":{"start":{"line":1823,"column":0},"end":{"line":1823,"column":21}},"1823":{"start":{"line":1824,"column":0},"end":{"line":1824,"column":18}},"1824":{"start":{"line":1825,"column":0},"end":{"line":1825,"column":60}},"1825":{"start":{"line":1826,"column":0},"end":{"line":1826,"column":14}},"1826":{"start":{"line":1827,"column":0},"end":{"line":1827,"column":19}},"1827":{"start":{"line":1828,"column":0},"end":{"line":1828,"column":76}},"1828":{"start":{"line":1829,"column":0},"end":{"line":1829,"column":14}},"1829":{"start":{"line":1830,"column":0},"end":{"line":1830,"column":22}},"1831":{"start":{"line":1832,"column":0},"end":{"line":1832,"column":31}},"1832":{"start":{"line":1833,"column":0},"end":{"line":1833,"column":40}},"1833":{"start":{"line":1834,"column":0},"end":{"line":1834,"column":40}},"1834":{"start":{"line":1835,"column":0},"end":{"line":1835,"column":38}},"1835":{"start":{"line":1836,"column":0},"end":{"line":1836,"column":39}},"1836":{"start":{"line":1837,"column":0},"end":{"line":1837,"column":74}},"1837":{"start":{"line":1838,"column":0},"end":{"line":1838,"column":11}},"1838":{"start":{"line":1839,"column":0},"end":{"line":1839,"column":14}},"1839":{"start":{"line":1840,"column":0},"end":{"line":1840,"column":20}},"1841":{"start":{"line":1842,"column":0},"end":{"line":1842,"column":31}},"1842":{"start":{"line":1843,"column":0},"end":{"line":1843,"column":122}},"1843":{"start":{"line":1844,"column":0},"end":{"line":1844,"column":122}},"1845":{"start":{"line":1846,"column":0},"end":{"line":1846,"column":54}},"1846":{"start":{"line":1847,"column":0},"end":{"line":1847,"column":51}},"1847":{"start":{"line":1848,"column":0},"end":{"line":1848,"column":60}},"1848":{"start":{"line":1849,"column":0},"end":{"line":1849,"column":29}},"1849":{"start":{"line":1850,"column":0},"end":{"line":1850,"column":12}},"1851":{"start":{"line":1852,"column":0},"end":{"line":1852,"column":61}},"1852":{"start":{"line":1853,"column":0},"end":{"line":1853,"column":11}},"1853":{"start":{"line":1854,"column":0},"end":{"line":1854,"column":14}},"1854":{"start":{"line":1855,"column":0},"end":{"line":1855,"column":5}},"1857":{"start":{"line":1858,"column":0},"end":{"line":1858,"column":19}},"1858":{"start":{"line":1859,"column":0},"end":{"line":1859,"column":23}},"1859":{"start":{"line":1860,"column":0},"end":{"line":1860,"column":5}},"1861":{"start":{"line":1862,"column":0},"end":{"line":1862,"column":18}},"1862":{"start":{"line":1863,"column":0},"end":{"line":1863,"column":47}},"1865":{"start":{"line":1866,"column":0},"end":{"line":1866,"column":41}},"1866":{"start":{"line":1867,"column":0},"end":{"line":1867,"column":43}},"1868":{"start":{"line":1869,"column":0},"end":{"line":1869,"column":61}},"1869":{"start":{"line":1870,"column":0},"end":{"line":1870,"column":39}},"1870":{"start":{"line":1871,"column":0},"end":{"line":1871,"column":55}},"1871":{"start":{"line":1872,"column":0},"end":{"line":1872,"column":51}},"1872":{"start":{"line":1873,"column":0},"end":{"line":1873,"column":37}},"1873":{"start":{"line":1874,"column":0},"end":{"line":1874,"column":7}},"1874":{"start":{"line":1875,"column":0},"end":{"line":1875,"column":18}},"1875":{"start":{"line":1876,"column":0},"end":{"line":1876,"column":31}},"1877":{"start":{"line":1878,"column":0},"end":{"line":1878,"column":10}},"1878":{"start":{"line":1879,"column":0},"end":{"line":1879,"column":32}},"1879":{"start":{"line":1880,"column":0},"end":{"line":1880,"column":62}},"1880":{"start":{"line":1881,"column":0},"end":{"line":1881,"column":13}},"1881":{"start":{"line":1882,"column":0},"end":{"line":1882,"column":69}},"1882":{"start":{"line":1883,"column":0},"end":{"line":1883,"column":50}},"1883":{"start":{"line":1884,"column":0},"end":{"line":1884,"column":14}},"1884":{"start":{"line":1885,"column":0},"end":{"line":1885,"column":49}},"1886":{"start":{"line":1887,"column":0},"end":{"line":1887,"column":51}},"1887":{"start":{"line":1888,"column":0},"end":{"line":1888,"column":19}},"1888":{"start":{"line":1889,"column":0},"end":{"line":1889,"column":28}},"1889":{"start":{"line":1890,"column":0},"end":{"line":1890,"column":78}},"1890":{"start":{"line":1891,"column":0},"end":{"line":1891,"column":159}},"1892":{"start":{"line":1893,"column":0},"end":{"line":1893,"column":48}},"1893":{"start":{"line":1894,"column":0},"end":{"line":1894,"column":52}},"1894":{"start":{"line":1895,"column":0},"end":{"line":1895,"column":50}},"1895":{"start":{"line":1896,"column":0},"end":{"line":1896,"column":56}},"1896":{"start":{"line":1897,"column":0},"end":{"line":1897,"column":21}},"1897":{"start":{"line":1898,"column":0},"end":{"line":1898,"column":19}},"1898":{"start":{"line":1899,"column":0},"end":{"line":1899,"column":43}},"1899":{"start":{"line":1900,"column":0},"end":{"line":1900,"column":89}},"1900":{"start":{"line":1901,"column":0},"end":{"line":1901,"column":68}},"1902":{"start":{"line":1903,"column":0},"end":{"line":1903,"column":26}},"1903":{"start":{"line":1904,"column":0},"end":{"line":1904,"column":63}},"1905":{"start":{"line":1906,"column":0},"end":{"line":1906,"column":65}},"1907":{"start":{"line":1908,"column":0},"end":{"line":1908,"column":21}},"1908":{"start":{"line":1909,"column":0},"end":{"line":1909,"column":16}},"1911":{"start":{"line":1912,"column":0},"end":{"line":1912,"column":17}},"1912":{"start":{"line":1913,"column":0},"end":{"line":1913,"column":36}},"1913":{"start":{"line":1914,"column":0},"end":{"line":1914,"column":87}},"1914":{"start":{"line":1915,"column":0},"end":{"line":1915,"column":98}},"1916":{"start":{"line":1917,"column":0},"end":{"line":1917,"column":40}},"1917":{"start":{"line":1918,"column":0},"end":{"line":1918,"column":64}},"1919":{"start":{"line":1920,"column":0},"end":{"line":1920,"column":64}},"1921":{"start":{"line":1922,"column":0},"end":{"line":1922,"column":19}},"1923":{"start":{"line":1924,"column":0},"end":{"line":1924,"column":61}},"1925":{"start":{"line":1926,"column":0},"end":{"line":1926,"column":92}},"1926":{"start":{"line":1927,"column":0},"end":{"line":1927,"column":18}},"1927":{"start":{"line":1928,"column":0},"end":{"line":1928,"column":29}},"1928":{"start":{"line":1929,"column":0},"end":{"line":1929,"column":40}},"1929":{"start":{"line":1930,"column":0},"end":{"line":1930,"column":47}},"1930":{"start":{"line":1931,"column":0},"end":{"line":1931,"column":114}},"1931":{"start":{"line":1932,"column":0},"end":{"line":1932,"column":14}},"1933":{"start":{"line":1934,"column":0},"end":{"line":1934,"column":18}},"1935":{"start":{"line":1936,"column":0},"end":{"line":1936,"column":78}},"1936":{"start":{"line":1937,"column":0},"end":{"line":1937,"column":38}},"1937":{"start":{"line":1938,"column":0},"end":{"line":1938,"column":21}},"1938":{"start":{"line":1939,"column":0},"end":{"line":1939,"column":72}},"1939":{"start":{"line":1940,"column":0},"end":{"line":1940,"column":297}},"1941":{"start":{"line":1942,"column":0},"end":{"line":1942,"column":45}},"1943":{"start":{"line":1944,"column":0},"end":{"line":1944,"column":115}},"1944":{"start":{"line":1945,"column":0},"end":{"line":1945,"column":23}},"1945":{"start":{"line":1946,"column":0},"end":{"line":1946,"column":37}},"1946":{"start":{"line":1947,"column":0},"end":{"line":1947,"column":18}},"1948":{"start":{"line":1949,"column":0},"end":{"line":1949,"column":22}},"1949":{"start":{"line":1950,"column":0},"end":{"line":1950,"column":50}},"1950":{"start":{"line":1951,"column":0},"end":{"line":1951,"column":63}},"1951":{"start":{"line":1952,"column":0},"end":{"line":1952,"column":20}},"1952":{"start":{"line":1953,"column":0},"end":{"line":1953,"column":186}},"1953":{"start":{"line":1954,"column":0},"end":{"line":1954,"column":147}},"1955":{"start":{"line":1956,"column":0},"end":{"line":1956,"column":26}},"1956":{"start":{"line":1957,"column":0},"end":{"line":1957,"column":85}},"1957":{"start":{"line":1958,"column":0},"end":{"line":1958,"column":40}},"1958":{"start":{"line":1959,"column":0},"end":{"line":1959,"column":40}},"1959":{"start":{"line":1960,"column":0},"end":{"line":1960,"column":41}},"1960":{"start":{"line":1961,"column":0},"end":{"line":1961,"column":61}},"1961":{"start":{"line":1962,"column":0},"end":{"line":1962,"column":48}},"1962":{"start":{"line":1963,"column":0},"end":{"line":1963,"column":48}},"1963":{"start":{"line":1964,"column":0},"end":{"line":1964,"column":57}},"1964":{"start":{"line":1965,"column":0},"end":{"line":1965,"column":26}},"1965":{"start":{"line":1966,"column":0},"end":{"line":1966,"column":86}},"1966":{"start":{"line":1967,"column":0},"end":{"line":1967,"column":24}},"1967":{"start":{"line":1968,"column":0},"end":{"line":1968,"column":23}},"1968":{"start":{"line":1969,"column":0},"end":{"line":1969,"column":86}},"1969":{"start":{"line":1970,"column":0},"end":{"line":1970,"column":73}},"1971":{"start":{"line":1972,"column":0},"end":{"line":1972,"column":28}},"1973":{"start":{"line":1974,"column":0},"end":{"line":1974,"column":24}},"1974":{"start":{"line":1975,"column":0},"end":{"line":1975,"column":19}},"1976":{"start":{"line":1977,"column":0},"end":{"line":1977,"column":18}},"1978":{"start":{"line":1979,"column":0},"end":{"line":1979,"column":56}},"1979":{"start":{"line":1980,"column":0},"end":{"line":1980,"column":40}},"1981":{"start":{"line":1982,"column":0},"end":{"line":1982,"column":19}},"1982":{"start":{"line":1983,"column":0},"end":{"line":1983,"column":14}},"1983":{"start":{"line":1984,"column":0},"end":{"line":1984,"column":12}},"1985":{"start":{"line":1986,"column":0},"end":{"line":1986,"column":20}},"1986":{"start":{"line":1987,"column":0},"end":{"line":1987,"column":84}},"1987":{"start":{"line":1988,"column":0},"end":{"line":1988,"column":36}},"1988":{"start":{"line":1989,"column":0},"end":{"line":1989,"column":14}},"1989":{"start":{"line":1990,"column":0},"end":{"line":1990,"column":53}},"1990":{"start":{"line":1991,"column":0},"end":{"line":1991,"column":78}},"1991":{"start":{"line":1992,"column":0},"end":{"line":1992,"column":58}},"1992":{"start":{"line":1993,"column":0},"end":{"line":1993,"column":42}},"1994":{"start":{"line":1995,"column":0},"end":{"line":1995,"column":21}},"1995":{"start":{"line":1996,"column":0},"end":{"line":1996,"column":24}},"1996":{"start":{"line":1997,"column":0},"end":{"line":1997,"column":15}},"1997":{"start":{"line":1998,"column":0},"end":{"line":1998,"column":29}},"1999":{"start":{"line":2000,"column":0},"end":{"line":2000,"column":35}},"2000":{"start":{"line":2001,"column":0},"end":{"line":2001,"column":82}},"2001":{"start":{"line":2002,"column":0},"end":{"line":2002,"column":32}},"2002":{"start":{"line":2003,"column":0},"end":{"line":2003,"column":92}},"2003":{"start":{"line":2004,"column":0},"end":{"line":2004,"column":72}},"2004":{"start":{"line":2005,"column":0},"end":{"line":2005,"column":26}},"2005":{"start":{"line":2006,"column":0},"end":{"line":2006,"column":104}},"2006":{"start":{"line":2007,"column":0},"end":{"line":2007,"column":19}},"2007":{"start":{"line":2008,"column":0},"end":{"line":2008,"column":44}},"2008":{"start":{"line":2009,"column":0},"end":{"line":2009,"column":38}},"2009":{"start":{"line":2010,"column":0},"end":{"line":2010,"column":63}},"2010":{"start":{"line":2011,"column":0},"end":{"line":2011,"column":69}},"2011":{"start":{"line":2012,"column":0},"end":{"line":2012,"column":18}},"2012":{"start":{"line":2013,"column":0},"end":{"line":2013,"column":52}},"2013":{"start":{"line":2014,"column":0},"end":{"line":2014,"column":30}},"2014":{"start":{"line":2015,"column":0},"end":{"line":2015,"column":36}},"2015":{"start":{"line":2016,"column":0},"end":{"line":2016,"column":37}},"2016":{"start":{"line":2017,"column":0},"end":{"line":2017,"column":57}},"2017":{"start":{"line":2018,"column":0},"end":{"line":2018,"column":70}},"2018":{"start":{"line":2019,"column":0},"end":{"line":2019,"column":39}},"2019":{"start":{"line":2020,"column":0},"end":{"line":2020,"column":47}},"2020":{"start":{"line":2021,"column":0},"end":{"line":2021,"column":77}},"2021":{"start":{"line":2022,"column":0},"end":{"line":2022,"column":77}},"2022":{"start":{"line":2023,"column":0},"end":{"line":2023,"column":69}},"2023":{"start":{"line":2024,"column":0},"end":{"line":2024,"column":69}},"2024":{"start":{"line":2025,"column":0},"end":{"line":2025,"column":34}},"2025":{"start":{"line":2026,"column":0},"end":{"line":2026,"column":20}},"2026":{"start":{"line":2027,"column":0},"end":{"line":2027,"column":19}},"2027":{"start":{"line":2028,"column":0},"end":{"line":2028,"column":20}},"2028":{"start":{"line":2029,"column":0},"end":{"line":2029,"column":18}},"2029":{"start":{"line":2030,"column":0},"end":{"line":2030,"column":13}},"2030":{"start":{"line":2031,"column":0},"end":{"line":2031,"column":14}},"2033":{"start":{"line":2034,"column":0},"end":{"line":2034,"column":38}},"2034":{"start":{"line":2035,"column":0},"end":{"line":2035,"column":32}},"2035":{"start":{"line":2036,"column":0},"end":{"line":2036,"column":57}},"2036":{"start":{"line":2037,"column":0},"end":{"line":2037,"column":63}},"2037":{"start":{"line":2038,"column":0},"end":{"line":2038,"column":12}},"2038":{"start":{"line":2039,"column":0},"end":{"line":2039,"column":44}},"2039":{"start":{"line":2040,"column":0},"end":{"line":2040,"column":24}},"2040":{"start":{"line":2041,"column":0},"end":{"line":2041,"column":30}},"2041":{"start":{"line":2042,"column":0},"end":{"line":2042,"column":31}},"2042":{"start":{"line":2043,"column":0},"end":{"line":2043,"column":51}},"2043":{"start":{"line":2044,"column":0},"end":{"line":2044,"column":64}},"2044":{"start":{"line":2045,"column":0},"end":{"line":2045,"column":33}},"2045":{"start":{"line":2046,"column":0},"end":{"line":2046,"column":41}},"2046":{"start":{"line":2047,"column":0},"end":{"line":2047,"column":71}},"2047":{"start":{"line":2048,"column":0},"end":{"line":2048,"column":71}},"2048":{"start":{"line":2049,"column":0},"end":{"line":2049,"column":63}},"2049":{"start":{"line":2050,"column":0},"end":{"line":2050,"column":63}},"2050":{"start":{"line":2051,"column":0},"end":{"line":2051,"column":28}},"2051":{"start":{"line":2052,"column":0},"end":{"line":2052,"column":14}},"2052":{"start":{"line":2053,"column":0},"end":{"line":2053,"column":13}},"2053":{"start":{"line":2054,"column":0},"end":{"line":2054,"column":14}},"2056":{"start":{"line":2057,"column":0},"end":{"line":2057,"column":24}},"2057":{"start":{"line":2058,"column":0},"end":{"line":2058,"column":24}},"2058":{"start":{"line":2059,"column":0},"end":{"line":2059,"column":48}},"2059":{"start":{"line":2060,"column":0},"end":{"line":2060,"column":52}},"2060":{"start":{"line":2061,"column":0},"end":{"line":2061,"column":10}},"2062":{"start":{"line":2063,"column":0},"end":{"line":2063,"column":10}},"2064":{"start":{"line":2065,"column":0},"end":{"line":2065,"column":1}}},"s":{"0":0,"43":0,"44":0,"46":0,"47":0,"48":0,"49":0,"50":0,"52":0,"53":0,"55":0,"63":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"73":0,"74":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"87":0,"88":0,"89":0,"90":0,"92":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"109":0,"117":0,"118":0,"119":0,"121":0,"122":0,"124":0,"125":0,"126":0,"127":0,"130":0,"132":0,"134":0,"135":0,"137":0,"140":0,"141":0,"142":0,"143":0,"144":0,"146":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"156":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"166":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"176":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"187":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"198":0,"209":0,"210":0,"211":0,"212":0,"216":0,"217":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"252":0,"253":0,"254":0,"256":0,"266":0,"268":0,"269":0,"271":0,"272":0,"273":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"296":0,"297":0,"298":0,"300":0,"305":0,"307":0,"308":0,"309":0,"311":0,"312":0,"313":0,"314":0,"316":0,"317":0,"318":0,"319":0,"320":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"330":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"343":0,"344":0,"346":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"360":0,"361":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"372":0,"373":0,"374":0,"375":0,"377":0,"378":0,"379":0,"380":0,"381":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"395":0,"397":0,"400":0,"401":0,"402":0,"403":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"414":0,"415":0,"417":0,"419":0,"428":0,"429":0,"431":0,"432":0,"433":0,"434":0,"435":0,"437":0,"438":0,"439":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"451":0,"452":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"463":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"491":0,"493":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"530":0,"532":0,"533":0,"534":0,"535":0,"536":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"568":0,"569":0,"570":0,"571":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"582":0,"583":0,"584":0,"585":0,"586":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"597":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"622":0,"623":0,"624":0,"625":0,"626":0,"628":0,"629":0,"630":0,"632":0,"633":0,"634":0,"636":0,"637":0,"638":0,"640":0,"642":0,"643":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"662":0,"663":0,"664":0,"666":0,"667":0,"668":0,"669":0,"671":0,"672":0,"673":0,"674":0,"675":0,"677":0,"678":0,"679":0,"681":0,"682":0,"683":0,"684":0,"685":0,"687":0,"688":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":0,"698":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"706":0,"708":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":0,"716":0,"718":0,"720":0,"721":0,"722":0,"723":0,"724":0,"725":0,"726":0,"728":0,"730":0,"731":0,"733":0,"734":0,"737":0,"738":0,"740":0,"741":0,"742":0,"743":0,"744":0,"745":0,"747":0,"748":0,"750":0,"752":0,"753":0,"755":0,"756":0,"757":0,"758":0,"759":0,"760":0,"761":0,"762":0,"763":0,"764":0,"765":0,"766":0,"767":0,"768":0,"770":0,"771":0,"772":0,"775":0,"776":0,"777":0,"778":0,"779":0,"780":0,"781":0,"782":0,"783":0,"784":0,"785":0,"787":0,"788":0,"789":0,"790":0,"791":0,"794":0,"795":0,"796":0,"797":0,"798":0,"799":0,"800":0,"801":0,"802":0,"803":0,"804":0,"805":0,"806":0,"807":0,"810":0,"811":0,"812":0,"813":0,"814":0,"817":0,"818":0,"819":0,"820":0,"821":0,"823":0,"824":0,"825":0,"827":0,"829":0,"832":0,"833":0,"834":0,"835":0,"836":0,"837":0,"838":0,"839":0,"840":0,"841":0,"842":0,"843":0,"847":0,"848":0,"850":0,"851":0,"852":0,"853":0,"854":0,"855":0,"856":0,"857":0,"858":0,"859":0,"860":0,"861":0,"863":0,"865":0,"868":0,"870":0,"871":0,"873":0,"874":0,"875":0,"876":0,"878":0,"879":0,"880":0,"881":0,"882":0,"883":0,"884":0,"885":0,"886":0,"887":0,"888":0,"889":0,"890":0,"891":0,"892":0,"893":0,"894":0,"895":0,"896":0,"897":0,"898":0,"899":0,"900":0,"901":0,"902":0,"903":0,"904":0,"906":0,"907":0,"908":0,"909":0,"910":0,"912":0,"913":0,"915":0,"916":0,"917":0,"918":0,"919":0,"920":0,"921":0,"922":0,"923":0,"924":0,"925":0,"926":0,"927":0,"928":0,"929":0,"930":0,"931":0,"932":0,"934":0,"936":0,"938":0,"940":0,"941":0,"942":0,"945":0,"946":0,"948":0,"952":0,"953":0,"955":0,"956":0,"957":0,"958":0,"959":0,"960":0,"961":0,"962":0,"963":0,"965":0,"966":0,"967":0,"968":0,"969":0,"970":0,"972":0,"973":0,"974":0,"975":0,"976":0,"977":0,"978":0,"979":0,"980":0,"981":0,"982":0,"983":0,"984":0,"985":0,"986":0,"987":0,"989":0,"993":0,"994":0,"995":0,"998":0,"1000":0,"1001":0,"1002":0,"1003":0,"1005":0,"1007":0,"1008":0,"1011":0,"1012":0,"1013":0,"1014":0,"1016":0,"1017":0,"1018":0,"1020":0,"1021":0,"1022":0,"1024":0,"1025":0,"1026":0,"1027":0,"1028":0,"1030":0,"1031":0,"1032":0,"1033":0,"1035":0,"1038":0,"1039":0,"1040":0,"1041":0,"1043":0,"1044":0,"1045":0,"1046":0,"1047":0,"1048":0,"1049":0,"1050":0,"1051":0,"1052":0,"1053":0,"1054":0,"1055":0,"1056":0,"1057":0,"1058":0,"1060":0,"1061":0,"1062":0,"1063":0,"1065":0,"1066":0,"1067":0,"1068":0,"1069":0,"1070":0,"1071":0,"1072":0,"1073":0,"1074":0,"1075":0,"1076":0,"1077":0,"1079":0,"1080":0,"1081":0,"1082":0,"1083":0,"1084":0,"1085":0,"1086":0,"1087":0,"1088":0,"1089":0,"1091":0,"1093":0,"1094":0,"1096":0,"1098":0,"1099":0,"1100":0,"1101":0,"1102":0,"1103":0,"1104":0,"1105":0,"1106":0,"1107":0,"1108":0,"1109":0,"1110":0,"1111":0,"1112":0,"1113":0,"1114":0,"1116":0,"1118":0,"1122":0,"1123":0,"1124":0,"1126":0,"1127":0,"1128":0,"1129":0,"1130":0,"1131":0,"1132":0,"1133":0,"1134":0,"1135":0,"1136":0,"1137":0,"1139":0,"1140":0,"1143":0,"1144":0,"1145":0,"1146":0,"1148":0,"1151":0,"1154":0,"1155":0,"1156":0,"1157":0,"1158":0,"1159":0,"1160":0,"1161":0,"1162":0,"1164":0,"1166":0,"1167":0,"1168":0,"1169":0,"1170":0,"1171":0,"1172":0,"1173":0,"1174":0,"1176":0,"1178":0,"1179":0,"1182":0,"1183":0,"1184":0,"1185":0,"1186":0,"1187":0,"1188":0,"1189":0,"1190":0,"1191":0,"1192":0,"1193":0,"1194":0,"1196":0,"1197":0,"1198":0,"1199":0,"1200":0,"1201":0,"1202":0,"1203":0,"1204":0,"1208":0,"1209":0,"1210":0,"1211":0,"1212":0,"1213":0,"1214":0,"1215":0,"1216":0,"1217":0,"1218":0,"1219":0,"1220":0,"1221":0,"1222":0,"1223":0,"1224":0,"1225":0,"1226":0,"1228":0,"1229":0,"1230":0,"1231":0,"1232":0,"1233":0,"1234":0,"1236":0,"1238":0,"1239":0,"1240":0,"1242":0,"1245":0,"1246":0,"1247":0,"1248":0,"1249":0,"1250":0,"1254":0,"1255":0,"1256":0,"1257":0,"1258":0,"1259":0,"1263":0,"1264":0,"1265":0,"1266":0,"1267":0,"1268":0,"1269":0,"1270":0,"1271":0,"1272":0,"1273":0,"1274":0,"1278":0,"1279":0,"1280":0,"1281":0,"1282":0,"1283":0,"1284":0,"1286":0,"1287":0,"1288":0,"1289":0,"1290":0,"1291":0,"1292":0,"1293":0,"1297":0,"1298":0,"1299":0,"1300":0,"1301":0,"1302":0,"1306":0,"1307":0,"1308":0,"1309":0,"1310":0,"1311":0,"1312":0,"1313":0,"1314":0,"1315":0,"1316":0,"1320":0,"1321":0,"1322":0,"1323":0,"1324":0,"1326":0,"1328":0,"1330":0,"1331":0,"1332":0,"1333":0,"1336":0,"1337":0,"1338":0,"1339":0,"1340":0,"1341":0,"1342":0,"1343":0,"1344":0,"1347":0,"1348":0,"1349":0,"1350":0,"1351":0,"1352":0,"1353":0,"1355":0,"1356":0,"1357":0,"1358":0,"1360":0,"1361":0,"1362":0,"1363":0,"1364":0,"1365":0,"1366":0,"1367":0,"1368":0,"1370":0,"1371":0,"1372":0,"1373":0,"1374":0,"1375":0,"1376":0,"1377":0,"1378":0,"1379":0,"1380":0,"1381":0,"1382":0,"1383":0,"1384":0,"1385":0,"1386":0,"1387":0,"1388":0,"1389":0,"1390":0,"1391":0,"1392":0,"1393":0,"1394":0,"1395":0,"1396":0,"1397":0,"1398":0,"1399":0,"1400":0,"1401":0,"1402":0,"1403":0,"1404":0,"1405":0,"1406":0,"1407":0,"1408":0,"1409":0,"1410":0,"1411":0,"1412":0,"1413":0,"1414":0,"1415":0,"1416":0,"1417":0,"1418":0,"1419":0,"1420":0,"1422":0,"1423":0,"1424":0,"1425":0,"1426":0,"1427":0,"1428":0,"1429":0,"1430":0,"1431":0,"1432":0,"1433":0,"1434":0,"1435":0,"1436":0,"1437":0,"1438":0,"1439":0,"1440":0,"1441":0,"1442":0,"1443":0,"1444":0,"1445":0,"1446":0,"1447":0,"1448":0,"1449":0,"1450":0,"1451":0,"1452":0,"1454":0,"1455":0,"1456":0,"1457":0,"1459":0,"1460":0,"1462":0,"1463":0,"1464":0,"1465":0,"1466":0,"1467":0,"1469":0,"1471":0,"1472":0,"1473":0,"1474":0,"1477":0,"1478":0,"1479":0,"1480":0,"1481":0,"1482":0,"1483":0,"1484":0,"1485":0,"1486":0,"1488":0,"1489":0,"1490":0,"1491":0,"1492":0,"1493":0,"1494":0,"1495":0,"1498":0,"1499":0,"1500":0,"1501":0,"1502":0,"1503":0,"1504":0,"1506":0,"1507":0,"1508":0,"1509":0,"1510":0,"1511":0,"1512":0,"1513":0,"1514":0,"1516":0,"1517":0,"1518":0,"1519":0,"1520":0,"1522":0,"1523":0,"1524":0,"1525":0,"1527":0,"1528":0,"1529":0,"1530":0,"1531":0,"1532":0,"1533":0,"1534":0,"1535":0,"1536":0,"1537":0,"1538":0,"1539":0,"1540":0,"1541":0,"1542":0,"1543":0,"1544":0,"1545":0,"1546":0,"1547":0,"1548":0,"1549":0,"1550":0,"1551":0,"1552":0,"1553":0,"1554":0,"1555":0,"1556":0,"1557":0,"1558":0,"1559":0,"1560":0,"1561":0,"1562":0,"1563":0,"1564":0,"1565":0,"1566":0,"1567":0,"1568":0,"1569":0,"1570":0,"1571":0,"1572":0,"1573":0,"1574":0,"1575":0,"1576":0,"1577":0,"1578":0,"1579":0,"1581":0,"1582":0,"1583":0,"1584":0,"1585":0,"1586":0,"1587":0,"1588":0,"1589":0,"1590":0,"1591":0,"1592":0,"1593":0,"1594":0,"1595":0,"1596":0,"1597":0,"1598":0,"1599":0,"1600":0,"1601":0,"1602":0,"1603":0,"1604":0,"1605":0,"1606":0,"1607":0,"1608":0,"1609":0,"1610":0,"1611":0,"1612":0,"1613":0,"1614":0,"1615":0,"1616":0,"1617":0,"1618":0,"1619":0,"1620":0,"1621":0,"1622":0,"1624":0,"1625":0,"1626":0,"1627":0,"1629":0,"1630":0,"1631":0,"1632":0,"1633":0,"1634":0,"1635":0,"1636":0,"1637":0,"1639":0,"1642":0,"1643":0,"1644":0,"1645":0,"1646":0,"1647":0,"1648":0,"1649":0,"1652":0,"1653":0,"1654":0,"1655":0,"1656":0,"1657":0,"1662":0,"1663":0,"1666":0,"1667":0,"1668":0,"1669":0,"1670":0,"1673":0,"1674":0,"1675":0,"1677":0,"1678":0,"1679":0,"1680":0,"1681":0,"1682":0,"1683":0,"1684":0,"1685":0,"1686":0,"1687":0,"1689":0,"1690":0,"1692":0,"1693":0,"1694":0,"1695":0,"1696":0,"1697":0,"1698":0,"1699":0,"1700":0,"1702":0,"1703":0,"1704":0,"1705":0,"1707":0,"1709":0,"1710":0,"1711":0,"1712":0,"1713":0,"1714":0,"1715":0,"1716":0,"1717":0,"1718":0,"1719":0,"1720":0,"1721":0,"1722":0,"1723":0,"1724":0,"1725":0,"1727":0,"1728":0,"1729":0,"1730":0,"1733":0,"1734":0,"1735":0,"1736":0,"1739":0,"1740":0,"1741":0,"1742":0,"1745":0,"1746":0,"1747":0,"1748":0,"1749":0,"1752":0,"1753":0,"1754":0,"1755":0,"1756":0,"1757":0,"1758":0,"1759":0,"1760":0,"1761":0,"1762":0,"1765":0,"1766":0,"1767":0,"1768":0,"1769":0,"1770":0,"1771":0,"1772":0,"1773":0,"1775":0,"1776":0,"1777":0,"1778":0,"1779":0,"1780":0,"1781":0,"1783":0,"1784":0,"1785":0,"1786":0,"1787":0,"1788":0,"1789":0,"1790":0,"1791":0,"1792":0,"1794":0,"1795":0,"1796":0,"1797":0,"1798":0,"1800":0,"1801":0,"1802":0,"1803":0,"1805":0,"1806":0,"1807":0,"1808":0,"1809":0,"1811":0,"1812":0,"1813":0,"1814":0,"1815":0,"1818":0,"1819":0,"1820":0,"1822":0,"1823":0,"1824":0,"1825":0,"1826":0,"1827":0,"1828":0,"1829":0,"1831":0,"1832":0,"1833":0,"1834":0,"1835":0,"1836":0,"1837":0,"1838":0,"1839":0,"1841":0,"1842":0,"1843":0,"1845":0,"1846":0,"1847":0,"1848":0,"1849":0,"1851":0,"1852":0,"1853":0,"1854":0,"1857":0,"1858":0,"1859":0,"1861":0,"1862":0,"1865":0,"1866":0,"1868":0,"1869":0,"1870":0,"1871":0,"1872":0,"1873":0,"1874":0,"1875":0,"1877":0,"1878":0,"1879":0,"1880":0,"1881":0,"1882":0,"1883":0,"1884":0,"1886":0,"1887":0,"1888":0,"1889":0,"1890":0,"1892":0,"1893":0,"1894":0,"1895":0,"1896":0,"1897":0,"1898":0,"1899":0,"1900":0,"1902":0,"1903":0,"1905":0,"1907":0,"1908":0,"1911":0,"1912":0,"1913":0,"1914":0,"1916":0,"1917":0,"1919":0,"1921":0,"1923":0,"1925":0,"1926":0,"1927":0,"1928":0,"1929":0,"1930":0,"1931":0,"1933":0,"1935":0,"1936":0,"1937":0,"1938":0,"1939":0,"1941":0,"1943":0,"1944":0,"1945":0,"1946":0,"1948":0,"1949":0,"1950":0,"1951":0,"1952":0,"1953":0,"1955":0,"1956":0,"1957":0,"1958":0,"1959":0,"1960":0,"1961":0,"1962":0,"1963":0,"1964":0,"1965":0,"1966":0,"1967":0,"1968":0,"1969":0,"1971":0,"1973":0,"1974":0,"1976":0,"1978":0,"1979":0,"1981":0,"1982":0,"1983":0,"1985":0,"1986":0,"1987":0,"1988":0,"1989":0,"1990":0,"1991":0,"1992":0,"1994":0,"1995":0,"1996":0,"1997":0,"1999":0,"2000":0,"2001":0,"2002":0,"2003":0,"2004":0,"2005":0,"2006":0,"2007":0,"2008":0,"2009":0,"2010":0,"2011":0,"2012":0,"2013":0,"2014":0,"2015":0,"2016":0,"2017":0,"2018":0,"2019":0,"2020":0,"2021":0,"2022":0,"2023":0,"2024":0,"2025":0,"2026":0,"2027":0,"2028":0,"2029":0,"2030":0,"2033":0,"2034":0,"2035":0,"2036":0,"2037":0,"2038":0,"2039":0,"2040":0,"2041":0,"2042":0,"2043":0,"2044":0,"2045":0,"2046":0,"2047":0,"2048":0,"2049":0,"2050":0,"2051":0,"2052":0,"2053":0,"2056":0,"2057":0,"2058":0,"2059":0,"2060":0,"2062":0,"2064":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":2065,"column":-36855}},"locations":[{"start":{"line":1,"column":0},"end":{"line":2065,"column":-36855}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":2065,"column":-36855}},"loc":{"start":{"line":1,"column":0},"end":{"line":2065,"column":-36855}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/pages/ProfilesPage.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/pages/ProfilesPage.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":53}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":60}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":3}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":47}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":124}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":63}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":93}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":80}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":100}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":63}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":126}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":77}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":56}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":1}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":51}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":49}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":1}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":54}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":33}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":25}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":48}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":46}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":49}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":49}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":38}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":47}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":49}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":46}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":35}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":1}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":62}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":35}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":55}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":41}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":47}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":39}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":41}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":49}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":37}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":62}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":28}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":27}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":44}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":20}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":45}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":58}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":24}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":14}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":43}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":7}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":6}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":65}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":5}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":38}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":51}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":28}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":27}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":44}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":20}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":14}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":43}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":7}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":6}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":65}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":5}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":37}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":47}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":22}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":42}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":18}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":6}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":65}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":5}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":48}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":23}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":49}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":54}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":54}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":4}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":99}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":10}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":39}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":19}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":42}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":111}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":58}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":16}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":86}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":97}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":14}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":60}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":32}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":14}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":19}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":83}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":22}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":30}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":31}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":60}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":188}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":46}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":26}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":18}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":20}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":19}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":86}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":22}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":33}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":34}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":63}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":188}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":40}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":26}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":18}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":20}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":19}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":84}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":23}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":32}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":61}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":160}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":56}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":54}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":25}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":20}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":15}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":31}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":17}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":93}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":107}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":20}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":27}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":28}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":88}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":205}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":36}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":29}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":24}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":16}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":18}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":32}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":17}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":88}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":115}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":23}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":29}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":58}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":216}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":36}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":24}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":24}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":16}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":18}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":38}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":33}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":108}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":23}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":74}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":104}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":85}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":21}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":16}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":32}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":70}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":21}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":29}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":48}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":110}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":43}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":23}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":18}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":32}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":70}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":21}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":29}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":48}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":110}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":45}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":23}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":18}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":15}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":20}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":11}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":1}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":25}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":8}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":8}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":10}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":11}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":4}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":4}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":46}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":62}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":10}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":30}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":13}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":42}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":178}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":57}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":53}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":112}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":15}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":18}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":10}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":81}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":185}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":38}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":21}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":34}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":77}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":146}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":76}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":19}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":43}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":48}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":81}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":23}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":15}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":16}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":11}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":10}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":1}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":24}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":52}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":19}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":36}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":41}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":6}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":56}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":72}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":9}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":29}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":52}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":4}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":30}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":10}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":11}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":27}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":162}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":32}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":37}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":13}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":1}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":25}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":10}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":10}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":14}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":14}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":20}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":15}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":18}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":4}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":4}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":49}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":54}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":10}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":51}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":13}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":25}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":34}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":75}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":27}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":56}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":29}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":64}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":60}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":70}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":49}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":63}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":141}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":32}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":19}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":48}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":115}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":84}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":26}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":17}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":68}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":72}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":37}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":19}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":66}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":72}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":36}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":19}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":32}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":72}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":32}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":19}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":14}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":15}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":13}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":64}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":105}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":25}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":36}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":15}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":10}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":1}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":65}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":37}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":34}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":44}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":32}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":52}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":27}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":30}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":29}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":31}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":42}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":29}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":94}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":7}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":5}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":31}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":3}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":60}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":23}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":3}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":27}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":38}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":90}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":59}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":3}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":32}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":40}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":42}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":45}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":88}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":6}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":59}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":3}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":21}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":1}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":28}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":10}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":10}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":12}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":14}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":9}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":4}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":4}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":35}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":39}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":68}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":69}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":57}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":65}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":5}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":38}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":65}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":22}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":34}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":69}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":18}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":6}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":65}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":5}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":54}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":86}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":10}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":89}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":84}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":66}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":115}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":44}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":55}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":93}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":32}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":116}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":25}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":20}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":84}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":73}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":88}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":20}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":18}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":145}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":39}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":21}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":16}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":62}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":26}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":70}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":77}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":20}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":26}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":185}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":46}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":20}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":100}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":16}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":32}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":96}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":73}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":53}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":72}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":20}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":58}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":102}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":18}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":42}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":143}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":25}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":136}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":124}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":25}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":20}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":18}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":83}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":42}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":95}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":66}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":46}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":25}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":32}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":20}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":97}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":52}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":29}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":88}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":52}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":29}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":21}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":20}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":18}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":22}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":13}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":10}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":1}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":50}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":7}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":68}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":44}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":11}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":14}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":3}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":1}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":59}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":78}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":1}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":25}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":10}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":10}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":4}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":4}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":35}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":84}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":96}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":66}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":47}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":47}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":57}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":82}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":78}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":48}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":15}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":51}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":56}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":26}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":33}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":4}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":40}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":55}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":27}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":29}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":34}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":4}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":52}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":30}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":31}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":38}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":64}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":31}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":4}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":32}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":47}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":9}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":48}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":40}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":26}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":83}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":13}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":8}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":29}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":25}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":36}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":17}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":49}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":5}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":4}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":34}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":23}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":20}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":20}},"719":{"start":{"line":720,"column":0},"end":{"line":720,"column":26}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":31}},"721":{"start":{"line":722,"column":0},"end":{"line":722,"column":4}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":45}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":38}},"725":{"start":{"line":726,"column":0},"end":{"line":726,"column":61}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":6}},"727":{"start":{"line":728,"column":0},"end":{"line":728,"column":27}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":4}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":22}},"731":{"start":{"line":732,"column":0},"end":{"line":732,"column":76}},"732":{"start":{"line":733,"column":0},"end":{"line":733,"column":73}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":79}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":4}},"736":{"start":{"line":737,"column":0},"end":{"line":737,"column":98}},"739":{"start":{"line":740,"column":0},"end":{"line":740,"column":19}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":49}},"741":{"start":{"line":742,"column":0},"end":{"line":742,"column":31}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":30}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":35}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":31}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":29}},"746":{"start":{"line":747,"column":0},"end":{"line":747,"column":16}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":20}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":9}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":7}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":6}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":54}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":70}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":44}},"755":{"start":{"line":756,"column":0},"end":{"line":756,"column":10}},"756":{"start":{"line":757,"column":0},"end":{"line":757,"column":89}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":28}},"759":{"start":{"line":760,"column":0},"end":{"line":760,"column":89}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":44}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":41}},"762":{"start":{"line":763,"column":0},"end":{"line":763,"column":60}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":62}},"764":{"start":{"line":765,"column":0},"end":{"line":765,"column":68}},"765":{"start":{"line":766,"column":0},"end":{"line":766,"column":22}},"766":{"start":{"line":767,"column":0},"end":{"line":767,"column":21}},"767":{"start":{"line":768,"column":0},"end":{"line":768,"column":87}},"768":{"start":{"line":769,"column":0},"end":{"line":769,"column":89}},"769":{"start":{"line":770,"column":0},"end":{"line":770,"column":22}},"770":{"start":{"line":771,"column":0},"end":{"line":771,"column":20}},"771":{"start":{"line":772,"column":0},"end":{"line":772,"column":45}},"772":{"start":{"line":773,"column":0},"end":{"line":773,"column":111}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":18}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":42}},"775":{"start":{"line":776,"column":0},"end":{"line":776,"column":104}},"777":{"start":{"line":778,"column":0},"end":{"line":778,"column":25}},"778":{"start":{"line":779,"column":0},"end":{"line":779,"column":118}},"779":{"start":{"line":780,"column":0},"end":{"line":780,"column":48}},"781":{"start":{"line":782,"column":0},"end":{"line":782,"column":25}},"782":{"start":{"line":783,"column":0},"end":{"line":783,"column":20}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":26}},"784":{"start":{"line":785,"column":0},"end":{"line":785,"column":17}},"785":{"start":{"line":786,"column":0},"end":{"line":786,"column":14}},"788":{"start":{"line":789,"column":0},"end":{"line":789,"column":68}},"789":{"start":{"line":790,"column":0},"end":{"line":790,"column":58}},"791":{"start":{"line":792,"column":0},"end":{"line":792,"column":101}},"792":{"start":{"line":793,"column":0},"end":{"line":793,"column":85}},"793":{"start":{"line":794,"column":0},"end":{"line":794,"column":61}},"795":{"start":{"line":796,"column":0},"end":{"line":796,"column":17}},"796":{"start":{"line":797,"column":0},"end":{"line":797,"column":83}},"797":{"start":{"line":798,"column":0},"end":{"line":798,"column":39}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":21}},"799":{"start":{"line":800,"column":0},"end":{"line":800,"column":16}},"802":{"start":{"line":803,"column":0},"end":{"line":803,"column":91}},"803":{"start":{"line":804,"column":0},"end":{"line":804,"column":66}},"804":{"start":{"line":805,"column":0},"end":{"line":805,"column":79}},"805":{"start":{"line":806,"column":0},"end":{"line":806,"column":21}},"806":{"start":{"line":807,"column":0},"end":{"line":807,"column":26}},"807":{"start":{"line":808,"column":0},"end":{"line":808,"column":51}},"808":{"start":{"line":809,"column":0},"end":{"line":809,"column":77}},"809":{"start":{"line":810,"column":0},"end":{"line":810,"column":37}},"810":{"start":{"line":811,"column":0},"end":{"line":811,"column":49}},"811":{"start":{"line":812,"column":0},"end":{"line":812,"column":70}},"812":{"start":{"line":813,"column":0},"end":{"line":813,"column":19}},"814":{"start":{"line":815,"column":0},"end":{"line":815,"column":65}},"815":{"start":{"line":816,"column":0},"end":{"line":816,"column":23}},"816":{"start":{"line":817,"column":0},"end":{"line":817,"column":15}},"817":{"start":{"line":818,"column":0},"end":{"line":818,"column":16}},"820":{"start":{"line":821,"column":0},"end":{"line":821,"column":54}},"821":{"start":{"line":822,"column":0},"end":{"line":822,"column":47}},"822":{"start":{"line":823,"column":0},"end":{"line":823,"column":65}},"823":{"start":{"line":824,"column":0},"end":{"line":824,"column":74}},"824":{"start":{"line":825,"column":0},"end":{"line":825,"column":39}},"825":{"start":{"line":826,"column":0},"end":{"line":826,"column":87}},"826":{"start":{"line":827,"column":0},"end":{"line":827,"column":20}},"828":{"start":{"line":829,"column":0},"end":{"line":829,"column":41}},"829":{"start":{"line":830,"column":0},"end":{"line":830,"column":54}},"830":{"start":{"line":831,"column":0},"end":{"line":831,"column":61}},"831":{"start":{"line":832,"column":0},"end":{"line":832,"column":49}},"833":{"start":{"line":834,"column":0},"end":{"line":834,"column":50}},"834":{"start":{"line":835,"column":0},"end":{"line":835,"column":28}},"835":{"start":{"line":836,"column":0},"end":{"line":836,"column":26}},"836":{"start":{"line":837,"column":0},"end":{"line":837,"column":41}},"837":{"start":{"line":838,"column":0},"end":{"line":838,"column":90}},"839":{"start":{"line":840,"column":0},"end":{"line":840,"column":69}},"840":{"start":{"line":841,"column":0},"end":{"line":841,"column":32}},"841":{"start":{"line":842,"column":0},"end":{"line":842,"column":39}},"842":{"start":{"line":843,"column":0},"end":{"line":843,"column":44}},"843":{"start":{"line":844,"column":0},"end":{"line":844,"column":73}},"844":{"start":{"line":845,"column":0},"end":{"line":845,"column":55}},"845":{"start":{"line":846,"column":0},"end":{"line":846,"column":178}},"846":{"start":{"line":847,"column":0},"end":{"line":847,"column":37}},"847":{"start":{"line":848,"column":0},"end":{"line":848,"column":28}},"848":{"start":{"line":849,"column":0},"end":{"line":849,"column":32}},"849":{"start":{"line":850,"column":0},"end":{"line":850,"column":39}},"850":{"start":{"line":851,"column":0},"end":{"line":851,"column":44}},"851":{"start":{"line":852,"column":0},"end":{"line":852,"column":73}},"852":{"start":{"line":853,"column":0},"end":{"line":853,"column":53}},"853":{"start":{"line":854,"column":0},"end":{"line":854,"column":178}},"854":{"start":{"line":855,"column":0},"end":{"line":855,"column":28}},"855":{"start":{"line":856,"column":0},"end":{"line":856,"column":30}},"856":{"start":{"line":857,"column":0},"end":{"line":857,"column":46}},"857":{"start":{"line":858,"column":0},"end":{"line":858,"column":103}},"858":{"start":{"line":859,"column":0},"end":{"line":859,"column":35}},"859":{"start":{"line":860,"column":0},"end":{"line":860,"column":48}},"860":{"start":{"line":861,"column":0},"end":{"line":861,"column":46}},"861":{"start":{"line":862,"column":0},"end":{"line":862,"column":62}},"862":{"start":{"line":863,"column":0},"end":{"line":863,"column":57}},"863":{"start":{"line":864,"column":0},"end":{"line":864,"column":30}},"864":{"start":{"line":865,"column":0},"end":{"line":865,"column":36}},"865":{"start":{"line":866,"column":0},"end":{"line":866,"column":146}},"866":{"start":{"line":867,"column":0},"end":{"line":867,"column":122}},"867":{"start":{"line":868,"column":0},"end":{"line":868,"column":31}},"868":{"start":{"line":869,"column":0},"end":{"line":869,"column":28}},"869":{"start":{"line":870,"column":0},"end":{"line":870,"column":49}},"870":{"start":{"line":871,"column":0},"end":{"line":871,"column":92}},"872":{"start":{"line":873,"column":0},"end":{"line":873,"column":30}},"873":{"start":{"line":874,"column":0},"end":{"line":874,"column":52}},"874":{"start":{"line":875,"column":0},"end":{"line":875,"column":97}},"875":{"start":{"line":876,"column":0},"end":{"line":876,"column":56}},"877":{"start":{"line":878,"column":0},"end":{"line":878,"column":35}},"878":{"start":{"line":879,"column":0},"end":{"line":879,"column":91}},"880":{"start":{"line":881,"column":0},"end":{"line":881,"column":35}},"881":{"start":{"line":882,"column":0},"end":{"line":882,"column":30}},"882":{"start":{"line":883,"column":0},"end":{"line":883,"column":28}},"884":{"start":{"line":885,"column":0},"end":{"line":885,"column":19}},"886":{"start":{"line":887,"column":0},"end":{"line":887,"column":26}},"887":{"start":{"line":888,"column":0},"end":{"line":888,"column":24}},"888":{"start":{"line":889,"column":0},"end":{"line":889,"column":39}},"889":{"start":{"line":890,"column":0},"end":{"line":890,"column":167}},"891":{"start":{"line":892,"column":0},"end":{"line":892,"column":88}},"892":{"start":{"line":893,"column":0},"end":{"line":893,"column":54}},"893":{"start":{"line":894,"column":0},"end":{"line":894,"column":89}},"894":{"start":{"line":895,"column":0},"end":{"line":895,"column":98}},"895":{"start":{"line":896,"column":0},"end":{"line":896,"column":28}},"896":{"start":{"line":897,"column":0},"end":{"line":897,"column":111}},"897":{"start":{"line":898,"column":0},"end":{"line":898,"column":70}},"898":{"start":{"line":899,"column":0},"end":{"line":899,"column":29}},"899":{"start":{"line":900,"column":0},"end":{"line":900,"column":29}},"900":{"start":{"line":901,"column":0},"end":{"line":901,"column":70}},"901":{"start":{"line":902,"column":0},"end":{"line":902,"column":60}},"902":{"start":{"line":903,"column":0},"end":{"line":903,"column":46}},"903":{"start":{"line":904,"column":0},"end":{"line":904,"column":74}},"904":{"start":{"line":905,"column":0},"end":{"line":905,"column":64}},"905":{"start":{"line":906,"column":0},"end":{"line":906,"column":27}},"906":{"start":{"line":907,"column":0},"end":{"line":907,"column":93}},"908":{"start":{"line":909,"column":0},"end":{"line":909,"column":109}},"909":{"start":{"line":910,"column":0},"end":{"line":910,"column":31}},"910":{"start":{"line":911,"column":0},"end":{"line":911,"column":29}},"911":{"start":{"line":912,"column":0},"end":{"line":912,"column":57}},"912":{"start":{"line":913,"column":0},"end":{"line":913,"column":138}},"913":{"start":{"line":914,"column":0},"end":{"line":914,"column":23}},"915":{"start":{"line":916,"column":0},"end":{"line":916,"column":31}},"916":{"start":{"line":917,"column":0},"end":{"line":917,"column":29}},"917":{"start":{"line":918,"column":0},"end":{"line":918,"column":60}},"918":{"start":{"line":919,"column":0},"end":{"line":919,"column":72}},"919":{"start":{"line":920,"column":0},"end":{"line":920,"column":36}},"921":{"start":{"line":922,"column":0},"end":{"line":922,"column":54}},"922":{"start":{"line":923,"column":0},"end":{"line":923,"column":31}},"923":{"start":{"line":924,"column":0},"end":{"line":924,"column":29}},"924":{"start":{"line":925,"column":0},"end":{"line":925,"column":71}},"925":{"start":{"line":926,"column":0},"end":{"line":926,"column":74}},"926":{"start":{"line":927,"column":0},"end":{"line":927,"column":38}},"928":{"start":{"line":929,"column":0},"end":{"line":929,"column":54}},"929":{"start":{"line":930,"column":0},"end":{"line":930,"column":31}},"930":{"start":{"line":931,"column":0},"end":{"line":931,"column":26}},"932":{"start":{"line":933,"column":0},"end":{"line":933,"column":19}},"933":{"start":{"line":934,"column":0},"end":{"line":934,"column":20}},"935":{"start":{"line":936,"column":0},"end":{"line":936,"column":16}},"936":{"start":{"line":937,"column":0},"end":{"line":937,"column":22}},"937":{"start":{"line":938,"column":0},"end":{"line":938,"column":13}},"938":{"start":{"line":939,"column":0},"end":{"line":939,"column":10}},"940":{"start":{"line":941,"column":0},"end":{"line":941,"column":1}},"953":{"start":{"line":954,"column":0},"end":{"line":954,"column":20}},"954":{"start":{"line":955,"column":0},"end":{"line":955,"column":10}},"955":{"start":{"line":956,"column":0},"end":{"line":956,"column":13}},"956":{"start":{"line":957,"column":0},"end":{"line":957,"column":14}},"957":{"start":{"line":958,"column":0},"end":{"line":958,"column":12}},"958":{"start":{"line":959,"column":0},"end":{"line":959,"column":13}},"959":{"start":{"line":960,"column":0},"end":{"line":960,"column":4}},"965":{"start":{"line":966,"column":0},"end":{"line":966,"column":4}},"966":{"start":{"line":967,"column":0},"end":{"line":967,"column":77}},"967":{"start":{"line":968,"column":0},"end":{"line":968,"column":53}},"970":{"start":{"line":971,"column":0},"end":{"line":971,"column":37}},"971":{"start":{"line":972,"column":0},"end":{"line":972,"column":87}},"972":{"start":{"line":973,"column":0},"end":{"line":973,"column":36}},"974":{"start":{"line":975,"column":0},"end":{"line":975,"column":32}},"976":{"start":{"line":977,"column":0},"end":{"line":977,"column":60}},"978":{"start":{"line":979,"column":0},"end":{"line":979,"column":38}},"979":{"start":{"line":980,"column":0},"end":{"line":980,"column":40}},"980":{"start":{"line":981,"column":0},"end":{"line":981,"column":43}},"981":{"start":{"line":982,"column":0},"end":{"line":982,"column":45}},"983":{"start":{"line":984,"column":0},"end":{"line":984,"column":38}},"984":{"start":{"line":985,"column":0},"end":{"line":985,"column":39}},"985":{"start":{"line":986,"column":0},"end":{"line":986,"column":25}},"986":{"start":{"line":987,"column":0},"end":{"line":987,"column":46}},"987":{"start":{"line":988,"column":0},"end":{"line":988,"column":27}},"988":{"start":{"line":989,"column":0},"end":{"line":989,"column":72}},"989":{"start":{"line":990,"column":0},"end":{"line":990,"column":27}},"990":{"start":{"line":991,"column":0},"end":{"line":991,"column":14}},"991":{"start":{"line":992,"column":0},"end":{"line":992,"column":24}},"992":{"start":{"line":993,"column":0},"end":{"line":993,"column":7}},"994":{"start":{"line":995,"column":0},"end":{"line":995,"column":68}},"995":{"start":{"line":996,"column":0},"end":{"line":996,"column":5}},"997":{"start":{"line":998,"column":0},"end":{"line":998,"column":35}},"999":{"start":{"line":1000,"column":0},"end":{"line":1000,"column":72}},"1000":{"start":{"line":1001,"column":0},"end":{"line":1001,"column":60}},"1001":{"start":{"line":1002,"column":0},"end":{"line":1002,"column":61}},"1002":{"start":{"line":1003,"column":0},"end":{"line":1003,"column":7}},"1003":{"start":{"line":1004,"column":0},"end":{"line":1004,"column":40}},"1004":{"start":{"line":1005,"column":0},"end":{"line":1005,"column":7}},"1005":{"start":{"line":1006,"column":0},"end":{"line":1006,"column":32}},"1008":{"start":{"line":1009,"column":0},"end":{"line":1009,"column":41}},"1009":{"start":{"line":1010,"column":0},"end":{"line":1010,"column":35}},"1010":{"start":{"line":1011,"column":0},"end":{"line":1011,"column":35}},"1011":{"start":{"line":1012,"column":0},"end":{"line":1012,"column":57}},"1012":{"start":{"line":1013,"column":0},"end":{"line":1013,"column":5}},"1013":{"start":{"line":1014,"column":0},"end":{"line":1014,"column":22}},"1014":{"start":{"line":1015,"column":0},"end":{"line":1015,"column":42}},"1015":{"start":{"line":1016,"column":0},"end":{"line":1016,"column":35}},"1016":{"start":{"line":1017,"column":0},"end":{"line":1017,"column":42}},"1017":{"start":{"line":1018,"column":0},"end":{"line":1018,"column":51}},"1018":{"start":{"line":1019,"column":0},"end":{"line":1019,"column":49}},"1019":{"start":{"line":1020,"column":0},"end":{"line":1020,"column":8}},"1020":{"start":{"line":1021,"column":0},"end":{"line":1021,"column":5}},"1021":{"start":{"line":1022,"column":0},"end":{"line":1022,"column":19}},"1022":{"start":{"line":1023,"column":0},"end":{"line":1023,"column":45}},"1025":{"start":{"line":1026,"column":0},"end":{"line":1026,"column":31}},"1026":{"start":{"line":1027,"column":0},"end":{"line":1027,"column":12}},"1027":{"start":{"line":1028,"column":0},"end":{"line":1028,"column":66}},"1028":{"start":{"line":1029,"column":0},"end":{"line":1029,"column":70}},"1029":{"start":{"line":1030,"column":0},"end":{"line":1030,"column":70}},"1030":{"start":{"line":1031,"column":0},"end":{"line":1031,"column":64}},"1031":{"start":{"line":1032,"column":0},"end":{"line":1032,"column":6}},"1032":{"start":{"line":1033,"column":0},"end":{"line":1033,"column":20}},"1034":{"start":{"line":1035,"column":0},"end":{"line":1035,"column":49}},"1035":{"start":{"line":1036,"column":0},"end":{"line":1036,"column":38}},"1036":{"start":{"line":1037,"column":0},"end":{"line":1037,"column":36}},"1037":{"start":{"line":1038,"column":0},"end":{"line":1038,"column":29}},"1039":{"start":{"line":1040,"column":0},"end":{"line":1040,"column":40}},"1040":{"start":{"line":1041,"column":0},"end":{"line":1041,"column":50}},"1041":{"start":{"line":1042,"column":0},"end":{"line":1042,"column":28}},"1042":{"start":{"line":1043,"column":0},"end":{"line":1043,"column":5}},"1043":{"start":{"line":1044,"column":0},"end":{"line":1044,"column":60}},"1045":{"start":{"line":1046,"column":0},"end":{"line":1046,"column":28}},"1047":{"start":{"line":1048,"column":0},"end":{"line":1048,"column":50}},"1049":{"start":{"line":1050,"column":0},"end":{"line":1050,"column":44}},"1050":{"start":{"line":1051,"column":0},"end":{"line":1051,"column":22}},"1051":{"start":{"line":1052,"column":0},"end":{"line":1052,"column":51}},"1052":{"start":{"line":1053,"column":0},"end":{"line":1053,"column":7}},"1053":{"start":{"line":1054,"column":0},"end":{"line":1054,"column":29}},"1054":{"start":{"line":1055,"column":0},"end":{"line":1055,"column":43}},"1055":{"start":{"line":1056,"column":0},"end":{"line":1056,"column":7}},"1056":{"start":{"line":1057,"column":0},"end":{"line":1057,"column":5}},"1057":{"start":{"line":1058,"column":0},"end":{"line":1058,"column":15}},"1058":{"start":{"line":1059,"column":0},"end":{"line":1059,"column":4}},"1061":{"start":{"line":1062,"column":0},"end":{"line":1062,"column":19}},"1062":{"start":{"line":1063,"column":0},"end":{"line":1063,"column":49}},"1063":{"start":{"line":1064,"column":0},"end":{"line":1064,"column":40}},"1064":{"start":{"line":1065,"column":0},"end":{"line":1065,"column":6}},"1065":{"start":{"line":1066,"column":0},"end":{"line":1066,"column":54}},"1066":{"start":{"line":1067,"column":0},"end":{"line":1067,"column":70}},"1067":{"start":{"line":1068,"column":0},"end":{"line":1068,"column":16}},"1069":{"start":{"line":1070,"column":0},"end":{"line":1070,"column":10}},"1070":{"start":{"line":1071,"column":0},"end":{"line":1071,"column":89}},"1071":{"start":{"line":1072,"column":0},"end":{"line":1072,"column":84}},"1072":{"start":{"line":1073,"column":0},"end":{"line":1073,"column":66}},"1074":{"start":{"line":1075,"column":0},"end":{"line":1075,"column":115}},"1075":{"start":{"line":1076,"column":0},"end":{"line":1076,"column":85}},"1076":{"start":{"line":1077,"column":0},"end":{"line":1077,"column":62}},"1078":{"start":{"line":1079,"column":0},"end":{"line":1079,"column":17}},"1079":{"start":{"line":1080,"column":0},"end":{"line":1080,"column":83}},"1080":{"start":{"line":1081,"column":0},"end":{"line":1081,"column":39}},"1081":{"start":{"line":1082,"column":0},"end":{"line":1082,"column":21}},"1082":{"start":{"line":1083,"column":0},"end":{"line":1083,"column":16}},"1085":{"start":{"line":1086,"column":0},"end":{"line":1086,"column":118}},"1086":{"start":{"line":1087,"column":0},"end":{"line":1087,"column":41}},"1087":{"start":{"line":1088,"column":0},"end":{"line":1088,"column":68}},"1088":{"start":{"line":1089,"column":0},"end":{"line":1089,"column":76}},"1089":{"start":{"line":1090,"column":0},"end":{"line":1090,"column":18}},"1090":{"start":{"line":1091,"column":0},"end":{"line":1091,"column":41}},"1091":{"start":{"line":1092,"column":0},"end":{"line":1092,"column":69}},"1092":{"start":{"line":1093,"column":0},"end":{"line":1093,"column":77}},"1093":{"start":{"line":1094,"column":0},"end":{"line":1094,"column":18}},"1094":{"start":{"line":1095,"column":0},"end":{"line":1095,"column":16}},"1097":{"start":{"line":1098,"column":0},"end":{"line":1098,"column":115}},"1098":{"start":{"line":1099,"column":0},"end":{"line":1099,"column":61}},"1099":{"start":{"line":1100,"column":0},"end":{"line":1100,"column":71}},"1100":{"start":{"line":1101,"column":0},"end":{"line":1101,"column":52}},"1101":{"start":{"line":1102,"column":0},"end":{"line":1102,"column":35}},"1102":{"start":{"line":1103,"column":0},"end":{"line":1103,"column":21}},"1103":{"start":{"line":1104,"column":0},"end":{"line":1104,"column":69}},"1104":{"start":{"line":1105,"column":0},"end":{"line":1105,"column":53}},"1105":{"start":{"line":1106,"column":0},"end":{"line":1106,"column":39}},"1106":{"start":{"line":1107,"column":0},"end":{"line":1107,"column":21}},"1107":{"start":{"line":1108,"column":0},"end":{"line":1108,"column":71}},"1108":{"start":{"line":1109,"column":0},"end":{"line":1109,"column":54}},"1109":{"start":{"line":1110,"column":0},"end":{"line":1110,"column":39}},"1110":{"start":{"line":1111,"column":0},"end":{"line":1111,"column":21}},"1111":{"start":{"line":1112,"column":0},"end":{"line":1112,"column":72}},"1112":{"start":{"line":1113,"column":0},"end":{"line":1113,"column":49}},"1113":{"start":{"line":1114,"column":0},"end":{"line":1114,"column":33}},"1114":{"start":{"line":1115,"column":0},"end":{"line":1115,"column":21}},"1115":{"start":{"line":1116,"column":0},"end":{"line":1116,"column":18}},"1116":{"start":{"line":1117,"column":0},"end":{"line":1117,"column":53}},"1117":{"start":{"line":1118,"column":0},"end":{"line":1118,"column":40}},"1118":{"start":{"line":1119,"column":0},"end":{"line":1119,"column":103}},"1119":{"start":{"line":1120,"column":0},"end":{"line":1120,"column":22}},"1120":{"start":{"line":1121,"column":0},"end":{"line":1121,"column":29}},"1121":{"start":{"line":1122,"column":0},"end":{"line":1122,"column":37}},"1122":{"start":{"line":1123,"column":0},"end":{"line":1123,"column":66}},"1123":{"start":{"line":1124,"column":0},"end":{"line":1124,"column":48}},"1124":{"start":{"line":1125,"column":0},"end":{"line":1125,"column":170}},"1125":{"start":{"line":1126,"column":0},"end":{"line":1126,"column":18}},"1126":{"start":{"line":1127,"column":0},"end":{"line":1127,"column":20}},"1127":{"start":{"line":1128,"column":0},"end":{"line":1128,"column":34}},"1128":{"start":{"line":1129,"column":0},"end":{"line":1129,"column":96}},"1129":{"start":{"line":1130,"column":0},"end":{"line":1130,"column":25}},"1130":{"start":{"line":1131,"column":0},"end":{"line":1131,"column":60}},"1131":{"start":{"line":1132,"column":0},"end":{"line":1132,"column":72}},"1132":{"start":{"line":1133,"column":0},"end":{"line":1133,"column":46}},"1133":{"start":{"line":1134,"column":0},"end":{"line":1134,"column":53}},"1134":{"start":{"line":1135,"column":0},"end":{"line":1135,"column":74}},"1135":{"start":{"line":1136,"column":0},"end":{"line":1136,"column":23}},"1136":{"start":{"line":1137,"column":0},"end":{"line":1137,"column":19}},"1138":{"start":{"line":1139,"column":0},"end":{"line":1139,"column":27}},"1139":{"start":{"line":1140,"column":0},"end":{"line":1140,"column":25}},"1140":{"start":{"line":1141,"column":0},"end":{"line":1141,"column":56}},"1141":{"start":{"line":1142,"column":0},"end":{"line":1142,"column":72}},"1142":{"start":{"line":1143,"column":0},"end":{"line":1143,"column":42}},"1143":{"start":{"line":1144,"column":0},"end":{"line":1144,"column":53}},"1144":{"start":{"line":1145,"column":0},"end":{"line":1145,"column":74}},"1145":{"start":{"line":1146,"column":0},"end":{"line":1146,"column":23}},"1146":{"start":{"line":1147,"column":0},"end":{"line":1147,"column":19}},"1148":{"start":{"line":1149,"column":0},"end":{"line":1149,"column":27}},"1149":{"start":{"line":1150,"column":0},"end":{"line":1150,"column":22}},"1151":{"start":{"line":1152,"column":0},"end":{"line":1152,"column":18}},"1152":{"start":{"line":1153,"column":0},"end":{"line":1153,"column":16}},"1155":{"start":{"line":1156,"column":0},"end":{"line":1156,"column":58}},"1156":{"start":{"line":1157,"column":0},"end":{"line":1157,"column":45}},"1157":{"start":{"line":1158,"column":0},"end":{"line":1158,"column":65}},"1158":{"start":{"line":1159,"column":0},"end":{"line":1159,"column":71}},"1159":{"start":{"line":1160,"column":0},"end":{"line":1160,"column":105}},"1160":{"start":{"line":1161,"column":0},"end":{"line":1161,"column":20}},"1162":{"start":{"line":1163,"column":0},"end":{"line":1163,"column":40}},"1163":{"start":{"line":1164,"column":0},"end":{"line":1164,"column":72}},"1164":{"start":{"line":1165,"column":0},"end":{"line":1165,"column":94}},"1165":{"start":{"line":1166,"column":0},"end":{"line":1166,"column":66}},"1166":{"start":{"line":1167,"column":0},"end":{"line":1167,"column":72}},"1167":{"start":{"line":1168,"column":0},"end":{"line":1168,"column":73}},"1168":{"start":{"line":1169,"column":0},"end":{"line":1169,"column":23}},"1169":{"start":{"line":1170,"column":0},"end":{"line":1170,"column":24}},"1170":{"start":{"line":1171,"column":0},"end":{"line":1171,"column":23}},"1171":{"start":{"line":1172,"column":0},"end":{"line":1172,"column":51}},"1172":{"start":{"line":1173,"column":0},"end":{"line":1173,"column":37}},"1173":{"start":{"line":1174,"column":0},"end":{"line":1174,"column":47}},"1174":{"start":{"line":1175,"column":0},"end":{"line":1175,"column":47}},"1175":{"start":{"line":1176,"column":0},"end":{"line":1176,"column":49}},"1176":{"start":{"line":1177,"column":0},"end":{"line":1177,"column":31}},"1177":{"start":{"line":1178,"column":0},"end":{"line":1178,"column":36}},"1179":{"start":{"line":1180,"column":0},"end":{"line":1180,"column":40}},"1180":{"start":{"line":1181,"column":0},"end":{"line":1181,"column":81}},"1181":{"start":{"line":1182,"column":0},"end":{"line":1182,"column":82}},"1182":{"start":{"line":1183,"column":0},"end":{"line":1183,"column":85}},"1183":{"start":{"line":1184,"column":0},"end":{"line":1184,"column":83}},"1184":{"start":{"line":1185,"column":0},"end":{"line":1185,"column":36}},"1186":{"start":{"line":1187,"column":0},"end":{"line":1187,"column":28}},"1187":{"start":{"line":1188,"column":0},"end":{"line":1188,"column":103}},"1188":{"start":{"line":1189,"column":0},"end":{"line":1189,"column":44}},"1189":{"start":{"line":1190,"column":0},"end":{"line":1190,"column":67}},"1190":{"start":{"line":1191,"column":0},"end":{"line":1191,"column":40}},"1191":{"start":{"line":1192,"column":0},"end":{"line":1192,"column":93}},"1192":{"start":{"line":1193,"column":0},"end":{"line":1193,"column":32}},"1193":{"start":{"line":1194,"column":0},"end":{"line":1194,"column":29}},"1194":{"start":{"line":1195,"column":0},"end":{"line":1195,"column":44}},"1195":{"start":{"line":1196,"column":0},"end":{"line":1196,"column":74}},"1196":{"start":{"line":1197,"column":0},"end":{"line":1197,"column":73}},"1197":{"start":{"line":1198,"column":0},"end":{"line":1198,"column":89}},"1198":{"start":{"line":1199,"column":0},"end":{"line":1199,"column":30}},"1199":{"start":{"line":1200,"column":0},"end":{"line":1200,"column":53}},"1200":{"start":{"line":1201,"column":0},"end":{"line":1201,"column":33}},"1201":{"start":{"line":1202,"column":0},"end":{"line":1202,"column":29}},"1202":{"start":{"line":1203,"column":0},"end":{"line":1203,"column":44}},"1203":{"start":{"line":1204,"column":0},"end":{"line":1204,"column":74}},"1204":{"start":{"line":1205,"column":0},"end":{"line":1205,"column":73}},"1205":{"start":{"line":1206,"column":0},"end":{"line":1206,"column":89}},"1206":{"start":{"line":1207,"column":0},"end":{"line":1207,"column":30}},"1207":{"start":{"line":1208,"column":0},"end":{"line":1208,"column":54}},"1208":{"start":{"line":1209,"column":0},"end":{"line":1209,"column":33}},"1209":{"start":{"line":1210,"column":0},"end":{"line":1210,"column":29}},"1210":{"start":{"line":1211,"column":0},"end":{"line":1211,"column":27}},"1212":{"start":{"line":1213,"column":0},"end":{"line":1213,"column":21}},"1213":{"start":{"line":1214,"column":0},"end":{"line":1214,"column":24}},"1214":{"start":{"line":1215,"column":0},"end":{"line":1215,"column":22}},"1216":{"start":{"line":1217,"column":0},"end":{"line":1217,"column":16}},"1217":{"start":{"line":1218,"column":0},"end":{"line":1218,"column":22}},"1218":{"start":{"line":1219,"column":0},"end":{"line":1219,"column":13}},"1219":{"start":{"line":1220,"column":0},"end":{"line":1220,"column":10}},"1221":{"start":{"line":1222,"column":0},"end":{"line":1222,"column":1}},"1227":{"start":{"line":1228,"column":0},"end":{"line":1228,"column":28}},"1228":{"start":{"line":1229,"column":0},"end":{"line":1229,"column":10}},"1229":{"start":{"line":1230,"column":0},"end":{"line":1230,"column":14}},"1230":{"start":{"line":1231,"column":0},"end":{"line":1231,"column":13}},"1231":{"start":{"line":1232,"column":0},"end":{"line":1232,"column":4}},"1235":{"start":{"line":1236,"column":0},"end":{"line":1236,"column":4}},"1236":{"start":{"line":1237,"column":0},"end":{"line":1237,"column":35}},"1237":{"start":{"line":1238,"column":0},"end":{"line":1238,"column":39}},"1240":{"start":{"line":1241,"column":0},"end":{"line":1241,"column":47}},"1242":{"start":{"line":1243,"column":0},"end":{"line":1243,"column":66}},"1243":{"start":{"line":1244,"column":0},"end":{"line":1244,"column":81}},"1244":{"start":{"line":1245,"column":0},"end":{"line":1245,"column":73}},"1245":{"start":{"line":1246,"column":0},"end":{"line":1246,"column":4}},"1246":{"start":{"line":1247,"column":0},"end":{"line":1247,"column":35}},"1247":{"start":{"line":1248,"column":0},"end":{"line":1248,"column":21}},"1248":{"start":{"line":1249,"column":0},"end":{"line":1249,"column":70}},"1249":{"start":{"line":1250,"column":0},"end":{"line":1250,"column":10}},"1250":{"start":{"line":1251,"column":0},"end":{"line":1251,"column":4}},"1251":{"start":{"line":1252,"column":0},"end":{"line":1252,"column":67}},"1252":{"start":{"line":1253,"column":0},"end":{"line":1253,"column":47}},"1253":{"start":{"line":1254,"column":0},"end":{"line":1254,"column":74}},"1254":{"start":{"line":1255,"column":0},"end":{"line":1255,"column":44}},"1255":{"start":{"line":1256,"column":0},"end":{"line":1256,"column":4}},"1256":{"start":{"line":1257,"column":0},"end":{"line":1257,"column":110}},"1257":{"start":{"line":1258,"column":0},"end":{"line":1258,"column":66}},"1258":{"start":{"line":1259,"column":0},"end":{"line":1259,"column":53}},"1259":{"start":{"line":1260,"column":0},"end":{"line":1260,"column":54}},"1260":{"start":{"line":1261,"column":0},"end":{"line":1261,"column":59}},"1261":{"start":{"line":1262,"column":0},"end":{"line":1262,"column":74}},"1262":{"start":{"line":1263,"column":0},"end":{"line":1263,"column":96}},"1263":{"start":{"line":1264,"column":0},"end":{"line":1264,"column":66}},"1264":{"start":{"line":1265,"column":0},"end":{"line":1265,"column":61}},"1265":{"start":{"line":1266,"column":0},"end":{"line":1266,"column":61}},"1266":{"start":{"line":1267,"column":0},"end":{"line":1267,"column":77}},"1267":{"start":{"line":1268,"column":0},"end":{"line":1268,"column":86}},"1268":{"start":{"line":1269,"column":0},"end":{"line":1269,"column":60}},"1271":{"start":{"line":1272,"column":0},"end":{"line":1272,"column":39}},"1272":{"start":{"line":1273,"column":0},"end":{"line":1273,"column":54}},"1273":{"start":{"line":1274,"column":0},"end":{"line":1274,"column":36}},"1274":{"start":{"line":1275,"column":0},"end":{"line":1275,"column":32}},"1275":{"start":{"line":1276,"column":0},"end":{"line":1276,"column":34}},"1276":{"start":{"line":1277,"column":0},"end":{"line":1277,"column":6}},"1277":{"start":{"line":1278,"column":0},"end":{"line":1278,"column":37}},"1278":{"start":{"line":1279,"column":0},"end":{"line":1279,"column":31}},"1281":{"start":{"line":1282,"column":0},"end":{"line":1282,"column":43}},"1282":{"start":{"line":1283,"column":0},"end":{"line":1283,"column":65}},"1283":{"start":{"line":1284,"column":0},"end":{"line":1284,"column":22}},"1286":{"start":{"line":1287,"column":0},"end":{"line":1287,"column":47}},"1287":{"start":{"line":1288,"column":0},"end":{"line":1288,"column":42}},"1288":{"start":{"line":1289,"column":0},"end":{"line":1289,"column":87}},"1289":{"start":{"line":1290,"column":0},"end":{"line":1290,"column":50}},"1290":{"start":{"line":1291,"column":0},"end":{"line":1291,"column":5}},"1293":{"start":{"line":1294,"column":0},"end":{"line":1294,"column":47}},"1294":{"start":{"line":1295,"column":0},"end":{"line":1295,"column":99}},"1295":{"start":{"line":1296,"column":0},"end":{"line":1296,"column":26}},"1297":{"start":{"line":1298,"column":0},"end":{"line":1298,"column":62}},"1298":{"start":{"line":1299,"column":0},"end":{"line":1299,"column":26}},"1299":{"start":{"line":1300,"column":0},"end":{"line":1300,"column":69}},"1300":{"start":{"line":1301,"column":0},"end":{"line":1301,"column":64}},"1301":{"start":{"line":1302,"column":0},"end":{"line":1302,"column":47}},"1302":{"start":{"line":1303,"column":0},"end":{"line":1303,"column":39}},"1303":{"start":{"line":1304,"column":0},"end":{"line":1304,"column":17}},"1304":{"start":{"line":1305,"column":0},"end":{"line":1305,"column":80}},"1305":{"start":{"line":1306,"column":0},"end":{"line":1306,"column":55}},"1306":{"start":{"line":1307,"column":0},"end":{"line":1307,"column":21}},"1307":{"start":{"line":1308,"column":0},"end":{"line":1308,"column":26}},"1308":{"start":{"line":1309,"column":0},"end":{"line":1309,"column":13}},"1309":{"start":{"line":1310,"column":0},"end":{"line":1310,"column":12}},"1310":{"start":{"line":1311,"column":0},"end":{"line":1311,"column":10}},"1311":{"start":{"line":1312,"column":0},"end":{"line":1312,"column":35}},"1312":{"start":{"line":1313,"column":0},"end":{"line":1313,"column":42}},"1313":{"start":{"line":1314,"column":0},"end":{"line":1314,"column":11}},"1314":{"start":{"line":1315,"column":0},"end":{"line":1315,"column":7}},"1315":{"start":{"line":1316,"column":0},"end":{"line":1316,"column":21}},"1316":{"start":{"line":1317,"column":0},"end":{"line":1317,"column":6}},"1317":{"start":{"line":1318,"column":0},"end":{"line":1318,"column":42}},"1318":{"start":{"line":1319,"column":0},"end":{"line":1319,"column":54}},"1319":{"start":{"line":1320,"column":0},"end":{"line":1320,"column":5}},"1322":{"start":{"line":1323,"column":0},"end":{"line":1323,"column":100}},"1323":{"start":{"line":1324,"column":0},"end":{"line":1324,"column":45}},"1324":{"start":{"line":1325,"column":0},"end":{"line":1325,"column":53}},"1325":{"start":{"line":1326,"column":0},"end":{"line":1326,"column":22}},"1326":{"start":{"line":1327,"column":0},"end":{"line":1327,"column":5}},"1329":{"start":{"line":1330,"column":0},"end":{"line":1330,"column":19}},"1330":{"start":{"line":1331,"column":0},"end":{"line":1331,"column":31}},"1331":{"start":{"line":1332,"column":0},"end":{"line":1332,"column":56}},"1332":{"start":{"line":1333,"column":0},"end":{"line":1333,"column":5}},"1333":{"start":{"line":1334,"column":0},"end":{"line":1334,"column":31}},"1337":{"start":{"line":1338,"column":0},"end":{"line":1338,"column":46}},"1338":{"start":{"line":1339,"column":0},"end":{"line":1339,"column":54}},"1339":{"start":{"line":1340,"column":0},"end":{"line":1340,"column":36}},"1340":{"start":{"line":1341,"column":0},"end":{"line":1341,"column":32}},"1341":{"start":{"line":1342,"column":0},"end":{"line":1342,"column":34}},"1342":{"start":{"line":1343,"column":0},"end":{"line":1343,"column":6}},"1343":{"start":{"line":1344,"column":0},"end":{"line":1344,"column":38}},"1344":{"start":{"line":1345,"column":0},"end":{"line":1345,"column":72}},"1345":{"start":{"line":1346,"column":0},"end":{"line":1346,"column":52}},"1346":{"start":{"line":1347,"column":0},"end":{"line":1347,"column":31}},"1350":{"start":{"line":1351,"column":0},"end":{"line":1351,"column":19}},"1351":{"start":{"line":1352,"column":0},"end":{"line":1352,"column":24}},"1353":{"start":{"line":1354,"column":0},"end":{"line":1354,"column":75}},"1354":{"start":{"line":1355,"column":0},"end":{"line":1355,"column":17}},"1355":{"start":{"line":1356,"column":0},"end":{"line":1356,"column":31}},"1357":{"start":{"line":1358,"column":0},"end":{"line":1358,"column":24}},"1358":{"start":{"line":1359,"column":0},"end":{"line":1359,"column":50}},"1359":{"start":{"line":1360,"column":0},"end":{"line":1360,"column":72}},"1360":{"start":{"line":1361,"column":0},"end":{"line":1361,"column":7}},"1361":{"start":{"line":1362,"column":0},"end":{"line":1362,"column":5}},"1362":{"start":{"line":1363,"column":0},"end":{"line":1363,"column":49}},"1365":{"start":{"line":1366,"column":0},"end":{"line":1366,"column":39}},"1367":{"start":{"line":1368,"column":0},"end":{"line":1368,"column":74}},"1368":{"start":{"line":1369,"column":0},"end":{"line":1369,"column":61}},"1371":{"start":{"line":1372,"column":0},"end":{"line":1372,"column":45}},"1372":{"start":{"line":1373,"column":0},"end":{"line":1373,"column":106}},"1375":{"start":{"line":1376,"column":0},"end":{"line":1376,"column":27}},"1376":{"start":{"line":1377,"column":0},"end":{"line":1377,"column":57}},"1377":{"start":{"line":1378,"column":0},"end":{"line":1378,"column":30}},"1378":{"start":{"line":1379,"column":0},"end":{"line":1379,"column":54}},"1379":{"start":{"line":1380,"column":0},"end":{"line":1380,"column":65}},"1380":{"start":{"line":1381,"column":0},"end":{"line":1381,"column":38}},"1381":{"start":{"line":1382,"column":0},"end":{"line":1382,"column":13}},"1382":{"start":{"line":1383,"column":0},"end":{"line":1383,"column":13}},"1383":{"start":{"line":1384,"column":0},"end":{"line":1384,"column":9}},"1384":{"start":{"line":1385,"column":0},"end":{"line":1385,"column":9}},"1385":{"start":{"line":1386,"column":0},"end":{"line":1386,"column":5}},"1388":{"start":{"line":1389,"column":0},"end":{"line":1389,"column":45}},"1389":{"start":{"line":1390,"column":0},"end":{"line":1390,"column":59}},"1390":{"start":{"line":1391,"column":0},"end":{"line":1391,"column":32}},"1391":{"start":{"line":1392,"column":0},"end":{"line":1392,"column":7}},"1392":{"start":{"line":1393,"column":0},"end":{"line":1393,"column":7}},"1395":{"start":{"line":1396,"column":0},"end":{"line":1396,"column":74}},"1396":{"start":{"line":1397,"column":0},"end":{"line":1397,"column":13}},"1397":{"start":{"line":1398,"column":0},"end":{"line":1398,"column":20}},"1398":{"start":{"line":1399,"column":0},"end":{"line":1399,"column":12}},"1399":{"start":{"line":1400,"column":0},"end":{"line":1400,"column":77}},"1400":{"start":{"line":1401,"column":0},"end":{"line":1401,"column":30}},"1401":{"start":{"line":1402,"column":0},"end":{"line":1402,"column":31}},"1402":{"start":{"line":1403,"column":0},"end":{"line":1403,"column":47}},"1403":{"start":{"line":1404,"column":0},"end":{"line":1404,"column":10}},"1405":{"start":{"line":1406,"column":0},"end":{"line":1406,"column":49}},"1406":{"start":{"line":1407,"column":0},"end":{"line":1407,"column":56}},"1409":{"start":{"line":1410,"column":0},"end":{"line":1410,"column":50}},"1410":{"start":{"line":1411,"column":0},"end":{"line":1411,"column":64}},"1411":{"start":{"line":1412,"column":0},"end":{"line":1412,"column":59}},"1412":{"start":{"line":1413,"column":0},"end":{"line":1413,"column":4}},"1415":{"start":{"line":1416,"column":0},"end":{"line":1416,"column":32}},"1416":{"start":{"line":1417,"column":0},"end":{"line":1417,"column":32}},"1417":{"start":{"line":1418,"column":0},"end":{"line":1418,"column":75}},"1418":{"start":{"line":1419,"column":0},"end":{"line":1419,"column":27}},"1419":{"start":{"line":1420,"column":0},"end":{"line":1420,"column":28}},"1420":{"start":{"line":1421,"column":0},"end":{"line":1421,"column":37}},"1421":{"start":{"line":1422,"column":0},"end":{"line":1422,"column":40}},"1422":{"start":{"line":1423,"column":0},"end":{"line":1423,"column":5}},"1423":{"start":{"line":1424,"column":0},"end":{"line":1424,"column":4}},"1426":{"start":{"line":1427,"column":0},"end":{"line":1427,"column":56}},"1427":{"start":{"line":1428,"column":0},"end":{"line":1428,"column":28}},"1428":{"start":{"line":1429,"column":0},"end":{"line":1429,"column":33}},"1429":{"start":{"line":1430,"column":0},"end":{"line":1430,"column":48}},"1430":{"start":{"line":1431,"column":0},"end":{"line":1431,"column":27}},"1431":{"start":{"line":1432,"column":0},"end":{"line":1432,"column":14}},"1432":{"start":{"line":1433,"column":0},"end":{"line":1433,"column":28}},"1433":{"start":{"line":1434,"column":0},"end":{"line":1434,"column":7}},"1434":{"start":{"line":1435,"column":0},"end":{"line":1435,"column":20}},"1435":{"start":{"line":1436,"column":0},"end":{"line":1436,"column":7}},"1436":{"start":{"line":1437,"column":0},"end":{"line":1437,"column":4}},"1439":{"start":{"line":1440,"column":0},"end":{"line":1440,"column":92}},"1440":{"start":{"line":1441,"column":0},"end":{"line":1441,"column":64}},"1441":{"start":{"line":1442,"column":0},"end":{"line":1442,"column":42}},"1442":{"start":{"line":1443,"column":0},"end":{"line":1443,"column":34}},"1443":{"start":{"line":1444,"column":0},"end":{"line":1444,"column":4}},"1446":{"start":{"line":1447,"column":0},"end":{"line":1447,"column":32}},"1447":{"start":{"line":1448,"column":0},"end":{"line":1448,"column":40}},"1448":{"start":{"line":1449,"column":0},"end":{"line":1449,"column":41}},"1449":{"start":{"line":1450,"column":0},"end":{"line":1450,"column":30}},"1450":{"start":{"line":1451,"column":0},"end":{"line":1451,"column":46}},"1451":{"start":{"line":1452,"column":0},"end":{"line":1452,"column":49}},"1452":{"start":{"line":1453,"column":0},"end":{"line":1453,"column":13}},"1453":{"start":{"line":1454,"column":0},"end":{"line":1454,"column":5}},"1454":{"start":{"line":1455,"column":0},"end":{"line":1455,"column":41}},"1455":{"start":{"line":1456,"column":0},"end":{"line":1456,"column":32}},"1456":{"start":{"line":1457,"column":0},"end":{"line":1457,"column":35}},"1457":{"start":{"line":1458,"column":0},"end":{"line":1458,"column":63}},"1458":{"start":{"line":1459,"column":0},"end":{"line":1459,"column":23}},"1459":{"start":{"line":1460,"column":0},"end":{"line":1460,"column":26}},"1460":{"start":{"line":1461,"column":0},"end":{"line":1461,"column":42}},"1461":{"start":{"line":1462,"column":0},"end":{"line":1462,"column":6}},"1462":{"start":{"line":1463,"column":0},"end":{"line":1463,"column":54}},"1463":{"start":{"line":1464,"column":0},"end":{"line":1464,"column":32}},"1464":{"start":{"line":1465,"column":0},"end":{"line":1465,"column":33}},"1465":{"start":{"line":1466,"column":0},"end":{"line":1466,"column":31}},"1466":{"start":{"line":1467,"column":0},"end":{"line":1467,"column":27}},"1467":{"start":{"line":1468,"column":0},"end":{"line":1468,"column":27}},"1468":{"start":{"line":1469,"column":0},"end":{"line":1469,"column":36}},"1469":{"start":{"line":1470,"column":0},"end":{"line":1470,"column":32}},"1470":{"start":{"line":1471,"column":0},"end":{"line":1471,"column":4}},"1473":{"start":{"line":1474,"column":0},"end":{"line":1474,"column":42}},"1474":{"start":{"line":1475,"column":0},"end":{"line":1475,"column":79}},"1475":{"start":{"line":1476,"column":0},"end":{"line":1476,"column":36}},"1478":{"start":{"line":1479,"column":0},"end":{"line":1479,"column":46}},"1479":{"start":{"line":1480,"column":0},"end":{"line":1480,"column":22}},"1480":{"start":{"line":1481,"column":0},"end":{"line":1481,"column":9}},"1481":{"start":{"line":1482,"column":0},"end":{"line":1482,"column":38}},"1482":{"start":{"line":1483,"column":0},"end":{"line":1483,"column":29}},"1483":{"start":{"line":1484,"column":0},"end":{"line":1484,"column":25}},"1484":{"start":{"line":1485,"column":0},"end":{"line":1485,"column":17}},"1485":{"start":{"line":1486,"column":0},"end":{"line":1486,"column":41}},"1486":{"start":{"line":1487,"column":0},"end":{"line":1487,"column":5}},"1487":{"start":{"line":1488,"column":0},"end":{"line":1488,"column":4}},"1490":{"start":{"line":1491,"column":0},"end":{"line":1491,"column":50}},"1491":{"start":{"line":1492,"column":0},"end":{"line":1492,"column":23}},"1492":{"start":{"line":1493,"column":0},"end":{"line":1493,"column":25}},"1493":{"start":{"line":1494,"column":0},"end":{"line":1494,"column":41}},"1494":{"start":{"line":1495,"column":0},"end":{"line":1495,"column":46}},"1495":{"start":{"line":1496,"column":0},"end":{"line":1496,"column":38}},"1496":{"start":{"line":1497,"column":0},"end":{"line":1497,"column":34}},"1497":{"start":{"line":1498,"column":0},"end":{"line":1498,"column":13}},"1498":{"start":{"line":1499,"column":0},"end":{"line":1499,"column":57}},"1499":{"start":{"line":1500,"column":0},"end":{"line":1500,"column":45}},"1501":{"start":{"line":1502,"column":0},"end":{"line":1502,"column":52}},"1502":{"start":{"line":1503,"column":0},"end":{"line":1503,"column":61}},"1503":{"start":{"line":1504,"column":0},"end":{"line":1504,"column":80}},"1504":{"start":{"line":1505,"column":0},"end":{"line":1505,"column":50}},"1505":{"start":{"line":1506,"column":0},"end":{"line":1506,"column":17}},"1506":{"start":{"line":1507,"column":0},"end":{"line":1507,"column":50}},"1507":{"start":{"line":1508,"column":0},"end":{"line":1508,"column":9}},"1508":{"start":{"line":1509,"column":0},"end":{"line":1509,"column":8}},"1509":{"start":{"line":1510,"column":0},"end":{"line":1510,"column":30}},"1510":{"start":{"line":1511,"column":0},"end":{"line":1511,"column":5}},"1511":{"start":{"line":1512,"column":0},"end":{"line":1512,"column":4}},"1513":{"start":{"line":1514,"column":0},"end":{"line":1514,"column":38}},"1514":{"start":{"line":1515,"column":0},"end":{"line":1515,"column":23}},"1515":{"start":{"line":1516,"column":0},"end":{"line":1516,"column":47}},"1516":{"start":{"line":1517,"column":0},"end":{"line":1517,"column":78}},"1517":{"start":{"line":1518,"column":0},"end":{"line":1518,"column":79}},"1518":{"start":{"line":1519,"column":0},"end":{"line":1519,"column":49}},"1520":{"start":{"line":1521,"column":0},"end":{"line":1521,"column":108}},"1521":{"start":{"line":1522,"column":0},"end":{"line":1522,"column":42}},"1522":{"start":{"line":1523,"column":0},"end":{"line":1523,"column":6}},"1523":{"start":{"line":1524,"column":0},"end":{"line":1524,"column":28}},"1524":{"start":{"line":1525,"column":0},"end":{"line":1525,"column":47}},"1526":{"start":{"line":1527,"column":0},"end":{"line":1527,"column":72}},"1527":{"start":{"line":1528,"column":0},"end":{"line":1528,"column":16}},"1528":{"start":{"line":1529,"column":0},"end":{"line":1529,"column":6}},"1529":{"start":{"line":1530,"column":0},"end":{"line":1530,"column":65}},"1530":{"start":{"line":1531,"column":0},"end":{"line":1531,"column":5}},"1532":{"start":{"line":1533,"column":0},"end":{"line":1533,"column":38}},"1533":{"start":{"line":1534,"column":0},"end":{"line":1534,"column":23}},"1534":{"start":{"line":1535,"column":0},"end":{"line":1535,"column":80}},"1535":{"start":{"line":1536,"column":0},"end":{"line":1536,"column":92}},"1536":{"start":{"line":1537,"column":0},"end":{"line":1537,"column":6}},"1537":{"start":{"line":1538,"column":0},"end":{"line":1538,"column":28}},"1538":{"start":{"line":1539,"column":0},"end":{"line":1539,"column":47}},"1540":{"start":{"line":1541,"column":0},"end":{"line":1541,"column":70}},"1542":{"start":{"line":1543,"column":0},"end":{"line":1543,"column":72}},"1543":{"start":{"line":1544,"column":0},"end":{"line":1544,"column":16}},"1544":{"start":{"line":1545,"column":0},"end":{"line":1545,"column":6}},"1545":{"start":{"line":1546,"column":0},"end":{"line":1546,"column":65}},"1546":{"start":{"line":1547,"column":0},"end":{"line":1547,"column":5}},"1548":{"start":{"line":1549,"column":0},"end":{"line":1549,"column":68}},"1551":{"start":{"line":1552,"column":0},"end":{"line":1552,"column":88}},"1552":{"start":{"line":1553,"column":0},"end":{"line":1553,"column":45}},"1553":{"start":{"line":1554,"column":0},"end":{"line":1554,"column":68}},"1554":{"start":{"line":1555,"column":0},"end":{"line":1555,"column":16}},"1557":{"start":{"line":1558,"column":0},"end":{"line":1558,"column":73}},"1558":{"start":{"line":1559,"column":0},"end":{"line":1559,"column":66}},"1559":{"start":{"line":1560,"column":0},"end":{"line":1560,"column":74}},"1560":{"start":{"line":1561,"column":0},"end":{"line":1561,"column":43}},"1561":{"start":{"line":1562,"column":0},"end":{"line":1562,"column":5}},"1564":{"start":{"line":1565,"column":0},"end":{"line":1565,"column":42}},"1566":{"start":{"line":1567,"column":0},"end":{"line":1567,"column":92}},"1569":{"start":{"line":1570,"column":0},"end":{"line":1570,"column":86}},"1572":{"start":{"line":1573,"column":0},"end":{"line":1573,"column":72}},"1573":{"start":{"line":1574,"column":0},"end":{"line":1574,"column":67}},"1574":{"start":{"line":1575,"column":0},"end":{"line":1575,"column":11}},"1578":{"start":{"line":1579,"column":0},"end":{"line":1579,"column":12}},"1579":{"start":{"line":1580,"column":0},"end":{"line":1580,"column":25}},"1580":{"start":{"line":1581,"column":0},"end":{"line":1581,"column":24}},"1581":{"start":{"line":1582,"column":0},"end":{"line":1582,"column":24}},"1582":{"start":{"line":1583,"column":0},"end":{"line":1583,"column":6}},"1583":{"start":{"line":1584,"column":0},"end":{"line":1584,"column":74}},"1586":{"start":{"line":1587,"column":0},"end":{"line":1587,"column":49}},"1587":{"start":{"line":1588,"column":0},"end":{"line":1588,"column":53}},"1588":{"start":{"line":1589,"column":0},"end":{"line":1589,"column":29}},"1590":{"start":{"line":1591,"column":0},"end":{"line":1591,"column":59}},"1591":{"start":{"line":1592,"column":0},"end":{"line":1592,"column":62}},"1592":{"start":{"line":1593,"column":0},"end":{"line":1593,"column":5}},"1593":{"start":{"line":1594,"column":0},"end":{"line":1594,"column":23}},"1594":{"start":{"line":1595,"column":0},"end":{"line":1595,"column":4}},"1597":{"start":{"line":1598,"column":0},"end":{"line":1598,"column":56}},"1598":{"start":{"line":1599,"column":0},"end":{"line":1599,"column":82}},"1599":{"start":{"line":1600,"column":0},"end":{"line":1600,"column":50}},"1600":{"start":{"line":1601,"column":0},"end":{"line":1601,"column":54}},"1602":{"start":{"line":1603,"column":0},"end":{"line":1603,"column":43}},"1603":{"start":{"line":1604,"column":0},"end":{"line":1604,"column":20}},"1604":{"start":{"line":1605,"column":0},"end":{"line":1605,"column":35}},"1605":{"start":{"line":1606,"column":0},"end":{"line":1606,"column":162}},"1607":{"start":{"line":1608,"column":0},"end":{"line":1608,"column":35}},"1608":{"start":{"line":1609,"column":0},"end":{"line":1609,"column":79}},"1609":{"start":{"line":1610,"column":0},"end":{"line":1610,"column":14}},"1610":{"start":{"line":1611,"column":0},"end":{"line":1611,"column":15}},"1611":{"start":{"line":1612,"column":0},"end":{"line":1612,"column":23}},"1612":{"start":{"line":1613,"column":0},"end":{"line":1613,"column":75}},"1613":{"start":{"line":1614,"column":0},"end":{"line":1614,"column":116}},"1615":{"start":{"line":1616,"column":0},"end":{"line":1616,"column":137}},"1616":{"start":{"line":1617,"column":0},"end":{"line":1617,"column":17}},"1618":{"start":{"line":1619,"column":0},"end":{"line":1619,"column":5}},"1620":{"start":{"line":1621,"column":0},"end":{"line":1621,"column":34}},"1621":{"start":{"line":1622,"column":0},"end":{"line":1622,"column":14}},"1622":{"start":{"line":1623,"column":0},"end":{"line":1623,"column":15}},"1623":{"start":{"line":1624,"column":0},"end":{"line":1624,"column":41}},"1624":{"start":{"line":1625,"column":0},"end":{"line":1625,"column":66}},"1625":{"start":{"line":1626,"column":0},"end":{"line":1626,"column":31}},"1627":{"start":{"line":1628,"column":0},"end":{"line":1628,"column":49}},"1628":{"start":{"line":1629,"column":0},"end":{"line":1629,"column":38}},"1629":{"start":{"line":1630,"column":0},"end":{"line":1630,"column":74}},"1630":{"start":{"line":1631,"column":0},"end":{"line":1631,"column":13}},"1631":{"start":{"line":1632,"column":0},"end":{"line":1632,"column":17}},"1633":{"start":{"line":1634,"column":0},"end":{"line":1634,"column":5}},"1635":{"start":{"line":1636,"column":0},"end":{"line":1636,"column":12}},"1636":{"start":{"line":1637,"column":0},"end":{"line":1637,"column":47}},"1637":{"start":{"line":1638,"column":0},"end":{"line":1638,"column":14}},"1638":{"start":{"line":1639,"column":0},"end":{"line":1639,"column":60}},"1639":{"start":{"line":1640,"column":0},"end":{"line":1640,"column":58}},"1640":{"start":{"line":1641,"column":0},"end":{"line":1641,"column":66}},"1641":{"start":{"line":1642,"column":0},"end":{"line":1642,"column":27}},"1642":{"start":{"line":1643,"column":0},"end":{"line":1643,"column":25}},"1643":{"start":{"line":1644,"column":0},"end":{"line":1644,"column":25}},"1644":{"start":{"line":1645,"column":0},"end":{"line":1645,"column":35}},"1645":{"start":{"line":1646,"column":0},"end":{"line":1646,"column":31}},"1646":{"start":{"line":1647,"column":0},"end":{"line":1647,"column":10}},"1647":{"start":{"line":1648,"column":0},"end":{"line":1648,"column":103}},"1648":{"start":{"line":1649,"column":0},"end":{"line":1649,"column":12}},"1650":{"start":{"line":1651,"column":0},"end":{"line":1651,"column":4}},"1653":{"start":{"line":1654,"column":0},"end":{"line":1654,"column":44}},"1654":{"start":{"line":1655,"column":0},"end":{"line":1655,"column":46}},"1655":{"start":{"line":1656,"column":0},"end":{"line":1656,"column":63}},"1656":{"start":{"line":1657,"column":0},"end":{"line":1657,"column":25}},"1658":{"start":{"line":1659,"column":0},"end":{"line":1659,"column":10}},"1659":{"start":{"line":1660,"column":0},"end":{"line":1660,"column":8}},"1660":{"start":{"line":1661,"column":0},"end":{"line":1661,"column":85}},"1661":{"start":{"line":1662,"column":0},"end":{"line":1662,"column":70}},"1662":{"start":{"line":1663,"column":0},"end":{"line":1663,"column":46}},"1663":{"start":{"line":1664,"column":0},"end":{"line":1664,"column":29}},"1666":{"start":{"line":1667,"column":0},"end":{"line":1667,"column":35}},"1667":{"start":{"line":1668,"column":0},"end":{"line":1668,"column":18}},"1668":{"start":{"line":1669,"column":0},"end":{"line":1669,"column":49}},"1669":{"start":{"line":1670,"column":0},"end":{"line":1670,"column":41}},"1670":{"start":{"line":1671,"column":0},"end":{"line":1671,"column":35}},"1671":{"start":{"line":1672,"column":0},"end":{"line":1672,"column":51}},"1672":{"start":{"line":1673,"column":0},"end":{"line":1673,"column":57}},"1673":{"start":{"line":1674,"column":0},"end":{"line":1674,"column":10}},"1676":{"start":{"line":1677,"column":0},"end":{"line":1677,"column":68}},"1677":{"start":{"line":1678,"column":0},"end":{"line":1678,"column":58}},"1679":{"start":{"line":1680,"column":0},"end":{"line":1680,"column":101}},"1680":{"start":{"line":1681,"column":0},"end":{"line":1681,"column":17}},"1681":{"start":{"line":1682,"column":0},"end":{"line":1682,"column":63}},"1682":{"start":{"line":1683,"column":0},"end":{"line":1683,"column":103}},"1683":{"start":{"line":1684,"column":0},"end":{"line":1684,"column":19}},"1684":{"start":{"line":1685,"column":0},"end":{"line":1685,"column":58}},"1686":{"start":{"line":1687,"column":0},"end":{"line":1687,"column":18}},"1687":{"start":{"line":1688,"column":0},"end":{"line":1688,"column":18}},"1688":{"start":{"line":1689,"column":0},"end":{"line":1689,"column":53}},"1689":{"start":{"line":1690,"column":0},"end":{"line":1690,"column":26}},"1690":{"start":{"line":1691,"column":0},"end":{"line":1691,"column":23}},"1691":{"start":{"line":1692,"column":0},"end":{"line":1692,"column":56}},"1692":{"start":{"line":1693,"column":0},"end":{"line":1693,"column":162}},"1693":{"start":{"line":1694,"column":0},"end":{"line":1694,"column":50}},"1695":{"start":{"line":1696,"column":0},"end":{"line":1696,"column":52}},"1697":{"start":{"line":1698,"column":0},"end":{"line":1698,"column":25}},"1699":{"start":{"line":1700,"column":0},"end":{"line":1700,"column":147}},"1700":{"start":{"line":1701,"column":0},"end":{"line":1701,"column":41}},"1701":{"start":{"line":1702,"column":0},"end":{"line":1702,"column":23}},"1702":{"start":{"line":1703,"column":0},"end":{"line":1703,"column":18}},"1703":{"start":{"line":1704,"column":0},"end":{"line":1704,"column":16}},"1706":{"start":{"line":1707,"column":0},"end":{"line":1707,"column":26}},"1707":{"start":{"line":1708,"column":0},"end":{"line":1708,"column":155}},"1708":{"start":{"line":1709,"column":0},"end":{"line":1709,"column":43}},"1709":{"start":{"line":1710,"column":0},"end":{"line":1710,"column":78}},"1710":{"start":{"line":1711,"column":0},"end":{"line":1711,"column":88}},"1711":{"start":{"line":1712,"column":0},"end":{"line":1712,"column":20}},"1712":{"start":{"line":1713,"column":0},"end":{"line":1713,"column":18}},"1716":{"start":{"line":1717,"column":0},"end":{"line":1717,"column":77}},"1717":{"start":{"line":1718,"column":0},"end":{"line":1718,"column":52}},"1718":{"start":{"line":1719,"column":0},"end":{"line":1719,"column":19}},"1719":{"start":{"line":1720,"column":0},"end":{"line":1720,"column":82}},"1720":{"start":{"line":1721,"column":0},"end":{"line":1721,"column":23}},"1721":{"start":{"line":1722,"column":0},"end":{"line":1722,"column":36}},"1722":{"start":{"line":1723,"column":0},"end":{"line":1723,"column":121}},"1723":{"start":{"line":1724,"column":0},"end":{"line":1724,"column":160}},"1725":{"start":{"line":1726,"column":0},"end":{"line":1726,"column":60}},"1726":{"start":{"line":1727,"column":0},"end":{"line":1727,"column":56}},"1727":{"start":{"line":1728,"column":0},"end":{"line":1728,"column":58}},"1728":{"start":{"line":1729,"column":0},"end":{"line":1729,"column":25}},"1729":{"start":{"line":1730,"column":0},"end":{"line":1730,"column":20}},"1730":{"start":{"line":1731,"column":0},"end":{"line":1731,"column":19}},"1731":{"start":{"line":1732,"column":0},"end":{"line":1732,"column":89}},"1732":{"start":{"line":1733,"column":0},"end":{"line":1733,"column":23}},"1733":{"start":{"line":1734,"column":0},"end":{"line":1734,"column":32}},"1734":{"start":{"line":1735,"column":0},"end":{"line":1735,"column":61}},"1735":{"start":{"line":1736,"column":0},"end":{"line":1736,"column":168}},"1737":{"start":{"line":1738,"column":0},"end":{"line":1738,"column":65}},"1738":{"start":{"line":1739,"column":0},"end":{"line":1739,"column":57}},"1739":{"start":{"line":1740,"column":0},"end":{"line":1740,"column":100}},"1740":{"start":{"line":1741,"column":0},"end":{"line":1741,"column":21}},"1741":{"start":{"line":1742,"column":0},"end":{"line":1742,"column":25}},"1742":{"start":{"line":1743,"column":0},"end":{"line":1743,"column":20}},"1743":{"start":{"line":1744,"column":0},"end":{"line":1744,"column":19}},"1744":{"start":{"line":1745,"column":0},"end":{"line":1745,"column":89}},"1745":{"start":{"line":1746,"column":0},"end":{"line":1746,"column":22}},"1746":{"start":{"line":1747,"column":0},"end":{"line":1747,"column":29}},"1747":{"start":{"line":1748,"column":0},"end":{"line":1748,"column":30}},"1748":{"start":{"line":1749,"column":0},"end":{"line":1749,"column":59}},"1749":{"start":{"line":1750,"column":0},"end":{"line":1750,"column":160}},"1750":{"start":{"line":1751,"column":0},"end":{"line":1751,"column":48}},"1751":{"start":{"line":1752,"column":0},"end":{"line":1752,"column":18}},"1752":{"start":{"line":1753,"column":0},"end":{"line":1753,"column":20}},"1753":{"start":{"line":1754,"column":0},"end":{"line":1754,"column":18}},"1754":{"start":{"line":1755,"column":0},"end":{"line":1755,"column":26}},"1755":{"start":{"line":1756,"column":0},"end":{"line":1756,"column":55}},"1756":{"start":{"line":1757,"column":0},"end":{"line":1757,"column":55}},"1757":{"start":{"line":1758,"column":0},"end":{"line":1758,"column":64}},"1758":{"start":{"line":1759,"column":0},"end":{"line":1759,"column":79}},"1759":{"start":{"line":1760,"column":0},"end":{"line":1760,"column":43}},"1760":{"start":{"line":1761,"column":0},"end":{"line":1761,"column":69}},"1762":{"start":{"line":1763,"column":0},"end":{"line":1763,"column":20}},"1763":{"start":{"line":1764,"column":0},"end":{"line":1764,"column":20}},"1765":{"start":{"line":1766,"column":0},"end":{"line":1766,"column":16}},"1768":{"start":{"line":1769,"column":0},"end":{"line":1769,"column":68}},"1769":{"start":{"line":1770,"column":0},"end":{"line":1770,"column":19}},"1770":{"start":{"line":1771,"column":0},"end":{"line":1771,"column":52}},"1771":{"start":{"line":1772,"column":0},"end":{"line":1772,"column":118}},"1772":{"start":{"line":1773,"column":0},"end":{"line":1773,"column":134}},"1773":{"start":{"line":1774,"column":0},"end":{"line":1774,"column":17}},"1775":{"start":{"line":1776,"column":0},"end":{"line":1776,"column":45}},"1777":{"start":{"line":1778,"column":0},"end":{"line":1778,"column":21}},"1778":{"start":{"line":1779,"column":0},"end":{"line":1779,"column":19}},"1779":{"start":{"line":1780,"column":0},"end":{"line":1780,"column":52}},"1780":{"start":{"line":1781,"column":0},"end":{"line":1781,"column":118}},"1781":{"start":{"line":1782,"column":0},"end":{"line":1782,"column":134}},"1782":{"start":{"line":1783,"column":0},"end":{"line":1783,"column":17}},"1784":{"start":{"line":1785,"column":0},"end":{"line":1785,"column":42}},"1786":{"start":{"line":1787,"column":0},"end":{"line":1787,"column":21}},"1787":{"start":{"line":1788,"column":0},"end":{"line":1788,"column":19}},"1788":{"start":{"line":1789,"column":0},"end":{"line":1789,"column":50}},"1789":{"start":{"line":1790,"column":0},"end":{"line":1790,"column":118}},"1790":{"start":{"line":1791,"column":0},"end":{"line":1791,"column":132}},"1791":{"start":{"line":1792,"column":0},"end":{"line":1792,"column":17}},"1793":{"start":{"line":1794,"column":0},"end":{"line":1794,"column":42}},"1795":{"start":{"line":1796,"column":0},"end":{"line":1796,"column":77}},"1796":{"start":{"line":1797,"column":0},"end":{"line":1797,"column":21}},"1797":{"start":{"line":1798,"column":0},"end":{"line":1798,"column":38}},"1798":{"start":{"line":1799,"column":0},"end":{"line":1799,"column":19}},"1799":{"start":{"line":1800,"column":0},"end":{"line":1800,"column":30}},"1800":{"start":{"line":1801,"column":0},"end":{"line":1801,"column":36}},"1801":{"start":{"line":1802,"column":0},"end":{"line":1802,"column":23}},"1802":{"start":{"line":1803,"column":0},"end":{"line":1803,"column":35}},"1803":{"start":{"line":1804,"column":0},"end":{"line":1804,"column":34}},"1804":{"start":{"line":1805,"column":0},"end":{"line":1805,"column":39}},"1805":{"start":{"line":1806,"column":0},"end":{"line":1806,"column":18}},"1806":{"start":{"line":1807,"column":0},"end":{"line":1807,"column":107}},"1807":{"start":{"line":1808,"column":0},"end":{"line":1808,"column":54}},"1808":{"start":{"line":1809,"column":0},"end":{"line":1809,"column":54}},"1809":{"start":{"line":1810,"column":0},"end":{"line":1810,"column":29}},"1810":{"start":{"line":1811,"column":0},"end":{"line":1811,"column":56}},"1811":{"start":{"line":1812,"column":0},"end":{"line":1812,"column":45}},"1812":{"start":{"line":1813,"column":0},"end":{"line":1813,"column":26}},"1813":{"start":{"line":1814,"column":0},"end":{"line":1814,"column":45}},"1814":{"start":{"line":1815,"column":0},"end":{"line":1815,"column":41}},"1815":{"start":{"line":1816,"column":0},"end":{"line":1816,"column":45}},"1816":{"start":{"line":1817,"column":0},"end":{"line":1817,"column":16}},"1817":{"start":{"line":1818,"column":0},"end":{"line":1818,"column":118}},"1818":{"start":{"line":1819,"column":0},"end":{"line":1819,"column":58}},"1820":{"start":{"line":1821,"column":0},"end":{"line":1821,"column":46}},"1822":{"start":{"line":1823,"column":0},"end":{"line":1823,"column":21}},"1823":{"start":{"line":1824,"column":0},"end":{"line":1824,"column":19}},"1824":{"start":{"line":1825,"column":0},"end":{"line":1825,"column":77}},"1825":{"start":{"line":1826,"column":0},"end":{"line":1826,"column":118}},"1826":{"start":{"line":1827,"column":0},"end":{"line":1827,"column":52}},"1828":{"start":{"line":1829,"column":0},"end":{"line":1829,"column":44}},"1830":{"start":{"line":1831,"column":0},"end":{"line":1831,"column":21}},"1831":{"start":{"line":1832,"column":0},"end":{"line":1832,"column":18}},"1832":{"start":{"line":1833,"column":0},"end":{"line":1833,"column":30}},"1833":{"start":{"line":1834,"column":0},"end":{"line":1834,"column":25}},"1834":{"start":{"line":1835,"column":0},"end":{"line":1835,"column":28}},"1835":{"start":{"line":1836,"column":0},"end":{"line":1836,"column":32}},"1836":{"start":{"line":1837,"column":0},"end":{"line":1837,"column":32}},"1837":{"start":{"line":1838,"column":0},"end":{"line":1838,"column":49}},"1838":{"start":{"line":1839,"column":0},"end":{"line":1839,"column":27}},"1839":{"start":{"line":1840,"column":0},"end":{"line":1840,"column":50}},"1840":{"start":{"line":1841,"column":0},"end":{"line":1841,"column":46}},"1841":{"start":{"line":1842,"column":0},"end":{"line":1842,"column":25}},"1842":{"start":{"line":1843,"column":0},"end":{"line":1843,"column":80}},"1843":{"start":{"line":1844,"column":0},"end":{"line":1844,"column":64}},"1844":{"start":{"line":1845,"column":0},"end":{"line":1845,"column":73}},"1845":{"start":{"line":1846,"column":0},"end":{"line":1846,"column":49}},"1846":{"start":{"line":1847,"column":0},"end":{"line":1847,"column":29}},"1847":{"start":{"line":1848,"column":0},"end":{"line":1848,"column":57}},"1848":{"start":{"line":1849,"column":0},"end":{"line":1849,"column":21}},"1849":{"start":{"line":1850,"column":0},"end":{"line":1850,"column":20}},"1850":{"start":{"line":1851,"column":0},"end":{"line":1851,"column":42}},"1851":{"start":{"line":1852,"column":0},"end":{"line":1852,"column":17}},"1852":{"start":{"line":1853,"column":0},"end":{"line":1853,"column":16}},"1853":{"start":{"line":1854,"column":0},"end":{"line":1854,"column":14}},"1854":{"start":{"line":1855,"column":0},"end":{"line":1855,"column":16}},"1857":{"start":{"line":1858,"column":0},"end":{"line":1858,"column":54}},"1858":{"start":{"line":1859,"column":0},"end":{"line":1859,"column":40}},"1859":{"start":{"line":1860,"column":0},"end":{"line":1860,"column":41}},"1861":{"start":{"line":1862,"column":0},"end":{"line":1862,"column":21}},"1862":{"start":{"line":1863,"column":0},"end":{"line":1863,"column":74}},"1863":{"start":{"line":1864,"column":0},"end":{"line":1864,"column":91}},"1864":{"start":{"line":1865,"column":0},"end":{"line":1865,"column":69}},"1866":{"start":{"line":1867,"column":0},"end":{"line":1867,"column":25}},"1867":{"start":{"line":1868,"column":0},"end":{"line":1868,"column":91}},"1868":{"start":{"line":1869,"column":0},"end":{"line":1869,"column":29}},"1869":{"start":{"line":1870,"column":0},"end":{"line":1870,"column":78}},"1870":{"start":{"line":1871,"column":0},"end":{"line":1871,"column":118}},"1872":{"start":{"line":1873,"column":0},"end":{"line":1873,"column":52}},"1874":{"start":{"line":1875,"column":0},"end":{"line":1875,"column":31}},"1876":{"start":{"line":1877,"column":0},"end":{"line":1877,"column":24}},"1878":{"start":{"line":1879,"column":0},"end":{"line":1879,"column":40}},"1879":{"start":{"line":1880,"column":0},"end":{"line":1880,"column":105}},"1880":{"start":{"line":1881,"column":0},"end":{"line":1881,"column":67}},"1881":{"start":{"line":1882,"column":0},"end":{"line":1882,"column":30}},"1882":{"start":{"line":1883,"column":0},"end":{"line":1883,"column":37}},"1883":{"start":{"line":1884,"column":0},"end":{"line":1884,"column":49}},"1884":{"start":{"line":1885,"column":0},"end":{"line":1885,"column":78}},"1885":{"start":{"line":1886,"column":0},"end":{"line":1886,"column":53}},"1886":{"start":{"line":1887,"column":0},"end":{"line":1887,"column":178}},"1887":{"start":{"line":1888,"column":0},"end":{"line":1888,"column":35}},"1888":{"start":{"line":1889,"column":0},"end":{"line":1889,"column":26}},"1889":{"start":{"line":1890,"column":0},"end":{"line":1890,"column":30}},"1890":{"start":{"line":1891,"column":0},"end":{"line":1891,"column":37}},"1891":{"start":{"line":1892,"column":0},"end":{"line":1892,"column":49}},"1892":{"start":{"line":1893,"column":0},"end":{"line":1893,"column":78}},"1893":{"start":{"line":1894,"column":0},"end":{"line":1894,"column":62}},"1894":{"start":{"line":1895,"column":0},"end":{"line":1895,"column":178}},"1895":{"start":{"line":1896,"column":0},"end":{"line":1896,"column":26}},"1896":{"start":{"line":1897,"column":0},"end":{"line":1897,"column":28}},"1897":{"start":{"line":1898,"column":0},"end":{"line":1898,"column":73}},"1898":{"start":{"line":1899,"column":0},"end":{"line":1899,"column":52}},"1899":{"start":{"line":1900,"column":0},"end":{"line":1900,"column":104}},"1900":{"start":{"line":1901,"column":0},"end":{"line":1901,"column":56}},"1902":{"start":{"line":1903,"column":0},"end":{"line":1903,"column":35}},"1903":{"start":{"line":1904,"column":0},"end":{"line":1904,"column":107}},"1905":{"start":{"line":1906,"column":0},"end":{"line":1906,"column":35}},"1906":{"start":{"line":1907,"column":0},"end":{"line":1907,"column":30}},"1907":{"start":{"line":1908,"column":0},"end":{"line":1908,"column":31}},"1908":{"start":{"line":1909,"column":0},"end":{"line":1909,"column":92}},"1909":{"start":{"line":1910,"column":0},"end":{"line":1910,"column":92}},"1910":{"start":{"line":1911,"column":0},"end":{"line":1911,"column":108}},"1911":{"start":{"line":1912,"column":0},"end":{"line":1912,"column":29}},"1913":{"start":{"line":1914,"column":0},"end":{"line":1914,"column":121}},"1914":{"start":{"line":1915,"column":0},"end":{"line":1915,"column":90}},"1915":{"start":{"line":1916,"column":0},"end":{"line":1916,"column":33}},"1916":{"start":{"line":1917,"column":0},"end":{"line":1917,"column":28}},"1917":{"start":{"line":1918,"column":0},"end":{"line":1918,"column":26}},"1921":{"start":{"line":1922,"column":0},"end":{"line":1922,"column":43}},"1922":{"start":{"line":1923,"column":0},"end":{"line":1923,"column":134}},"1923":{"start":{"line":1924,"column":0},"end":{"line":1924,"column":68}},"1924":{"start":{"line":1925,"column":0},"end":{"line":1925,"column":148}},"1925":{"start":{"line":1926,"column":0},"end":{"line":1926,"column":29}},"1926":{"start":{"line":1927,"column":0},"end":{"line":1927,"column":68}},"1927":{"start":{"line":1928,"column":0},"end":{"line":1928,"column":86}},"1929":{"start":{"line":1930,"column":0},"end":{"line":1930,"column":49}},"1930":{"start":{"line":1931,"column":0},"end":{"line":1931,"column":31}},"1931":{"start":{"line":1932,"column":0},"end":{"line":1932,"column":26}},"1934":{"start":{"line":1935,"column":0},"end":{"line":1935,"column":58}},"1935":{"start":{"line":1936,"column":0},"end":{"line":1936,"column":57}},"1936":{"start":{"line":1937,"column":0},"end":{"line":1937,"column":29}},"1937":{"start":{"line":1938,"column":0},"end":{"line":1938,"column":41}},"1938":{"start":{"line":1939,"column":0},"end":{"line":1939,"column":63}},"1939":{"start":{"line":1940,"column":0},"end":{"line":1940,"column":155}},"1941":{"start":{"line":1942,"column":0},"end":{"line":1942,"column":89}},"1942":{"start":{"line":1943,"column":0},"end":{"line":1943,"column":94}},"1943":{"start":{"line":1944,"column":0},"end":{"line":1944,"column":31}},"1944":{"start":{"line":1945,"column":0},"end":{"line":1945,"column":23}},"1945":{"start":{"line":1946,"column":0},"end":{"line":1946,"column":55}},"1946":{"start":{"line":1947,"column":0},"end":{"line":1947,"column":89}},"1948":{"start":{"line":1949,"column":0},"end":{"line":1949,"column":26}},"1950":{"start":{"line":1951,"column":0},"end":{"line":1951,"column":24}},"1953":{"start":{"line":1954,"column":0},"end":{"line":1954,"column":79}},"1955":{"start":{"line":1956,"column":0},"end":{"line":1956,"column":22}},"1956":{"start":{"line":1957,"column":0},"end":{"line":1957,"column":22}},"1959":{"start":{"line":1960,"column":0},"end":{"line":1960,"column":21}},"1960":{"start":{"line":1961,"column":0},"end":{"line":1961,"column":90}},"1961":{"start":{"line":1962,"column":0},"end":{"line":1962,"column":68}},"1962":{"start":{"line":1963,"column":0},"end":{"line":1963,"column":62}},"1963":{"start":{"line":1964,"column":0},"end":{"line":1964,"column":95}},"1964":{"start":{"line":1965,"column":0},"end":{"line":1965,"column":102}},"1965":{"start":{"line":1966,"column":0},"end":{"line":1966,"column":77}},"1966":{"start":{"line":1967,"column":0},"end":{"line":1967,"column":28}},"1967":{"start":{"line":1968,"column":0},"end":{"line":1968,"column":23}},"1968":{"start":{"line":1969,"column":0},"end":{"line":1969,"column":24}},"1969":{"start":{"line":1970,"column":0},"end":{"line":1970,"column":22}},"1972":{"start":{"line":1973,"column":0},"end":{"line":1973,"column":57}},"1973":{"start":{"line":1974,"column":0},"end":{"line":1974,"column":23}},"1974":{"start":{"line":1975,"column":0},"end":{"line":1975,"column":94}},"1975":{"start":{"line":1976,"column":0},"end":{"line":1976,"column":58}},"1976":{"start":{"line":1977,"column":0},"end":{"line":1977,"column":50}},"1977":{"start":{"line":1978,"column":0},"end":{"line":1978,"column":58}},"1978":{"start":{"line":1979,"column":0},"end":{"line":1979,"column":48}},"1979":{"start":{"line":1980,"column":0},"end":{"line":1980,"column":146}},"1980":{"start":{"line":1981,"column":0},"end":{"line":1981,"column":63}},"1981":{"start":{"line":1982,"column":0},"end":{"line":1982,"column":109}},"1982":{"start":{"line":1983,"column":0},"end":{"line":1983,"column":55}},"1983":{"start":{"line":1984,"column":0},"end":{"line":1984,"column":37}},"1984":{"start":{"line":1985,"column":0},"end":{"line":1985,"column":33}},"1985":{"start":{"line":1986,"column":0},"end":{"line":1986,"column":27}},"1986":{"start":{"line":1987,"column":0},"end":{"line":1987,"column":26}},"1987":{"start":{"line":1988,"column":0},"end":{"line":1988,"column":24}},"1989":{"start":{"line":1990,"column":0},"end":{"line":1990,"column":20}},"1992":{"start":{"line":1993,"column":0},"end":{"line":1993,"column":40}},"1993":{"start":{"line":1994,"column":0},"end":{"line":1994,"column":82}},"1995":{"start":{"line":1996,"column":0},"end":{"line":1996,"column":70}},"1996":{"start":{"line":1997,"column":0},"end":{"line":1997,"column":88}},"1997":{"start":{"line":1998,"column":0},"end":{"line":1998,"column":88}},"1998":{"start":{"line":1999,"column":0},"end":{"line":1999,"column":62}},"1999":{"start":{"line":2000,"column":0},"end":{"line":2000,"column":39}},"2000":{"start":{"line":2001,"column":0},"end":{"line":2001,"column":58}},"2001":{"start":{"line":2002,"column":0},"end":{"line":2002,"column":39}},"2002":{"start":{"line":2003,"column":0},"end":{"line":2003,"column":27}},"2003":{"start":{"line":2004,"column":0},"end":{"line":2004,"column":24}},"2005":{"start":{"line":2006,"column":0},"end":{"line":2006,"column":63}},"2006":{"start":{"line":2007,"column":0},"end":{"line":2007,"column":107}},"2007":{"start":{"line":2008,"column":0},"end":{"line":2008,"column":26}},"2008":{"start":{"line":2009,"column":0},"end":{"line":2009,"column":33}},"2009":{"start":{"line":2010,"column":0},"end":{"line":2010,"column":41}},"2010":{"start":{"line":2011,"column":0},"end":{"line":2011,"column":70}},"2011":{"start":{"line":2012,"column":0},"end":{"line":2012,"column":52}},"2012":{"start":{"line":2013,"column":0},"end":{"line":2013,"column":206}},"2013":{"start":{"line":2014,"column":0},"end":{"line":2014,"column":22}},"2014":{"start":{"line":2015,"column":0},"end":{"line":2015,"column":24}},"2016":{"start":{"line":2017,"column":0},"end":{"line":2017,"column":81}},"2017":{"start":{"line":2018,"column":0},"end":{"line":2018,"column":35}},"2018":{"start":{"line":2019,"column":0},"end":{"line":2019,"column":59}},"2019":{"start":{"line":2020,"column":0},"end":{"line":2020,"column":37}},"2020":{"start":{"line":2021,"column":0},"end":{"line":2021,"column":68}},"2021":{"start":{"line":2022,"column":0},"end":{"line":2022,"column":66}},"2022":{"start":{"line":2023,"column":0},"end":{"line":2023,"column":32}},"2023":{"start":{"line":2024,"column":0},"end":{"line":2024,"column":30}},"2024":{"start":{"line":2025,"column":0},"end":{"line":2025,"column":43}},"2025":{"start":{"line":2026,"column":0},"end":{"line":2026,"column":44}},"2027":{"start":{"line":2028,"column":0},"end":{"line":2028,"column":101}},"2028":{"start":{"line":2029,"column":0},"end":{"line":2029,"column":30}},"2029":{"start":{"line":2030,"column":0},"end":{"line":2030,"column":162}},"2031":{"start":{"line":2032,"column":0},"end":{"line":2032,"column":60}},"2032":{"start":{"line":2033,"column":0},"end":{"line":2033,"column":90}},"2033":{"start":{"line":2034,"column":0},"end":{"line":2034,"column":98}},"2034":{"start":{"line":2035,"column":0},"end":{"line":2035,"column":34}},"2035":{"start":{"line":2036,"column":0},"end":{"line":2036,"column":83}},"2036":{"start":{"line":2037,"column":0},"end":{"line":2037,"column":48}},"2037":{"start":{"line":2038,"column":0},"end":{"line":2038,"column":147}},"2038":{"start":{"line":2039,"column":0},"end":{"line":2039,"column":100}},"2039":{"start":{"line":2040,"column":0},"end":{"line":2040,"column":39}},"2041":{"start":{"line":2042,"column":0},"end":{"line":2042,"column":167}},"2042":{"start":{"line":2043,"column":0},"end":{"line":2043,"column":123}},"2043":{"start":{"line":2044,"column":0},"end":{"line":2044,"column":36}},"2044":{"start":{"line":2045,"column":0},"end":{"line":2045,"column":34}},"2045":{"start":{"line":2046,"column":0},"end":{"line":2046,"column":32}},"2047":{"start":{"line":2048,"column":0},"end":{"line":2048,"column":25}},"2049":{"start":{"line":2050,"column":0},"end":{"line":2050,"column":90}},"2050":{"start":{"line":2051,"column":0},"end":{"line":2051,"column":78}},"2051":{"start":{"line":2052,"column":0},"end":{"line":2052,"column":81}},"2052":{"start":{"line":2053,"column":0},"end":{"line":2053,"column":26}},"2054":{"start":{"line":2055,"column":0},"end":{"line":2055,"column":24}},"2057":{"start":{"line":2058,"column":0},"end":{"line":2058,"column":95}},"2058":{"start":{"line":2059,"column":0},"end":{"line":2059,"column":45}},"2059":{"start":{"line":2060,"column":0},"end":{"line":2060,"column":50}},"2060":{"start":{"line":2061,"column":0},"end":{"line":2061,"column":30}},"2061":{"start":{"line":2062,"column":0},"end":{"line":2062,"column":37}},"2062":{"start":{"line":2063,"column":0},"end":{"line":2063,"column":48}},"2063":{"start":{"line":2064,"column":0},"end":{"line":2064,"column":77}},"2064":{"start":{"line":2065,"column":0},"end":{"line":2065,"column":82}},"2065":{"start":{"line":2066,"column":0},"end":{"line":2066,"column":57}},"2066":{"start":{"line":2067,"column":0},"end":{"line":2067,"column":214}},"2067":{"start":{"line":2068,"column":0},"end":{"line":2068,"column":35}},"2068":{"start":{"line":2069,"column":0},"end":{"line":2069,"column":26}},"2069":{"start":{"line":2070,"column":0},"end":{"line":2070,"column":101}},"2070":{"start":{"line":2071,"column":0},"end":{"line":2071,"column":54}},"2071":{"start":{"line":2072,"column":0},"end":{"line":2072,"column":33}},"2072":{"start":{"line":2073,"column":0},"end":{"line":2073,"column":137}},"2073":{"start":{"line":2074,"column":0},"end":{"line":2074,"column":51}},"2074":{"start":{"line":2075,"column":0},"end":{"line":2075,"column":33}},"2075":{"start":{"line":2076,"column":0},"end":{"line":2076,"column":28}},"2077":{"start":{"line":2078,"column":0},"end":{"line":2078,"column":29}},"2078":{"start":{"line":2079,"column":0},"end":{"line":2079,"column":69}},"2079":{"start":{"line":2080,"column":0},"end":{"line":2080,"column":232}},"2081":{"start":{"line":2082,"column":0},"end":{"line":2082,"column":52}},"2083":{"start":{"line":2084,"column":0},"end":{"line":2084,"column":31}},"2085":{"start":{"line":2086,"column":0},"end":{"line":2086,"column":24}},"2086":{"start":{"line":2087,"column":0},"end":{"line":2087,"column":22}},"2089":{"start":{"line":2090,"column":0},"end":{"line":2090,"column":70}},"2090":{"start":{"line":2091,"column":0},"end":{"line":2091,"column":88}},"2091":{"start":{"line":2092,"column":0},"end":{"line":2092,"column":86}},"2092":{"start":{"line":2093,"column":0},"end":{"line":2093,"column":62}},"2093":{"start":{"line":2094,"column":0},"end":{"line":2094,"column":92}},"2094":{"start":{"line":2095,"column":0},"end":{"line":2095,"column":27}},"2095":{"start":{"line":2096,"column":0},"end":{"line":2096,"column":24}},"2097":{"start":{"line":2098,"column":0},"end":{"line":2098,"column":81}},"2098":{"start":{"line":2099,"column":0},"end":{"line":2099,"column":48}},"2099":{"start":{"line":2100,"column":0},"end":{"line":2100,"column":60}},"2100":{"start":{"line":2101,"column":0},"end":{"line":2101,"column":46}},"2101":{"start":{"line":2102,"column":0},"end":{"line":2102,"column":80}},"2102":{"start":{"line":2103,"column":0},"end":{"line":2103,"column":32}},"2103":{"start":{"line":2104,"column":0},"end":{"line":2104,"column":116}},"2104":{"start":{"line":2105,"column":0},"end":{"line":2105,"column":84}},"2105":{"start":{"line":2106,"column":0},"end":{"line":2106,"column":35}},"2106":{"start":{"line":2107,"column":0},"end":{"line":2107,"column":106}},"2107":{"start":{"line":2108,"column":0},"end":{"line":2108,"column":85}},"2108":{"start":{"line":2109,"column":0},"end":{"line":2109,"column":36}},"2109":{"start":{"line":2110,"column":0},"end":{"line":2110,"column":37}},"2110":{"start":{"line":2111,"column":0},"end":{"line":2111,"column":75}},"2111":{"start":{"line":2112,"column":0},"end":{"line":2112,"column":100}},"2113":{"start":{"line":2114,"column":0},"end":{"line":2114,"column":57}},"2114":{"start":{"line":2115,"column":0},"end":{"line":2115,"column":39}},"2115":{"start":{"line":2116,"column":0},"end":{"line":2116,"column":34}},"2116":{"start":{"line":2117,"column":0},"end":{"line":2117,"column":41}},"2117":{"start":{"line":2118,"column":0},"end":{"line":2118,"column":56}},"2119":{"start":{"line":2120,"column":0},"end":{"line":2120,"column":36}},"2120":{"start":{"line":2121,"column":0},"end":{"line":2121,"column":43}},"2121":{"start":{"line":2122,"column":0},"end":{"line":2122,"column":53}},"2122":{"start":{"line":2123,"column":0},"end":{"line":2123,"column":82}},"2123":{"start":{"line":2124,"column":0},"end":{"line":2124,"column":191}},"2124":{"start":{"line":2125,"column":0},"end":{"line":2125,"column":32}},"2126":{"start":{"line":2127,"column":0},"end":{"line":2127,"column":32}},"2128":{"start":{"line":2129,"column":0},"end":{"line":2129,"column":25}},"2130":{"start":{"line":2131,"column":0},"end":{"line":2131,"column":93}},"2131":{"start":{"line":2132,"column":0},"end":{"line":2132,"column":72}},"2132":{"start":{"line":2133,"column":0},"end":{"line":2133,"column":79}},"2133":{"start":{"line":2134,"column":0},"end":{"line":2134,"column":67}},"2134":{"start":{"line":2135,"column":0},"end":{"line":2135,"column":92}},"2135":{"start":{"line":2136,"column":0},"end":{"line":2136,"column":28}},"2137":{"start":{"line":2138,"column":0},"end":{"line":2138,"column":24}},"2140":{"start":{"line":2141,"column":0},"end":{"line":2141,"column":89}},"2141":{"start":{"line":2142,"column":0},"end":{"line":2142,"column":97}},"2142":{"start":{"line":2143,"column":0},"end":{"line":2143,"column":29}},"2143":{"start":{"line":2144,"column":0},"end":{"line":2144,"column":94}},"2144":{"start":{"line":2145,"column":0},"end":{"line":2145,"column":232}},"2146":{"start":{"line":2147,"column":0},"end":{"line":2147,"column":52}},"2148":{"start":{"line":2149,"column":0},"end":{"line":2149,"column":31}},"2149":{"start":{"line":2150,"column":0},"end":{"line":2150,"column":26}},"2151":{"start":{"line":2152,"column":0},"end":{"line":2152,"column":22}},"2152":{"start":{"line":2153,"column":0},"end":{"line":2153,"column":20}},"2155":{"start":{"line":2156,"column":0},"end":{"line":2156,"column":38}},"2156":{"start":{"line":2157,"column":0},"end":{"line":2157,"column":41}},"2157":{"start":{"line":2158,"column":0},"end":{"line":2158,"column":31}},"2158":{"start":{"line":2159,"column":0},"end":{"line":2159,"column":80}},"2159":{"start":{"line":2160,"column":0},"end":{"line":2160,"column":55}},"2160":{"start":{"line":2161,"column":0},"end":{"line":2161,"column":31}},"2161":{"start":{"line":2162,"column":0},"end":{"line":2162,"column":24}},"2163":{"start":{"line":2164,"column":0},"end":{"line":2164,"column":25}},"2164":{"start":{"line":2165,"column":0},"end":{"line":2165,"column":34}},"2165":{"start":{"line":2166,"column":0},"end":{"line":2166,"column":68}},"2166":{"start":{"line":2167,"column":0},"end":{"line":2167,"column":146}},"2167":{"start":{"line":2168,"column":0},"end":{"line":2168,"column":125}},"2168":{"start":{"line":2169,"column":0},"end":{"line":2169,"column":21}},"2169":{"start":{"line":2170,"column":0},"end":{"line":2170,"column":36}},"2170":{"start":{"line":2171,"column":0},"end":{"line":2171,"column":18}},"2171":{"start":{"line":2172,"column":0},"end":{"line":2172,"column":55}},"2173":{"start":{"line":2174,"column":0},"end":{"line":2174,"column":20}},"2174":{"start":{"line":2175,"column":0},"end":{"line":2175,"column":20}},"2176":{"start":{"line":2177,"column":0},"end":{"line":2177,"column":16}},"2179":{"start":{"line":2180,"column":0},"end":{"line":2180,"column":78}},"2180":{"start":{"line":2181,"column":0},"end":{"line":2181,"column":92}},"2181":{"start":{"line":2182,"column":0},"end":{"line":2182,"column":19}},"2182":{"start":{"line":2183,"column":0},"end":{"line":2183,"column":51}},"2183":{"start":{"line":2184,"column":0},"end":{"line":2184,"column":106}},"2184":{"start":{"line":2185,"column":0},"end":{"line":2185,"column":32}},"2186":{"start":{"line":2187,"column":0},"end":{"line":2187,"column":162}},"2187":{"start":{"line":2188,"column":0},"end":{"line":2188,"column":76}},"2188":{"start":{"line":2189,"column":0},"end":{"line":2189,"column":21}},"2189":{"start":{"line":2190,"column":0},"end":{"line":2190,"column":16}},"2190":{"start":{"line":2191,"column":0},"end":{"line":2191,"column":22}},"2191":{"start":{"line":2192,"column":0},"end":{"line":2192,"column":13}},"2192":{"start":{"line":2193,"column":0},"end":{"line":2193,"column":10}},"2194":{"start":{"line":2195,"column":0},"end":{"line":2195,"column":1}},"2200":{"start":{"line":2201,"column":0},"end":{"line":2201,"column":28}},"2201":{"start":{"line":2202,"column":0},"end":{"line":2202,"column":11}},"2202":{"start":{"line":2203,"column":0},"end":{"line":2203,"column":15}},"2203":{"start":{"line":2204,"column":0},"end":{"line":2204,"column":12}},"2204":{"start":{"line":2205,"column":0},"end":{"line":2205,"column":15}},"2205":{"start":{"line":2206,"column":0},"end":{"line":2206,"column":11}},"2206":{"start":{"line":2207,"column":0},"end":{"line":2207,"column":4}},"2212":{"start":{"line":2213,"column":0},"end":{"line":2213,"column":4}},"2213":{"start":{"line":2214,"column":0},"end":{"line":2214,"column":53}},"2214":{"start":{"line":2215,"column":0},"end":{"line":2215,"column":66}},"2215":{"start":{"line":2216,"column":0},"end":{"line":2216,"column":86}},"2216":{"start":{"line":2217,"column":0},"end":{"line":2217,"column":60}},"2217":{"start":{"line":2218,"column":0},"end":{"line":2218,"column":58}},"2218":{"start":{"line":2219,"column":0},"end":{"line":2219,"column":62}},"2219":{"start":{"line":2220,"column":0},"end":{"line":2220,"column":68}},"2220":{"start":{"line":2221,"column":0},"end":{"line":2221,"column":85}},"2221":{"start":{"line":2222,"column":0},"end":{"line":2222,"column":64}},"2222":{"start":{"line":2223,"column":0},"end":{"line":2223,"column":70}},"2223":{"start":{"line":2224,"column":0},"end":{"line":2224,"column":149}},"2224":{"start":{"line":2225,"column":0},"end":{"line":2225,"column":159}},"2225":{"start":{"line":2226,"column":0},"end":{"line":2226,"column":116}},"2227":{"start":{"line":2228,"column":0},"end":{"line":2228,"column":56}},"2228":{"start":{"line":2229,"column":0},"end":{"line":2229,"column":119}},"2229":{"start":{"line":2230,"column":0},"end":{"line":2230,"column":66}},"2230":{"start":{"line":2231,"column":0},"end":{"line":2231,"column":120}},"2232":{"start":{"line":2233,"column":0},"end":{"line":2233,"column":39}},"2235":{"start":{"line":2236,"column":0},"end":{"line":2236,"column":44}},"2236":{"start":{"line":2237,"column":0},"end":{"line":2237,"column":22}},"2237":{"start":{"line":2238,"column":0},"end":{"line":2238,"column":75}},"2238":{"start":{"line":2239,"column":0},"end":{"line":2239,"column":73}},"2239":{"start":{"line":2240,"column":0},"end":{"line":2240,"column":73}},"2240":{"start":{"line":2241,"column":0},"end":{"line":2241,"column":6}},"2241":{"start":{"line":2242,"column":0},"end":{"line":2242,"column":72}},"2242":{"start":{"line":2243,"column":0},"end":{"line":2243,"column":17}},"2245":{"start":{"line":2246,"column":0},"end":{"line":2246,"column":39}},"2246":{"start":{"line":2247,"column":0},"end":{"line":2247,"column":38}},"2247":{"start":{"line":2248,"column":0},"end":{"line":2248,"column":40}},"2248":{"start":{"line":2249,"column":0},"end":{"line":2249,"column":43}},"2250":{"start":{"line":2251,"column":0},"end":{"line":2251,"column":37}},"2251":{"start":{"line":2252,"column":0},"end":{"line":2252,"column":52}},"2252":{"start":{"line":2253,"column":0},"end":{"line":2253,"column":66}},"2253":{"start":{"line":2254,"column":0},"end":{"line":2254,"column":67}},"2254":{"start":{"line":2255,"column":0},"end":{"line":2255,"column":7}},"2256":{"start":{"line":2257,"column":0},"end":{"line":2257,"column":12}},"2257":{"start":{"line":2258,"column":0},"end":{"line":2258,"column":75}},"2258":{"start":{"line":2259,"column":0},"end":{"line":2259,"column":81}},"2259":{"start":{"line":2260,"column":0},"end":{"line":2260,"column":46}},"2260":{"start":{"line":2261,"column":0},"end":{"line":2261,"column":91}},"2261":{"start":{"line":2262,"column":0},"end":{"line":2262,"column":6}},"2262":{"start":{"line":2263,"column":0},"end":{"line":2263,"column":37}},"2265":{"start":{"line":2266,"column":0},"end":{"line":2266,"column":46}},"2266":{"start":{"line":2267,"column":0},"end":{"line":2267,"column":45}},"2267":{"start":{"line":2268,"column":0},"end":{"line":2268,"column":74}},"2268":{"start":{"line":2269,"column":0},"end":{"line":2269,"column":34}},"2269":{"start":{"line":2270,"column":0},"end":{"line":2270,"column":32}},"2272":{"start":{"line":2273,"column":0},"end":{"line":2273,"column":41}},"2273":{"start":{"line":2274,"column":0},"end":{"line":2274,"column":29}},"2274":{"start":{"line":2275,"column":0},"end":{"line":2275,"column":65}},"2275":{"start":{"line":2276,"column":0},"end":{"line":2276,"column":20}},"2276":{"start":{"line":2277,"column":0},"end":{"line":2277,"column":47}},"2277":{"start":{"line":2278,"column":0},"end":{"line":2278,"column":52}},"2278":{"start":{"line":2279,"column":0},"end":{"line":2279,"column":63}},"2279":{"start":{"line":2280,"column":0},"end":{"line":2280,"column":8}},"2280":{"start":{"line":2281,"column":0},"end":{"line":2281,"column":20}},"2281":{"start":{"line":2282,"column":0},"end":{"line":2282,"column":74}},"2283":{"start":{"line":2284,"column":0},"end":{"line":2284,"column":66}},"2284":{"start":{"line":2285,"column":0},"end":{"line":2285,"column":67}},"2285":{"start":{"line":2286,"column":0},"end":{"line":2286,"column":98}},"2286":{"start":{"line":2287,"column":0},"end":{"line":2287,"column":8}},"2287":{"start":{"line":2288,"column":0},"end":{"line":2288,"column":76}},"2288":{"start":{"line":2289,"column":0},"end":{"line":2289,"column":86}},"2289":{"start":{"line":2290,"column":0},"end":{"line":2290,"column":91}},"2290":{"start":{"line":2291,"column":0},"end":{"line":2291,"column":98}},"2291":{"start":{"line":2292,"column":0},"end":{"line":2292,"column":52}},"2292":{"start":{"line":2293,"column":0},"end":{"line":2293,"column":151}},"2295":{"start":{"line":2296,"column":0},"end":{"line":2296,"column":56}},"2296":{"start":{"line":2297,"column":0},"end":{"line":2297,"column":22}},"2298":{"start":{"line":2299,"column":0},"end":{"line":2299,"column":76}},"2299":{"start":{"line":2300,"column":0},"end":{"line":2300,"column":77}},"2301":{"start":{"line":2302,"column":0},"end":{"line":2302,"column":20}},"2303":{"start":{"line":2304,"column":0},"end":{"line":2304,"column":57}},"2304":{"start":{"line":2305,"column":0},"end":{"line":2305,"column":28}},"2306":{"start":{"line":2307,"column":0},"end":{"line":2307,"column":57}},"2307":{"start":{"line":2308,"column":0},"end":{"line":2308,"column":40}},"2309":{"start":{"line":2310,"column":0},"end":{"line":2310,"column":44}},"2310":{"start":{"line":2311,"column":0},"end":{"line":2311,"column":40}},"2312":{"start":{"line":2313,"column":0},"end":{"line":2313,"column":55}},"2313":{"start":{"line":2314,"column":0},"end":{"line":2314,"column":58}},"2314":{"start":{"line":2315,"column":0},"end":{"line":2315,"column":9}},"2316":{"start":{"line":2317,"column":0},"end":{"line":2317,"column":59}},"2317":{"start":{"line":2318,"column":0},"end":{"line":2318,"column":14}},"2319":{"start":{"line":2320,"column":0},"end":{"line":2320,"column":55}},"2320":{"start":{"line":2321,"column":0},"end":{"line":2321,"column":17}},"2321":{"start":{"line":2322,"column":0},"end":{"line":2322,"column":9}},"2322":{"start":{"line":2323,"column":0},"end":{"line":2323,"column":59}},"2323":{"start":{"line":2324,"column":0},"end":{"line":2324,"column":7}},"2324":{"start":{"line":2325,"column":0},"end":{"line":2325,"column":12}},"2326":{"start":{"line":2327,"column":0},"end":{"line":2327,"column":33}},"2327":{"start":{"line":2328,"column":0},"end":{"line":2328,"column":5}},"2328":{"start":{"line":2329,"column":0},"end":{"line":2329,"column":4}},"2331":{"start":{"line":2332,"column":0},"end":{"line":2332,"column":74}},"2332":{"start":{"line":2333,"column":0},"end":{"line":2333,"column":72}},"2333":{"start":{"line":2334,"column":0},"end":{"line":2334,"column":72}},"2334":{"start":{"line":2335,"column":0},"end":{"line":2335,"column":21}},"2335":{"start":{"line":2336,"column":0},"end":{"line":2336,"column":4}},"2337":{"start":{"line":2338,"column":0},"end":{"line":2338,"column":61}},"2338":{"start":{"line":2339,"column":0},"end":{"line":2339,"column":9}},"2340":{"start":{"line":2341,"column":0},"end":{"line":2341,"column":73}},"2342":{"start":{"line":2343,"column":0},"end":{"line":2343,"column":74}},"2343":{"start":{"line":2344,"column":0},"end":{"line":2344,"column":24}},"2344":{"start":{"line":2345,"column":0},"end":{"line":2345,"column":22}},"2345":{"start":{"line":2346,"column":0},"end":{"line":2346,"column":27}},"2346":{"start":{"line":2347,"column":0},"end":{"line":2347,"column":44}},"2347":{"start":{"line":2348,"column":0},"end":{"line":2348,"column":38}},"2348":{"start":{"line":2349,"column":0},"end":{"line":2349,"column":9}},"2349":{"start":{"line":2350,"column":0},"end":{"line":2350,"column":31}},"2350":{"start":{"line":2351,"column":0},"end":{"line":2351,"column":21}},"2351":{"start":{"line":2352,"column":0},"end":{"line":2352,"column":78}},"2352":{"start":{"line":2353,"column":0},"end":{"line":2353,"column":5}},"2353":{"start":{"line":2354,"column":0},"end":{"line":2354,"column":4}},"2355":{"start":{"line":2356,"column":0},"end":{"line":2356,"column":56}},"2356":{"start":{"line":2357,"column":0},"end":{"line":2357,"column":9}},"2358":{"start":{"line":2359,"column":0},"end":{"line":2359,"column":90}},"2361":{"start":{"line":2362,"column":0},"end":{"line":2362,"column":73}},"2363":{"start":{"line":2364,"column":0},"end":{"line":2364,"column":74}},"2364":{"start":{"line":2365,"column":0},"end":{"line":2365,"column":19}},"2365":{"start":{"line":2366,"column":0},"end":{"line":2366,"column":22}},"2366":{"start":{"line":2367,"column":0},"end":{"line":2367,"column":27}},"2367":{"start":{"line":2368,"column":0},"end":{"line":2368,"column":44}},"2368":{"start":{"line":2369,"column":0},"end":{"line":2369,"column":38}},"2369":{"start":{"line":2370,"column":0},"end":{"line":2370,"column":39}},"2370":{"start":{"line":2371,"column":0},"end":{"line":2371,"column":9}},"2371":{"start":{"line":2372,"column":0},"end":{"line":2372,"column":31}},"2372":{"start":{"line":2373,"column":0},"end":{"line":2373,"column":21}},"2373":{"start":{"line":2374,"column":0},"end":{"line":2374,"column":74}},"2374":{"start":{"line":2375,"column":0},"end":{"line":2375,"column":5}},"2375":{"start":{"line":2376,"column":0},"end":{"line":2376,"column":4}},"2377":{"start":{"line":2378,"column":0},"end":{"line":2378,"column":30}},"2378":{"start":{"line":2379,"column":0},"end":{"line":2379,"column":25}},"2379":{"start":{"line":2380,"column":0},"end":{"line":2380,"column":26}},"2380":{"start":{"line":2381,"column":0},"end":{"line":2381,"column":28}},"2381":{"start":{"line":2382,"column":0},"end":{"line":2382,"column":27}},"2382":{"start":{"line":2383,"column":0},"end":{"line":2383,"column":29}},"2383":{"start":{"line":2384,"column":0},"end":{"line":2384,"column":32}},"2384":{"start":{"line":2385,"column":0},"end":{"line":2385,"column":23}},"2385":{"start":{"line":2386,"column":0},"end":{"line":2386,"column":4}},"2387":{"start":{"line":2388,"column":0},"end":{"line":2388,"column":128}},"2388":{"start":{"line":2389,"column":0},"end":{"line":2389,"column":82}},"2390":{"start":{"line":2391,"column":0},"end":{"line":2391,"column":98}},"2392":{"start":{"line":2393,"column":0},"end":{"line":2393,"column":10}},"2393":{"start":{"line":2394,"column":0},"end":{"line":2394,"column":6}},"2395":{"start":{"line":2396,"column":0},"end":{"line":2396,"column":38}},"2397":{"start":{"line":2398,"column":0},"end":{"line":2398,"column":57}},"2398":{"start":{"line":2399,"column":0},"end":{"line":2399,"column":43}},"2399":{"start":{"line":2400,"column":0},"end":{"line":2400,"column":99}},"2400":{"start":{"line":2401,"column":0},"end":{"line":2401,"column":18}},"2401":{"start":{"line":2402,"column":0},"end":{"line":2402,"column":25}},"2402":{"start":{"line":2403,"column":0},"end":{"line":2403,"column":33}},"2403":{"start":{"line":2404,"column":0},"end":{"line":2404,"column":62}},"2404":{"start":{"line":2405,"column":0},"end":{"line":2405,"column":45}},"2405":{"start":{"line":2406,"column":0},"end":{"line":2406,"column":190}},"2406":{"start":{"line":2407,"column":0},"end":{"line":2407,"column":14}},"2407":{"start":{"line":2408,"column":0},"end":{"line":2408,"column":16}},"2409":{"start":{"line":2410,"column":0},"end":{"line":2410,"column":38}},"2410":{"start":{"line":2411,"column":0},"end":{"line":2411,"column":19}},"2411":{"start":{"line":2412,"column":0},"end":{"line":2412,"column":61}},"2412":{"start":{"line":2413,"column":0},"end":{"line":2413,"column":30}},"2413":{"start":{"line":2414,"column":0},"end":{"line":2414,"column":34}},"2414":{"start":{"line":2415,"column":0},"end":{"line":2415,"column":40}},"2415":{"start":{"line":2416,"column":0},"end":{"line":2416,"column":52}},"2416":{"start":{"line":2417,"column":0},"end":{"line":2417,"column":24}},"2417":{"start":{"line":2418,"column":0},"end":{"line":2418,"column":39}},"2418":{"start":{"line":2419,"column":0},"end":{"line":2419,"column":17}},"2419":{"start":{"line":2420,"column":0},"end":{"line":2420,"column":16}},"2421":{"start":{"line":2422,"column":0},"end":{"line":2422,"column":48}},"2422":{"start":{"line":2423,"column":0},"end":{"line":2423,"column":50}},"2423":{"start":{"line":2424,"column":0},"end":{"line":2424,"column":21}},"2424":{"start":{"line":2425,"column":0},"end":{"line":2425,"column":84}},"2425":{"start":{"line":2426,"column":0},"end":{"line":2426,"column":46}},"2427":{"start":{"line":2428,"column":0},"end":{"line":2428,"column":21}},"2428":{"start":{"line":2429,"column":0},"end":{"line":2429,"column":84}},"2429":{"start":{"line":2430,"column":0},"end":{"line":2430,"column":87}},"2431":{"start":{"line":2432,"column":0},"end":{"line":2432,"column":21}},"2432":{"start":{"line":2433,"column":0},"end":{"line":2433,"column":61}},"2433":{"start":{"line":2434,"column":0},"end":{"line":2434,"column":42}},"2435":{"start":{"line":2436,"column":0},"end":{"line":2436,"column":21}},"2436":{"start":{"line":2437,"column":0},"end":{"line":2437,"column":16}},"2437":{"start":{"line":2438,"column":0},"end":{"line":2438,"column":14}},"2440":{"start":{"line":2441,"column":0},"end":{"line":2441,"column":59}},"2441":{"start":{"line":2442,"column":0},"end":{"line":2442,"column":56}},"2443":{"start":{"line":2444,"column":0},"end":{"line":2444,"column":25}},"2444":{"start":{"line":2445,"column":0},"end":{"line":2445,"column":24}},"2445":{"start":{"line":2446,"column":0},"end":{"line":2446,"column":30}},"2446":{"start":{"line":2447,"column":0},"end":{"line":2447,"column":22}},"2447":{"start":{"line":2448,"column":0},"end":{"line":2448,"column":64}},"2448":{"start":{"line":2449,"column":0},"end":{"line":2449,"column":88}},"2449":{"start":{"line":2450,"column":0},"end":{"line":2450,"column":85}},"2450":{"start":{"line":2451,"column":0},"end":{"line":2451,"column":85}},"2451":{"start":{"line":2452,"column":0},"end":{"line":2452,"column":14}},"2452":{"start":{"line":2453,"column":0},"end":{"line":2453,"column":60}},"2453":{"start":{"line":2454,"column":0},"end":{"line":2454,"column":12}},"2455":{"start":{"line":2456,"column":0},"end":{"line":2456,"column":25}},"2456":{"start":{"line":2457,"column":0},"end":{"line":2457,"column":25}},"2457":{"start":{"line":2458,"column":0},"end":{"line":2458,"column":31}},"2458":{"start":{"line":2459,"column":0},"end":{"line":2459,"column":22}},"2459":{"start":{"line":2460,"column":0},"end":{"line":2460,"column":45}},"2460":{"start":{"line":2461,"column":0},"end":{"line":2461,"column":55}},"2461":{"start":{"line":2462,"column":0},"end":{"line":2462,"column":54}},"2462":{"start":{"line":2463,"column":0},"end":{"line":2463,"column":14}},"2463":{"start":{"line":2464,"column":0},"end":{"line":2464,"column":79}},"2464":{"start":{"line":2465,"column":0},"end":{"line":2465,"column":12}},"2466":{"start":{"line":2467,"column":0},"end":{"line":2467,"column":49}},"2467":{"start":{"line":2468,"column":0},"end":{"line":2468,"column":27}},"2468":{"start":{"line":2469,"column":0},"end":{"line":2469,"column":29}},"2469":{"start":{"line":2470,"column":0},"end":{"line":2470,"column":35}},"2470":{"start":{"line":2471,"column":0},"end":{"line":2471,"column":24}},"2471":{"start":{"line":2472,"column":0},"end":{"line":2472,"column":47}},"2472":{"start":{"line":2473,"column":0},"end":{"line":2473,"column":85}},"2473":{"start":{"line":2474,"column":0},"end":{"line":2474,"column":16}},"2474":{"start":{"line":2475,"column":0},"end":{"line":2475,"column":41}},"2475":{"start":{"line":2476,"column":0},"end":{"line":2476,"column":14}},"2478":{"start":{"line":2479,"column":0},"end":{"line":2479,"column":48}},"2479":{"start":{"line":2480,"column":0},"end":{"line":2480,"column":27}},"2480":{"start":{"line":2481,"column":0},"end":{"line":2481,"column":28}},"2481":{"start":{"line":2482,"column":0},"end":{"line":2482,"column":34}},"2482":{"start":{"line":2483,"column":0},"end":{"line":2483,"column":24}},"2483":{"start":{"line":2484,"column":0},"end":{"line":2484,"column":47}},"2484":{"start":{"line":2485,"column":0},"end":{"line":2485,"column":76}},"2485":{"start":{"line":2486,"column":0},"end":{"line":2486,"column":16}},"2486":{"start":{"line":2487,"column":0},"end":{"line":2487,"column":40}},"2487":{"start":{"line":2488,"column":0},"end":{"line":2488,"column":14}},"2490":{"start":{"line":2491,"column":0},"end":{"line":2491,"column":105}},"2491":{"start":{"line":2492,"column":0},"end":{"line":2492,"column":27}},"2492":{"start":{"line":2493,"column":0},"end":{"line":2493,"column":30}},"2493":{"start":{"line":2494,"column":0},"end":{"line":2494,"column":36}},"2494":{"start":{"line":2495,"column":0},"end":{"line":2495,"column":24}},"2495":{"start":{"line":2496,"column":0},"end":{"line":2496,"column":47}},"2496":{"start":{"line":2497,"column":0},"end":{"line":2497,"column":78}},"2497":{"start":{"line":2498,"column":0},"end":{"line":2498,"column":16}},"2498":{"start":{"line":2499,"column":0},"end":{"line":2499,"column":42}},"2499":{"start":{"line":2500,"column":0},"end":{"line":2500,"column":14}},"2502":{"start":{"line":2503,"column":0},"end":{"line":2503,"column":107}},"2503":{"start":{"line":2504,"column":0},"end":{"line":2504,"column":27}},"2504":{"start":{"line":2505,"column":0},"end":{"line":2505,"column":27}},"2505":{"start":{"line":2506,"column":0},"end":{"line":2506,"column":39}},"2506":{"start":{"line":2507,"column":0},"end":{"line":2507,"column":24}},"2507":{"start":{"line":2508,"column":0},"end":{"line":2508,"column":47}},"2508":{"start":{"line":2509,"column":0},"end":{"line":2509,"column":81}},"2509":{"start":{"line":2510,"column":0},"end":{"line":2510,"column":16}},"2510":{"start":{"line":2511,"column":0},"end":{"line":2511,"column":45}},"2511":{"start":{"line":2512,"column":0},"end":{"line":2512,"column":14}},"2514":{"start":{"line":2515,"column":0},"end":{"line":2515,"column":32}},"2515":{"start":{"line":2516,"column":0},"end":{"line":2516,"column":19}},"2516":{"start":{"line":2517,"column":0},"end":{"line":2517,"column":36}},"2517":{"start":{"line":2518,"column":0},"end":{"line":2518,"column":94}},"2518":{"start":{"line":2519,"column":0},"end":{"line":2519,"column":13}},"2520":{"start":{"line":2521,"column":0},"end":{"line":2521,"column":21}},"2522":{"start":{"line":2523,"column":0},"end":{"line":2523,"column":14}},"2523":{"start":{"line":2524,"column":0},"end":{"line":2524,"column":12}},"2526":{"start":{"line":2527,"column":0},"end":{"line":2527,"column":23}},"2527":{"start":{"line":2528,"column":0},"end":{"line":2528,"column":86}},"2528":{"start":{"line":2529,"column":0},"end":{"line":2529,"column":61}},"2529":{"start":{"line":2530,"column":0},"end":{"line":2530,"column":53}},"2530":{"start":{"line":2531,"column":0},"end":{"line":2531,"column":62}},"2531":{"start":{"line":2532,"column":0},"end":{"line":2532,"column":74}},"2532":{"start":{"line":2533,"column":0},"end":{"line":2533,"column":48}},"2533":{"start":{"line":2534,"column":0},"end":{"line":2534,"column":36}},"2534":{"start":{"line":2535,"column":0},"end":{"line":2535,"column":71}},"2535":{"start":{"line":2536,"column":0},"end":{"line":2536,"column":68}},"2536":{"start":{"line":2537,"column":0},"end":{"line":2537,"column":21}},"2537":{"start":{"line":2538,"column":0},"end":{"line":2538,"column":18}},"2538":{"start":{"line":2539,"column":0},"end":{"line":2539,"column":53}},"2539":{"start":{"line":2540,"column":0},"end":{"line":2540,"column":55}},"2540":{"start":{"line":2541,"column":0},"end":{"line":2541,"column":194}},"2541":{"start":{"line":2542,"column":0},"end":{"line":2542,"column":86}},"2542":{"start":{"line":2543,"column":0},"end":{"line":2543,"column":23}},"2543":{"start":{"line":2544,"column":0},"end":{"line":2544,"column":66}},"2544":{"start":{"line":2545,"column":0},"end":{"line":2545,"column":194}},"2545":{"start":{"line":2546,"column":0},"end":{"line":2546,"column":87}},"2546":{"start":{"line":2547,"column":0},"end":{"line":2547,"column":23}},"2547":{"start":{"line":2548,"column":0},"end":{"line":2548,"column":20}},"2548":{"start":{"line":2549,"column":0},"end":{"line":2549,"column":62}},"2549":{"start":{"line":2550,"column":0},"end":{"line":2550,"column":23}},"2550":{"start":{"line":2551,"column":0},"end":{"line":2551,"column":27}},"2551":{"start":{"line":2552,"column":0},"end":{"line":2552,"column":40}},"2552":{"start":{"line":2553,"column":0},"end":{"line":2553,"column":25}},"2553":{"start":{"line":2554,"column":0},"end":{"line":2554,"column":63}},"2554":{"start":{"line":2555,"column":0},"end":{"line":2555,"column":83}},"2555":{"start":{"line":2556,"column":0},"end":{"line":2556,"column":83}},"2556":{"start":{"line":2557,"column":0},"end":{"line":2557,"column":25}},"2557":{"start":{"line":2558,"column":0},"end":{"line":2558,"column":41}},"2558":{"start":{"line":2559,"column":0},"end":{"line":2559,"column":72}},"2559":{"start":{"line":2560,"column":0},"end":{"line":2560,"column":73}},"2560":{"start":{"line":2561,"column":0},"end":{"line":2561,"column":25}},"2561":{"start":{"line":2562,"column":0},"end":{"line":2562,"column":48}},"2562":{"start":{"line":2563,"column":0},"end":{"line":2563,"column":29}},"2564":{"start":{"line":2565,"column":0},"end":{"line":2565,"column":21}},"2565":{"start":{"line":2566,"column":0},"end":{"line":2566,"column":20}},"2567":{"start":{"line":2568,"column":0},"end":{"line":2568,"column":52}},"2569":{"start":{"line":2570,"column":0},"end":{"line":2570,"column":25}},"2571":{"start":{"line":2572,"column":0},"end":{"line":2572,"column":18}},"2572":{"start":{"line":2573,"column":0},"end":{"line":2573,"column":16}},"2573":{"start":{"line":2574,"column":0},"end":{"line":2574,"column":14}},"2577":{"start":{"line":2578,"column":0},"end":{"line":2578,"column":86}},"2578":{"start":{"line":2579,"column":0},"end":{"line":2579,"column":26}},"2579":{"start":{"line":2580,"column":0},"end":{"line":2580,"column":51}},"2580":{"start":{"line":2581,"column":0},"end":{"line":2581,"column":41}},"2581":{"start":{"line":2582,"column":0},"end":{"line":2582,"column":73}},"2582":{"start":{"line":2583,"column":0},"end":{"line":2583,"column":16}},"2584":{"start":{"line":2585,"column":0},"end":{"line":2585,"column":77}},"2585":{"start":{"line":2586,"column":0},"end":{"line":2586,"column":49}},"2586":{"start":{"line":2587,"column":0},"end":{"line":2587,"column":70}},"2587":{"start":{"line":2588,"column":0},"end":{"line":2588,"column":45}},"2588":{"start":{"line":2589,"column":0},"end":{"line":2589,"column":14}},"2589":{"start":{"line":2590,"column":0},"end":{"line":2590,"column":12}},"2592":{"start":{"line":2593,"column":0},"end":{"line":2593,"column":39}},"2593":{"start":{"line":2594,"column":0},"end":{"line":2594,"column":43}},"2594":{"start":{"line":2595,"column":0},"end":{"line":2595,"column":76}},"2595":{"start":{"line":2596,"column":0},"end":{"line":2596,"column":61}},"2596":{"start":{"line":2597,"column":0},"end":{"line":2597,"column":32}},"2597":{"start":{"line":2598,"column":0},"end":{"line":2598,"column":114}},"2599":{"start":{"line":2600,"column":0},"end":{"line":2600,"column":21}},"2601":{"start":{"line":2602,"column":0},"end":{"line":2602,"column":14}},"2603":{"start":{"line":2604,"column":0},"end":{"line":2604,"column":63}},"2605":{"start":{"line":2606,"column":0},"end":{"line":2606,"column":15}},"2606":{"start":{"line":2607,"column":0},"end":{"line":2607,"column":63}},"2607":{"start":{"line":2608,"column":0},"end":{"line":2608,"column":60}},"2608":{"start":{"line":2609,"column":0},"end":{"line":2609,"column":79}},"2609":{"start":{"line":2610,"column":0},"end":{"line":2610,"column":61}},"2610":{"start":{"line":2611,"column":0},"end":{"line":2611,"column":77}},"2611":{"start":{"line":2612,"column":0},"end":{"line":2612,"column":21}},"2612":{"start":{"line":2613,"column":0},"end":{"line":2613,"column":18}},"2613":{"start":{"line":2614,"column":0},"end":{"line":2614,"column":86}},"2614":{"start":{"line":2615,"column":0},"end":{"line":2615,"column":30}},"2615":{"start":{"line":2616,"column":0},"end":{"line":2616,"column":51}},"2616":{"start":{"line":2617,"column":0},"end":{"line":2617,"column":34}},"2617":{"start":{"line":2618,"column":0},"end":{"line":2618,"column":33}},"2618":{"start":{"line":2619,"column":0},"end":{"line":2619,"column":43}},"2619":{"start":{"line":2620,"column":0},"end":{"line":2620,"column":36}},"2620":{"start":{"line":2621,"column":0},"end":{"line":2621,"column":61}},"2621":{"start":{"line":2622,"column":0},"end":{"line":2622,"column":63}},"2622":{"start":{"line":2623,"column":0},"end":{"line":2623,"column":45}},"2623":{"start":{"line":2624,"column":0},"end":{"line":2624,"column":77}},"2624":{"start":{"line":2625,"column":0},"end":{"line":2625,"column":58}},"2625":{"start":{"line":2626,"column":0},"end":{"line":2626,"column":118}},"2626":{"start":{"line":2627,"column":0},"end":{"line":2627,"column":20}},"2627":{"start":{"line":2628,"column":0},"end":{"line":2628,"column":19}},"2628":{"start":{"line":2629,"column":0},"end":{"line":2629,"column":83}},"2629":{"start":{"line":2630,"column":0},"end":{"line":2630,"column":93}},"2631":{"start":{"line":2632,"column":0},"end":{"line":2632,"column":18}},"2632":{"start":{"line":2633,"column":0},"end":{"line":2633,"column":16}},"2635":{"start":{"line":2636,"column":0},"end":{"line":2636,"column":15}},"2636":{"start":{"line":2637,"column":0},"end":{"line":2637,"column":63}},"2637":{"start":{"line":2638,"column":0},"end":{"line":2638,"column":61}},"2638":{"start":{"line":2639,"column":0},"end":{"line":2639,"column":78}},"2639":{"start":{"line":2640,"column":0},"end":{"line":2640,"column":61}},"2640":{"start":{"line":2641,"column":0},"end":{"line":2641,"column":76}},"2641":{"start":{"line":2642,"column":0},"end":{"line":2642,"column":21}},"2642":{"start":{"line":2643,"column":0},"end":{"line":2643,"column":18}},"2643":{"start":{"line":2644,"column":0},"end":{"line":2644,"column":86}},"2644":{"start":{"line":2645,"column":0},"end":{"line":2645,"column":30}},"2645":{"start":{"line":2646,"column":0},"end":{"line":2646,"column":50}},"2646":{"start":{"line":2647,"column":0},"end":{"line":2647,"column":34}},"2647":{"start":{"line":2648,"column":0},"end":{"line":2648,"column":33}},"2648":{"start":{"line":2649,"column":0},"end":{"line":2649,"column":43}},"2649":{"start":{"line":2650,"column":0},"end":{"line":2650,"column":36}},"2650":{"start":{"line":2651,"column":0},"end":{"line":2651,"column":61}},"2651":{"start":{"line":2652,"column":0},"end":{"line":2652,"column":63}},"2652":{"start":{"line":2653,"column":0},"end":{"line":2653,"column":45}},"2653":{"start":{"line":2654,"column":0},"end":{"line":2654,"column":77}},"2654":{"start":{"line":2655,"column":0},"end":{"line":2655,"column":58}},"2655":{"start":{"line":2656,"column":0},"end":{"line":2656,"column":118}},"2656":{"start":{"line":2657,"column":0},"end":{"line":2657,"column":20}},"2657":{"start":{"line":2658,"column":0},"end":{"line":2658,"column":19}},"2658":{"start":{"line":2659,"column":0},"end":{"line":2659,"column":82}},"2659":{"start":{"line":2660,"column":0},"end":{"line":2660,"column":92}},"2661":{"start":{"line":2662,"column":0},"end":{"line":2662,"column":18}},"2662":{"start":{"line":2663,"column":0},"end":{"line":2663,"column":16}},"2665":{"start":{"line":2666,"column":0},"end":{"line":2666,"column":15}},"2666":{"start":{"line":2667,"column":0},"end":{"line":2667,"column":63}},"2667":{"start":{"line":2668,"column":0},"end":{"line":2668,"column":65}},"2668":{"start":{"line":2669,"column":0},"end":{"line":2669,"column":78}},"2669":{"start":{"line":2670,"column":0},"end":{"line":2670,"column":61}},"2670":{"start":{"line":2671,"column":0},"end":{"line":2671,"column":76}},"2671":{"start":{"line":2672,"column":0},"end":{"line":2672,"column":21}},"2672":{"start":{"line":2673,"column":0},"end":{"line":2673,"column":18}},"2673":{"start":{"line":2674,"column":0},"end":{"line":2674,"column":86}},"2674":{"start":{"line":2675,"column":0},"end":{"line":2675,"column":30}},"2675":{"start":{"line":2676,"column":0},"end":{"line":2676,"column":50}},"2676":{"start":{"line":2677,"column":0},"end":{"line":2677,"column":34}},"2677":{"start":{"line":2678,"column":0},"end":{"line":2678,"column":33}},"2678":{"start":{"line":2679,"column":0},"end":{"line":2679,"column":43}},"2679":{"start":{"line":2680,"column":0},"end":{"line":2680,"column":36}},"2680":{"start":{"line":2681,"column":0},"end":{"line":2681,"column":61}},"2681":{"start":{"line":2682,"column":0},"end":{"line":2682,"column":63}},"2682":{"start":{"line":2683,"column":0},"end":{"line":2683,"column":45}},"2683":{"start":{"line":2684,"column":0},"end":{"line":2684,"column":77}},"2684":{"start":{"line":2685,"column":0},"end":{"line":2685,"column":58}},"2685":{"start":{"line":2686,"column":0},"end":{"line":2686,"column":118}},"2686":{"start":{"line":2687,"column":0},"end":{"line":2687,"column":20}},"2687":{"start":{"line":2688,"column":0},"end":{"line":2688,"column":19}},"2688":{"start":{"line":2689,"column":0},"end":{"line":2689,"column":82}},"2689":{"start":{"line":2690,"column":0},"end":{"line":2690,"column":92}},"2691":{"start":{"line":2692,"column":0},"end":{"line":2692,"column":18}},"2692":{"start":{"line":2693,"column":0},"end":{"line":2693,"column":16}},"2693":{"start":{"line":2694,"column":0},"end":{"line":2694,"column":14}},"2697":{"start":{"line":2698,"column":0},"end":{"line":2698,"column":27}},"2698":{"start":{"line":2699,"column":0},"end":{"line":2699,"column":26}},"2699":{"start":{"line":2700,"column":0},"end":{"line":2700,"column":35}},"2700":{"start":{"line":2701,"column":0},"end":{"line":2701,"column":50}},"2701":{"start":{"line":2702,"column":0},"end":{"line":2702,"column":52}},"2702":{"start":{"line":2703,"column":0},"end":{"line":2703,"column":62}},"2703":{"start":{"line":2704,"column":0},"end":{"line":2704,"column":52}},"2704":{"start":{"line":2705,"column":0},"end":{"line":2705,"column":10}},"2707":{"start":{"line":2708,"column":0},"end":{"line":2708,"column":74}},"2708":{"start":{"line":2709,"column":0},"end":{"line":2709,"column":26}},"2709":{"start":{"line":2710,"column":0},"end":{"line":2710,"column":122}},"2710":{"start":{"line":2711,"column":0},"end":{"line":2711,"column":163}},"2711":{"start":{"line":2712,"column":0},"end":{"line":2712,"column":31}},"2712":{"start":{"line":2713,"column":0},"end":{"line":2713,"column":10}},"2715":{"start":{"line":2716,"column":0},"end":{"line":2716,"column":30}},"2716":{"start":{"line":2717,"column":0},"end":{"line":2717,"column":23}},"2717":{"start":{"line":2718,"column":0},"end":{"line":2718,"column":54}},"2718":{"start":{"line":2719,"column":0},"end":{"line":2719,"column":34}},"2719":{"start":{"line":2720,"column":0},"end":{"line":2720,"column":81}},"2720":{"start":{"line":2721,"column":0},"end":{"line":2721,"column":41}},"2721":{"start":{"line":2722,"column":0},"end":{"line":2722,"column":12}},"2722":{"start":{"line":2723,"column":0},"end":{"line":2723,"column":10}},"2725":{"start":{"line":2726,"column":0},"end":{"line":2726,"column":92}},"2726":{"start":{"line":2727,"column":0},"end":{"line":2727,"column":18}},"2727":{"start":{"line":2728,"column":0},"end":{"line":2728,"column":26}},"2728":{"start":{"line":2729,"column":0},"end":{"line":2729,"column":39}},"2729":{"start":{"line":2730,"column":0},"end":{"line":2730,"column":36}},"2730":{"start":{"line":2731,"column":0},"end":{"line":2731,"column":12}},"2731":{"start":{"line":2732,"column":0},"end":{"line":2732,"column":40}},"2732":{"start":{"line":2733,"column":0},"end":{"line":2733,"column":41}},"2733":{"start":{"line":2734,"column":0},"end":{"line":2734,"column":46}},"2734":{"start":{"line":2735,"column":0},"end":{"line":2735,"column":47}},"2735":{"start":{"line":2736,"column":0},"end":{"line":2736,"column":10}},"2737":{"start":{"line":2738,"column":0},"end":{"line":2738,"column":7}},"2739":{"start":{"line":2740,"column":0},"end":{"line":2740,"column":1}},"2745":{"start":{"line":2746,"column":0},"end":{"line":2746,"column":32}},"2746":{"start":{"line":2747,"column":0},"end":{"line":2747,"column":39}},"2747":{"start":{"line":2748,"column":0},"end":{"line":2748,"column":35}},"2748":{"start":{"line":2749,"column":0},"end":{"line":2749,"column":66}},"2749":{"start":{"line":2750,"column":0},"end":{"line":2750,"column":59}},"2751":{"start":{"line":2752,"column":0},"end":{"line":2752,"column":63}},"2752":{"start":{"line":2753,"column":0},"end":{"line":2753,"column":30}},"2753":{"start":{"line":2754,"column":0},"end":{"line":2754,"column":32}},"2754":{"start":{"line":2755,"column":0},"end":{"line":2755,"column":5}},"2756":{"start":{"line":2757,"column":0},"end":{"line":2757,"column":44}},"2757":{"start":{"line":2758,"column":0},"end":{"line":2758,"column":27}},"2758":{"start":{"line":2759,"column":0},"end":{"line":2759,"column":29}},"2759":{"start":{"line":2760,"column":0},"end":{"line":2760,"column":5}},"2761":{"start":{"line":2762,"column":0},"end":{"line":2762,"column":108}},"2762":{"start":{"line":2763,"column":0},"end":{"line":2763,"column":32}},"2763":{"start":{"line":2764,"column":0},"end":{"line":2764,"column":42}},"2764":{"start":{"line":2765,"column":0},"end":{"line":2765,"column":40}},"2765":{"start":{"line":2766,"column":0},"end":{"line":2766,"column":17}},"2766":{"start":{"line":2767,"column":0},"end":{"line":2767,"column":29}},"2767":{"start":{"line":2768,"column":0},"end":{"line":2768,"column":5}},"2769":{"start":{"line":2770,"column":0},"end":{"line":2770,"column":19}},"2770":{"start":{"line":2771,"column":0},"end":{"line":2771,"column":24}},"2771":{"start":{"line":2772,"column":0},"end":{"line":2772,"column":47}},"2772":{"start":{"line":2773,"column":0},"end":{"line":2773,"column":5}},"2773":{"start":{"line":2774,"column":0},"end":{"line":2774,"column":22}},"2775":{"start":{"line":2776,"column":0},"end":{"line":2776,"column":38}},"2776":{"start":{"line":2777,"column":0},"end":{"line":2777,"column":32}},"2777":{"start":{"line":2778,"column":0},"end":{"line":2778,"column":22}},"2778":{"start":{"line":2779,"column":0},"end":{"line":2779,"column":67}},"2779":{"start":{"line":2780,"column":0},"end":{"line":2780,"column":65}},"2780":{"start":{"line":2781,"column":0},"end":{"line":2781,"column":30}},"2781":{"start":{"line":2782,"column":0},"end":{"line":2782,"column":6}},"2782":{"start":{"line":2783,"column":0},"end":{"line":2783,"column":5}},"2784":{"start":{"line":2785,"column":0},"end":{"line":2785,"column":36}},"2785":{"start":{"line":2786,"column":0},"end":{"line":2786,"column":65}},"2786":{"start":{"line":2787,"column":0},"end":{"line":2787,"column":4}},"2788":{"start":{"line":2789,"column":0},"end":{"line":2789,"column":22}},"2789":{"start":{"line":2790,"column":0},"end":{"line":2790,"column":12}},"2790":{"start":{"line":2791,"column":0},"end":{"line":2791,"column":81}},"2791":{"start":{"line":2792,"column":0},"end":{"line":2792,"column":69}},"2792":{"start":{"line":2793,"column":0},"end":{"line":2793,"column":12}},"2794":{"start":{"line":2795,"column":0},"end":{"line":2795,"column":3}},"2796":{"start":{"line":2797,"column":0},"end":{"line":2797,"column":10}},"2797":{"start":{"line":2798,"column":0},"end":{"line":2798,"column":32}},"2799":{"start":{"line":2800,"column":0},"end":{"line":2800,"column":28}},"2800":{"start":{"line":2801,"column":0},"end":{"line":2801,"column":67}},"2801":{"start":{"line":2802,"column":0},"end":{"line":2802,"column":103}},"2802":{"start":{"line":2803,"column":0},"end":{"line":2803,"column":12}},"2805":{"start":{"line":2806,"column":0},"end":{"line":2806,"column":69}},"2806":{"start":{"line":2807,"column":0},"end":{"line":2807,"column":15}},"2807":{"start":{"line":2808,"column":0},"end":{"line":2808,"column":47}},"2808":{"start":{"line":2809,"column":0},"end":{"line":2809,"column":114}},"2809":{"start":{"line":2810,"column":0},"end":{"line":2810,"column":33}},"2810":{"start":{"line":2811,"column":0},"end":{"line":2811,"column":53}},"2811":{"start":{"line":2812,"column":0},"end":{"line":2812,"column":69}},"2812":{"start":{"line":2813,"column":0},"end":{"line":2813,"column":13}},"2814":{"start":{"line":2815,"column":0},"end":{"line":2815,"column":39}},"2816":{"start":{"line":2817,"column":0},"end":{"line":2817,"column":17}},"2817":{"start":{"line":2818,"column":0},"end":{"line":2818,"column":15}},"2818":{"start":{"line":2819,"column":0},"end":{"line":2819,"column":51}},"2819":{"start":{"line":2820,"column":0},"end":{"line":2820,"column":114}},"2820":{"start":{"line":2821,"column":0},"end":{"line":2821,"column":37}},"2821":{"start":{"line":2822,"column":0},"end":{"line":2822,"column":53}},"2822":{"start":{"line":2823,"column":0},"end":{"line":2823,"column":69}},"2823":{"start":{"line":2824,"column":0},"end":{"line":2824,"column":13}},"2825":{"start":{"line":2826,"column":0},"end":{"line":2826,"column":39}},"2827":{"start":{"line":2828,"column":0},"end":{"line":2828,"column":17}},"2828":{"start":{"line":2829,"column":0},"end":{"line":2829,"column":12}},"2831":{"start":{"line":2832,"column":0},"end":{"line":2832,"column":33}},"2832":{"start":{"line":2833,"column":0},"end":{"line":2833,"column":10}},"2834":{"start":{"line":2835,"column":0},"end":{"line":2835,"column":40}},"2835":{"start":{"line":2836,"column":0},"end":{"line":2836,"column":131}},"2836":{"start":{"line":2837,"column":0},"end":{"line":2837,"column":55}},"2837":{"start":{"line":2838,"column":0},"end":{"line":2838,"column":85}},"2838":{"start":{"line":2839,"column":0},"end":{"line":2839,"column":58}},"2839":{"start":{"line":2840,"column":0},"end":{"line":2840,"column":81}},"2840":{"start":{"line":2841,"column":0},"end":{"line":2841,"column":23}},"2841":{"start":{"line":2842,"column":0},"end":{"line":2842,"column":20}},"2842":{"start":{"line":2843,"column":0},"end":{"line":2843,"column":21}},"2843":{"start":{"line":2844,"column":0},"end":{"line":2844,"column":35}},"2844":{"start":{"line":2845,"column":0},"end":{"line":2845,"column":25}},"2845":{"start":{"line":2846,"column":0},"end":{"line":2846,"column":55}},"2846":{"start":{"line":2847,"column":0},"end":{"line":2847,"column":51}},"2848":{"start":{"line":2849,"column":0},"end":{"line":2849,"column":46}},"2850":{"start":{"line":2851,"column":0},"end":{"line":2851,"column":23}},"2851":{"start":{"line":2852,"column":0},"end":{"line":2852,"column":18}},"2854":{"start":{"line":2855,"column":0},"end":{"line":2855,"column":40}},"2855":{"start":{"line":2856,"column":0},"end":{"line":2856,"column":56}},"2856":{"start":{"line":2857,"column":0},"end":{"line":2857,"column":33}},"2857":{"start":{"line":2858,"column":0},"end":{"line":2858,"column":68}},"2858":{"start":{"line":2859,"column":0},"end":{"line":2859,"column":75}},"2859":{"start":{"line":2860,"column":0},"end":{"line":2860,"column":18}},"2860":{"start":{"line":2861,"column":0},"end":{"line":2861,"column":26}},"2861":{"start":{"line":2862,"column":0},"end":{"line":2862,"column":30}},"2862":{"start":{"line":2863,"column":0},"end":{"line":2863,"column":33}},"2863":{"start":{"line":2864,"column":0},"end":{"line":2864,"column":41}},"2864":{"start":{"line":2865,"column":0},"end":{"line":2865,"column":49}},"2865":{"start":{"line":2866,"column":0},"end":{"line":2866,"column":44}},"2866":{"start":{"line":2867,"column":0},"end":{"line":2867,"column":33}},"2867":{"start":{"line":2868,"column":0},"end":{"line":2868,"column":14}},"2869":{"start":{"line":2870,"column":0},"end":{"line":2870,"column":47}},"2870":{"start":{"line":2871,"column":0},"end":{"line":2871,"column":77}},"2871":{"start":{"line":2872,"column":0},"end":{"line":2872,"column":70}},"2872":{"start":{"line":2873,"column":0},"end":{"line":2873,"column":18}},"2874":{"start":{"line":2875,"column":0},"end":{"line":2875,"column":11}},"2878":{"start":{"line":2879,"column":0},"end":{"line":2879,"column":54}},"2881":{"start":{"line":2882,"column":0},"end":{"line":2882,"column":21}},"2882":{"start":{"line":2883,"column":0},"end":{"line":2883,"column":10}},"2884":{"start":{"line":2885,"column":0},"end":{"line":2885,"column":1}}},"s":{"0":0,"54":0,"59":0,"60":0,"63":0,"64":0,"67":0,"68":0,"71":0,"72":0,"75":0,"76":0,"78":0,"79":0,"82":0,"83":0,"84":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"160":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"205":0,"206":0,"207":0,"208":0,"209":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"243":0,"244":0,"245":0,"247":0,"249":0,"250":0,"251":0,"252":0,"253":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"262":0,"264":0,"265":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"275":0,"277":0,"278":0,"280":0,"281":0,"282":0,"284":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"300":0,"301":0,"302":0,"304":0,"305":0,"306":0,"307":0,"308":0,"310":0,"311":0,"312":0,"313":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"327":0,"328":0,"329":0,"331":0,"332":0,"333":0,"334":0,"336":0,"338":0,"344":0,"345":0,"347":0,"348":0,"349":0,"350":0,"352":0,"353":0,"354":0,"356":0,"357":0,"358":0,"360":0,"362":0,"363":0,"364":0,"365":0,"366":0,"368":0,"369":0,"371":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"393":0,"394":0,"395":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"410":0,"411":0,"412":0,"413":0,"414":0,"416":0,"417":0,"419":0,"420":0,"421":0,"423":0,"424":0,"425":0,"426":0,"428":0,"429":0,"430":0,"431":0,"433":0,"434":0,"435":0,"436":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"445":0,"446":0,"447":0,"449":0,"456":0,"457":0,"459":0,"460":0,"462":0,"464":0,"465":0,"466":0,"467":0,"468":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"478":0,"479":0,"480":0,"482":0,"483":0,"484":0,"485":0,"486":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"497":0,"498":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"512":0,"513":0,"514":0,"515":0,"517":0,"518":0,"519":0,"520":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"532":0,"533":0,"535":0,"536":0,"537":0,"538":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"547":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"571":0,"573":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"588":0,"589":0,"590":0,"592":0,"593":0,"594":0,"596":0,"597":0,"598":0,"599":0,"600":0,"602":0,"603":0,"604":0,"605":0,"606":0,"608":0,"609":0,"610":0,"611":0,"612":0,"614":0,"615":0,"617":0,"618":0,"619":0,"621":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"649":0,"650":0,"651":0,"657":0,"658":0,"659":0,"660":0,"663":0,"664":0,"665":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0,"672":0,"674":0,"675":0,"676":0,"678":0,"679":0,"680":0,"681":0,"683":0,"684":0,"685":0,"686":0,"687":0,"688":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"706":0,"707":0,"708":0,"709":0,"710":0,"711":0,"712":0,"713":0,"715":0,"716":0,"717":0,"718":0,"719":0,"720":0,"721":0,"723":0,"724":0,"725":0,"726":0,"727":0,"728":0,"730":0,"731":0,"732":0,"733":0,"734":0,"736":0,"739":0,"740":0,"741":0,"742":0,"743":0,"744":0,"745":0,"746":0,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"753":0,"755":0,"756":0,"758":0,"759":0,"760":0,"761":0,"762":0,"763":0,"764":0,"765":0,"766":0,"767":0,"768":0,"769":0,"770":0,"771":0,"772":0,"773":0,"774":0,"775":0,"777":0,"778":0,"779":0,"781":0,"782":0,"783":0,"784":0,"785":0,"788":0,"789":0,"791":0,"792":0,"793":0,"795":0,"796":0,"797":0,"798":0,"799":0,"802":0,"803":0,"804":0,"805":0,"806":0,"807":0,"808":0,"809":0,"810":0,"811":0,"812":0,"814":0,"815":0,"816":0,"817":0,"820":0,"821":0,"822":0,"823":0,"824":0,"825":0,"826":0,"828":0,"829":0,"830":0,"831":0,"833":0,"834":0,"835":0,"836":0,"837":0,"839":0,"840":0,"841":0,"842":0,"843":0,"844":0,"845":0,"846":0,"847":0,"848":0,"849":0,"850":0,"851":0,"852":0,"853":0,"854":0,"855":0,"856":0,"857":0,"858":0,"859":0,"860":0,"861":0,"862":0,"863":0,"864":0,"865":0,"866":0,"867":0,"868":0,"869":0,"870":0,"872":0,"873":0,"874":0,"875":0,"877":0,"878":0,"880":0,"881":0,"882":0,"884":0,"886":0,"887":0,"888":0,"889":0,"891":0,"892":0,"893":0,"894":0,"895":0,"896":0,"897":0,"898":0,"899":0,"900":0,"901":0,"902":0,"903":0,"904":0,"905":0,"906":0,"908":0,"909":0,"910":0,"911":0,"912":0,"913":0,"915":0,"916":0,"917":0,"918":0,"919":0,"921":0,"922":0,"923":0,"924":0,"925":0,"926":0,"928":0,"929":0,"930":0,"932":0,"933":0,"935":0,"936":0,"937":0,"938":0,"940":0,"953":0,"954":0,"955":0,"956":0,"957":0,"958":0,"959":0,"965":0,"966":0,"967":0,"970":0,"971":0,"972":0,"974":0,"976":0,"978":0,"979":0,"980":0,"981":0,"983":0,"984":0,"985":0,"986":0,"987":0,"988":0,"989":0,"990":0,"991":0,"992":0,"994":0,"995":0,"997":0,"999":0,"1000":0,"1001":0,"1002":0,"1003":0,"1004":0,"1005":0,"1008":0,"1009":0,"1010":0,"1011":0,"1012":0,"1013":0,"1014":0,"1015":0,"1016":0,"1017":0,"1018":0,"1019":0,"1020":0,"1021":0,"1022":0,"1025":0,"1026":0,"1027":0,"1028":0,"1029":0,"1030":0,"1031":0,"1032":0,"1034":0,"1035":0,"1036":0,"1037":0,"1039":0,"1040":0,"1041":0,"1042":0,"1043":0,"1045":0,"1047":0,"1049":0,"1050":0,"1051":0,"1052":0,"1053":0,"1054":0,"1055":0,"1056":0,"1057":0,"1058":0,"1061":0,"1062":0,"1063":0,"1064":0,"1065":0,"1066":0,"1067":0,"1069":0,"1070":0,"1071":0,"1072":0,"1074":0,"1075":0,"1076":0,"1078":0,"1079":0,"1080":0,"1081":0,"1082":0,"1085":0,"1086":0,"1087":0,"1088":0,"1089":0,"1090":0,"1091":0,"1092":0,"1093":0,"1094":0,"1097":0,"1098":0,"1099":0,"1100":0,"1101":0,"1102":0,"1103":0,"1104":0,"1105":0,"1106":0,"1107":0,"1108":0,"1109":0,"1110":0,"1111":0,"1112":0,"1113":0,"1114":0,"1115":0,"1116":0,"1117":0,"1118":0,"1119":0,"1120":0,"1121":0,"1122":0,"1123":0,"1124":0,"1125":0,"1126":0,"1127":0,"1128":0,"1129":0,"1130":0,"1131":0,"1132":0,"1133":0,"1134":0,"1135":0,"1136":0,"1138":0,"1139":0,"1140":0,"1141":0,"1142":0,"1143":0,"1144":0,"1145":0,"1146":0,"1148":0,"1149":0,"1151":0,"1152":0,"1155":0,"1156":0,"1157":0,"1158":0,"1159":0,"1160":0,"1162":0,"1163":0,"1164":0,"1165":0,"1166":0,"1167":0,"1168":0,"1169":0,"1170":0,"1171":0,"1172":0,"1173":0,"1174":0,"1175":0,"1176":0,"1177":0,"1179":0,"1180":0,"1181":0,"1182":0,"1183":0,"1184":0,"1186":0,"1187":0,"1188":0,"1189":0,"1190":0,"1191":0,"1192":0,"1193":0,"1194":0,"1195":0,"1196":0,"1197":0,"1198":0,"1199":0,"1200":0,"1201":0,"1202":0,"1203":0,"1204":0,"1205":0,"1206":0,"1207":0,"1208":0,"1209":0,"1210":0,"1212":0,"1213":0,"1214":0,"1216":0,"1217":0,"1218":0,"1219":0,"1221":0,"1227":0,"1228":0,"1229":0,"1230":0,"1231":0,"1235":0,"1236":0,"1237":0,"1240":0,"1242":0,"1243":0,"1244":0,"1245":0,"1246":0,"1247":0,"1248":0,"1249":0,"1250":0,"1251":0,"1252":0,"1253":0,"1254":0,"1255":0,"1256":0,"1257":0,"1258":0,"1259":0,"1260":0,"1261":0,"1262":0,"1263":0,"1264":0,"1265":0,"1266":0,"1267":0,"1268":0,"1271":0,"1272":0,"1273":0,"1274":0,"1275":0,"1276":0,"1277":0,"1278":0,"1281":0,"1282":0,"1283":0,"1286":0,"1287":0,"1288":0,"1289":0,"1290":0,"1293":0,"1294":0,"1295":0,"1297":0,"1298":0,"1299":0,"1300":0,"1301":0,"1302":0,"1303":0,"1304":0,"1305":0,"1306":0,"1307":0,"1308":0,"1309":0,"1310":0,"1311":0,"1312":0,"1313":0,"1314":0,"1315":0,"1316":0,"1317":0,"1318":0,"1319":0,"1322":0,"1323":0,"1324":0,"1325":0,"1326":0,"1329":0,"1330":0,"1331":0,"1332":0,"1333":0,"1337":0,"1338":0,"1339":0,"1340":0,"1341":0,"1342":0,"1343":0,"1344":0,"1345":0,"1346":0,"1350":0,"1351":0,"1353":0,"1354":0,"1355":0,"1357":0,"1358":0,"1359":0,"1360":0,"1361":0,"1362":0,"1365":0,"1367":0,"1368":0,"1371":0,"1372":0,"1375":0,"1376":0,"1377":0,"1378":0,"1379":0,"1380":0,"1381":0,"1382":0,"1383":0,"1384":0,"1385":0,"1388":0,"1389":0,"1390":0,"1391":0,"1392":0,"1395":0,"1396":0,"1397":0,"1398":0,"1399":0,"1400":0,"1401":0,"1402":0,"1403":0,"1405":0,"1406":0,"1409":0,"1410":0,"1411":0,"1412":0,"1415":0,"1416":0,"1417":0,"1418":0,"1419":0,"1420":0,"1421":0,"1422":0,"1423":0,"1426":0,"1427":0,"1428":0,"1429":0,"1430":0,"1431":0,"1432":0,"1433":0,"1434":0,"1435":0,"1436":0,"1439":0,"1440":0,"1441":0,"1442":0,"1443":0,"1446":0,"1447":0,"1448":0,"1449":0,"1450":0,"1451":0,"1452":0,"1453":0,"1454":0,"1455":0,"1456":0,"1457":0,"1458":0,"1459":0,"1460":0,"1461":0,"1462":0,"1463":0,"1464":0,"1465":0,"1466":0,"1467":0,"1468":0,"1469":0,"1470":0,"1473":0,"1474":0,"1475":0,"1478":0,"1479":0,"1480":0,"1481":0,"1482":0,"1483":0,"1484":0,"1485":0,"1486":0,"1487":0,"1490":0,"1491":0,"1492":0,"1493":0,"1494":0,"1495":0,"1496":0,"1497":0,"1498":0,"1499":0,"1501":0,"1502":0,"1503":0,"1504":0,"1505":0,"1506":0,"1507":0,"1508":0,"1509":0,"1510":0,"1511":0,"1513":0,"1514":0,"1515":0,"1516":0,"1517":0,"1518":0,"1520":0,"1521":0,"1522":0,"1523":0,"1524":0,"1526":0,"1527":0,"1528":0,"1529":0,"1530":0,"1532":0,"1533":0,"1534":0,"1535":0,"1536":0,"1537":0,"1538":0,"1540":0,"1542":0,"1543":0,"1544":0,"1545":0,"1546":0,"1548":0,"1551":0,"1552":0,"1553":0,"1554":0,"1557":0,"1558":0,"1559":0,"1560":0,"1561":0,"1564":0,"1566":0,"1569":0,"1572":0,"1573":0,"1574":0,"1578":0,"1579":0,"1580":0,"1581":0,"1582":0,"1583":0,"1586":0,"1587":0,"1588":0,"1590":0,"1591":0,"1592":0,"1593":0,"1594":0,"1597":0,"1598":0,"1599":0,"1600":0,"1602":0,"1603":0,"1604":0,"1605":0,"1607":0,"1608":0,"1609":0,"1610":0,"1611":0,"1612":0,"1613":0,"1615":0,"1616":0,"1618":0,"1620":0,"1621":0,"1622":0,"1623":0,"1624":0,"1625":0,"1627":0,"1628":0,"1629":0,"1630":0,"1631":0,"1633":0,"1635":0,"1636":0,"1637":0,"1638":0,"1639":0,"1640":0,"1641":0,"1642":0,"1643":0,"1644":0,"1645":0,"1646":0,"1647":0,"1648":0,"1650":0,"1653":0,"1654":0,"1655":0,"1656":0,"1658":0,"1659":0,"1660":0,"1661":0,"1662":0,"1663":0,"1666":0,"1667":0,"1668":0,"1669":0,"1670":0,"1671":0,"1672":0,"1673":0,"1676":0,"1677":0,"1679":0,"1680":0,"1681":0,"1682":0,"1683":0,"1684":0,"1686":0,"1687":0,"1688":0,"1689":0,"1690":0,"1691":0,"1692":0,"1693":0,"1695":0,"1697":0,"1699":0,"1700":0,"1701":0,"1702":0,"1703":0,"1706":0,"1707":0,"1708":0,"1709":0,"1710":0,"1711":0,"1712":0,"1716":0,"1717":0,"1718":0,"1719":0,"1720":0,"1721":0,"1722":0,"1723":0,"1725":0,"1726":0,"1727":0,"1728":0,"1729":0,"1730":0,"1731":0,"1732":0,"1733":0,"1734":0,"1735":0,"1737":0,"1738":0,"1739":0,"1740":0,"1741":0,"1742":0,"1743":0,"1744":0,"1745":0,"1746":0,"1747":0,"1748":0,"1749":0,"1750":0,"1751":0,"1752":0,"1753":0,"1754":0,"1755":0,"1756":0,"1757":0,"1758":0,"1759":0,"1760":0,"1762":0,"1763":0,"1765":0,"1768":0,"1769":0,"1770":0,"1771":0,"1772":0,"1773":0,"1775":0,"1777":0,"1778":0,"1779":0,"1780":0,"1781":0,"1782":0,"1784":0,"1786":0,"1787":0,"1788":0,"1789":0,"1790":0,"1791":0,"1793":0,"1795":0,"1796":0,"1797":0,"1798":0,"1799":0,"1800":0,"1801":0,"1802":0,"1803":0,"1804":0,"1805":0,"1806":0,"1807":0,"1808":0,"1809":0,"1810":0,"1811":0,"1812":0,"1813":0,"1814":0,"1815":0,"1816":0,"1817":0,"1818":0,"1820":0,"1822":0,"1823":0,"1824":0,"1825":0,"1826":0,"1828":0,"1830":0,"1831":0,"1832":0,"1833":0,"1834":0,"1835":0,"1836":0,"1837":0,"1838":0,"1839":0,"1840":0,"1841":0,"1842":0,"1843":0,"1844":0,"1845":0,"1846":0,"1847":0,"1848":0,"1849":0,"1850":0,"1851":0,"1852":0,"1853":0,"1854":0,"1857":0,"1858":0,"1859":0,"1861":0,"1862":0,"1863":0,"1864":0,"1866":0,"1867":0,"1868":0,"1869":0,"1870":0,"1872":0,"1874":0,"1876":0,"1878":0,"1879":0,"1880":0,"1881":0,"1882":0,"1883":0,"1884":0,"1885":0,"1886":0,"1887":0,"1888":0,"1889":0,"1890":0,"1891":0,"1892":0,"1893":0,"1894":0,"1895":0,"1896":0,"1897":0,"1898":0,"1899":0,"1900":0,"1902":0,"1903":0,"1905":0,"1906":0,"1907":0,"1908":0,"1909":0,"1910":0,"1911":0,"1913":0,"1914":0,"1915":0,"1916":0,"1917":0,"1921":0,"1922":0,"1923":0,"1924":0,"1925":0,"1926":0,"1927":0,"1929":0,"1930":0,"1931":0,"1934":0,"1935":0,"1936":0,"1937":0,"1938":0,"1939":0,"1941":0,"1942":0,"1943":0,"1944":0,"1945":0,"1946":0,"1948":0,"1950":0,"1953":0,"1955":0,"1956":0,"1959":0,"1960":0,"1961":0,"1962":0,"1963":0,"1964":0,"1965":0,"1966":0,"1967":0,"1968":0,"1969":0,"1972":0,"1973":0,"1974":0,"1975":0,"1976":0,"1977":0,"1978":0,"1979":0,"1980":0,"1981":0,"1982":0,"1983":0,"1984":0,"1985":0,"1986":0,"1987":0,"1989":0,"1992":0,"1993":0,"1995":0,"1996":0,"1997":0,"1998":0,"1999":0,"2000":0,"2001":0,"2002":0,"2003":0,"2005":0,"2006":0,"2007":0,"2008":0,"2009":0,"2010":0,"2011":0,"2012":0,"2013":0,"2014":0,"2016":0,"2017":0,"2018":0,"2019":0,"2020":0,"2021":0,"2022":0,"2023":0,"2024":0,"2025":0,"2027":0,"2028":0,"2029":0,"2031":0,"2032":0,"2033":0,"2034":0,"2035":0,"2036":0,"2037":0,"2038":0,"2039":0,"2041":0,"2042":0,"2043":0,"2044":0,"2045":0,"2047":0,"2049":0,"2050":0,"2051":0,"2052":0,"2054":0,"2057":0,"2058":0,"2059":0,"2060":0,"2061":0,"2062":0,"2063":0,"2064":0,"2065":0,"2066":0,"2067":0,"2068":0,"2069":0,"2070":0,"2071":0,"2072":0,"2073":0,"2074":0,"2075":0,"2077":0,"2078":0,"2079":0,"2081":0,"2083":0,"2085":0,"2086":0,"2089":0,"2090":0,"2091":0,"2092":0,"2093":0,"2094":0,"2095":0,"2097":0,"2098":0,"2099":0,"2100":0,"2101":0,"2102":0,"2103":0,"2104":0,"2105":0,"2106":0,"2107":0,"2108":0,"2109":0,"2110":0,"2111":0,"2113":0,"2114":0,"2115":0,"2116":0,"2117":0,"2119":0,"2120":0,"2121":0,"2122":0,"2123":0,"2124":0,"2126":0,"2128":0,"2130":0,"2131":0,"2132":0,"2133":0,"2134":0,"2135":0,"2137":0,"2140":0,"2141":0,"2142":0,"2143":0,"2144":0,"2146":0,"2148":0,"2149":0,"2151":0,"2152":0,"2155":0,"2156":0,"2157":0,"2158":0,"2159":0,"2160":0,"2161":0,"2163":0,"2164":0,"2165":0,"2166":0,"2167":0,"2168":0,"2169":0,"2170":0,"2171":0,"2173":0,"2174":0,"2176":0,"2179":0,"2180":0,"2181":0,"2182":0,"2183":0,"2184":0,"2186":0,"2187":0,"2188":0,"2189":0,"2190":0,"2191":0,"2192":0,"2194":0,"2200":0,"2201":0,"2202":0,"2203":0,"2204":0,"2205":0,"2206":0,"2212":0,"2213":0,"2214":0,"2215":0,"2216":0,"2217":0,"2218":0,"2219":0,"2220":0,"2221":0,"2222":0,"2223":0,"2224":0,"2225":0,"2227":0,"2228":0,"2229":0,"2230":0,"2232":0,"2235":0,"2236":0,"2237":0,"2238":0,"2239":0,"2240":0,"2241":0,"2242":0,"2245":0,"2246":0,"2247":0,"2248":0,"2250":0,"2251":0,"2252":0,"2253":0,"2254":0,"2256":0,"2257":0,"2258":0,"2259":0,"2260":0,"2261":0,"2262":0,"2265":0,"2266":0,"2267":0,"2268":0,"2269":0,"2272":0,"2273":0,"2274":0,"2275":0,"2276":0,"2277":0,"2278":0,"2279":0,"2280":0,"2281":0,"2283":0,"2284":0,"2285":0,"2286":0,"2287":0,"2288":0,"2289":0,"2290":0,"2291":0,"2292":0,"2295":0,"2296":0,"2298":0,"2299":0,"2301":0,"2303":0,"2304":0,"2306":0,"2307":0,"2309":0,"2310":0,"2312":0,"2313":0,"2314":0,"2316":0,"2317":0,"2319":0,"2320":0,"2321":0,"2322":0,"2323":0,"2324":0,"2326":0,"2327":0,"2328":0,"2331":0,"2332":0,"2333":0,"2334":0,"2335":0,"2337":0,"2338":0,"2340":0,"2342":0,"2343":0,"2344":0,"2345":0,"2346":0,"2347":0,"2348":0,"2349":0,"2350":0,"2351":0,"2352":0,"2353":0,"2355":0,"2356":0,"2358":0,"2361":0,"2363":0,"2364":0,"2365":0,"2366":0,"2367":0,"2368":0,"2369":0,"2370":0,"2371":0,"2372":0,"2373":0,"2374":0,"2375":0,"2377":0,"2378":0,"2379":0,"2380":0,"2381":0,"2382":0,"2383":0,"2384":0,"2385":0,"2387":0,"2388":0,"2390":0,"2392":0,"2393":0,"2395":0,"2397":0,"2398":0,"2399":0,"2400":0,"2401":0,"2402":0,"2403":0,"2404":0,"2405":0,"2406":0,"2407":0,"2409":0,"2410":0,"2411":0,"2412":0,"2413":0,"2414":0,"2415":0,"2416":0,"2417":0,"2418":0,"2419":0,"2421":0,"2422":0,"2423":0,"2424":0,"2425":0,"2427":0,"2428":0,"2429":0,"2431":0,"2432":0,"2433":0,"2435":0,"2436":0,"2437":0,"2440":0,"2441":0,"2443":0,"2444":0,"2445":0,"2446":0,"2447":0,"2448":0,"2449":0,"2450":0,"2451":0,"2452":0,"2453":0,"2455":0,"2456":0,"2457":0,"2458":0,"2459":0,"2460":0,"2461":0,"2462":0,"2463":0,"2464":0,"2466":0,"2467":0,"2468":0,"2469":0,"2470":0,"2471":0,"2472":0,"2473":0,"2474":0,"2475":0,"2478":0,"2479":0,"2480":0,"2481":0,"2482":0,"2483":0,"2484":0,"2485":0,"2486":0,"2487":0,"2490":0,"2491":0,"2492":0,"2493":0,"2494":0,"2495":0,"2496":0,"2497":0,"2498":0,"2499":0,"2502":0,"2503":0,"2504":0,"2505":0,"2506":0,"2507":0,"2508":0,"2509":0,"2510":0,"2511":0,"2514":0,"2515":0,"2516":0,"2517":0,"2518":0,"2520":0,"2522":0,"2523":0,"2526":0,"2527":0,"2528":0,"2529":0,"2530":0,"2531":0,"2532":0,"2533":0,"2534":0,"2535":0,"2536":0,"2537":0,"2538":0,"2539":0,"2540":0,"2541":0,"2542":0,"2543":0,"2544":0,"2545":0,"2546":0,"2547":0,"2548":0,"2549":0,"2550":0,"2551":0,"2552":0,"2553":0,"2554":0,"2555":0,"2556":0,"2557":0,"2558":0,"2559":0,"2560":0,"2561":0,"2562":0,"2564":0,"2565":0,"2567":0,"2569":0,"2571":0,"2572":0,"2573":0,"2577":0,"2578":0,"2579":0,"2580":0,"2581":0,"2582":0,"2584":0,"2585":0,"2586":0,"2587":0,"2588":0,"2589":0,"2592":0,"2593":0,"2594":0,"2595":0,"2596":0,"2597":0,"2599":0,"2601":0,"2603":0,"2605":0,"2606":0,"2607":0,"2608":0,"2609":0,"2610":0,"2611":0,"2612":0,"2613":0,"2614":0,"2615":0,"2616":0,"2617":0,"2618":0,"2619":0,"2620":0,"2621":0,"2622":0,"2623":0,"2624":0,"2625":0,"2626":0,"2627":0,"2628":0,"2629":0,"2631":0,"2632":0,"2635":0,"2636":0,"2637":0,"2638":0,"2639":0,"2640":0,"2641":0,"2642":0,"2643":0,"2644":0,"2645":0,"2646":0,"2647":0,"2648":0,"2649":0,"2650":0,"2651":0,"2652":0,"2653":0,"2654":0,"2655":0,"2656":0,"2657":0,"2658":0,"2659":0,"2661":0,"2662":0,"2665":0,"2666":0,"2667":0,"2668":0,"2669":0,"2670":0,"2671":0,"2672":0,"2673":0,"2674":0,"2675":0,"2676":0,"2677":0,"2678":0,"2679":0,"2680":0,"2681":0,"2682":0,"2683":0,"2684":0,"2685":0,"2686":0,"2687":0,"2688":0,"2689":0,"2691":0,"2692":0,"2693":0,"2697":0,"2698":0,"2699":0,"2700":0,"2701":0,"2702":0,"2703":0,"2704":0,"2707":0,"2708":0,"2709":0,"2710":0,"2711":0,"2712":0,"2715":0,"2716":0,"2717":0,"2718":0,"2719":0,"2720":0,"2721":0,"2722":0,"2725":0,"2726":0,"2727":0,"2728":0,"2729":0,"2730":0,"2731":0,"2732":0,"2733":0,"2734":0,"2735":0,"2737":0,"2739":0,"2745":0,"2746":0,"2747":0,"2748":0,"2749":0,"2751":0,"2752":0,"2753":0,"2754":0,"2756":0,"2757":0,"2758":0,"2759":0,"2761":0,"2762":0,"2763":0,"2764":0,"2765":0,"2766":0,"2767":0,"2769":0,"2770":0,"2771":0,"2772":0,"2773":0,"2775":0,"2776":0,"2777":0,"2778":0,"2779":0,"2780":0,"2781":0,"2782":0,"2784":0,"2785":0,"2786":0,"2788":0,"2789":0,"2790":0,"2791":0,"2792":0,"2794":0,"2796":0,"2797":0,"2799":0,"2800":0,"2801":0,"2802":0,"2805":0,"2806":0,"2807":0,"2808":0,"2809":0,"2810":0,"2811":0,"2812":0,"2814":0,"2816":0,"2817":0,"2818":0,"2819":0,"2820":0,"2821":0,"2822":0,"2823":0,"2825":0,"2827":0,"2828":0,"2831":0,"2832":0,"2834":0,"2835":0,"2836":0,"2837":0,"2838":0,"2839":0,"2840":0,"2841":0,"2842":0,"2843":0,"2844":0,"2845":0,"2846":0,"2848":0,"2850":0,"2851":0,"2854":0,"2855":0,"2856":0,"2857":0,"2858":0,"2859":0,"2860":0,"2861":0,"2862":0,"2863":0,"2864":0,"2865":0,"2866":0,"2867":0,"2869":0,"2870":0,"2871":0,"2872":0,"2874":0,"2878":0,"2881":0,"2882":0,"2884":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":2885,"column":-51105}},"locations":[{"start":{"line":1,"column":0},"end":{"line":2885,"column":-51105}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":2885,"column":-51105}},"loc":{"start":{"line":1,"column":0},"end":{"line":2885,"column":-51105}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/pages/ProjectsPage.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/pages/ProjectsPage.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":33}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":24}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":19}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":22}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":22}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":21}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":20}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":20}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":22}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":20}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":20}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":2}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":83}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":56}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":77}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":74}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":90}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":68}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":48}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":23}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":12}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":24}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":51}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":12}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":72}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":33}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":7}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":4}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":10}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":89}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":108}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":65}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":59}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":54}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":15}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":14}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":64}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":15}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":73}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":20}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":18}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":25}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":26}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":55}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":176}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":49}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":22}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":14}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":16}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":15}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":73}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":20}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":21}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":33}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":62}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":188}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":51}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":22}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":14}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":16}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":15}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":73}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":20}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":50}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":42}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":23}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":25}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":31}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":45}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":74}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":115}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":21}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":48}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":18}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":17}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":18}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":16}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":15}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":73}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":20}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":18}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":27}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":33}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":62}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":176}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":51}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":21}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":14}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":16}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":23}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":17}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":75}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":22}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":21}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":30}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":59}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":155}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":54}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":60}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":58}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":23}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":18}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":55}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":72}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":21}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":71}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":28}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":60}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":29}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":22}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":24}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":21}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":16}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":15}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":12}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":10}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":1}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":80}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":56}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":53}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":51}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":10}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":100}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":35}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":63}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":51}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":16}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":60}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":69}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":14}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":17}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":72}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":39}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":78}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":39}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":20}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":18}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":16}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":88}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":29}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":95}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":21}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":28}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":93}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":21}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":79}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":43}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":21}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":113}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":44}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":21}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":16}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":14}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":34}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":32}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":79}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":82}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":56}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":18}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":76}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":18}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":62}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":24}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":62}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":99}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":18}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":16}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":18}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":16}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":61}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":32}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":40}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":62}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":18}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":34}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":91}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":54}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":180}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":57}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":45}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":24}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":70}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":52}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":60}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":22}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":100}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":53}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":26}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":51}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":101}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":77}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":26}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":20}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":17}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":45}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":173}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":46}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":22}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":18}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":16}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":73}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":68}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":43}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":48}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":16}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":66}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":44}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":46}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":16}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":14}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":20}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":11}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":1}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":32}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":39}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":35}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":52}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":86}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":69}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":74}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":50}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":78}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":86}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":5}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":38}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":65}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":22}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":64}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":26}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":46}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":6}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":32}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":40}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":6}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":5}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":38}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":70}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":34}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":22}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":64}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":26}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":35}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":46}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":6}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":32}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":40}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":6}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":5}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":38}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":54}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":22}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":64}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":29}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":46}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":6}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":32}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":40}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":6}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":5}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":63}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":25}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":61}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":12}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":51}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":5}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":4}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":52}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":31}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":23}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":4}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":53}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":24}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":4}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":45}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":25}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":4}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":37}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":33}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":43}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":5}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":4}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":10}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":31}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":57}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":49}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":63}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":69}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":14}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":51}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":43}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":17}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":12}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":34}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":69}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":17}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":24}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":51}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":75}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":37}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":45}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":72}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":15}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":62}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":19}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":11}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":12}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":20}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":64}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":71}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":14}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":36}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":14}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":53}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":82}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":64}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":59}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":16}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":24}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":15}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":78}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":39}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":24}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":30}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":31}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":50}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":48}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":60}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":14}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":13}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":14}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":34}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":21}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":32}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":124}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":38}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":26}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":41}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":49}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":10}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":21}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":21}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":34}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":26}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":32}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":41}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":12}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":29}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":74}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":10}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":10}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":1}}},"s":{"0":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"65":0,"66":0,"67":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"93":0,"94":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"112":0,"113":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"126":0,"127":0,"128":0,"130":0,"131":0,"132":0,"133":0,"134":0,"136":0,"137":0,"138":0,"139":0,"140":0,"143":0,"144":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"153":0,"155":0,"156":0,"157":0,"158":0,"159":0,"161":0,"170":0,"171":0,"172":0,"173":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"191":0,"192":0,"193":0,"194":0,"195":0,"197":0,"199":0,"200":0,"202":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"251":0,"252":0,"253":0,"255":0,"256":0,"257":0,"258":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"267":0,"268":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"285":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"295":0,"296":0,"297":0,"298":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"346":0,"347":0,"348":0,"349":0,"351":0,"353":0,"354":0,"356":0,"357":0,"358":0,"360":0,"361":0,"362":0,"363":0,"364":0,"366":0,"367":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"377":0,"378":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"392":0,"393":0,"394":0,"395":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"409":0,"410":0,"411":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"450":0,"452":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":453,"column":-8731}},"locations":[{"start":{"line":1,"column":0},"end":{"line":453,"column":-8731}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":453,"column":-8731}},"loc":{"start":{"line":1,"column":0},"end":{"line":453,"column":-8731}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/pages/QueuePage.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/pages/QueuePage.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":53}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":69}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":28}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":43}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":52}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":48}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":23}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":1}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":64}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":33}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":36}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":25}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":46}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":38}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":29}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":51}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":66}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":71}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":31}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":1}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":72}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":18}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":111}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":106}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":118}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":102}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":117}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":105}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":4}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":54}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":10}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":118}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":38}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":13}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":11}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":1}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":28}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":7}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":11}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":9}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":11}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":11}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":9}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":12}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":4}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":4}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":9}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":15}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":14}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":15}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":14}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":15}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":15}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":72}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":17}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":49}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":15}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":4}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":48}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":46}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":90}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":10}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":8}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":22}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":19}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":18}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":69}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":97}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":51}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":22}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":14}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":27}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":26}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":206}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":78}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":16}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":38}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":129}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":23}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":16}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":33}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":90}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":37}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":16}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":60}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":20}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":52}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":14}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":92}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":44}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":18}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":14}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":40}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":56}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":59}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":66}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":16}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":17}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":59}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":96}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":34}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":54}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":19}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":16}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":75}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":56}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":49}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":66}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":19}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":41}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":58}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":49}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":57}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":21}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":27}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":58}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":49}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":57}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":21}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":16}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":56}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":47}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":126}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":21}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":37}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":144}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":45}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":21}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":16}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":26}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":34}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":78}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":117}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":20}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":85}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":18}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":34}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":77}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":49}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":34}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":16}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":14}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":44}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":49}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":26}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":19}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":29}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":23}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":30}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":32}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":77}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":48}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":21}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":25}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":14}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":21}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":31}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":25}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":32}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":28}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":46}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":23}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":21}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":31}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":25}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":34}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":30}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":79}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":41}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":23}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":15}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":25}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":14}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":21}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":31}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":25}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":35}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":32}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":94}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":49}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":23}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":21}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":31}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":25}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":34}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":30}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":46}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":23}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":15}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":14}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":12}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":10}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":1}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":29}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":39}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":35}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":74}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":63}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":80}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":72}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":54}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":18}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":89}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":62}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":60}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":5}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":62}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":63}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":53}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":5}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":102}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":62}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":77}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":5}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":62}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":63}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":52}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":5}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":19}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":63}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":22}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":19}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":73}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":23}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":19}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":63}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":22}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":19}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":73}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":23}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":29}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":72}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":80}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":4}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":47}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":53}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":87}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":26}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":5}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":39}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":27}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":37}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":5}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":38}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":56}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":22}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":61}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":40}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":6}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":63}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":5}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":38}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":56}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":22}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":61}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":38}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":6}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":63}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":5}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":36}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":54}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":22}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":61}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":33}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":6}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":62}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":5}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":39}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":87}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":22}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":61}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":6}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":65}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":5}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":39}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":43}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":36}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":59}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":29}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":36}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":36}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":49}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":40}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":30}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":9}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":6}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":29}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":61}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":61}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":27}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":6}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":94}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":5}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":44}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":29}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":45}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":74}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":14}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":40}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":43}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":7}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":33}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":6}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":27}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":61}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":74}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":6}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":65}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":5}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":38}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":67}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":64}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":41}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":59}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":72}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":48}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":6}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":38}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":22}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":37}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":73}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":47}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":73}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":44}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":56}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":14}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":38}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":7}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":41}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":7}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":45}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":72}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":38}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":111}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":38}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":22}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":37}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":73}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":47}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":73}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":14}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":118}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":7}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":41}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":7}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":45}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":40}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":87}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":21}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":50}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":35}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":47}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":69}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":67}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":45}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":68}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":55}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":20}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":28}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":10}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":38}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":5}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":4}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":10}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":32}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":62}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":13}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":80}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":64}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":15}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":85}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":14}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":12}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":66}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":95}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":39}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":53}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":100}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":58}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":20}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":19}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":85}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":67}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":20}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":18}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":24}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":15}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":99}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":39}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":53}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":102}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":61}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":20}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":19}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":86}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":65}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":20}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":18}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":24}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":15}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":101}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":39}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":53}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":103}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":62}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":20}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":19}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":97}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":75}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":20}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":18}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":24}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":15}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":95}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":39}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":53}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":100}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":65}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":20}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":19}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":86}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":66}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":20}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":18}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":24}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":15}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":12}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":52}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":15}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":155}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":37}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":92}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":48}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":33}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":61}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":13}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":17}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":15}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":155}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":30}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":59}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":46}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":50}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":52}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":54}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":48}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":50}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":54}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":17}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":34}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":37}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":17}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":31}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":21}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":60}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":42}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":19}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":12}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":20}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":75}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":33}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":57}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":84}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":86}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":58}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":14}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":15}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":35}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":38}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":17}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":92}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":82}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":19}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":41}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":44}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":36}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":33}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":31}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":37}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":39}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":39}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":75}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":40}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":20}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":19}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":20}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":18}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":39}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":17}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":70}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":89}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":63}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":72}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":86}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":25}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":146}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":25}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":21}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":57}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":25}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":175}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":41}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":114}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":70}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":62}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":68}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":66}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":27}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":25}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":35}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":29}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":70}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":71}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":36}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":106}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":27}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":22}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":20}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":25}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":33}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":50}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":41}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":32}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":53}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":56}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":45}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":56}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":40}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":37}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":35}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":44}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":56}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":83}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":43}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":41}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":44}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":24}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":23}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":24}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":34}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":27}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":18}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":39}},"721":{"start":{"line":722,"column":0},"end":{"line":722,"column":17}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":70}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":89}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":69}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":72}},"727":{"start":{"line":728,"column":0},"end":{"line":728,"column":86}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":25}},"729":{"start":{"line":730,"column":0},"end":{"line":730,"column":21}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":57}},"731":{"start":{"line":732,"column":0},"end":{"line":732,"column":25}},"732":{"start":{"line":733,"column":0},"end":{"line":733,"column":175}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":41}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":101}},"736":{"start":{"line":737,"column":0},"end":{"line":737,"column":62}},"737":{"start":{"line":738,"column":0},"end":{"line":738,"column":62}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":68}},"739":{"start":{"line":740,"column":0},"end":{"line":740,"column":27}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":25}},"741":{"start":{"line":742,"column":0},"end":{"line":742,"column":35}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":29}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":70}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":101}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":36}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":106}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":27}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":22}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":20}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":41}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":65}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":36}},"754":{"start":{"line":755,"column":0},"end":{"line":755,"column":33}},"755":{"start":{"line":756,"column":0},"end":{"line":756,"column":31}},"756":{"start":{"line":757,"column":0},"end":{"line":757,"column":40}},"757":{"start":{"line":758,"column":0},"end":{"line":758,"column":37}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":39}},"759":{"start":{"line":760,"column":0},"end":{"line":760,"column":79}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":37}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":66}},"762":{"start":{"line":763,"column":0},"end":{"line":763,"column":20}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":19}},"764":{"start":{"line":765,"column":0},"end":{"line":765,"column":20}},"765":{"start":{"line":766,"column":0},"end":{"line":766,"column":18}},"767":{"start":{"line":768,"column":0},"end":{"line":768,"column":14}},"771":{"start":{"line":772,"column":0},"end":{"line":772,"column":20}},"772":{"start":{"line":773,"column":0},"end":{"line":773,"column":27}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":25}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":43}},"775":{"start":{"line":776,"column":0},"end":{"line":776,"column":10}},"779":{"start":{"line":780,"column":0},"end":{"line":780,"column":25}},"780":{"start":{"line":781,"column":0},"end":{"line":781,"column":21}},"781":{"start":{"line":782,"column":0},"end":{"line":782,"column":17}},"782":{"start":{"line":783,"column":0},"end":{"line":783,"column":72}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":58}},"784":{"start":{"line":785,"column":0},"end":{"line":785,"column":33}},"786":{"start":{"line":787,"column":0},"end":{"line":787,"column":19}},"787":{"start":{"line":788,"column":0},"end":{"line":788,"column":43}},"788":{"start":{"line":789,"column":0},"end":{"line":789,"column":103}},"789":{"start":{"line":790,"column":0},"end":{"line":790,"column":45}},"790":{"start":{"line":791,"column":0},"end":{"line":791,"column":166}},"791":{"start":{"line":792,"column":0},"end":{"line":792,"column":125}},"793":{"start":{"line":794,"column":0},"end":{"line":794,"column":23}},"794":{"start":{"line":795,"column":0},"end":{"line":795,"column":62}},"795":{"start":{"line":796,"column":0},"end":{"line":796,"column":58}},"796":{"start":{"line":797,"column":0},"end":{"line":797,"column":20}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":26}},"799":{"start":{"line":800,"column":0},"end":{"line":800,"column":28}},"800":{"start":{"line":801,"column":0},"end":{"line":801,"column":50}},"801":{"start":{"line":802,"column":0},"end":{"line":802,"column":59}},"802":{"start":{"line":803,"column":0},"end":{"line":803,"column":55}},"803":{"start":{"line":804,"column":0},"end":{"line":804,"column":57}},"804":{"start":{"line":805,"column":0},"end":{"line":805,"column":20}},"805":{"start":{"line":806,"column":0},"end":{"line":806,"column":59}},"806":{"start":{"line":807,"column":0},"end":{"line":807,"column":13}},"807":{"start":{"line":808,"column":0},"end":{"line":808,"column":35}},"808":{"start":{"line":809,"column":0},"end":{"line":809,"column":12}},"809":{"start":{"line":810,"column":0},"end":{"line":810,"column":49}},"810":{"start":{"line":811,"column":0},"end":{"line":811,"column":10}},"814":{"start":{"line":815,"column":0},"end":{"line":815,"column":35}},"815":{"start":{"line":816,"column":0},"end":{"line":816,"column":21}},"816":{"start":{"line":817,"column":0},"end":{"line":817,"column":31}},"817":{"start":{"line":818,"column":0},"end":{"line":818,"column":142}},"818":{"start":{"line":819,"column":0},"end":{"line":819,"column":37}},"819":{"start":{"line":820,"column":0},"end":{"line":820,"column":26}},"820":{"start":{"line":821,"column":0},"end":{"line":821,"column":28}},"821":{"start":{"line":822,"column":0},"end":{"line":822,"column":42}},"822":{"start":{"line":823,"column":0},"end":{"line":823,"column":46}},"823":{"start":{"line":824,"column":0},"end":{"line":824,"column":12}},"824":{"start":{"line":825,"column":0},"end":{"line":825,"column":60}},"825":{"start":{"line":826,"column":0},"end":{"line":826,"column":10}},"827":{"start":{"line":828,"column":0},"end":{"line":828,"column":10}},"829":{"start":{"line":830,"column":0},"end":{"line":830,"column":1}}},"s":{"0":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"59":0,"60":0,"61":0,"62":0,"63":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"83":0,"85":0,"86":0,"87":0,"88":0,"89":0,"91":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"120":0,"121":0,"122":0,"123":0,"125":0,"126":0,"127":0,"129":0,"130":0,"131":0,"132":0,"133":0,"136":0,"137":0,"140":0,"142":0,"143":0,"144":0,"145":0,"146":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"155":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"167":0,"168":0,"169":0,"171":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"184":0,"185":0,"186":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"199":0,"200":0,"201":0,"202":0,"203":0,"205":0,"208":0,"209":0,"210":0,"212":0,"214":0,"215":0,"216":0,"218":0,"220":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"233":0,"234":0,"235":0,"236":0,"237":0,"239":0,"242":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"254":0,"255":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"274":0,"275":0,"276":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"295":0,"296":0,"297":0,"299":0,"300":0,"301":0,"303":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"334":0,"335":0,"336":0,"338":0,"339":0,"340":0,"342":0,"343":0,"344":0,"346":0,"347":0,"348":0,"350":0,"351":0,"352":0,"353":0,"355":0,"356":0,"357":0,"358":0,"359":0,"361":0,"362":0,"363":0,"364":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"401":0,"402":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"418":0,"419":0,"420":0,"421":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"440":0,"441":0,"444":0,"445":0,"446":0,"448":0,"449":0,"450":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"478":0,"479":0,"480":0,"481":0,"482":0,"485":0,"486":0,"487":0,"489":0,"490":0,"491":0,"493":0,"494":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"506":0,"507":0,"509":0,"510":0,"511":0,"512":0,"514":0,"515":0,"516":0,"517":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"579":0,"580":0,"581":0,"582":0,"583":0,"585":0,"586":0,"587":0,"588":0,"589":0,"591":0,"592":0,"593":0,"594":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"605":0,"607":0,"608":0,"609":0,"610":0,"611":0,"613":0,"615":0,"617":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"628":0,"629":0,"631":0,"633":0,"634":0,"635":0,"636":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"656":0,"657":0,"658":0,"659":0,"660":0,"662":0,"663":0,"664":0,"665":0,"667":0,"668":0,"669":0,"670":0,"671":0,"672":0,"673":0,"675":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":0,"682":0,"683":0,"684":0,"685":0,"687":0,"688":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"696":0,"697":0,"698":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"706":0,"707":0,"708":0,"709":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":0,"716":0,"720":0,"721":0,"722":0,"723":0,"724":0,"726":0,"727":0,"728":0,"729":0,"730":0,"731":0,"732":0,"733":0,"734":0,"736":0,"737":0,"738":0,"739":0,"740":0,"741":0,"742":0,"743":0,"744":0,"745":0,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"753":0,"754":0,"755":0,"756":0,"757":0,"758":0,"759":0,"760":0,"761":0,"762":0,"763":0,"764":0,"765":0,"767":0,"771":0,"772":0,"773":0,"774":0,"775":0,"779":0,"780":0,"781":0,"782":0,"783":0,"784":0,"786":0,"787":0,"788":0,"789":0,"790":0,"791":0,"793":0,"794":0,"795":0,"796":0,"798":0,"799":0,"800":0,"801":0,"802":0,"803":0,"804":0,"805":0,"806":0,"807":0,"808":0,"809":0,"810":0,"814":0,"815":0,"816":0,"817":0,"818":0,"819":0,"820":0,"821":0,"822":0,"823":0,"824":0,"825":0,"827":0,"829":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":830,"column":-13360}},"locations":[{"start":{"line":1,"column":0},"end":{"line":830,"column":-13360}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":830,"column":-13360}},"loc":{"start":{"line":1,"column":0},"end":{"line":830,"column":-13360}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/pages/SettingsPage.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/pages/SettingsPage.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":78}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":32}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":39}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":39}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":35}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":79}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":60}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":73}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":76}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":92}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":92}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":60}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":80}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":107}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":66}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":57}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":68}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":20}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":31}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":26}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":5}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":74}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":94}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":74}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":80}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":92}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":64}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":66}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":53}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":30}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":25}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":4}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":41}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":44}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":29}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":4}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":50}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":27}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":29}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":5}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":66}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":30}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":31}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":5}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":74}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":65}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":26}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":62}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":41}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":63}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":15}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":65}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":36}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":19}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":68}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":11}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":10}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":8}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":25}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":25}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":29}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":28}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":29}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":42}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":49}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":27}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":77}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":77}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":89}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":80}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":9}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":7}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":14}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":19}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":19}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":23}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":22}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":23}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":61}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":8}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":6}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":76}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":98}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":5}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":81}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":41}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":42}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":5}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":65}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":27}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":28}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":37}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":5}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":44}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":119}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":29}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":26}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":41}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":33}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":27}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":64}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":35}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":6}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":32}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":71}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":6}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":5}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":44}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":53}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":22}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":64}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":35}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":6}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":32}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":71}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":6}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":5}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":39}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":27}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":29}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":5}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":81}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":41}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":42}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":5}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":43}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":32}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":29}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":5}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":42}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":26}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":28}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":5}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":103}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":30}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":33}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":29}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":5}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":73}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":31}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":33}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":33}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":66}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":80}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":20}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":7}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":19}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":6}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":5}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":43}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":32}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":22}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":28}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":6}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":5}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":54}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":18}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":39}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":49}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":26}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":29}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":78}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":30}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":82}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":14}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":111}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":7}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":6}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":32}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":71}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":6}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":5}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":46}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":49}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":56}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":61}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":40}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":42}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":15}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":56}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":37}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":19}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":38}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":11}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":10}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":8}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":14}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":55}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":55}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":8}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":6}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":34}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":67}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":74}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":30}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":75}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":14}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":92}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":7}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":6}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":32}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":53}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":6}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":5}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":76}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":40}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":19}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":37}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":33}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":24}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":41}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":14}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":5}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":32}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":38}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":35}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":26}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":51}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":68}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":45}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":6}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":32}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":61}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":6}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":5}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":19}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":66}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":13}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":5}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":22}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":61}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":67}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":77}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":79}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":53}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":75}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":77}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":63}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":79}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":71}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":71}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":63}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":63}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":89}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":59}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":59}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":71}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":22}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":13}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":5}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":33}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":43}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":5}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":47}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":43}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":12}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":18}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":35}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":45}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":7}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":6}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":48}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":101}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":70}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":9}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":36}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":12}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":54}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":69}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":12}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":3}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":10}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":32}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":28}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":67}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":61}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":12}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":75}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":15}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":49}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":90}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":35}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":53}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":69}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":13}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":9}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":17}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":15}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":47}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":114}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":33}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":53}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":69}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":13}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":38}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":51}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":88}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":33}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":19}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":17}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":15}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":55}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":114}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":41}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":53}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":69}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":13}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":38}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":73}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":88}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":44}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":19}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":17}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":15}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":49}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":114}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":35}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":53}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":69}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":13}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":37}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":45}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":88}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":30}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":19}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":17}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":12}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":35}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":64}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":54}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":16}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":24}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":91}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":25}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":47}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":19}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":70}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":59}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":42}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":24}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":23}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":39}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":71}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":160}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":53}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":62}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":53}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":29}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":21}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":25}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":60}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":53}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":20}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":20}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":19}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":70}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":45}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":24}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":23}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":37}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":75}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":160}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":50}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":58}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":40}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":29}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":21}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":25}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":60}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":56}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":20}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":20}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":54}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":21}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":72}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":26}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":25}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":65}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":116}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":162}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":66}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":63}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":63}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":65}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":27}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":22}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":21}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":72}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":26}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":25}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":65}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":110}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":162}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":66}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":66}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":64}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":27}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":22}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":20}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":19}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":70}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":24}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":23}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":64}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":119}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":160}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":70}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":47}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":64}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":36}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":29}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":21}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":25}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":60}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":20}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":20}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":65}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":21}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":61}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":57}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":22}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":22}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":23}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":37}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":27}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":51}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":51}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":25}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":20}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":26}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":17}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":16}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":24}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":84}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":25}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":47}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":65}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":21}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":67}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":57}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":22}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":22}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":84}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":24}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":35}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":56}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":85}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":44}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":20}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":353}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":24}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":20}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":65}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":21}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":63}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":57}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":22}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":22}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":84}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":24}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":35}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":59}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":88}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":44}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":20}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":353}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":24}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":20}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":65}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":21}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":68}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":57}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":22}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":22}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":84}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":24}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":35}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":64}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":93}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":44}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":20}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":353}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":24}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":20}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":97}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":116}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":92}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":43}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":87}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":56}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":73}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":118}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":110}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":24}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":24}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":22}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":26}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":17}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":16}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":24}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":81}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":25}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":47}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":19}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":70}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":24}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":22}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":31}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":29}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":25}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":61}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":34}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":91}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":160}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":18}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":20}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":19}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":86}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":23}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":48}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":77}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":160}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":54}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":54}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":54}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":56}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":54}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":54}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":54}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":54}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":25}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":20}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":19}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":70}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":24}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":22}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":31}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":29}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":25}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":59}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":34}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":89}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":160}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":18}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":20}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":19}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":70}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":24}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":23}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":71}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":110}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":160}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":60}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":66}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":25}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":60}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":65}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":72}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":73}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":20}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":20}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":26}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":17}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":14}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":54}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":16}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":24}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":90}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":25}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":47}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":53}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":18}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":41}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":68}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":64}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":63}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":22}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":56}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":23}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":74}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":28}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":61}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":28}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":37}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":31}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":33}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":69}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":108}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":166}},"719":{"start":{"line":720,"column":0},"end":{"line":720,"column":24}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":64}},"721":{"start":{"line":722,"column":0},"end":{"line":722,"column":26}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":24}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":23}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":74}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":28}},"727":{"start":{"line":728,"column":0},"end":{"line":728,"column":61}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":28}},"729":{"start":{"line":730,"column":0},"end":{"line":730,"column":37}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":31}},"731":{"start":{"line":732,"column":0},"end":{"line":732,"column":33}},"732":{"start":{"line":733,"column":0},"end":{"line":733,"column":69}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":108}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":166}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":24}},"736":{"start":{"line":737,"column":0},"end":{"line":737,"column":64}},"737":{"start":{"line":738,"column":0},"end":{"line":738,"column":26}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":24}},"739":{"start":{"line":740,"column":0},"end":{"line":740,"column":22}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":55}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":20}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":20}},"746":{"start":{"line":747,"column":0},"end":{"line":747,"column":82}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":68}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":69}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":66}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":22}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":56}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":23}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":74}},"755":{"start":{"line":756,"column":0},"end":{"line":756,"column":28}},"756":{"start":{"line":757,"column":0},"end":{"line":757,"column":61}},"757":{"start":{"line":758,"column":0},"end":{"line":758,"column":28}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":37}},"759":{"start":{"line":760,"column":0},"end":{"line":760,"column":34}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":31}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":32}},"762":{"start":{"line":763,"column":0},"end":{"line":763,"column":65}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":106}},"764":{"start":{"line":765,"column":0},"end":{"line":765,"column":166}},"765":{"start":{"line":766,"column":0},"end":{"line":766,"column":24}},"766":{"start":{"line":767,"column":0},"end":{"line":767,"column":65}},"767":{"start":{"line":768,"column":0},"end":{"line":768,"column":26}},"768":{"start":{"line":769,"column":0},"end":{"line":769,"column":24}},"769":{"start":{"line":770,"column":0},"end":{"line":770,"column":23}},"770":{"start":{"line":771,"column":0},"end":{"line":771,"column":74}},"772":{"start":{"line":773,"column":0},"end":{"line":773,"column":28}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":61}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":28}},"775":{"start":{"line":776,"column":0},"end":{"line":776,"column":37}},"776":{"start":{"line":777,"column":0},"end":{"line":777,"column":34}},"777":{"start":{"line":778,"column":0},"end":{"line":778,"column":31}},"778":{"start":{"line":779,"column":0},"end":{"line":779,"column":32}},"779":{"start":{"line":780,"column":0},"end":{"line":780,"column":65}},"780":{"start":{"line":781,"column":0},"end":{"line":781,"column":106}},"781":{"start":{"line":782,"column":0},"end":{"line":782,"column":166}},"782":{"start":{"line":783,"column":0},"end":{"line":783,"column":24}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":65}},"784":{"start":{"line":785,"column":0},"end":{"line":785,"column":26}},"785":{"start":{"line":786,"column":0},"end":{"line":786,"column":24}},"786":{"start":{"line":787,"column":0},"end":{"line":787,"column":22}},"787":{"start":{"line":788,"column":0},"end":{"line":788,"column":55}},"789":{"start":{"line":790,"column":0},"end":{"line":790,"column":20}},"790":{"start":{"line":791,"column":0},"end":{"line":791,"column":20}},"793":{"start":{"line":794,"column":0},"end":{"line":794,"column":82}},"794":{"start":{"line":795,"column":0},"end":{"line":795,"column":68}},"795":{"start":{"line":796,"column":0},"end":{"line":796,"column":66}},"796":{"start":{"line":797,"column":0},"end":{"line":797,"column":72}},"797":{"start":{"line":798,"column":0},"end":{"line":798,"column":22}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":21}},"799":{"start":{"line":800,"column":0},"end":{"line":800,"column":72}},"801":{"start":{"line":802,"column":0},"end":{"line":802,"column":26}},"802":{"start":{"line":803,"column":0},"end":{"line":803,"column":59}},"803":{"start":{"line":804,"column":0},"end":{"line":804,"column":26}},"804":{"start":{"line":805,"column":0},"end":{"line":805,"column":35}},"805":{"start":{"line":806,"column":0},"end":{"line":806,"column":29}},"806":{"start":{"line":807,"column":0},"end":{"line":807,"column":31}},"807":{"start":{"line":808,"column":0},"end":{"line":808,"column":76}},"808":{"start":{"line":809,"column":0},"end":{"line":809,"column":115}},"809":{"start":{"line":810,"column":0},"end":{"line":810,"column":162}},"810":{"start":{"line":811,"column":0},"end":{"line":811,"column":22}},"811":{"start":{"line":812,"column":0},"end":{"line":812,"column":65}},"812":{"start":{"line":813,"column":0},"end":{"line":813,"column":24}},"813":{"start":{"line":814,"column":0},"end":{"line":814,"column":22}},"814":{"start":{"line":815,"column":0},"end":{"line":815,"column":55}},"816":{"start":{"line":817,"column":0},"end":{"line":817,"column":20}},"817":{"start":{"line":818,"column":0},"end":{"line":818,"column":20}},"818":{"start":{"line":819,"column":0},"end":{"line":819,"column":26}},"819":{"start":{"line":820,"column":0},"end":{"line":820,"column":17}},"821":{"start":{"line":822,"column":0},"end":{"line":822,"column":30}},"823":{"start":{"line":824,"column":0},"end":{"line":824,"column":35}},"824":{"start":{"line":825,"column":0},"end":{"line":825,"column":14}},"827":{"start":{"line":828,"column":0},"end":{"line":828,"column":54}},"828":{"start":{"line":829,"column":0},"end":{"line":829,"column":16}},"829":{"start":{"line":830,"column":0},"end":{"line":830,"column":24}},"830":{"start":{"line":831,"column":0},"end":{"line":831,"column":75}},"831":{"start":{"line":832,"column":0},"end":{"line":832,"column":25}},"832":{"start":{"line":833,"column":0},"end":{"line":833,"column":47}},"833":{"start":{"line":834,"column":0},"end":{"line":834,"column":65}},"834":{"start":{"line":835,"column":0},"end":{"line":835,"column":21}},"835":{"start":{"line":836,"column":0},"end":{"line":836,"column":65}},"836":{"start":{"line":837,"column":0},"end":{"line":837,"column":57}},"838":{"start":{"line":839,"column":0},"end":{"line":839,"column":22}},"839":{"start":{"line":840,"column":0},"end":{"line":840,"column":22}},"840":{"start":{"line":841,"column":0},"end":{"line":841,"column":84}},"841":{"start":{"line":842,"column":0},"end":{"line":842,"column":24}},"842":{"start":{"line":843,"column":0},"end":{"line":843,"column":35}},"843":{"start":{"line":844,"column":0},"end":{"line":844,"column":57}},"844":{"start":{"line":845,"column":0},"end":{"line":845,"column":86}},"845":{"start":{"line":846,"column":0},"end":{"line":846,"column":44}},"846":{"start":{"line":847,"column":0},"end":{"line":847,"column":20}},"847":{"start":{"line":848,"column":0},"end":{"line":848,"column":353}},"848":{"start":{"line":849,"column":0},"end":{"line":849,"column":24}},"849":{"start":{"line":850,"column":0},"end":{"line":850,"column":20}},"851":{"start":{"line":852,"column":0},"end":{"line":852,"column":72}},"852":{"start":{"line":853,"column":0},"end":{"line":853,"column":72}},"853":{"start":{"line":854,"column":0},"end":{"line":854,"column":23}},"854":{"start":{"line":855,"column":0},"end":{"line":855,"column":65}},"855":{"start":{"line":856,"column":0},"end":{"line":856,"column":95}},"856":{"start":{"line":857,"column":0},"end":{"line":857,"column":24}},"857":{"start":{"line":858,"column":0},"end":{"line":858,"column":25}},"858":{"start":{"line":859,"column":0},"end":{"line":859,"column":39}},"859":{"start":{"line":860,"column":0},"end":{"line":860,"column":29}},"860":{"start":{"line":861,"column":0},"end":{"line":861,"column":56}},"861":{"start":{"line":862,"column":0},"end":{"line":862,"column":47}},"863":{"start":{"line":864,"column":0},"end":{"line":864,"column":41}},"864":{"start":{"line":865,"column":0},"end":{"line":865,"column":66}},"866":{"start":{"line":867,"column":0},"end":{"line":867,"column":55}},"867":{"start":{"line":868,"column":0},"end":{"line":868,"column":22}},"869":{"start":{"line":870,"column":0},"end":{"line":870,"column":27}},"870":{"start":{"line":871,"column":0},"end":{"line":871,"column":22}},"872":{"start":{"line":873,"column":0},"end":{"line":873,"column":50}},"873":{"start":{"line":874,"column":0},"end":{"line":874,"column":102}},"874":{"start":{"line":875,"column":0},"end":{"line":875,"column":70}},"875":{"start":{"line":876,"column":0},"end":{"line":876,"column":27}},"876":{"start":{"line":877,"column":0},"end":{"line":877,"column":68}},"877":{"start":{"line":878,"column":0},"end":{"line":878,"column":73}},"878":{"start":{"line":879,"column":0},"end":{"line":879,"column":28}},"879":{"start":{"line":880,"column":0},"end":{"line":880,"column":113}},"880":{"start":{"line":881,"column":0},"end":{"line":881,"column":100}},"882":{"start":{"line":883,"column":0},"end":{"line":883,"column":55}},"883":{"start":{"line":884,"column":0},"end":{"line":884,"column":103}},"884":{"start":{"line":885,"column":0},"end":{"line":885,"column":55}},"885":{"start":{"line":886,"column":0},"end":{"line":886,"column":30}},"887":{"start":{"line":888,"column":0},"end":{"line":888,"column":28}},"888":{"start":{"line":889,"column":0},"end":{"line":889,"column":51}},"889":{"start":{"line":890,"column":0},"end":{"line":890,"column":26}},"890":{"start":{"line":891,"column":0},"end":{"line":891,"column":56}},"891":{"start":{"line":892,"column":0},"end":{"line":892,"column":41}},"892":{"start":{"line":893,"column":0},"end":{"line":893,"column":51}},"893":{"start":{"line":894,"column":0},"end":{"line":894,"column":88}},"894":{"start":{"line":895,"column":0},"end":{"line":895,"column":56}},"896":{"start":{"line":897,"column":0},"end":{"line":897,"column":62}},"897":{"start":{"line":898,"column":0},"end":{"line":898,"column":28}},"899":{"start":{"line":900,"column":0},"end":{"line":900,"column":26}},"901":{"start":{"line":902,"column":0},"end":{"line":902,"column":104}},"902":{"start":{"line":903,"column":0},"end":{"line":903,"column":44}},"903":{"start":{"line":904,"column":0},"end":{"line":904,"column":89}},"904":{"start":{"line":905,"column":0},"end":{"line":905,"column":70}},"905":{"start":{"line":906,"column":0},"end":{"line":906,"column":61}},"906":{"start":{"line":907,"column":0},"end":{"line":907,"column":30}},"907":{"start":{"line":908,"column":0},"end":{"line":908,"column":93}},"908":{"start":{"line":909,"column":0},"end":{"line":909,"column":30}},"909":{"start":{"line":910,"column":0},"end":{"line":910,"column":99}},"910":{"start":{"line":911,"column":0},"end":{"line":911,"column":74}},"911":{"start":{"line":912,"column":0},"end":{"line":912,"column":28}},"912":{"start":{"line":913,"column":0},"end":{"line":913,"column":30}},"913":{"start":{"line":914,"column":0},"end":{"line":914,"column":28}},"914":{"start":{"line":915,"column":0},"end":{"line":915,"column":63}},"915":{"start":{"line":916,"column":0},"end":{"line":916,"column":99}},"916":{"start":{"line":917,"column":0},"end":{"line":917,"column":46}},"917":{"start":{"line":918,"column":0},"end":{"line":918,"column":28}},"918":{"start":{"line":919,"column":0},"end":{"line":919,"column":60}},"919":{"start":{"line":920,"column":0},"end":{"line":920,"column":91}},"920":{"start":{"line":921,"column":0},"end":{"line":921,"column":68}},"921":{"start":{"line":922,"column":0},"end":{"line":922,"column":28}},"923":{"start":{"line":924,"column":0},"end":{"line":924,"column":29}},"924":{"start":{"line":925,"column":0},"end":{"line":925,"column":40}},"925":{"start":{"line":926,"column":0},"end":{"line":926,"column":68}},"926":{"start":{"line":927,"column":0},"end":{"line":927,"column":64}},"928":{"start":{"line":929,"column":0},"end":{"line":929,"column":58}},"929":{"start":{"line":930,"column":0},"end":{"line":930,"column":70}},"931":{"start":{"line":932,"column":0},"end":{"line":932,"column":58}},"932":{"start":{"line":933,"column":0},"end":{"line":933,"column":26}},"934":{"start":{"line":935,"column":0},"end":{"line":935,"column":31}},"936":{"start":{"line":937,"column":0},"end":{"line":937,"column":24}},"937":{"start":{"line":938,"column":0},"end":{"line":938,"column":42}},"938":{"start":{"line":939,"column":0},"end":{"line":939,"column":112}},"939":{"start":{"line":940,"column":0},"end":{"line":940,"column":68}},"940":{"start":{"line":941,"column":0},"end":{"line":941,"column":24}},"941":{"start":{"line":942,"column":0},"end":{"line":942,"column":68}},"942":{"start":{"line":943,"column":0},"end":{"line":943,"column":62}},"944":{"start":{"line":945,"column":0},"end":{"line":945,"column":22}},"945":{"start":{"line":946,"column":0},"end":{"line":946,"column":25}},"946":{"start":{"line":947,"column":0},"end":{"line":947,"column":20}},"947":{"start":{"line":948,"column":0},"end":{"line":948,"column":26}},"948":{"start":{"line":949,"column":0},"end":{"line":949,"column":17}},"951":{"start":{"line":952,"column":0},"end":{"line":952,"column":16}},"952":{"start":{"line":953,"column":0},"end":{"line":953,"column":24}},"953":{"start":{"line":954,"column":0},"end":{"line":954,"column":83}},"954":{"start":{"line":955,"column":0},"end":{"line":955,"column":25}},"955":{"start":{"line":956,"column":0},"end":{"line":956,"column":47}},"957":{"start":{"line":958,"column":0},"end":{"line":958,"column":65}},"958":{"start":{"line":959,"column":0},"end":{"line":959,"column":21}},"959":{"start":{"line":960,"column":0},"end":{"line":960,"column":59}},"960":{"start":{"line":961,"column":0},"end":{"line":961,"column":57}},"962":{"start":{"line":963,"column":0},"end":{"line":963,"column":22}},"963":{"start":{"line":964,"column":0},"end":{"line":964,"column":22}},"964":{"start":{"line":965,"column":0},"end":{"line":965,"column":23}},"965":{"start":{"line":966,"column":0},"end":{"line":966,"column":37}},"966":{"start":{"line":967,"column":0},"end":{"line":967,"column":27}},"967":{"start":{"line":968,"column":0},"end":{"line":968,"column":58}},"969":{"start":{"line":970,"column":0},"end":{"line":970,"column":50}},"971":{"start":{"line":972,"column":0},"end":{"line":972,"column":25}},"972":{"start":{"line":973,"column":0},"end":{"line":973,"column":20}},"973":{"start":{"line":974,"column":0},"end":{"line":974,"column":65}},"974":{"start":{"line":975,"column":0},"end":{"line":975,"column":21}},"975":{"start":{"line":976,"column":0},"end":{"line":976,"column":62}},"976":{"start":{"line":977,"column":0},"end":{"line":977,"column":57}},"978":{"start":{"line":979,"column":0},"end":{"line":979,"column":22}},"979":{"start":{"line":980,"column":0},"end":{"line":980,"column":22}},"980":{"start":{"line":981,"column":0},"end":{"line":981,"column":23}},"981":{"start":{"line":982,"column":0},"end":{"line":982,"column":37}},"982":{"start":{"line":983,"column":0},"end":{"line":983,"column":27}},"983":{"start":{"line":984,"column":0},"end":{"line":984,"column":59}},"985":{"start":{"line":986,"column":0},"end":{"line":986,"column":48}},"987":{"start":{"line":988,"column":0},"end":{"line":988,"column":25}},"988":{"start":{"line":989,"column":0},"end":{"line":989,"column":20}},"990":{"start":{"line":991,"column":0},"end":{"line":991,"column":72}},"991":{"start":{"line":992,"column":0},"end":{"line":992,"column":67}},"992":{"start":{"line":993,"column":0},"end":{"line":993,"column":23}},"993":{"start":{"line":994,"column":0},"end":{"line":994,"column":73}},"994":{"start":{"line":995,"column":0},"end":{"line":995,"column":59}},"996":{"start":{"line":997,"column":0},"end":{"line":997,"column":24}},"997":{"start":{"line":998,"column":0},"end":{"line":998,"column":24}},"998":{"start":{"line":999,"column":0},"end":{"line":999,"column":25}},"999":{"start":{"line":1000,"column":0},"end":{"line":1000,"column":39}},"1000":{"start":{"line":1001,"column":0},"end":{"line":1001,"column":29}},"1001":{"start":{"line":1002,"column":0},"end":{"line":1002,"column":65}},"1003":{"start":{"line":1004,"column":0},"end":{"line":1004,"column":50}},"1005":{"start":{"line":1006,"column":0},"end":{"line":1006,"column":27}},"1006":{"start":{"line":1007,"column":0},"end":{"line":1007,"column":22}},"1007":{"start":{"line":1008,"column":0},"end":{"line":1008,"column":20}},"1008":{"start":{"line":1009,"column":0},"end":{"line":1009,"column":65}},"1009":{"start":{"line":1010,"column":0},"end":{"line":1010,"column":21}},"1010":{"start":{"line":1011,"column":0},"end":{"line":1011,"column":68}},"1011":{"start":{"line":1012,"column":0},"end":{"line":1012,"column":57}},"1013":{"start":{"line":1014,"column":0},"end":{"line":1014,"column":22}},"1014":{"start":{"line":1015,"column":0},"end":{"line":1015,"column":22}},"1015":{"start":{"line":1016,"column":0},"end":{"line":1016,"column":23}},"1016":{"start":{"line":1017,"column":0},"end":{"line":1017,"column":37}},"1017":{"start":{"line":1018,"column":0},"end":{"line":1018,"column":27}},"1018":{"start":{"line":1019,"column":0},"end":{"line":1019,"column":66}},"1020":{"start":{"line":1021,"column":0},"end":{"line":1021,"column":48}},"1022":{"start":{"line":1023,"column":0},"end":{"line":1023,"column":25}},"1023":{"start":{"line":1024,"column":0},"end":{"line":1024,"column":20}},"1024":{"start":{"line":1025,"column":0},"end":{"line":1025,"column":26}},"1025":{"start":{"line":1026,"column":0},"end":{"line":1026,"column":17}},"1026":{"start":{"line":1027,"column":0},"end":{"line":1027,"column":14}},"1027":{"start":{"line":1028,"column":0},"end":{"line":1028,"column":12}},"1031":{"start":{"line":1032,"column":0},"end":{"line":1032,"column":33}},"1032":{"start":{"line":1033,"column":0},"end":{"line":1033,"column":35}},"1033":{"start":{"line":1034,"column":0},"end":{"line":1034,"column":65}},"1034":{"start":{"line":1035,"column":0},"end":{"line":1035,"column":17}},"1035":{"start":{"line":1036,"column":0},"end":{"line":1036,"column":87}},"1036":{"start":{"line":1037,"column":0},"end":{"line":1037,"column":61}},"1038":{"start":{"line":1039,"column":0},"end":{"line":1039,"column":19}},"1039":{"start":{"line":1040,"column":0},"end":{"line":1040,"column":58}},"1041":{"start":{"line":1042,"column":0},"end":{"line":1042,"column":18}},"1042":{"start":{"line":1043,"column":0},"end":{"line":1043,"column":18}},"1043":{"start":{"line":1044,"column":0},"end":{"line":1044,"column":67}},"1044":{"start":{"line":1045,"column":0},"end":{"line":1045,"column":78}},"1045":{"start":{"line":1046,"column":0},"end":{"line":1046,"column":18}},"1046":{"start":{"line":1047,"column":0},"end":{"line":1047,"column":25}},"1047":{"start":{"line":1048,"column":0},"end":{"line":1048,"column":39}},"1048":{"start":{"line":1049,"column":0},"end":{"line":1049,"column":29}},"1049":{"start":{"line":1050,"column":0},"end":{"line":1050,"column":49}},"1050":{"start":{"line":1051,"column":0},"end":{"line":1051,"column":64}},"1051":{"start":{"line":1052,"column":0},"end":{"line":1052,"column":63}},"1052":{"start":{"line":1053,"column":0},"end":{"line":1053,"column":45}},"1054":{"start":{"line":1055,"column":0},"end":{"line":1055,"column":57}},"1055":{"start":{"line":1056,"column":0},"end":{"line":1056,"column":66}},"1057":{"start":{"line":1058,"column":0},"end":{"line":1058,"column":68}},"1058":{"start":{"line":1059,"column":0},"end":{"line":1059,"column":22}},"1060":{"start":{"line":1061,"column":0},"end":{"line":1061,"column":27}},"1061":{"start":{"line":1062,"column":0},"end":{"line":1062,"column":25}},"1062":{"start":{"line":1063,"column":0},"end":{"line":1063,"column":39}},"1063":{"start":{"line":1064,"column":0},"end":{"line":1064,"column":29}},"1064":{"start":{"line":1065,"column":0},"end":{"line":1065,"column":49}},"1065":{"start":{"line":1066,"column":0},"end":{"line":1066,"column":65}},"1066":{"start":{"line":1067,"column":0},"end":{"line":1067,"column":63}},"1067":{"start":{"line":1068,"column":0},"end":{"line":1068,"column":46}},"1069":{"start":{"line":1070,"column":0},"end":{"line":1070,"column":57}},"1070":{"start":{"line":1071,"column":0},"end":{"line":1071,"column":66}},"1072":{"start":{"line":1073,"column":0},"end":{"line":1073,"column":67}},"1073":{"start":{"line":1074,"column":0},"end":{"line":1074,"column":22}},"1075":{"start":{"line":1076,"column":0},"end":{"line":1076,"column":27}},"1076":{"start":{"line":1077,"column":0},"end":{"line":1077,"column":19}},"1078":{"start":{"line":1079,"column":0},"end":{"line":1079,"column":21}},"1079":{"start":{"line":1080,"column":0},"end":{"line":1080,"column":45}},"1080":{"start":{"line":1081,"column":0},"end":{"line":1081,"column":32}},"1081":{"start":{"line":1082,"column":0},"end":{"line":1082,"column":39}},"1082":{"start":{"line":1083,"column":0},"end":{"line":1083,"column":41}},"1083":{"start":{"line":1084,"column":0},"end":{"line":1084,"column":18}},"1085":{"start":{"line":1086,"column":0},"end":{"line":1086,"column":44}},"1087":{"start":{"line":1088,"column":0},"end":{"line":1088,"column":23}},"1088":{"start":{"line":1089,"column":0},"end":{"line":1089,"column":18}},"1089":{"start":{"line":1090,"column":0},"end":{"line":1090,"column":16}},"1092":{"start":{"line":1093,"column":0},"end":{"line":1093,"column":51}},"1093":{"start":{"line":1094,"column":0},"end":{"line":1094,"column":35}},"1094":{"start":{"line":1095,"column":0},"end":{"line":1095,"column":26}},"1095":{"start":{"line":1096,"column":0},"end":{"line":1096,"column":91}},"1096":{"start":{"line":1097,"column":0},"end":{"line":1097,"column":61}},"1098":{"start":{"line":1099,"column":0},"end":{"line":1099,"column":37}},"1099":{"start":{"line":1100,"column":0},"end":{"line":1100,"column":85}},"1101":{"start":{"line":1102,"column":0},"end":{"line":1102,"column":21}},"1102":{"start":{"line":1103,"column":0},"end":{"line":1103,"column":27}},"1103":{"start":{"line":1104,"column":0},"end":{"line":1104,"column":27}},"1104":{"start":{"line":1105,"column":0},"end":{"line":1105,"column":38}},"1105":{"start":{"line":1106,"column":0},"end":{"line":1106,"column":73}},"1107":{"start":{"line":1108,"column":0},"end":{"line":1108,"column":66}},"1108":{"start":{"line":1109,"column":0},"end":{"line":1109,"column":92}},"1109":{"start":{"line":1110,"column":0},"end":{"line":1110,"column":51}},"1111":{"start":{"line":1112,"column":0},"end":{"line":1112,"column":28}},"1112":{"start":{"line":1113,"column":0},"end":{"line":1113,"column":68}},"1113":{"start":{"line":1114,"column":0},"end":{"line":1114,"column":65}},"1114":{"start":{"line":1115,"column":0},"end":{"line":1115,"column":91}},"1115":{"start":{"line":1116,"column":0},"end":{"line":1116,"column":28}},"1116":{"start":{"line":1117,"column":0},"end":{"line":1117,"column":68}},"1117":{"start":{"line":1118,"column":0},"end":{"line":1118,"column":102}},"1118":{"start":{"line":1119,"column":0},"end":{"line":1119,"column":28}},"1119":{"start":{"line":1120,"column":0},"end":{"line":1120,"column":26}},"1122":{"start":{"line":1123,"column":0},"end":{"line":1123,"column":66}},"1123":{"start":{"line":1124,"column":0},"end":{"line":1124,"column":92}},"1124":{"start":{"line":1125,"column":0},"end":{"line":1125,"column":56}},"1126":{"start":{"line":1127,"column":0},"end":{"line":1127,"column":28}},"1127":{"start":{"line":1128,"column":0},"end":{"line":1128,"column":68}},"1128":{"start":{"line":1129,"column":0},"end":{"line":1129,"column":65}},"1129":{"start":{"line":1130,"column":0},"end":{"line":1130,"column":93}},"1130":{"start":{"line":1131,"column":0},"end":{"line":1131,"column":28}},"1131":{"start":{"line":1132,"column":0},"end":{"line":1132,"column":82}},"1132":{"start":{"line":1133,"column":0},"end":{"line":1133,"column":70}},"1133":{"start":{"line":1134,"column":0},"end":{"line":1134,"column":131}},"1134":{"start":{"line":1135,"column":0},"end":{"line":1135,"column":30}},"1136":{"start":{"line":1137,"column":0},"end":{"line":1137,"column":26}},"1139":{"start":{"line":1140,"column":0},"end":{"line":1140,"column":66}},"1140":{"start":{"line":1141,"column":0},"end":{"line":1141,"column":92}},"1141":{"start":{"line":1142,"column":0},"end":{"line":1142,"column":58}},"1143":{"start":{"line":1144,"column":0},"end":{"line":1144,"column":28}},"1144":{"start":{"line":1145,"column":0},"end":{"line":1145,"column":68}},"1145":{"start":{"line":1146,"column":0},"end":{"line":1146,"column":69}},"1146":{"start":{"line":1147,"column":0},"end":{"line":1147,"column":93}},"1147":{"start":{"line":1148,"column":0},"end":{"line":1148,"column":28}},"1148":{"start":{"line":1149,"column":0},"end":{"line":1149,"column":82}},"1149":{"start":{"line":1150,"column":0},"end":{"line":1150,"column":70}},"1150":{"start":{"line":1151,"column":0},"end":{"line":1151,"column":135}},"1151":{"start":{"line":1152,"column":0},"end":{"line":1152,"column":30}},"1153":{"start":{"line":1154,"column":0},"end":{"line":1154,"column":26}},"1156":{"start":{"line":1157,"column":0},"end":{"line":1157,"column":66}},"1157":{"start":{"line":1158,"column":0},"end":{"line":1158,"column":92}},"1158":{"start":{"line":1159,"column":0},"end":{"line":1159,"column":58}},"1160":{"start":{"line":1161,"column":0},"end":{"line":1161,"column":28}},"1161":{"start":{"line":1162,"column":0},"end":{"line":1162,"column":68}},"1162":{"start":{"line":1163,"column":0},"end":{"line":1163,"column":68}},"1163":{"start":{"line":1164,"column":0},"end":{"line":1164,"column":93}},"1164":{"start":{"line":1165,"column":0},"end":{"line":1165,"column":28}},"1165":{"start":{"line":1166,"column":0},"end":{"line":1166,"column":82}},"1166":{"start":{"line":1167,"column":0},"end":{"line":1167,"column":70}},"1167":{"start":{"line":1168,"column":0},"end":{"line":1168,"column":134}},"1168":{"start":{"line":1169,"column":0},"end":{"line":1169,"column":30}},"1170":{"start":{"line":1171,"column":0},"end":{"line":1171,"column":26}},"1171":{"start":{"line":1172,"column":0},"end":{"line":1172,"column":24}},"1172":{"start":{"line":1173,"column":0},"end":{"line":1173,"column":38}},"1173":{"start":{"line":1174,"column":0},"end":{"line":1174,"column":57}},"1175":{"start":{"line":1176,"column":0},"end":{"line":1176,"column":22}},"1176":{"start":{"line":1177,"column":0},"end":{"line":1177,"column":25}},"1177":{"start":{"line":1178,"column":0},"end":{"line":1178,"column":28}},"1178":{"start":{"line":1179,"column":0},"end":{"line":1179,"column":19}},"1181":{"start":{"line":1182,"column":0},"end":{"line":1182,"column":27}},"1182":{"start":{"line":1183,"column":0},"end":{"line":1183,"column":55}},"1183":{"start":{"line":1184,"column":0},"end":{"line":1184,"column":75}},"1184":{"start":{"line":1185,"column":0},"end":{"line":1185,"column":18}},"1185":{"start":{"line":1186,"column":0},"end":{"line":1186,"column":53}},"1186":{"start":{"line":1187,"column":0},"end":{"line":1187,"column":82}},"1187":{"start":{"line":1188,"column":0},"end":{"line":1188,"column":41}},"1188":{"start":{"line":1189,"column":0},"end":{"line":1189,"column":30}},"1189":{"start":{"line":1190,"column":0},"end":{"line":1190,"column":31}},"1190":{"start":{"line":1191,"column":0},"end":{"line":1191,"column":29}},"1191":{"start":{"line":1192,"column":0},"end":{"line":1192,"column":34}},"1192":{"start":{"line":1193,"column":0},"end":{"line":1193,"column":38}},"1193":{"start":{"line":1194,"column":0},"end":{"line":1194,"column":43}},"1194":{"start":{"line":1195,"column":0},"end":{"line":1195,"column":20}},"1195":{"start":{"line":1196,"column":0},"end":{"line":1196,"column":18}},"1196":{"start":{"line":1197,"column":0},"end":{"line":1197,"column":17}},"1197":{"start":{"line":1198,"column":0},"end":{"line":1198,"column":18}},"1199":{"start":{"line":1200,"column":0},"end":{"line":1200,"column":18}},"1200":{"start":{"line":1201,"column":0},"end":{"line":1201,"column":45}},"1201":{"start":{"line":1202,"column":0},"end":{"line":1202,"column":61}},"1202":{"start":{"line":1203,"column":0},"end":{"line":1203,"column":72}},"1203":{"start":{"line":1204,"column":0},"end":{"line":1204,"column":98}},"1204":{"start":{"line":1205,"column":0},"end":{"line":1205,"column":130}},"1205":{"start":{"line":1206,"column":0},"end":{"line":1206,"column":25}},"1206":{"start":{"line":1207,"column":0},"end":{"line":1207,"column":36}},"1207":{"start":{"line":1208,"column":0},"end":{"line":1208,"column":43}},"1208":{"start":{"line":1209,"column":0},"end":{"line":1209,"column":45}},"1209":{"start":{"line":1210,"column":0},"end":{"line":1210,"column":22}},"1211":{"start":{"line":1212,"column":0},"end":{"line":1212,"column":48}},"1213":{"start":{"line":1214,"column":0},"end":{"line":1214,"column":27}},"1214":{"start":{"line":1215,"column":0},"end":{"line":1215,"column":22}},"1215":{"start":{"line":1216,"column":0},"end":{"line":1216,"column":28}},"1216":{"start":{"line":1217,"column":0},"end":{"line":1217,"column":19}},"1218":{"start":{"line":1219,"column":0},"end":{"line":1219,"column":14}},"1222":{"start":{"line":1223,"column":0},"end":{"line":1223,"column":41}},"1223":{"start":{"line":1224,"column":0},"end":{"line":1224,"column":63}},"1225":{"start":{"line":1226,"column":0},"end":{"line":1226,"column":15}},"1226":{"start":{"line":1227,"column":0},"end":{"line":1227,"column":68}},"1227":{"start":{"line":1228,"column":0},"end":{"line":1228,"column":87}},"1228":{"start":{"line":1229,"column":0},"end":{"line":1229,"column":61}},"1230":{"start":{"line":1231,"column":0},"end":{"line":1231,"column":19}},"1231":{"start":{"line":1232,"column":0},"end":{"line":1232,"column":55}},"1232":{"start":{"line":1233,"column":0},"end":{"line":1233,"column":23}},"1233":{"start":{"line":1234,"column":0},"end":{"line":1234,"column":27}},"1234":{"start":{"line":1235,"column":0},"end":{"line":1235,"column":37}},"1235":{"start":{"line":1236,"column":0},"end":{"line":1236,"column":56}},"1237":{"start":{"line":1238,"column":0},"end":{"line":1238,"column":49}},"1239":{"start":{"line":1240,"column":0},"end":{"line":1240,"column":25}},"1240":{"start":{"line":1241,"column":0},"end":{"line":1241,"column":79}},"1241":{"start":{"line":1242,"column":0},"end":{"line":1242,"column":25}},"1242":{"start":{"line":1243,"column":0},"end":{"line":1243,"column":29}},"1243":{"start":{"line":1244,"column":0},"end":{"line":1244,"column":39}},"1244":{"start":{"line":1245,"column":0},"end":{"line":1245,"column":36}},"1245":{"start":{"line":1246,"column":0},"end":{"line":1246,"column":45}},"1246":{"start":{"line":1247,"column":0},"end":{"line":1247,"column":47}},"1247":{"start":{"line":1248,"column":0},"end":{"line":1248,"column":22}},"1248":{"start":{"line":1249,"column":0},"end":{"line":1249,"column":56}},"1250":{"start":{"line":1251,"column":0},"end":{"line":1251,"column":50}},"1251":{"start":{"line":1252,"column":0},"end":{"line":1252,"column":66}},"1253":{"start":{"line":1254,"column":0},"end":{"line":1254,"column":50}},"1254":{"start":{"line":1255,"column":0},"end":{"line":1255,"column":22}},"1256":{"start":{"line":1257,"column":0},"end":{"line":1257,"column":27}},"1258":{"start":{"line":1259,"column":0},"end":{"line":1259,"column":23}},"1259":{"start":{"line":1260,"column":0},"end":{"line":1260,"column":27}},"1260":{"start":{"line":1261,"column":0},"end":{"line":1261,"column":34}},"1261":{"start":{"line":1262,"column":0},"end":{"line":1262,"column":45}},"1262":{"start":{"line":1263,"column":0},"end":{"line":1263,"column":51}},"1263":{"start":{"line":1264,"column":0},"end":{"line":1264,"column":20}},"1265":{"start":{"line":1266,"column":0},"end":{"line":1266,"column":46}},"1267":{"start":{"line":1268,"column":0},"end":{"line":1268,"column":25}},"1268":{"start":{"line":1269,"column":0},"end":{"line":1269,"column":20}},"1269":{"start":{"line":1270,"column":0},"end":{"line":1270,"column":18}},"1272":{"start":{"line":1273,"column":0},"end":{"line":1273,"column":35}},"1273":{"start":{"line":1274,"column":0},"end":{"line":1274,"column":44}},"1274":{"start":{"line":1275,"column":0},"end":{"line":1275,"column":67}},"1275":{"start":{"line":1276,"column":0},"end":{"line":1276,"column":23}},"1276":{"start":{"line":1277,"column":0},"end":{"line":1277,"column":106}},"1277":{"start":{"line":1278,"column":0},"end":{"line":1278,"column":110}},"1278":{"start":{"line":1279,"column":0},"end":{"line":1279,"column":24}},"1279":{"start":{"line":1280,"column":0},"end":{"line":1280,"column":25}},"1280":{"start":{"line":1281,"column":0},"end":{"line":1281,"column":71}},"1281":{"start":{"line":1282,"column":0},"end":{"line":1282,"column":92}},"1282":{"start":{"line":1283,"column":0},"end":{"line":1283,"column":173}},"1284":{"start":{"line":1285,"column":0},"end":{"line":1285,"column":55}},"1285":{"start":{"line":1286,"column":0},"end":{"line":1286,"column":64}},"1286":{"start":{"line":1287,"column":0},"end":{"line":1287,"column":41}},"1287":{"start":{"line":1288,"column":0},"end":{"line":1288,"column":31}},"1288":{"start":{"line":1289,"column":0},"end":{"line":1289,"column":23}},"1289":{"start":{"line":1290,"column":0},"end":{"line":1290,"column":27}},"1290":{"start":{"line":1291,"column":0},"end":{"line":1291,"column":22}},"1291":{"start":{"line":1292,"column":0},"end":{"line":1292,"column":28}},"1292":{"start":{"line":1293,"column":0},"end":{"line":1293,"column":19}},"1295":{"start":{"line":1296,"column":0},"end":{"line":1296,"column":31}},"1296":{"start":{"line":1297,"column":0},"end":{"line":1297,"column":37}},"1297":{"start":{"line":1298,"column":0},"end":{"line":1298,"column":46}},"1298":{"start":{"line":1299,"column":0},"end":{"line":1299,"column":74}},"1299":{"start":{"line":1300,"column":0},"end":{"line":1300,"column":88}},"1300":{"start":{"line":1301,"column":0},"end":{"line":1301,"column":27}},"1301":{"start":{"line":1302,"column":0},"end":{"line":1302,"column":60}},"1302":{"start":{"line":1303,"column":0},"end":{"line":1303,"column":74}},"1303":{"start":{"line":1304,"column":0},"end":{"line":1304,"column":21}},"1305":{"start":{"line":1306,"column":0},"end":{"line":1306,"column":29}},"1306":{"start":{"line":1307,"column":0},"end":{"line":1307,"column":24}},"1307":{"start":{"line":1308,"column":0},"end":{"line":1308,"column":72}},"1308":{"start":{"line":1309,"column":0},"end":{"line":1309,"column":79}},"1309":{"start":{"line":1310,"column":0},"end":{"line":1310,"column":57}},"1310":{"start":{"line":1311,"column":0},"end":{"line":1311,"column":52}},"1311":{"start":{"line":1312,"column":0},"end":{"line":1312,"column":27}},"1312":{"start":{"line":1313,"column":0},"end":{"line":1313,"column":50}},"1313":{"start":{"line":1314,"column":0},"end":{"line":1314,"column":77}},"1314":{"start":{"line":1315,"column":0},"end":{"line":1315,"column":55}},"1315":{"start":{"line":1316,"column":0},"end":{"line":1316,"column":53}},"1316":{"start":{"line":1317,"column":0},"end":{"line":1317,"column":29}},"1318":{"start":{"line":1319,"column":0},"end":{"line":1319,"column":24}},"1319":{"start":{"line":1320,"column":0},"end":{"line":1320,"column":80}},"1320":{"start":{"line":1321,"column":0},"end":{"line":1321,"column":93}},"1321":{"start":{"line":1322,"column":0},"end":{"line":1322,"column":86}},"1322":{"start":{"line":1323,"column":0},"end":{"line":1323,"column":87}},"1323":{"start":{"line":1324,"column":0},"end":{"line":1324,"column":103}},"1324":{"start":{"line":1325,"column":0},"end":{"line":1325,"column":30}},"1325":{"start":{"line":1326,"column":0},"end":{"line":1326,"column":25}},"1326":{"start":{"line":1327,"column":0},"end":{"line":1327,"column":26}},"1328":{"start":{"line":1329,"column":0},"end":{"line":1329,"column":30}},"1329":{"start":{"line":1330,"column":0},"end":{"line":1330,"column":21}},"1332":{"start":{"line":1333,"column":0},"end":{"line":1333,"column":33}},"1333":{"start":{"line":1334,"column":0},"end":{"line":1334,"column":57}},"1334":{"start":{"line":1335,"column":0},"end":{"line":1335,"column":77}},"1335":{"start":{"line":1336,"column":0},"end":{"line":1336,"column":20}},"1336":{"start":{"line":1337,"column":0},"end":{"line":1337,"column":77}},"1337":{"start":{"line":1338,"column":0},"end":{"line":1338,"column":41}},"1338":{"start":{"line":1339,"column":0},"end":{"line":1339,"column":58}},"1339":{"start":{"line":1340,"column":0},"end":{"line":1340,"column":43}},"1340":{"start":{"line":1341,"column":0},"end":{"line":1341,"column":37}},"1341":{"start":{"line":1342,"column":0},"end":{"line":1342,"column":39}},"1342":{"start":{"line":1343,"column":0},"end":{"line":1343,"column":36}},"1343":{"start":{"line":1344,"column":0},"end":{"line":1344,"column":44}},"1344":{"start":{"line":1345,"column":0},"end":{"line":1345,"column":53}},"1345":{"start":{"line":1346,"column":0},"end":{"line":1346,"column":22}},"1346":{"start":{"line":1347,"column":0},"end":{"line":1347,"column":20}},"1347":{"start":{"line":1348,"column":0},"end":{"line":1348,"column":19}},"1348":{"start":{"line":1349,"column":0},"end":{"line":1349,"column":20}},"1350":{"start":{"line":1351,"column":0},"end":{"line":1351,"column":20}},"1351":{"start":{"line":1352,"column":0},"end":{"line":1352,"column":46}},"1352":{"start":{"line":1353,"column":0},"end":{"line":1353,"column":63}},"1353":{"start":{"line":1354,"column":0},"end":{"line":1354,"column":74}},"1354":{"start":{"line":1355,"column":0},"end":{"line":1355,"column":98}},"1355":{"start":{"line":1356,"column":0},"end":{"line":1356,"column":85}},"1356":{"start":{"line":1357,"column":0},"end":{"line":1357,"column":27}},"1357":{"start":{"line":1358,"column":0},"end":{"line":1358,"column":31}},"1358":{"start":{"line":1359,"column":0},"end":{"line":1359,"column":38}},"1359":{"start":{"line":1360,"column":0},"end":{"line":1360,"column":49}},"1360":{"start":{"line":1361,"column":0},"end":{"line":1361,"column":55}},"1361":{"start":{"line":1362,"column":0},"end":{"line":1362,"column":24}},"1363":{"start":{"line":1364,"column":0},"end":{"line":1364,"column":50}},"1365":{"start":{"line":1366,"column":0},"end":{"line":1366,"column":29}},"1366":{"start":{"line":1367,"column":0},"end":{"line":1367,"column":24}},"1367":{"start":{"line":1368,"column":0},"end":{"line":1368,"column":30}},"1368":{"start":{"line":1369,"column":0},"end":{"line":1369,"column":21}},"1370":{"start":{"line":1371,"column":0},"end":{"line":1371,"column":16}},"1373":{"start":{"line":1374,"column":0},"end":{"line":1374,"column":15}},"1374":{"start":{"line":1375,"column":0},"end":{"line":1375,"column":90}},"1375":{"start":{"line":1376,"column":0},"end":{"line":1376,"column":63}},"1377":{"start":{"line":1378,"column":0},"end":{"line":1378,"column":17}},"1378":{"start":{"line":1379,"column":0},"end":{"line":1379,"column":56}},"1380":{"start":{"line":1381,"column":0},"end":{"line":1381,"column":16}},"1382":{"start":{"line":1383,"column":0},"end":{"line":1383,"column":33}},"1383":{"start":{"line":1384,"column":0},"end":{"line":1384,"column":56}},"1384":{"start":{"line":1385,"column":0},"end":{"line":1385,"column":77}},"1385":{"start":{"line":1386,"column":0},"end":{"line":1386,"column":20}},"1386":{"start":{"line":1387,"column":0},"end":{"line":1387,"column":77}},"1387":{"start":{"line":1388,"column":0},"end":{"line":1388,"column":41}},"1388":{"start":{"line":1389,"column":0},"end":{"line":1389,"column":58}},"1389":{"start":{"line":1390,"column":0},"end":{"line":1390,"column":23}},"1390":{"start":{"line":1391,"column":0},"end":{"line":1391,"column":37}},"1391":{"start":{"line":1392,"column":0},"end":{"line":1392,"column":92}},"1392":{"start":{"line":1393,"column":0},"end":{"line":1393,"column":64}},"1394":{"start":{"line":1395,"column":0},"end":{"line":1395,"column":57}},"1395":{"start":{"line":1396,"column":0},"end":{"line":1396,"column":73}},"1396":{"start":{"line":1397,"column":0},"end":{"line":1397,"column":56}},"1397":{"start":{"line":1398,"column":0},"end":{"line":1398,"column":100}},"1398":{"start":{"line":1399,"column":0},"end":{"line":1399,"column":81}},"1399":{"start":{"line":1400,"column":0},"end":{"line":1400,"column":53}},"1400":{"start":{"line":1401,"column":0},"end":{"line":1401,"column":30}},"1401":{"start":{"line":1402,"column":0},"end":{"line":1402,"column":30}},"1402":{"start":{"line":1403,"column":0},"end":{"line":1403,"column":31}},"1403":{"start":{"line":1404,"column":0},"end":{"line":1404,"column":112}},"1404":{"start":{"line":1405,"column":0},"end":{"line":1405,"column":43}},"1405":{"start":{"line":1406,"column":0},"end":{"line":1406,"column":48}},"1406":{"start":{"line":1407,"column":0},"end":{"line":1407,"column":57}},"1407":{"start":{"line":1408,"column":0},"end":{"line":1408,"column":28}},"1409":{"start":{"line":1410,"column":0},"end":{"line":1410,"column":71}},"1410":{"start":{"line":1411,"column":0},"end":{"line":1411,"column":33}},"1411":{"start":{"line":1412,"column":0},"end":{"line":1412,"column":28}},"1412":{"start":{"line":1413,"column":0},"end":{"line":1413,"column":34}},"1413":{"start":{"line":1414,"column":0},"end":{"line":1414,"column":25}},"1414":{"start":{"line":1415,"column":0},"end":{"line":1415,"column":19}},"1415":{"start":{"line":1416,"column":0},"end":{"line":1416,"column":20}},"1417":{"start":{"line":1418,"column":0},"end":{"line":1418,"column":20}},"1418":{"start":{"line":1419,"column":0},"end":{"line":1419,"column":46}},"1419":{"start":{"line":1420,"column":0},"end":{"line":1420,"column":63}},"1420":{"start":{"line":1421,"column":0},"end":{"line":1421,"column":78}},"1421":{"start":{"line":1422,"column":0},"end":{"line":1422,"column":117}},"1422":{"start":{"line":1423,"column":0},"end":{"line":1423,"column":24}},"1423":{"start":{"line":1424,"column":0},"end":{"line":1424,"column":30}},"1424":{"start":{"line":1425,"column":0},"end":{"line":1425,"column":21}},"1426":{"start":{"line":1427,"column":0},"end":{"line":1427,"column":16}},"1427":{"start":{"line":1428,"column":0},"end":{"line":1428,"column":14}},"1431":{"start":{"line":1432,"column":0},"end":{"line":1432,"column":35}},"1432":{"start":{"line":1433,"column":0},"end":{"line":1433,"column":35}},"1433":{"start":{"line":1434,"column":0},"end":{"line":1434,"column":71}},"1434":{"start":{"line":1435,"column":0},"end":{"line":1435,"column":36}},"1435":{"start":{"line":1436,"column":0},"end":{"line":1436,"column":87}},"1436":{"start":{"line":1437,"column":0},"end":{"line":1437,"column":60}},"1438":{"start":{"line":1439,"column":0},"end":{"line":1439,"column":19}},"1439":{"start":{"line":1440,"column":0},"end":{"line":1440,"column":58}},"1441":{"start":{"line":1442,"column":0},"end":{"line":1442,"column":18}},"1442":{"start":{"line":1443,"column":0},"end":{"line":1443,"column":18}},"1443":{"start":{"line":1444,"column":0},"end":{"line":1444,"column":98}},"1444":{"start":{"line":1445,"column":0},"end":{"line":1445,"column":42}},"1446":{"start":{"line":1447,"column":0},"end":{"line":1447,"column":21}},"1447":{"start":{"line":1448,"column":0},"end":{"line":1448,"column":16}},"1450":{"start":{"line":1451,"column":0},"end":{"line":1451,"column":29}},"1451":{"start":{"line":1452,"column":0},"end":{"line":1452,"column":54}},"1452":{"start":{"line":1453,"column":0},"end":{"line":1453,"column":44}},"1453":{"start":{"line":1454,"column":0},"end":{"line":1454,"column":56}},"1454":{"start":{"line":1455,"column":0},"end":{"line":1455,"column":91}},"1455":{"start":{"line":1456,"column":0},"end":{"line":1456,"column":42}},"1456":{"start":{"line":1457,"column":0},"end":{"line":1457,"column":95}},"1457":{"start":{"line":1458,"column":0},"end":{"line":1458,"column":64}},"1459":{"start":{"line":1460,"column":0},"end":{"line":1460,"column":24}},"1460":{"start":{"line":1461,"column":0},"end":{"line":1461,"column":90}},"1461":{"start":{"line":1462,"column":0},"end":{"line":1462,"column":92}},"1462":{"start":{"line":1463,"column":0},"end":{"line":1463,"column":39}},"1463":{"start":{"line":1464,"column":0},"end":{"line":1464,"column":29}},"1464":{"start":{"line":1465,"column":0},"end":{"line":1465,"column":29}},"1465":{"start":{"line":1466,"column":0},"end":{"line":1466,"column":43}},"1466":{"start":{"line":1467,"column":0},"end":{"line":1467,"column":33}},"1467":{"start":{"line":1468,"column":0},"end":{"line":1468,"column":46}},"1468":{"start":{"line":1469,"column":0},"end":{"line":1469,"column":31}},"1469":{"start":{"line":1470,"column":0},"end":{"line":1470,"column":87}},"1470":{"start":{"line":1471,"column":0},"end":{"line":1471,"column":81}},"1471":{"start":{"line":1472,"column":0},"end":{"line":1472,"column":36}},"1473":{"start":{"line":1474,"column":0},"end":{"line":1474,"column":82}},"1474":{"start":{"line":1475,"column":0},"end":{"line":1475,"column":61}},"1475":{"start":{"line":1476,"column":0},"end":{"line":1476,"column":64}},"1476":{"start":{"line":1477,"column":0},"end":{"line":1477,"column":64}},"1477":{"start":{"line":1478,"column":0},"end":{"line":1478,"column":66}},"1478":{"start":{"line":1479,"column":0},"end":{"line":1479,"column":48}},"1479":{"start":{"line":1480,"column":0},"end":{"line":1480,"column":59}},"1480":{"start":{"line":1481,"column":0},"end":{"line":1481,"column":66}},"1481":{"start":{"line":1482,"column":0},"end":{"line":1482,"column":29}},"1482":{"start":{"line":1483,"column":0},"end":{"line":1483,"column":65}},"1483":{"start":{"line":1484,"column":0},"end":{"line":1484,"column":35}},"1484":{"start":{"line":1485,"column":0},"end":{"line":1485,"column":69}},"1485":{"start":{"line":1486,"column":0},"end":{"line":1486,"column":27}},"1486":{"start":{"line":1487,"column":0},"end":{"line":1487,"column":26}},"1488":{"start":{"line":1489,"column":0},"end":{"line":1489,"column":52}},"1489":{"start":{"line":1490,"column":0},"end":{"line":1490,"column":31}},"1490":{"start":{"line":1491,"column":0},"end":{"line":1491,"column":26}},"1491":{"start":{"line":1492,"column":0},"end":{"line":1492,"column":27}},"1492":{"start":{"line":1493,"column":0},"end":{"line":1493,"column":41}},"1493":{"start":{"line":1494,"column":0},"end":{"line":1494,"column":31}},"1494":{"start":{"line":1495,"column":0},"end":{"line":1495,"column":38}},"1495":{"start":{"line":1496,"column":0},"end":{"line":1496,"column":60}},"1496":{"start":{"line":1497,"column":0},"end":{"line":1497,"column":21}},"1498":{"start":{"line":1499,"column":0},"end":{"line":1499,"column":29}},"1499":{"start":{"line":1500,"column":0},"end":{"line":1500,"column":24}},"1500":{"start":{"line":1501,"column":0},"end":{"line":1501,"column":22}},"1501":{"start":{"line":1502,"column":0},"end":{"line":1502,"column":28}},"1502":{"start":{"line":1503,"column":0},"end":{"line":1503,"column":19}},"1506":{"start":{"line":1507,"column":0},"end":{"line":1507,"column":32}},"1507":{"start":{"line":1508,"column":0},"end":{"line":1508,"column":35}},"1508":{"start":{"line":1509,"column":0},"end":{"line":1509,"column":26}},"1509":{"start":{"line":1510,"column":0},"end":{"line":1510,"column":90}},"1510":{"start":{"line":1511,"column":0},"end":{"line":1511,"column":27}},"1511":{"start":{"line":1512,"column":0},"end":{"line":1512,"column":49}},"1512":{"start":{"line":1513,"column":0},"end":{"line":1513,"column":21}},"1513":{"start":{"line":1514,"column":0},"end":{"line":1514,"column":88}},"1514":{"start":{"line":1515,"column":0},"end":{"line":1515,"column":24}},"1515":{"start":{"line":1516,"column":0},"end":{"line":1516,"column":31}},"1516":{"start":{"line":1517,"column":0},"end":{"line":1517,"column":41}},"1517":{"start":{"line":1518,"column":0},"end":{"line":1518,"column":70}},"1518":{"start":{"line":1519,"column":0},"end":{"line":1519,"column":65}},"1519":{"start":{"line":1520,"column":0},"end":{"line":1520,"column":162}},"1520":{"start":{"line":1521,"column":0},"end":{"line":1521,"column":20}},"1521":{"start":{"line":1522,"column":0},"end":{"line":1522,"column":22}},"1522":{"start":{"line":1523,"column":0},"end":{"line":1523,"column":21}},"1523":{"start":{"line":1524,"column":0},"end":{"line":1524,"column":91}},"1524":{"start":{"line":1525,"column":0},"end":{"line":1525,"column":45}},"1525":{"start":{"line":1526,"column":0},"end":{"line":1526,"column":78}},"1526":{"start":{"line":1527,"column":0},"end":{"line":1527,"column":28}},"1527":{"start":{"line":1528,"column":0},"end":{"line":1528,"column":39}},"1528":{"start":{"line":1529,"column":0},"end":{"line":1529,"column":70}},"1529":{"start":{"line":1530,"column":0},"end":{"line":1530,"column":123}},"1530":{"start":{"line":1531,"column":0},"end":{"line":1531,"column":132}},"1531":{"start":{"line":1532,"column":0},"end":{"line":1532,"column":24}},"1532":{"start":{"line":1533,"column":0},"end":{"line":1533,"column":27}},"1533":{"start":{"line":1534,"column":0},"end":{"line":1534,"column":71}},"1534":{"start":{"line":1535,"column":0},"end":{"line":1535,"column":96}},"1535":{"start":{"line":1536,"column":0},"end":{"line":1536,"column":28}},"1536":{"start":{"line":1537,"column":0},"end":{"line":1537,"column":28}},"1537":{"start":{"line":1538,"column":0},"end":{"line":1538,"column":78}},"1538":{"start":{"line":1539,"column":0},"end":{"line":1539,"column":28}},"1539":{"start":{"line":1540,"column":0},"end":{"line":1540,"column":39}},"1540":{"start":{"line":1541,"column":0},"end":{"line":1541,"column":64}},"1541":{"start":{"line":1542,"column":0},"end":{"line":1542,"column":117}},"1542":{"start":{"line":1543,"column":0},"end":{"line":1543,"column":132}},"1543":{"start":{"line":1544,"column":0},"end":{"line":1544,"column":24}},"1544":{"start":{"line":1545,"column":0},"end":{"line":1545,"column":27}},"1545":{"start":{"line":1546,"column":0},"end":{"line":1546,"column":72}},"1546":{"start":{"line":1547,"column":0},"end":{"line":1547,"column":104}},"1547":{"start":{"line":1548,"column":0},"end":{"line":1548,"column":28}},"1548":{"start":{"line":1549,"column":0},"end":{"line":1549,"column":28}},"1549":{"start":{"line":1550,"column":0},"end":{"line":1550,"column":78}},"1550":{"start":{"line":1551,"column":0},"end":{"line":1551,"column":28}},"1551":{"start":{"line":1552,"column":0},"end":{"line":1552,"column":39}},"1552":{"start":{"line":1553,"column":0},"end":{"line":1553,"column":74}},"1553":{"start":{"line":1554,"column":0},"end":{"line":1554,"column":127}},"1554":{"start":{"line":1555,"column":0},"end":{"line":1555,"column":132}},"1555":{"start":{"line":1556,"column":0},"end":{"line":1556,"column":24}},"1556":{"start":{"line":1557,"column":0},"end":{"line":1557,"column":27}},"1557":{"start":{"line":1558,"column":0},"end":{"line":1558,"column":75}},"1558":{"start":{"line":1559,"column":0},"end":{"line":1559,"column":97}},"1559":{"start":{"line":1560,"column":0},"end":{"line":1560,"column":28}},"1560":{"start":{"line":1561,"column":0},"end":{"line":1561,"column":28}},"1561":{"start":{"line":1562,"column":0},"end":{"line":1562,"column":24}},"1562":{"start":{"line":1563,"column":0},"end":{"line":1563,"column":22}},"1563":{"start":{"line":1564,"column":0},"end":{"line":1564,"column":62}},"1564":{"start":{"line":1565,"column":0},"end":{"line":1565,"column":25}},"1565":{"start":{"line":1566,"column":0},"end":{"line":1566,"column":64}},"1566":{"start":{"line":1567,"column":0},"end":{"line":1567,"column":59}},"1567":{"start":{"line":1568,"column":0},"end":{"line":1568,"column":46}},"1568":{"start":{"line":1569,"column":0},"end":{"line":1569,"column":23}},"1569":{"start":{"line":1570,"column":0},"end":{"line":1570,"column":61}},"1571":{"start":{"line":1572,"column":0},"end":{"line":1572,"column":55}},"1572":{"start":{"line":1573,"column":0},"end":{"line":1573,"column":66}},"1574":{"start":{"line":1575,"column":0},"end":{"line":1575,"column":50}},"1575":{"start":{"line":1576,"column":0},"end":{"line":1576,"column":22}},"1577":{"start":{"line":1578,"column":0},"end":{"line":1578,"column":27}},"1578":{"start":{"line":1579,"column":0},"end":{"line":1579,"column":89}},"1580":{"start":{"line":1581,"column":0},"end":{"line":1581,"column":27}},"1581":{"start":{"line":1582,"column":0},"end":{"line":1582,"column":22}},"1582":{"start":{"line":1583,"column":0},"end":{"line":1583,"column":28}},"1583":{"start":{"line":1584,"column":0},"end":{"line":1584,"column":19}},"1587":{"start":{"line":1588,"column":0},"end":{"line":1588,"column":29}},"1588":{"start":{"line":1589,"column":0},"end":{"line":1589,"column":55}},"1589":{"start":{"line":1590,"column":0},"end":{"line":1590,"column":75}},"1590":{"start":{"line":1591,"column":0},"end":{"line":1591,"column":18}},"1591":{"start":{"line":1592,"column":0},"end":{"line":1592,"column":47}},"1592":{"start":{"line":1593,"column":0},"end":{"line":1593,"column":39}},"1593":{"start":{"line":1594,"column":0},"end":{"line":1594,"column":37}},"1594":{"start":{"line":1595,"column":0},"end":{"line":1595,"column":35}},"1595":{"start":{"line":1596,"column":0},"end":{"line":1596,"column":48}},"1596":{"start":{"line":1597,"column":0},"end":{"line":1597,"column":71}},"1597":{"start":{"line":1598,"column":0},"end":{"line":1598,"column":63}},"1598":{"start":{"line":1599,"column":0},"end":{"line":1599,"column":109}},"1599":{"start":{"line":1600,"column":0},"end":{"line":1600,"column":29}},"1600":{"start":{"line":1601,"column":0},"end":{"line":1601,"column":78}},"1601":{"start":{"line":1602,"column":0},"end":{"line":1602,"column":65}},"1602":{"start":{"line":1603,"column":0},"end":{"line":1603,"column":52}},"1603":{"start":{"line":1604,"column":0},"end":{"line":1604,"column":110}},"1604":{"start":{"line":1605,"column":0},"end":{"line":1605,"column":30}},"1605":{"start":{"line":1606,"column":0},"end":{"line":1606,"column":30}},"1606":{"start":{"line":1607,"column":0},"end":{"line":1607,"column":28}},"1607":{"start":{"line":1608,"column":0},"end":{"line":1608,"column":63}},"1608":{"start":{"line":1609,"column":0},"end":{"line":1609,"column":60}},"1609":{"start":{"line":1610,"column":0},"end":{"line":1610,"column":51}},"1610":{"start":{"line":1611,"column":0},"end":{"line":1611,"column":108}},"1612":{"start":{"line":1613,"column":0},"end":{"line":1613,"column":45}},"1613":{"start":{"line":1614,"column":0},"end":{"line":1614,"column":111}},"1615":{"start":{"line":1616,"column":0},"end":{"line":1616,"column":55}},"1616":{"start":{"line":1617,"column":0},"end":{"line":1617,"column":115}},"1618":{"start":{"line":1619,"column":0},"end":{"line":1619,"column":30}},"1619":{"start":{"line":1620,"column":0},"end":{"line":1620,"column":31}},"1620":{"start":{"line":1621,"column":0},"end":{"line":1621,"column":45}},"1621":{"start":{"line":1622,"column":0},"end":{"line":1622,"column":35}},"1622":{"start":{"line":1623,"column":0},"end":{"line":1623,"column":76}},"1624":{"start":{"line":1625,"column":0},"end":{"line":1625,"column":69}},"1625":{"start":{"line":1626,"column":0},"end":{"line":1626,"column":33}},"1626":{"start":{"line":1627,"column":0},"end":{"line":1627,"column":28}},"1627":{"start":{"line":1628,"column":0},"end":{"line":1628,"column":26}},"1628":{"start":{"line":1629,"column":0},"end":{"line":1629,"column":32}},"1629":{"start":{"line":1630,"column":0},"end":{"line":1630,"column":23}},"1630":{"start":{"line":1631,"column":0},"end":{"line":1631,"column":17}},"1631":{"start":{"line":1632,"column":0},"end":{"line":1632,"column":18}},"1633":{"start":{"line":1634,"column":0},"end":{"line":1634,"column":18}},"1634":{"start":{"line":1635,"column":0},"end":{"line":1635,"column":45}},"1635":{"start":{"line":1636,"column":0},"end":{"line":1636,"column":61}},"1636":{"start":{"line":1637,"column":0},"end":{"line":1637,"column":71}},"1637":{"start":{"line":1638,"column":0},"end":{"line":1638,"column":84}},"1638":{"start":{"line":1639,"column":0},"end":{"line":1639,"column":104}},"1639":{"start":{"line":1640,"column":0},"end":{"line":1640,"column":68}},"1640":{"start":{"line":1641,"column":0},"end":{"line":1641,"column":48}},"1642":{"start":{"line":1643,"column":0},"end":{"line":1643,"column":27}},"1643":{"start":{"line":1644,"column":0},"end":{"line":1644,"column":22}},"1644":{"start":{"line":1645,"column":0},"end":{"line":1645,"column":28}},"1645":{"start":{"line":1646,"column":0},"end":{"line":1646,"column":19}},"1649":{"start":{"line":1650,"column":0},"end":{"line":1650,"column":33}},"1650":{"start":{"line":1651,"column":0},"end":{"line":1651,"column":24}},"1651":{"start":{"line":1652,"column":0},"end":{"line":1652,"column":87}},"1652":{"start":{"line":1653,"column":0},"end":{"line":1653,"column":25}},"1653":{"start":{"line":1654,"column":0},"end":{"line":1654,"column":55}},"1654":{"start":{"line":1655,"column":0},"end":{"line":1655,"column":45}},"1655":{"start":{"line":1656,"column":0},"end":{"line":1656,"column":99}},"1656":{"start":{"line":1657,"column":0},"end":{"line":1657,"column":18}},"1657":{"start":{"line":1658,"column":0},"end":{"line":1658,"column":59}},"1658":{"start":{"line":1659,"column":0},"end":{"line":1659,"column":59}},"1659":{"start":{"line":1660,"column":0},"end":{"line":1660,"column":65}},"1660":{"start":{"line":1661,"column":0},"end":{"line":1661,"column":76}},"1661":{"start":{"line":1662,"column":0},"end":{"line":1662,"column":84}},"1662":{"start":{"line":1663,"column":0},"end":{"line":1663,"column":22}},"1663":{"start":{"line":1664,"column":0},"end":{"line":1664,"column":59}},"1664":{"start":{"line":1665,"column":0},"end":{"line":1665,"column":65}},"1665":{"start":{"line":1666,"column":0},"end":{"line":1666,"column":80}},"1666":{"start":{"line":1667,"column":0},"end":{"line":1667,"column":89}},"1667":{"start":{"line":1668,"column":0},"end":{"line":1668,"column":22}},"1668":{"start":{"line":1669,"column":0},"end":{"line":1669,"column":59}},"1669":{"start":{"line":1670,"column":0},"end":{"line":1670,"column":67}},"1670":{"start":{"line":1671,"column":0},"end":{"line":1671,"column":75}},"1671":{"start":{"line":1672,"column":0},"end":{"line":1672,"column":80}},"1672":{"start":{"line":1673,"column":0},"end":{"line":1673,"column":22}},"1673":{"start":{"line":1674,"column":0},"end":{"line":1674,"column":59}},"1674":{"start":{"line":1675,"column":0},"end":{"line":1675,"column":68}},"1675":{"start":{"line":1676,"column":0},"end":{"line":1676,"column":87}},"1676":{"start":{"line":1677,"column":0},"end":{"line":1677,"column":73}},"1677":{"start":{"line":1678,"column":0},"end":{"line":1678,"column":22}},"1678":{"start":{"line":1679,"column":0},"end":{"line":1679,"column":59}},"1679":{"start":{"line":1680,"column":0},"end":{"line":1680,"column":68}},"1680":{"start":{"line":1681,"column":0},"end":{"line":1681,"column":88}},"1681":{"start":{"line":1682,"column":0},"end":{"line":1682,"column":74}},"1682":{"start":{"line":1683,"column":0},"end":{"line":1683,"column":22}},"1683":{"start":{"line":1684,"column":0},"end":{"line":1684,"column":59}},"1684":{"start":{"line":1685,"column":0},"end":{"line":1685,"column":65}},"1685":{"start":{"line":1686,"column":0},"end":{"line":1686,"column":86}},"1686":{"start":{"line":1687,"column":0},"end":{"line":1687,"column":72}},"1687":{"start":{"line":1688,"column":0},"end":{"line":1688,"column":22}},"1688":{"start":{"line":1689,"column":0},"end":{"line":1689,"column":20}},"1689":{"start":{"line":1690,"column":0},"end":{"line":1690,"column":26}},"1690":{"start":{"line":1691,"column":0},"end":{"line":1691,"column":17}},"1691":{"start":{"line":1692,"column":0},"end":{"line":1692,"column":14}},"1695":{"start":{"line":1696,"column":0},"end":{"line":1696,"column":44}},"1696":{"start":{"line":1697,"column":0},"end":{"line":1697,"column":21}},"1697":{"start":{"line":1698,"column":0},"end":{"line":1698,"column":32}},"1698":{"start":{"line":1699,"column":0},"end":{"line":1699,"column":116}},"1699":{"start":{"line":1700,"column":0},"end":{"line":1700,"column":34}},"1700":{"start":{"line":1701,"column":0},"end":{"line":1701,"column":26}},"1701":{"start":{"line":1702,"column":0},"end":{"line":1702,"column":28}},"1702":{"start":{"line":1703,"column":0},"end":{"line":1703,"column":65}},"1703":{"start":{"line":1704,"column":0},"end":{"line":1704,"column":45}},"1704":{"start":{"line":1705,"column":0},"end":{"line":1705,"column":12}},"1705":{"start":{"line":1706,"column":0},"end":{"line":1706,"column":59}},"1706":{"start":{"line":1707,"column":0},"end":{"line":1707,"column":10}},"1710":{"start":{"line":1711,"column":0},"end":{"line":1711,"column":25}},"1711":{"start":{"line":1712,"column":0},"end":{"line":1712,"column":26}},"1712":{"start":{"line":1713,"column":0},"end":{"line":1713,"column":28}},"1713":{"start":{"line":1714,"column":0},"end":{"line":1714,"column":26}},"1714":{"start":{"line":1715,"column":0},"end":{"line":1715,"column":36}},"1715":{"start":{"line":1716,"column":0},"end":{"line":1716,"column":33}},"1716":{"start":{"line":1717,"column":0},"end":{"line":1717,"column":12}},"1717":{"start":{"line":1718,"column":0},"end":{"line":1718,"column":10}},"1721":{"start":{"line":1722,"column":0},"end":{"line":1722,"column":33}},"1722":{"start":{"line":1723,"column":0},"end":{"line":1723,"column":29}},"1723":{"start":{"line":1724,"column":0},"end":{"line":1724,"column":36}},"1724":{"start":{"line":1725,"column":0},"end":{"line":1725,"column":26}},"1725":{"start":{"line":1726,"column":0},"end":{"line":1726,"column":44}},"1726":{"start":{"line":1727,"column":0},"end":{"line":1727,"column":37}},"1727":{"start":{"line":1728,"column":0},"end":{"line":1728,"column":12}},"1728":{"start":{"line":1729,"column":0},"end":{"line":1729,"column":10}},"1732":{"start":{"line":1733,"column":0},"end":{"line":1733,"column":27}},"1733":{"start":{"line":1734,"column":0},"end":{"line":1734,"column":35}},"1734":{"start":{"line":1735,"column":0},"end":{"line":1735,"column":36}},"1735":{"start":{"line":1736,"column":0},"end":{"line":1736,"column":50}},"1736":{"start":{"line":1737,"column":0},"end":{"line":1737,"column":10}},"1740":{"start":{"line":1741,"column":0},"end":{"line":1741,"column":25}},"1741":{"start":{"line":1742,"column":0},"end":{"line":1742,"column":30}},"1742":{"start":{"line":1743,"column":0},"end":{"line":1743,"column":49}},"1743":{"start":{"line":1744,"column":0},"end":{"line":1744,"column":10}},"1747":{"start":{"line":1748,"column":0},"end":{"line":1748,"column":32}},"1748":{"start":{"line":1749,"column":0},"end":{"line":1749,"column":21}},"1749":{"start":{"line":1750,"column":0},"end":{"line":1750,"column":41}},"1750":{"start":{"line":1751,"column":0},"end":{"line":1751,"column":120}},"1751":{"start":{"line":1752,"column":0},"end":{"line":1752,"column":34}},"1752":{"start":{"line":1753,"column":0},"end":{"line":1753,"column":27}},"1753":{"start":{"line":1754,"column":0},"end":{"line":1754,"column":34}},"1754":{"start":{"line":1755,"column":0},"end":{"line":1755,"column":43}},"1755":{"start":{"line":1756,"column":0},"end":{"line":1756,"column":17}},"1756":{"start":{"line":1757,"column":0},"end":{"line":1757,"column":65}},"1757":{"start":{"line":1758,"column":0},"end":{"line":1758,"column":51}},"1758":{"start":{"line":1759,"column":0},"end":{"line":1759,"column":21}},"1759":{"start":{"line":1760,"column":0},"end":{"line":1760,"column":57}},"1760":{"start":{"line":1761,"column":0},"end":{"line":1761,"column":13}},"1761":{"start":{"line":1762,"column":0},"end":{"line":1762,"column":12}},"1762":{"start":{"line":1763,"column":0},"end":{"line":1763,"column":57}},"1763":{"start":{"line":1764,"column":0},"end":{"line":1764,"column":10}},"1767":{"start":{"line":1768,"column":0},"end":{"line":1768,"column":35}},"1768":{"start":{"line":1769,"column":0},"end":{"line":1769,"column":21}},"1769":{"start":{"line":1770,"column":0},"end":{"line":1770,"column":38}},"1770":{"start":{"line":1771,"column":0},"end":{"line":1771,"column":248}},"1771":{"start":{"line":1772,"column":0},"end":{"line":1772,"column":41}},"1772":{"start":{"line":1773,"column":0},"end":{"line":1773,"column":27}},"1773":{"start":{"line":1774,"column":0},"end":{"line":1774,"column":28}},"1774":{"start":{"line":1775,"column":0},"end":{"line":1775,"column":46}},"1775":{"start":{"line":1776,"column":0},"end":{"line":1776,"column":33}},"1776":{"start":{"line":1777,"column":0},"end":{"line":1777,"column":72}},"1777":{"start":{"line":1778,"column":0},"end":{"line":1778,"column":61}},"1778":{"start":{"line":1779,"column":0},"end":{"line":1779,"column":12}},"1779":{"start":{"line":1780,"column":0},"end":{"line":1780,"column":60}},"1780":{"start":{"line":1781,"column":0},"end":{"line":1781,"column":10}},"1784":{"start":{"line":1785,"column":0},"end":{"line":1785,"column":31}},"1785":{"start":{"line":1786,"column":0},"end":{"line":1786,"column":21}},"1786":{"start":{"line":1787,"column":0},"end":{"line":1787,"column":81}},"1787":{"start":{"line":1788,"column":0},"end":{"line":1788,"column":238}},"1788":{"start":{"line":1789,"column":0},"end":{"line":1789,"column":81}},"1789":{"start":{"line":1790,"column":0},"end":{"line":1790,"column":72}},"1790":{"start":{"line":1791,"column":0},"end":{"line":1791,"column":28}},"1791":{"start":{"line":1792,"column":0},"end":{"line":1792,"column":47}},"1792":{"start":{"line":1793,"column":0},"end":{"line":1793,"column":41}},"1793":{"start":{"line":1794,"column":0},"end":{"line":1794,"column":50}},"1794":{"start":{"line":1795,"column":0},"end":{"line":1795,"column":12}},"1795":{"start":{"line":1796,"column":0},"end":{"line":1796,"column":55}},"1796":{"start":{"line":1797,"column":0},"end":{"line":1797,"column":10}},"1800":{"start":{"line":1801,"column":0},"end":{"line":1801,"column":27}},"1801":{"start":{"line":1802,"column":0},"end":{"line":1802,"column":20}},"1802":{"start":{"line":1803,"column":0},"end":{"line":1803,"column":51}},"1803":{"start":{"line":1804,"column":0},"end":{"line":1804,"column":43}},"1804":{"start":{"line":1805,"column":0},"end":{"line":1805,"column":38}},"1805":{"start":{"line":1806,"column":0},"end":{"line":1806,"column":17}},"1806":{"start":{"line":1807,"column":0},"end":{"line":1807,"column":76}},"1807":{"start":{"line":1808,"column":0},"end":{"line":1808,"column":52}},"1808":{"start":{"line":1809,"column":0},"end":{"line":1809,"column":52}},"1809":{"start":{"line":1810,"column":0},"end":{"line":1810,"column":27}},"1810":{"start":{"line":1811,"column":0},"end":{"line":1811,"column":36}},"1811":{"start":{"line":1812,"column":0},"end":{"line":1812,"column":24}},"1812":{"start":{"line":1813,"column":0},"end":{"line":1813,"column":39}},"1813":{"start":{"line":1814,"column":0},"end":{"line":1814,"column":56}},"1814":{"start":{"line":1815,"column":0},"end":{"line":1815,"column":27}},"1815":{"start":{"line":1816,"column":0},"end":{"line":1816,"column":60}},"1816":{"start":{"line":1817,"column":0},"end":{"line":1817,"column":13}},"1817":{"start":{"line":1818,"column":0},"end":{"line":1818,"column":12}},"1818":{"start":{"line":1819,"column":0},"end":{"line":1819,"column":10}},"1822":{"start":{"line":1823,"column":0},"end":{"line":1823,"column":28}},"1823":{"start":{"line":1824,"column":0},"end":{"line":1824,"column":21}},"1824":{"start":{"line":1825,"column":0},"end":{"line":1825,"column":52}},"1825":{"start":{"line":1826,"column":0},"end":{"line":1826,"column":49}},"1826":{"start":{"line":1827,"column":0},"end":{"line":1827,"column":59}},"1827":{"start":{"line":1828,"column":0},"end":{"line":1828,"column":12}},"1828":{"start":{"line":1829,"column":0},"end":{"line":1829,"column":28}},"1829":{"start":{"line":1830,"column":0},"end":{"line":1830,"column":44}},"1830":{"start":{"line":1831,"column":0},"end":{"line":1831,"column":12}},"1831":{"start":{"line":1832,"column":0},"end":{"line":1832,"column":10}},"1833":{"start":{"line":1834,"column":0},"end":{"line":1834,"column":10}},"1835":{"start":{"line":1836,"column":0},"end":{"line":1836,"column":1}}},"s":{"0":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"47":0,"48":0,"49":0,"50":0,"51":0,"53":0,"54":0,"55":0,"56":0,"58":0,"59":0,"60":0,"61":0,"63":0,"64":0,"65":0,"66":0,"68":0,"69":0,"70":0,"71":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"90":0,"91":0,"92":0,"93":0,"94":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"119":0,"120":0,"121":0,"122":0,"124":0,"125":0,"126":0,"127":0,"128":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"156":0,"157":0,"158":0,"159":0,"161":0,"162":0,"163":0,"164":0,"166":0,"167":0,"168":0,"169":0,"171":0,"172":0,"173":0,"174":0,"176":0,"177":0,"178":0,"179":0,"180":0,"182":0,"183":0,"184":0,"185":0,"186":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"203":0,"214":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"267":0,"268":0,"271":0,"272":0,"273":0,"275":0,"276":0,"277":0,"278":0,"279":0,"281":0,"282":0,"283":0,"284":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"295":0,"297":0,"298":0,"299":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"321":0,"322":0,"323":0,"326":0,"327":0,"328":0,"331":0,"332":0,"333":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"343":0,"344":0,"345":0,"347":0,"348":0,"349":0,"350":0,"351":0,"353":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"382":0,"384":0,"385":0,"386":0,"387":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"398":0,"400":0,"401":0,"402":0,"403":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"414":0,"416":0,"417":0,"418":0,"419":0,"421":0,"422":0,"425":0,"426":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"477":0,"478":0,"479":0,"480":0,"481":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"492":0,"493":0,"494":0,"495":0,"496":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"507":0,"508":0,"509":0,"510":0,"511":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"536":0,"538":0,"539":0,"540":0,"541":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"612":0,"613":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"653":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"661":0,"662":0,"664":0,"665":0,"666":0,"667":0,"668":0,"670":0,"671":0,"672":0,"673":0,"674":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":0,"682":0,"683":0,"684":0,"685":0,"686":0,"687":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":0,"698":0,"701":0,"702":0,"703":0,"704":0,"705":0,"706":0,"707":0,"708":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":0,"716":0,"717":0,"718":0,"719":0,"720":0,"721":0,"722":0,"723":0,"724":0,"726":0,"727":0,"728":0,"729":0,"730":0,"731":0,"732":0,"733":0,"734":0,"735":0,"736":0,"737":0,"738":0,"739":0,"740":0,"742":0,"743":0,"746":0,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"753":0,"755":0,"756":0,"757":0,"758":0,"759":0,"760":0,"761":0,"762":0,"763":0,"764":0,"765":0,"766":0,"767":0,"768":0,"769":0,"770":0,"772":0,"773":0,"774":0,"775":0,"776":0,"777":0,"778":0,"779":0,"780":0,"781":0,"782":0,"783":0,"784":0,"785":0,"786":0,"787":0,"789":0,"790":0,"793":0,"794":0,"795":0,"796":0,"797":0,"798":0,"799":0,"801":0,"802":0,"803":0,"804":0,"805":0,"806":0,"807":0,"808":0,"809":0,"810":0,"811":0,"812":0,"813":0,"814":0,"816":0,"817":0,"818":0,"819":0,"821":0,"823":0,"824":0,"827":0,"828":0,"829":0,"830":0,"831":0,"832":0,"833":0,"834":0,"835":0,"836":0,"838":0,"839":0,"840":0,"841":0,"842":0,"843":0,"844":0,"845":0,"846":0,"847":0,"848":0,"849":0,"851":0,"852":0,"853":0,"854":0,"855":0,"856":0,"857":0,"858":0,"859":0,"860":0,"861":0,"863":0,"864":0,"866":0,"867":0,"869":0,"870":0,"872":0,"873":0,"874":0,"875":0,"876":0,"877":0,"878":0,"879":0,"880":0,"882":0,"883":0,"884":0,"885":0,"887":0,"888":0,"889":0,"890":0,"891":0,"892":0,"893":0,"894":0,"896":0,"897":0,"899":0,"901":0,"902":0,"903":0,"904":0,"905":0,"906":0,"907":0,"908":0,"909":0,"910":0,"911":0,"912":0,"913":0,"914":0,"915":0,"916":0,"917":0,"918":0,"919":0,"920":0,"921":0,"923":0,"924":0,"925":0,"926":0,"928":0,"929":0,"931":0,"932":0,"934":0,"936":0,"937":0,"938":0,"939":0,"940":0,"941":0,"942":0,"944":0,"945":0,"946":0,"947":0,"948":0,"951":0,"952":0,"953":0,"954":0,"955":0,"957":0,"958":0,"959":0,"960":0,"962":0,"963":0,"964":0,"965":0,"966":0,"967":0,"969":0,"971":0,"972":0,"973":0,"974":0,"975":0,"976":0,"978":0,"979":0,"980":0,"981":0,"982":0,"983":0,"985":0,"987":0,"988":0,"990":0,"991":0,"992":0,"993":0,"994":0,"996":0,"997":0,"998":0,"999":0,"1000":0,"1001":0,"1003":0,"1005":0,"1006":0,"1007":0,"1008":0,"1009":0,"1010":0,"1011":0,"1013":0,"1014":0,"1015":0,"1016":0,"1017":0,"1018":0,"1020":0,"1022":0,"1023":0,"1024":0,"1025":0,"1026":0,"1027":0,"1031":0,"1032":0,"1033":0,"1034":0,"1035":0,"1036":0,"1038":0,"1039":0,"1041":0,"1042":0,"1043":0,"1044":0,"1045":0,"1046":0,"1047":0,"1048":0,"1049":0,"1050":0,"1051":0,"1052":0,"1054":0,"1055":0,"1057":0,"1058":0,"1060":0,"1061":0,"1062":0,"1063":0,"1064":0,"1065":0,"1066":0,"1067":0,"1069":0,"1070":0,"1072":0,"1073":0,"1075":0,"1076":0,"1078":0,"1079":0,"1080":0,"1081":0,"1082":0,"1083":0,"1085":0,"1087":0,"1088":0,"1089":0,"1092":0,"1093":0,"1094":0,"1095":0,"1096":0,"1098":0,"1099":0,"1101":0,"1102":0,"1103":0,"1104":0,"1105":0,"1107":0,"1108":0,"1109":0,"1111":0,"1112":0,"1113":0,"1114":0,"1115":0,"1116":0,"1117":0,"1118":0,"1119":0,"1122":0,"1123":0,"1124":0,"1126":0,"1127":0,"1128":0,"1129":0,"1130":0,"1131":0,"1132":0,"1133":0,"1134":0,"1136":0,"1139":0,"1140":0,"1141":0,"1143":0,"1144":0,"1145":0,"1146":0,"1147":0,"1148":0,"1149":0,"1150":0,"1151":0,"1153":0,"1156":0,"1157":0,"1158":0,"1160":0,"1161":0,"1162":0,"1163":0,"1164":0,"1165":0,"1166":0,"1167":0,"1168":0,"1170":0,"1171":0,"1172":0,"1173":0,"1175":0,"1176":0,"1177":0,"1178":0,"1181":0,"1182":0,"1183":0,"1184":0,"1185":0,"1186":0,"1187":0,"1188":0,"1189":0,"1190":0,"1191":0,"1192":0,"1193":0,"1194":0,"1195":0,"1196":0,"1197":0,"1199":0,"1200":0,"1201":0,"1202":0,"1203":0,"1204":0,"1205":0,"1206":0,"1207":0,"1208":0,"1209":0,"1211":0,"1213":0,"1214":0,"1215":0,"1216":0,"1218":0,"1222":0,"1223":0,"1225":0,"1226":0,"1227":0,"1228":0,"1230":0,"1231":0,"1232":0,"1233":0,"1234":0,"1235":0,"1237":0,"1239":0,"1240":0,"1241":0,"1242":0,"1243":0,"1244":0,"1245":0,"1246":0,"1247":0,"1248":0,"1250":0,"1251":0,"1253":0,"1254":0,"1256":0,"1258":0,"1259":0,"1260":0,"1261":0,"1262":0,"1263":0,"1265":0,"1267":0,"1268":0,"1269":0,"1272":0,"1273":0,"1274":0,"1275":0,"1276":0,"1277":0,"1278":0,"1279":0,"1280":0,"1281":0,"1282":0,"1284":0,"1285":0,"1286":0,"1287":0,"1288":0,"1289":0,"1290":0,"1291":0,"1292":0,"1295":0,"1296":0,"1297":0,"1298":0,"1299":0,"1300":0,"1301":0,"1302":0,"1303":0,"1305":0,"1306":0,"1307":0,"1308":0,"1309":0,"1310":0,"1311":0,"1312":0,"1313":0,"1314":0,"1315":0,"1316":0,"1318":0,"1319":0,"1320":0,"1321":0,"1322":0,"1323":0,"1324":0,"1325":0,"1326":0,"1328":0,"1329":0,"1332":0,"1333":0,"1334":0,"1335":0,"1336":0,"1337":0,"1338":0,"1339":0,"1340":0,"1341":0,"1342":0,"1343":0,"1344":0,"1345":0,"1346":0,"1347":0,"1348":0,"1350":0,"1351":0,"1352":0,"1353":0,"1354":0,"1355":0,"1356":0,"1357":0,"1358":0,"1359":0,"1360":0,"1361":0,"1363":0,"1365":0,"1366":0,"1367":0,"1368":0,"1370":0,"1373":0,"1374":0,"1375":0,"1377":0,"1378":0,"1380":0,"1382":0,"1383":0,"1384":0,"1385":0,"1386":0,"1387":0,"1388":0,"1389":0,"1390":0,"1391":0,"1392":0,"1394":0,"1395":0,"1396":0,"1397":0,"1398":0,"1399":0,"1400":0,"1401":0,"1402":0,"1403":0,"1404":0,"1405":0,"1406":0,"1407":0,"1409":0,"1410":0,"1411":0,"1412":0,"1413":0,"1414":0,"1415":0,"1417":0,"1418":0,"1419":0,"1420":0,"1421":0,"1422":0,"1423":0,"1424":0,"1426":0,"1427":0,"1431":0,"1432":0,"1433":0,"1434":0,"1435":0,"1436":0,"1438":0,"1439":0,"1441":0,"1442":0,"1443":0,"1444":0,"1446":0,"1447":0,"1450":0,"1451":0,"1452":0,"1453":0,"1454":0,"1455":0,"1456":0,"1457":0,"1459":0,"1460":0,"1461":0,"1462":0,"1463":0,"1464":0,"1465":0,"1466":0,"1467":0,"1468":0,"1469":0,"1470":0,"1471":0,"1473":0,"1474":0,"1475":0,"1476":0,"1477":0,"1478":0,"1479":0,"1480":0,"1481":0,"1482":0,"1483":0,"1484":0,"1485":0,"1486":0,"1488":0,"1489":0,"1490":0,"1491":0,"1492":0,"1493":0,"1494":0,"1495":0,"1496":0,"1498":0,"1499":0,"1500":0,"1501":0,"1502":0,"1506":0,"1507":0,"1508":0,"1509":0,"1510":0,"1511":0,"1512":0,"1513":0,"1514":0,"1515":0,"1516":0,"1517":0,"1518":0,"1519":0,"1520":0,"1521":0,"1522":0,"1523":0,"1524":0,"1525":0,"1526":0,"1527":0,"1528":0,"1529":0,"1530":0,"1531":0,"1532":0,"1533":0,"1534":0,"1535":0,"1536":0,"1537":0,"1538":0,"1539":0,"1540":0,"1541":0,"1542":0,"1543":0,"1544":0,"1545":0,"1546":0,"1547":0,"1548":0,"1549":0,"1550":0,"1551":0,"1552":0,"1553":0,"1554":0,"1555":0,"1556":0,"1557":0,"1558":0,"1559":0,"1560":0,"1561":0,"1562":0,"1563":0,"1564":0,"1565":0,"1566":0,"1567":0,"1568":0,"1569":0,"1571":0,"1572":0,"1574":0,"1575":0,"1577":0,"1578":0,"1580":0,"1581":0,"1582":0,"1583":0,"1587":0,"1588":0,"1589":0,"1590":0,"1591":0,"1592":0,"1593":0,"1594":0,"1595":0,"1596":0,"1597":0,"1598":0,"1599":0,"1600":0,"1601":0,"1602":0,"1603":0,"1604":0,"1605":0,"1606":0,"1607":0,"1608":0,"1609":0,"1610":0,"1612":0,"1613":0,"1615":0,"1616":0,"1618":0,"1619":0,"1620":0,"1621":0,"1622":0,"1624":0,"1625":0,"1626":0,"1627":0,"1628":0,"1629":0,"1630":0,"1631":0,"1633":0,"1634":0,"1635":0,"1636":0,"1637":0,"1638":0,"1639":0,"1640":0,"1642":0,"1643":0,"1644":0,"1645":0,"1649":0,"1650":0,"1651":0,"1652":0,"1653":0,"1654":0,"1655":0,"1656":0,"1657":0,"1658":0,"1659":0,"1660":0,"1661":0,"1662":0,"1663":0,"1664":0,"1665":0,"1666":0,"1667":0,"1668":0,"1669":0,"1670":0,"1671":0,"1672":0,"1673":0,"1674":0,"1675":0,"1676":0,"1677":0,"1678":0,"1679":0,"1680":0,"1681":0,"1682":0,"1683":0,"1684":0,"1685":0,"1686":0,"1687":0,"1688":0,"1689":0,"1690":0,"1691":0,"1695":0,"1696":0,"1697":0,"1698":0,"1699":0,"1700":0,"1701":0,"1702":0,"1703":0,"1704":0,"1705":0,"1706":0,"1710":0,"1711":0,"1712":0,"1713":0,"1714":0,"1715":0,"1716":0,"1717":0,"1721":0,"1722":0,"1723":0,"1724":0,"1725":0,"1726":0,"1727":0,"1728":0,"1732":0,"1733":0,"1734":0,"1735":0,"1736":0,"1740":0,"1741":0,"1742":0,"1743":0,"1747":0,"1748":0,"1749":0,"1750":0,"1751":0,"1752":0,"1753":0,"1754":0,"1755":0,"1756":0,"1757":0,"1758":0,"1759":0,"1760":0,"1761":0,"1762":0,"1763":0,"1767":0,"1768":0,"1769":0,"1770":0,"1771":0,"1772":0,"1773":0,"1774":0,"1775":0,"1776":0,"1777":0,"1778":0,"1779":0,"1780":0,"1784":0,"1785":0,"1786":0,"1787":0,"1788":0,"1789":0,"1790":0,"1791":0,"1792":0,"1793":0,"1794":0,"1795":0,"1796":0,"1800":0,"1801":0,"1802":0,"1803":0,"1804":0,"1805":0,"1806":0,"1807":0,"1808":0,"1809":0,"1810":0,"1811":0,"1812":0,"1813":0,"1814":0,"1815":0,"1816":0,"1817":0,"1818":0,"1822":0,"1823":0,"1824":0,"1825":0,"1826":0,"1827":0,"1828":0,"1829":0,"1830":0,"1831":0,"1833":0,"1835":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":1836,"column":-51395}},"locations":[{"start":{"line":1,"column":0},"end":{"line":1836,"column":-51395}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":1836,"column":-51395}},"loc":{"start":{"line":1,"column":0},"end":{"line":1836,"column":-51395}},"line":1}},"f":{"0":0}} -,"/opt/claude/projects/bambuddy/frontend/src/pages/StatsPage.tsx": {"path":"/opt/claude/projects/bambuddy/frontend/src/pages/StatsPage.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":49}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":27}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":8}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":11}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":4}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":4}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":10}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":59}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":46}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":71}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":41}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":14}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":13}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":65}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":84}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":14}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":12}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":46}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":68}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":39}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":14}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":13}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":63}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":106}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":14}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":12}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":46}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":70}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":41}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":14}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":13}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":66}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":116}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":14}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":12}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":46}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":69}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":44}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":14}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":13}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":66}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":109}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":14}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":12}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":46}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":70}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":37}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":14}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":13}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":64}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":108}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":14}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":12}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":46}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":70}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":44}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":14}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":13}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":64}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":116}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":14}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":12}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":10}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":1}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":28}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":8}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":4}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":4}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":41}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":70}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":8}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":10}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":45}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":42}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":50}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":89}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":17}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":19}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":19}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":18}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":23}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":28}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":28}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":33}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":57}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":12}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":14}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":75}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":78}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":14}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":12}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":33}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":49}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":62}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":70}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":97}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":14}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":49}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":54}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":66}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":93}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":14}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":12}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":10}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":1}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":29}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":8}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":13}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":4}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":4}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":48}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":52}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":12}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":63}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":85}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":12}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":3}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":61}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":82}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":37}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":71}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":67}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":54}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":4}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":35}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":35}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":10}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":45}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":42}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":50}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":89}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":17}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":19}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":19}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":18}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":23}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":26}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":28}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":33}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":64}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":12}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":14}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":84}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":86}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":94}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":62}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":17}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":14}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":12}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":40}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":73}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":40}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":46}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":14}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":103}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":42}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":99}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":89}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":73}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":71}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":23}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":48}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":64}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":65}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":20}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":35}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":23}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":20}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":15}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":16}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":12}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":10}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":1}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":30}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":8}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":4}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":4}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":99}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":90}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":3}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":75}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":27}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":4}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":10}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":31}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":45}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":81}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":16}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":26}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":63}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":56}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":69}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":18}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":60}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":18}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":77}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":51}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":16}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":18}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":16}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":9}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":10}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":1}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":72}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":62}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":1}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":32}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":8}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":13}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":4}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":4}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":87}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":89}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":3}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":10}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":59}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":76}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":94}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":65}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":60}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":16}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":15}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":58}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":67}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":16}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":69}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":16}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":14}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":9}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":10}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":1}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":31}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":11}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":11}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":4}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":4}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":43}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":87}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":3}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":68}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":1}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":34}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":50}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":34}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":56}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":5}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":18}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":12}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":48}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":69}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":12}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":3}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":49}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":97}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":3}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":64}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":34}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":17}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":10}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":31}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":47}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":49}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":166}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":100}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":71}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":14}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":49}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":74}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":14}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":12}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":33}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":35}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":84}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":48}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":84}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":94}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":62}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":18}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":13}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":14}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":56}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":66}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":59}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":48}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":125}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":36}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":32}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":18}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":46}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":93}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":19}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":16}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":14}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":10}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":1}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":29}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":35}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":56}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":62}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":54}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":47}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":31}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":33}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":5}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":39}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":27}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":29}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":5}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":39}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":27}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":55}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":5}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":39}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":27}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":29}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":5}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":58}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":29}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":25}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":9}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":77}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":44}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":44}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":19}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":28}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":16}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":31}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":37}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":19}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":42}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":15}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":28}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":5}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":4}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":45}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":81}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":62}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":18}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":12}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":34}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":86}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":12}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":3}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":38}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":5}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":24}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":27}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":72}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":21}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":6}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":5}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":25}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":28}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":53}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":21}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":6}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":5}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":26}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":29}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":78}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":21}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":6}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":5}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":27}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":30}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":55}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":21}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":6}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":5}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":29}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":42}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":43}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":21}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":6}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":5}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":27}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":30}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":65}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":21}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":6}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":5}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":30}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":33}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":81}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":21}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":6}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":5}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":28}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":37}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":88}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":21}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":6}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":4}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":35}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":56}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":38}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":30}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":4}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":10}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":32}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":62}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":13}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":70}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":99}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":14}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":49}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":17}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":31}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":39}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":45}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":19}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":36}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":19}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":33}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":64}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":36}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":30}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":60}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":55}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":16}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":21}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":32}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":151}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":23}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":151}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":53}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":50}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":25}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":23}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":151}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":54}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":57}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":25}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":20}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":16}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":14}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":12}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":107}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":10}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":1}}},"s":{"0":0,"26":0,"27":0,"28":0,"29":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"100":0,"102":0,"103":0,"104":0,"110":0,"111":0,"112":0,"113":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"149":0,"151":0,"152":0,"153":0,"154":0,"160":0,"161":0,"163":0,"164":0,"165":0,"166":0,"167":0,"169":0,"172":0,"173":0,"176":0,"177":0,"178":0,"179":0,"180":0,"182":0,"183":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"230":0,"231":0,"233":0,"235":0,"236":0,"237":0,"242":0,"243":0,"244":0,"245":0,"248":0,"249":0,"250":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"270":0,"271":0,"273":0,"275":0,"276":0,"277":0,"279":0,"280":0,"281":0,"282":0,"285":0,"286":0,"287":0,"288":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"307":0,"309":0,"310":0,"311":0,"312":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"322":0,"323":0,"324":0,"325":0,"326":0,"328":0,"329":0,"330":0,"331":0,"332":0,"334":0,"336":0,"337":0,"338":0,"340":0,"341":0,"342":0,"344":0,"345":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"386":0,"388":0,"390":0,"391":0,"392":0,"393":0,"394":0,"396":0,"397":0,"398":0,"399":0,"401":0,"402":0,"403":0,"404":0,"406":0,"407":0,"408":0,"409":0,"411":0,"412":0,"413":0,"414":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"435":0,"436":0,"437":0,"439":0,"440":0,"441":0,"442":0,"443":0,"445":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"500":0,"501":0,"502":0,"503":0,"504":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"518":0,"520":0,"522":0,"523":0,"524":0,"525":0,"526":0,"528":0,"529":0,"531":0,"532":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"541":0,"543":0,"544":0,"545":0,"546":0,"548":0,"550":0,"551":0,"553":0,"554":0,"555":0,"557":0,"558":0,"560":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":561,"column":-12498}},"locations":[{"start":{"line":1,"column":0},"end":{"line":561,"column":-12498}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":561,"column":-12498}},"loc":{"start":{"line":1,"column":0},"end":{"line":561,"column":-12498}},"line":1}},"f":{"0":0}} -} diff --git a/frontend/coverage/favicon.png b/frontend/coverage/favicon.png deleted file mode 100644 index c1525b811..000000000 Binary files a/frontend/coverage/favicon.png and /dev/null differ diff --git a/frontend/coverage/index.html b/frontend/coverage/index.html deleted file mode 100644 index 246323adc..000000000 --- a/frontend/coverage/index.html +++ /dev/null @@ -1,236 +0,0 @@ - - - - - - Code coverage report for All files - - - - - - - - - -
-
-

All files

-
- -
- 2.88% - Statements - 594/20569 -
- - -
- 41.73% - Branches - 53/127 -
- - -
- 7.06% - Functions - 19/269 -
- - -
- 2.88% - Lines - 594/20569 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
src -
-
0%0/560%0/10%0/10%0/56
src/api -
-
27.54%187/67975%3/41.76%3/17027.54%187/679
src/components -
-
3.65%352/962646%46/10018.66%14/753.65%352/9626
src/components/icons -
-
0%0/440%0/10%0/10%0/44
src/contexts -
-
60.22%53/8866.66%4/633.33%2/660.22%53/88
src/hooks -
-
1.33%2/1500%0/20%0/31.33%2/150
src/i18n -
-
0%0/290%0/10%0/10%0/29
src/i18n/locales -
-
0%0/6660%0/20%0/20%0/666
src/pages -
-
0%0/92310%0/100%0/100%0/9231
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/prettify.css b/frontend/coverage/prettify.css deleted file mode 100644 index b317a7cda..000000000 --- a/frontend/coverage/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/frontend/coverage/prettify.js b/frontend/coverage/prettify.js deleted file mode 100644 index b3225238f..000000000 --- a/frontend/coverage/prettify.js +++ /dev/null @@ -1,2 +0,0 @@ -/* eslint-disable */ -window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/frontend/coverage/sort-arrow-sprite.png b/frontend/coverage/sort-arrow-sprite.png deleted file mode 100644 index 6ed68316e..000000000 Binary files a/frontend/coverage/sort-arrow-sprite.png and /dev/null differ diff --git a/frontend/coverage/sorter.js b/frontend/coverage/sorter.js deleted file mode 100644 index 4ed70ae5a..000000000 --- a/frontend/coverage/sorter.js +++ /dev/null @@ -1,210 +0,0 @@ -/* eslint-disable */ -var addSorting = (function() { - 'use strict'; - var cols, - currentSort = { - index: 0, - desc: false - }; - - // returns the summary table element - function getTable() { - return document.querySelector('.coverage-summary'); - } - // returns the thead element of the summary table - function getTableHeader() { - return getTable().querySelector('thead tr'); - } - // returns the tbody element of the summary table - function getTableBody() { - return getTable().querySelector('tbody'); - } - // returns the th element for nth column - function getNthColumn(n) { - return getTableHeader().querySelectorAll('th')[n]; - } - - function onFilterInput() { - const searchValue = document.getElementById('fileSearch').value; - const rows = document.getElementsByTagName('tbody')[0].children; - - // Try to create a RegExp from the searchValue. If it fails (invalid regex), - // it will be treated as a plain text search - let searchRegex; - try { - searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive - } catch (error) { - searchRegex = null; - } - - for (let i = 0; i < rows.length; i++) { - const row = rows[i]; - let isMatch = false; - - if (searchRegex) { - // If a valid regex was created, use it for matching - isMatch = searchRegex.test(row.textContent); - } else { - // Otherwise, fall back to the original plain text search - isMatch = row.textContent - .toLowerCase() - .includes(searchValue.toLowerCase()); - } - - row.style.display = isMatch ? '' : 'none'; - } - } - - // loads the search box - function addSearchBox() { - var template = document.getElementById('filterTemplate'); - var templateClone = template.content.cloneNode(true); - templateClone.getElementById('fileSearch').oninput = onFilterInput; - template.parentElement.appendChild(templateClone); - } - - // loads all columns - function loadColumns() { - var colNodes = getTableHeader().querySelectorAll('th'), - colNode, - cols = [], - col, - i; - - for (i = 0; i < colNodes.length; i += 1) { - colNode = colNodes[i]; - col = { - key: colNode.getAttribute('data-col'), - sortable: !colNode.getAttribute('data-nosort'), - type: colNode.getAttribute('data-type') || 'string' - }; - cols.push(col); - if (col.sortable) { - col.defaultDescSort = col.type === 'number'; - colNode.innerHTML = - colNode.innerHTML + ''; - } - } - return cols; - } - // attaches a data attribute to every tr element with an object - // of data values keyed by column name - function loadRowData(tableRow) { - var tableCols = tableRow.querySelectorAll('td'), - colNode, - col, - data = {}, - i, - val; - for (i = 0; i < tableCols.length; i += 1) { - colNode = tableCols[i]; - col = cols[i]; - val = colNode.getAttribute('data-value'); - if (col.type === 'number') { - val = Number(val); - } - data[col.key] = val; - } - return data; - } - // loads all row data - function loadData() { - var rows = getTableBody().querySelectorAll('tr'), - i; - - for (i = 0; i < rows.length; i += 1) { - rows[i].data = loadRowData(rows[i]); - } - } - // sorts the table using the data for the ith column - function sortByIndex(index, desc) { - var key = cols[index].key, - sorter = function(a, b) { - a = a.data[key]; - b = b.data[key]; - return a < b ? -1 : a > b ? 1 : 0; - }, - finalSorter = sorter, - tableBody = document.querySelector('.coverage-summary tbody'), - rowNodes = tableBody.querySelectorAll('tr'), - rows = [], - i; - - if (desc) { - finalSorter = function(a, b) { - return -1 * sorter(a, b); - }; - } - - for (i = 0; i < rowNodes.length; i += 1) { - rows.push(rowNodes[i]); - tableBody.removeChild(rowNodes[i]); - } - - rows.sort(finalSorter); - - for (i = 0; i < rows.length; i += 1) { - tableBody.appendChild(rows[i]); - } - } - // removes sort indicators for current column being sorted - function removeSortIndicators() { - var col = getNthColumn(currentSort.index), - cls = col.className; - - cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); - col.className = cls; - } - // adds sort indicators for current column being sorted - function addSortIndicators() { - getNthColumn(currentSort.index).className += currentSort.desc - ? ' sorted-desc' - : ' sorted'; - } - // adds event listeners for all sorter widgets - function enableUI() { - var i, - el, - ithSorter = function ithSorter(i) { - var col = cols[i]; - - return function() { - var desc = col.defaultDescSort; - - if (currentSort.index === i) { - desc = !currentSort.desc; - } - sortByIndex(i, desc); - removeSortIndicators(); - currentSort.index = i; - currentSort.desc = desc; - addSortIndicators(); - }; - }; - for (i = 0; i < cols.length; i += 1) { - if (cols[i].sortable) { - // add the click event handler on the th so users - // dont have to click on those tiny arrows - el = getNthColumn(i).querySelector('.sorter').parentElement; - if (el.addEventListener) { - el.addEventListener('click', ithSorter(i)); - } else { - el.attachEvent('onclick', ithSorter(i)); - } - } - } - } - // adds sorting functionality to the UI - return function() { - if (!getTable()) { - return; - } - cols = loadColumns(); - loadData(); - addSearchBox(); - addSortIndicators(); - enableUI(); - }; -})(); - -window.addEventListener('load', addSorting); diff --git a/frontend/coverage/src/App.tsx.html b/frontend/coverage/src/App.tsx.html deleted file mode 100644 index 2207995c7..000000000 --- a/frontend/coverage/src/App.tsx.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - - Code coverage report for src/App.tsx - - - - - - - - - -
-
-

All files / src App.tsx

-
- -
- 0% - Statements - 0/56 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/56 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { BrowserRouter, Routes, Route } from 'react-router-dom';
-import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
-import { Layout } from './components/Layout';
-import { PrintersPage } from './pages/PrintersPage';
-import { ArchivesPage } from './pages/ArchivesPage';
-import { QueuePage } from './pages/QueuePage';
-import { StatsPage } from './pages/StatsPage';
-import { SettingsPage } from './pages/SettingsPage';
-import { ProfilesPage } from './pages/ProfilesPage';
-import { MaintenancePage } from './pages/MaintenancePage';
-import { ProjectsPage } from './pages/ProjectsPage';
-import { CameraPage } from './pages/CameraPage';
-import { ExternalLinkPage } from './pages/ExternalLinkPage';
-import { useWebSocket } from './hooks/useWebSocket';
-import { ThemeProvider } from './contexts/ThemeContext';
-import { ToastProvider } from './contexts/ToastContext';
- 
-const queryClient = new QueryClient({
-  defaultOptions: {
-    queries: {
-      staleTime: 1000 * 60,
-      retry: 1,
-    },
-  },
-});
- 
-function WebSocketProvider({ children }: { children: React.ReactNode }) {
-  useWebSocket();
-  return <>{children}</>;
-}
- 
-function App() {
-  return (
-    <ThemeProvider>
-      <ToastProvider>
-        <QueryClientProvider client={queryClient}>
-          <WebSocketProvider>
-            <BrowserRouter>
-              <Routes>
-                {/* Camera page - standalone, no layout */}
-                <Route path="/camera/:printerId" element={<CameraPage />} />
- 
-                <Route path="/" element={<Layout />}>
-                  <Route index element={<PrintersPage />} />
-                  <Route path="archives" element={<ArchivesPage />} />
-                  <Route path="queue" element={<QueuePage />} />
-                  <Route path="stats" element={<StatsPage />} />
-                  <Route path="profiles" element={<ProfilesPage />} />
-                  <Route path="maintenance" element={<MaintenancePage />} />
-                  <Route path="projects" element={<ProjectsPage />} />
-                  <Route path="settings" element={<SettingsPage />} />
-                  <Route path="external/:id" element={<ExternalLinkPage />} />
-                </Route>
-              </Routes>
-            </BrowserRouter>
-          </WebSocketProvider>
-        </QueryClientProvider>
-      </ToastProvider>
-    </ThemeProvider>
-  );
-}
- 
-export default App;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/api/client.ts.html b/frontend/coverage/src/api/client.ts.html deleted file mode 100644 index 670126df1..000000000 --- a/frontend/coverage/src/api/client.ts.html +++ /dev/null @@ -1,5875 +0,0 @@ - - - - - - Code coverage report for src/api/client.ts - - - - - - - - - -
-
-

All files / src/api client.ts

-
- -
- 27.54% - Statements - 187/679 -
- - -
- 75% - Branches - 3/4 -
- - -
- 1.76% - Functions - 3/170 -
- - -
- 27.54% - Lines - 187/679 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -425 -426 -427 -428 -429 -430 -431 -432 -433 -434 -435 -436 -437 -438 -439 -440 -441 -442 -443 -444 -445 -446 -447 -448 -449 -450 -451 -452 -453 -454 -455 -456 -457 -458 -459 -460 -461 -462 -463 -464 -465 -466 -467 -468 -469 -470 -471 -472 -473 -474 -475 -476 -477 -478 -479 -480 -481 -482 -483 -484 -485 -486 -487 -488 -489 -490 -491 -492 -493 -494 -495 -496 -497 -498 -499 -500 -501 -502 -503 -504 -505 -506 -507 -508 -509 -510 -511 -512 -513 -514 -515 -516 -517 -518 -519 -520 -521 -522 -523 -524 -525 -526 -527 -528 -529 -530 -531 -532 -533 -534 -535 -536 -537 -538 -539 -540 -541 -542 -543 -544 -545 -546 -547 -548 -549 -550 -551 -552 -553 -554 -555 -556 -557 -558 -559 -560 -561 -562 -563 -564 -565 -566 -567 -568 -569 -570 -571 -572 -573 -574 -575 -576 -577 -578 -579 -580 -581 -582 -583 -584 -585 -586 -587 -588 -589 -590 -591 -592 -593 -594 -595 -596 -597 -598 -599 -600 -601 -602 -603 -604 -605 -606 -607 -608 -609 -610 -611 -612 -613 -614 -615 -616 -617 -618 -619 -620 -621 -622 -623 -624 -625 -626 -627 -628 -629 -630 -631 -632 -633 -634 -635 -636 -637 -638 -639 -640 -641 -642 -643 -644 -645 -646 -647 -648 -649 -650 -651 -652 -653 -654 -655 -656 -657 -658 -659 -660 -661 -662 -663 -664 -665 -666 -667 -668 -669 -670 -671 -672 -673 -674 -675 -676 -677 -678 -679 -680 -681 -682 -683 -684 -685 -686 -687 -688 -689 -690 -691 -692 -693 -694 -695 -696 -697 -698 -699 -700 -701 -702 -703 -704 -705 -706 -707 -708 -709 -710 -711 -712 -713 -714 -715 -716 -717 -718 -719 -720 -721 -722 -723 -724 -725 -726 -727 -728 -729 -730 -731 -732 -733 -734 -735 -736 -737 -738 -739 -740 -741 -742 -743 -744 -745 -746 -747 -748 -749 -750 -751 -752 -753 -754 -755 -756 -757 -758 -759 -760 -761 -762 -763 -764 -765 -766 -767 -768 -769 -770 -771 -772 -773 -774 -775 -776 -777 -778 -779 -780 -781 -782 -783 -784 -785 -786 -787 -788 -789 -790 -791 -792 -793 -794 -795 -796 -797 -798 -799 -800 -801 -802 -803 -804 -805 -806 -807 -808 -809 -810 -811 -812 -813 -814 -815 -816 -817 -818 -819 -820 -821 -822 -823 -824 -825 -826 -827 -828 -829 -830 -831 -832 -833 -834 -835 -836 -837 -838 -839 -840 -841 -842 -843 -844 -845 -846 -847 -848 -849 -850 -851 -852 -853 -854 -855 -856 -857 -858 -859 -860 -861 -862 -863 -864 -865 -866 -867 -868 -869 -870 -871 -872 -873 -874 -875 -876 -877 -878 -879 -880 -881 -882 -883 -884 -885 -886 -887 -888 -889 -890 -891 -892 -893 -894 -895 -896 -897 -898 -899 -900 -901 -902 -903 -904 -905 -906 -907 -908 -909 -910 -911 -912 -913 -914 -915 -916 -917 -918 -919 -920 -921 -922 -923 -924 -925 -926 -927 -928 -929 -930 -931 -932 -933 -934 -935 -936 -937 -938 -939 -940 -941 -942 -943 -944 -945 -946 -947 -948 -949 -950 -951 -952 -953 -954 -955 -956 -957 -958 -959 -960 -961 -962 -963 -964 -965 -966 -967 -968 -969 -970 -971 -972 -973 -974 -975 -976 -977 -978 -979 -980 -981 -982 -983 -984 -985 -986 -987 -988 -989 -990 -991 -992 -993 -994 -995 -996 -997 -998 -999 -1000 -1001 -1002 -1003 -1004 -1005 -1006 -1007 -1008 -1009 -1010 -1011 -1012 -1013 -1014 -1015 -1016 -1017 -1018 -1019 -1020 -1021 -1022 -1023 -1024 -1025 -1026 -1027 -1028 -1029 -1030 -1031 -1032 -1033 -1034 -1035 -1036 -1037 -1038 -1039 -1040 -1041 -1042 -1043 -1044 -1045 -1046 -1047 -1048 -1049 -1050 -1051 -1052 -1053 -1054 -1055 -1056 -1057 -1058 -1059 -1060 -1061 -1062 -1063 -1064 -1065 -1066 -1067 -1068 -1069 -1070 -1071 -1072 -1073 -1074 -1075 -1076 -1077 -1078 -1079 -1080 -1081 -1082 -1083 -1084 -1085 -1086 -1087 -1088 -1089 -1090 -1091 -1092 -1093 -1094 -1095 -1096 -1097 -1098 -1099 -1100 -1101 -1102 -1103 -1104 -1105 -1106 -1107 -1108 -1109 -1110 -1111 -1112 -1113 -1114 -1115 -1116 -1117 -1118 -1119 -1120 -1121 -1122 -1123 -1124 -1125 -1126 -1127 -1128 -1129 -1130 -1131 -1132 -1133 -1134 -1135 -1136 -1137 -1138 -1139 -1140 -1141 -1142 -1143 -1144 -1145 -1146 -1147 -1148 -1149 -1150 -1151 -1152 -1153 -1154 -1155 -1156 -1157 -1158 -1159 -1160 -1161 -1162 -1163 -1164 -1165 -1166 -1167 -1168 -1169 -1170 -1171 -1172 -1173 -1174 -1175 -1176 -1177 -1178 -1179 -1180 -1181 -1182 -1183 -1184 -1185 -1186 -1187 -1188 -1189 -1190 -1191 -1192 -1193 -1194 -1195 -1196 -1197 -1198 -1199 -1200 -1201 -1202 -1203 -1204 -1205 -1206 -1207 -1208 -1209 -1210 -1211 -1212 -1213 -1214 -1215 -1216 -1217 -1218 -1219 -1220 -1221 -1222 -1223 -1224 -1225 -1226 -1227 -1228 -1229 -1230 -1231 -1232 -1233 -1234 -1235 -1236 -1237 -1238 -1239 -1240 -1241 -1242 -1243 -1244 -1245 -1246 -1247 -1248 -1249 -1250 -1251 -1252 -1253 -1254 -1255 -1256 -1257 -1258 -1259 -1260 -1261 -1262 -1263 -1264 -1265 -1266 -1267 -1268 -1269 -1270 -1271 -1272 -1273 -1274 -1275 -1276 -1277 -1278 -1279 -1280 -1281 -1282 -1283 -1284 -1285 -1286 -1287 -1288 -1289 -1290 -1291 -1292 -1293 -1294 -1295 -1296 -1297 -1298 -1299 -1300 -1301 -1302 -1303 -1304 -1305 -1306 -1307 -1308 -1309 -1310 -1311 -1312 -1313 -1314 -1315 -1316 -1317 -1318 -1319 -1320 -1321 -1322 -1323 -1324 -1325 -1326 -1327 -1328 -1329 -1330 -1331 -1332 -1333 -1334 -1335 -1336 -1337 -1338 -1339 -1340 -1341 -1342 -1343 -1344 -1345 -1346 -1347 -1348 -1349 -1350 -1351 -1352 -1353 -1354 -1355 -1356 -1357 -1358 -1359 -1360 -1361 -1362 -1363 -1364 -1365 -1366 -1367 -1368 -1369 -1370 -1371 -1372 -1373 -1374 -1375 -1376 -1377 -1378 -1379 -1380 -1381 -1382 -1383 -1384 -1385 -1386 -1387 -1388 -1389 -1390 -1391 -1392 -1393 -1394 -1395 -1396 -1397 -1398 -1399 -1400 -1401 -1402 -1403 -1404 -1405 -1406 -1407 -1408 -1409 -1410 -1411 -1412 -1413 -1414 -1415 -1416 -1417 -1418 -1419 -1420 -1421 -1422 -1423 -1424 -1425 -1426 -1427 -1428 -1429 -1430 -1431 -1432 -1433 -1434 -1435 -1436 -1437 -1438 -1439 -1440 -1441 -1442 -1443 -1444 -1445 -1446 -1447 -1448 -1449 -1450 -1451 -1452 -1453 -1454 -1455 -1456 -1457 -1458 -1459 -1460 -1461 -1462 -1463 -1464 -1465 -1466 -1467 -1468 -1469 -1470 -1471 -1472 -1473 -1474 -1475 -1476 -1477 -1478 -1479 -1480 -1481 -1482 -1483 -1484 -1485 -1486 -1487 -1488 -1489 -1490 -1491 -1492 -1493 -1494 -1495 -1496 -1497 -1498 -1499 -1500 -1501 -1502 -1503 -1504 -1505 -1506 -1507 -1508 -1509 -1510 -1511 -1512 -1513 -1514 -1515 -1516 -1517 -1518 -1519 -1520 -1521 -1522 -1523 -1524 -1525 -1526 -1527 -1528 -1529 -1530 -1531 -1532 -1533 -1534 -1535 -1536 -1537 -1538 -1539 -1540 -1541 -1542 -1543 -1544 -1545 -1546 -1547 -1548 -1549 -1550 -1551 -1552 -1553 -1554 -1555 -1556 -1557 -1558 -1559 -1560 -1561 -1562 -1563 -1564 -1565 -1566 -1567 -1568 -1569 -1570 -1571 -1572 -1573 -1574 -1575 -1576 -1577 -1578 -1579 -1580 -1581 -1582 -1583 -1584 -1585 -1586 -1587 -1588 -1589 -1590 -1591 -1592 -1593 -1594 -1595 -1596 -1597 -1598 -1599 -1600 -1601 -1602 -1603 -1604 -1605 -1606 -1607 -1608 -1609 -1610 -1611 -1612 -1613 -1614 -1615 -1616 -1617 -1618 -1619 -1620 -1621 -1622 -1623 -1624 -1625 -1626 -1627 -1628 -1629 -1630 -1631 -1632 -1633 -1634 -1635 -1636 -1637 -1638 -1639 -1640 -1641 -1642 -1643 -1644 -1645 -1646 -1647 -1648 -1649 -1650 -1651 -1652 -1653 -1654 -1655 -1656 -1657 -1658 -1659 -1660 -1661 -1662 -1663 -1664 -1665 -1666 -1667 -1668 -1669 -1670 -1671 -1672 -1673 -1674 -1675 -1676 -1677 -1678 -1679 -1680 -1681 -1682 -1683 -1684 -1685 -1686 -1687 -1688 -1689 -1690 -1691 -1692 -1693 -1694 -1695 -1696 -1697 -1698 -1699 -1700 -1701 -1702 -1703 -1704 -1705 -1706 -1707 -1708 -1709 -1710 -1711 -1712 -1713 -1714 -1715 -1716 -1717 -1718 -1719 -1720 -1721 -1722 -1723 -1724 -1725 -1726 -1727 -1728 -1729 -1730 -1731 -1732 -1733 -1734 -1735 -1736 -1737 -1738 -1739 -1740 -1741 -1742 -1743 -1744 -1745 -1746 -1747 -1748 -1749 -1750 -1751 -1752 -1753 -1754 -1755 -1756 -1757 -1758 -1759 -1760 -1761 -1762 -1763 -1764 -1765 -1766 -1767 -1768 -1769 -1770 -1771 -1772 -1773 -1774 -1775 -1776 -1777 -1778 -1779 -1780 -1781 -1782 -1783 -1784 -1785 -1786 -1787 -1788 -1789 -1790 -1791 -1792 -1793 -1794 -1795 -1796 -1797 -1798 -1799 -1800 -1801 -1802 -1803 -1804 -1805 -1806 -1807 -1808 -1809 -1810 -1811 -1812 -1813 -1814 -1815 -1816 -1817 -1818 -1819 -1820 -1821 -1822 -1823 -1824 -1825 -1826 -1827 -1828 -1829 -1830 -1831 -1832 -1833 -1834 -1835 -1836 -1837 -1838 -1839 -1840 -1841 -1842 -1843 -1844 -1845 -1846 -1847 -1848 -1849 -1850 -1851 -1852 -1853 -1854 -1855 -1856 -1857 -1858 -1859 -1860 -1861 -1862 -1863 -1864 -1865 -1866 -1867 -1868 -1869 -1870 -1871 -1872 -1873 -1874 -1875 -1876 -1877 -1878 -1879 -1880 -1881 -1882 -1883 -1884 -1885 -1886 -1887 -1888 -1889 -1890 -1891 -1892 -1893 -1894 -1895 -1896 -1897 -1898 -1899 -1900 -1901 -1902 -1903 -1904 -1905 -1906 -1907 -1908 -1909 -1910 -1911 -1912 -1913 -1914 -1915 -1916 -1917 -1918 -1919 -1920 -1921 -1922 -1923 -1924 -1925 -1926 -1927 -1928 -1929 -1930 -19311x -  -26x -26x -26x -26x -26x -26x -26x -26x -26x -26x -26x -  -26x -  -  -  -  -26x -26x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -1x -1x -1x -  -  -  -  -1x -  -  -  -  -1x -  -1x -  -1x -  -  -  -1x -  -  -  -  -  -1x -  -  -  -1x -  -  -  -1x -  -1x -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -1x -  -1x -  -  -  -1x -  -  -  -1x -  -  -  -  -  -  -  -1x -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -1x -  -1x -1x -  -  -  -  -  -  -1x -  -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -1x -  -  -  -1x -1x -1x -1x -1x -  -  -  -  -  -  -  -  -1x -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -1x -  -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -1x -  -1x -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -1x -  -1x -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -1x -  -  -  -  -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -1x -1x -  -  -  -  -1x -  -  -  -  -1x -  -  -  -  -1x -  -1x -  -1x -  -1x -  -  -  -  -1x -  -  -  -  -1x -  -  -  -1x -1x -  -1x -  -  -  -1x -1x -1x -1x -  -  -  -  -1x -  -  -  -  -1x -  -1x -  -  -  -  -1x -13x -1x -  -  -  -  -  -  -1x -  -  -  -  -  -1x -1x -  -  -  -  -1x -  -  -  -  -1x -  -1x -  -  -  -  -1x -  -1x -  -  -  -1x -  -1x -  -  -  -  -1x -  -  -  -  -1x -  -  -  -  -  -  -1x -  -1x -  -  -  -  -1x -  -  -  -  -  -1x -  -1x -  -1x -  -  -  -1x -  -  -  -  -  -1x -1x -1x -  -  -1x -1x -1x -  -  -  -  -1x -  -  -  -  -1x -  -1x -  -1x -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -1x -1x -  -  -  -  -1x -  -  -  -1x -1x -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -1x -  -  -  -  -  -  -1x -1x -  -  -  -1x -  -  -  -1x -  -  -  -1x -  -  -  -1x -  -1x -  -  -  -1x -1x -1x -  -  -  -1x -  -  -1x -1x -  -  -  -  -1x -  -  -  -  -1x -  -1x -1x -  -1x -  -  -  -  -1x -  -  -  -  -1x -  -1x -1x -  -  -  -  -  -  -1x -  -1x -  -1x -  -  -  -1x -1x -1x -  -  -  -  -1x -  -  -  -  -1x -  -1x -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -1x -  -  -1x -  -  -  -  -1x -1x -  -  -  -  -1x -  -  -  -  -1x -  -1x -  -1x -  -  -  -  -1x -  -  -  -  -1x -  -  -  -  -  -  -1x -1x -  -  -  -  -1x -  -  -  -  -1x -  -  -  -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
const API_BASE = '/api/v1';
- 
-async function request<T>(
-  endpoint: string,
-  options: RequestInit = {}
-): Promise<T> {
-  const response = await fetch(`${API_BASE}${endpoint}`, {
-    ...options,
-    headers: {
-      'Content-Type': 'application/json',
-      ...options.headers,
-    },
-  });
- 
-  if (!response.ok) {
-    const error = await response.json().catch(() => ({}));
-    throw new Error(error.detail || `HTTP ${response.status}`);
-  }
- 
-  return response.json();
-}
- 
-// Printer types
-export interface Printer {
-  id: number;
-  name: string;
-  serial_number: string;
-  ip_address: string;
-  access_code: string;
-  model: string | null;
-  location: string | null;  // Group/location name
-  nozzle_count: number;  // 1 or 2, auto-detected from MQTT
-  is_active: boolean;
-  auto_archive: boolean;
-  created_at: string;
-  updated_at: string;
-}
- 
-export interface HMSError {
-  code: string;
-  attr: number;  // Attribute value for constructing wiki URL
-  module: number;
-  severity: number;  // 1=fatal, 2=serious, 3=common, 4=info
-}
- 
-export interface AMSTray {
-  id: number;
-  tray_color: string | null;
-  tray_type: string | null;
-  tray_sub_brands: string | null;  // Full name like "PLA Basic", "PETG HF"
-  tray_id_name: string | null;  // Bambu filament ID like "A00-Y2" (can decode to color)
-  tray_info_idx: string | null;  // Filament preset ID like "GFA00" - maps to cloud setting_id
-  remain: number;
-  k: number | null;  // Pressure advance value
-  tag_uid: string | null;  // RFID tag UID (any tag)
-  tray_uuid: string | null;  // Bambu Lab spool UUID (32-char hex, only valid for Bambu Lab spools)
-  nozzle_temp_min: number | null;  // Min nozzle temperature
-  nozzle_temp_max: number | null;  // Max nozzle temperature
-}
- 
-export interface AMSUnit {
-  id: number;
-  humidity: number | null;
-  temp: number | null;
-  is_ams_ht: boolean;  // True for AMS-HT (single spool), False for regular AMS (4 spools)
-  tray: AMSTray[];
-}
- 
-export interface NozzleInfo {
-  nozzle_type: string;  // "stainless_steel" or "hardened_steel"
-  nozzle_diameter: string;  // e.g., "0.4"
-}
- 
-export interface PrintOptions {
-  // Core AI detectors
-  spaghetti_detector: boolean;
-  print_halt: boolean;
-  halt_print_sensitivity: string;  // "low", "medium", "high" - spaghetti sensitivity
-  first_layer_inspector: boolean;
-  printing_monitor: boolean;
-  buildplate_marker_detector: boolean;
-  allow_skip_parts: boolean;
-  // Additional AI detectors (decoded from cfg bitmask)
-  nozzle_clumping_detector: boolean;
-  nozzle_clumping_sensitivity: string;  // "low", "medium", "high"
-  pileup_detector: boolean;
-  pileup_sensitivity: string;  // "low", "medium", "high"
-  airprint_detector: boolean;
-  airprint_sensitivity: string;  // "low", "medium", "high"
-  auto_recovery_step_loss: boolean;
-  filament_tangle_detect: boolean;
-}
- 
-export interface PrinterStatus {
-  id: number;
-  name: string;
-  connected: boolean;
-  state: string | null;
-  current_print: string | null;
-  subtask_name: string | null;
-  gcode_file: string | null;
-  progress: number | null;
-  remaining_time: number | null;
-  layer_num: number | null;
-  total_layers: number | null;
-  temperatures: {
-    bed?: number;
-    bed_target?: number;
-    nozzle?: number;
-    nozzle_target?: number;
-    nozzle_2?: number;  // Second nozzle for H2 series (dual nozzle)
-    nozzle_2_target?: number;
-    chamber?: number;
-  } | null;
-  cover_url: string | null;
-  hms_errors: HMSError[];
-  ams: AMSUnit[];
-  ams_exists: boolean;
-  vt_tray: AMSTray | null;  // Virtual tray / external spool
-  sdcard: boolean;  // SD card inserted
-  store_to_sdcard: boolean;  // Store sent files on SD card
-  timelapse: boolean;  // Timelapse recording active
-  ipcam: boolean;  // Live view enabled
-  wifi_signal: number | null;  // WiFi signal strength in dBm
-  nozzles: NozzleInfo[];  // Nozzle hardware info (index 0=left/primary, 1=right)
-  print_options: PrintOptions | null;  // AI detection and print options
-  // Calibration stage tracking
-  stg_cur: number;  // Current stage number (-1 = not calibrating)
-  stg_cur_name: string | null;  // Human-readable current stage name
-  stg: number[];  // List of stage numbers in calibration sequence
-  // Air conditioning mode (0=cooling, 1=heating)
-  airduct_mode: number;
-  // Print speed level (1=silent, 2=standard, 3=sport, 4=ludicrous)
-  speed_level: number;
-  // Chamber light on/off
-  chamber_light: boolean;
-  // Active extruder for dual nozzle (0=right, 1=left)
-  active_extruder: number;
-  // AMS mapping - which AMS is connected to which nozzle
-  // Format: [ams_id_for_nozzle0, ams_id_for_nozzle1, ...] where -1 means no AMS
-  ams_mapping: number[];
-  // Per-AMS extruder mapping - extracted from each AMS unit's info field
-  // Format: {ams_id: extruder_id} where extruder 0=right, 1=left
-  // Note: JSON keys are always strings
-  ams_extruder_map: Record<string, number>;
-  // Currently loaded tray (global tray ID, 255 = no filament loaded, 254 = external spool)
-  tray_now: number;
-  // AMS status for filament change tracking (0=idle, 1=filament_change, 2=rfid_identifying, 3=assist, 4=calibration)
-  ams_status_main: number;
-  // AMS sub-status for filament change step (when main=1): 4=retraction, 6=load verification, 7=purge
-  ams_status_sub: number;
-  // mc_print_sub_stage - filament change step indicator used by OrcaSlicer/BambuStudio
-  mc_print_sub_stage: number;
-  // Timestamp of last AMS data update (for RFID refresh detection)
-  last_ams_update: number;
-}
- 
-export interface PrinterCreate {
-  name: string;
-  serial_number: string;
-  ip_address: string;
-  access_code: string;
-  model?: string;
-  location?: string;
-  auto_archive?: boolean;
-}
- 
-// Archive types
-export interface ArchiveDuplicate {
-  id: number;
-  print_name: string | null;
-  created_at: string;
-  match_type: 'exact' | 'similar';  // 'exact' = hash match, 'similar' = name match
-}
- 
-export interface Archive {
-  id: number;
-  printer_id: number | null;
-  project_id: number | null;
-  project_name: string | null;
-  filename: string;
-  file_path: string;
-  file_size: number;
-  content_hash: string | null;
-  thumbnail_path: string | null;
-  timelapse_path: string | null;
-  source_3mf_path: string | null;
-  duplicates: ArchiveDuplicate[] | null;
-  duplicate_count: number;
-  print_name: string | null;
-  print_time_seconds: number | null;
-  actual_time_seconds: number | null;  // Computed from started_at/completed_at
-  time_accuracy: number | null;  // Percentage: 100 = perfect, >100 = faster than estimated
-  filament_used_grams: number | null;
-  filament_type: string | null;
-  filament_color: string | null;
-  layer_height: number | null;
-  total_layers: number | null;
-  nozzle_diameter: number | null;
-  bed_temperature: number | null;
-  nozzle_temperature: number | null;
-  status: string;
-  started_at: string | null;
-  completed_at: string | null;
-  extra_data: Record<string, unknown> | null;
-  makerworld_url: string | null;
-  designer: string | null;
-  is_favorite: boolean;
-  tags: string | null;
-  notes: string | null;
-  cost: number | null;
-  photos: string[] | null;
-  failure_reason: string | null;
-  energy_kwh: number | null;
-  energy_cost: number | null;
-  created_at: string;
-}
- 
-export interface ArchiveStats {
-  total_prints: number;
-  successful_prints: number;
-  failed_prints: number;
-  total_print_time_hours: number;
-  total_filament_grams: number;
-  total_cost: number;
-  prints_by_filament_type: Record<string, number>;
-  prints_by_printer: Record<string, number>;
-  average_time_accuracy: number | null;
-  time_accuracy_by_printer: Record<string, number> | null;
-  total_energy_kwh: number;
-  total_energy_cost: number;
-}
- 
-export interface FailureAnalysis {
-  period_days: number;
-  total_prints: number;
-  failed_prints: number;
-  failure_rate: number;
-  failures_by_reason: Record<string, number>;
-  failures_by_filament: Record<string, number>;
-  failures_by_printer: Record<string, number>;
-  failures_by_hour: Record<number, number>;
-  recent_failures: Array<{
-    id: number;
-    print_name: string;
-    failure_reason: string | null;
-    filament_type: string | null;
-    printer_id: number | null;
-    created_at: string | null;
-  }>;
-  trend: Array<{
-    week_start: string;
-    total_prints: number;
-    failed_prints: number;
-    failure_rate: number;
-  }>;
-}
- 
-export interface BulkUploadResult {
-  uploaded: number;
-  failed: number;
-  results: Array<{ filename: string; id: number; status: string }>;
-  errors: Array<{ filename: string; error: string }>;
-}
- 
-// Archive Comparison types
-export interface ComparisonArchiveInfo {
-  id: number;
-  print_name: string;
-  status: string;
-  created_at: string | null;
-  printer_id: number | null;
-  project_name: string | null;
-}
- 
-export interface ComparisonField {
-  field: string;
-  label: string;
-  unit: string | null;
-  values: (string | number | null)[];
-  raw_values: (string | number | null)[];
-  has_difference: boolean;
-}
- 
-export interface SuccessCorrelationInsight {
-  field: string;
-  label: string;
-  insight: string;
-  success_avg?: number;
-  failed_avg?: number;
-  success_values?: string[];
-  failed_values?: string[];
-}
- 
-export interface SuccessCorrelation {
-  has_both_outcomes: boolean;
-  message?: string;
-  successful_count?: number;
-  failed_count?: number;
-  insights?: SuccessCorrelationInsight[];
-}
- 
-export interface ArchiveComparison {
-  archives: ComparisonArchiveInfo[];
-  comparison: ComparisonField[];
-  differences: ComparisonField[];
-  success_correlation: SuccessCorrelation;
-}
- 
-export interface SimilarArchive {
-  archive: {
-    id: number;
-    print_name: string;
-    status: string;
-    created_at: string | null;
-  };
-  match_reason: string;
-  match_score: number;
-}
- 
-// Project types
-export interface ProjectStats {
-  total_archives: number;
-  completed_prints: number;
-  failed_prints: number;
-  queued_prints: number;
-  in_progress_prints: number;
-  total_print_time_hours: number;
-  total_filament_grams: number;
-  progress_percent: number | null;
-}
- 
-export interface Project {
-  id: number;
-  name: string;
-  description: string | null;
-  color: string | null;
-  status: string;  // active, completed, archived
-  target_count: number | null;
-  created_at: string;
-  updated_at: string;
-  stats?: ProjectStats;
-}
- 
-export interface ArchivePreview {
-  id: number;
-  print_name: string | null;
-  thumbnail_path: string | null;
-  status: string;
-}
- 
-export interface ProjectListItem {
-  id: number;
-  name: string;
-  description: string | null;
-  color: string | null;
-  status: string;
-  target_count: number | null;
-  created_at: string;
-  archive_count: number;
-  queue_count: number;
-  progress_percent: number | null;
-  archives: ArchivePreview[];
-}
- 
-export interface ProjectCreate {
-  name: string;
-  description?: string;
-  color?: string;
-  target_count?: number;
-}
- 
-export interface ProjectUpdate {
-  name?: string;
-  description?: string;
-  color?: string;
-  status?: string;
-  target_count?: number;
-}
- 
-// API Key types
-export interface APIKey {
-  id: number;
-  name: string;
-  key_prefix: string;
-  can_queue: boolean;
-  can_control_printer: boolean;
-  can_read_status: boolean;
-  printer_ids: number[] | null;
-  enabled: boolean;
-  last_used: string | null;
-  created_at: string;
-  expires_at: string | null;
-}
- 
-export interface APIKeyCreate {
-  name: string;
-  can_queue?: boolean;
-  can_control_printer?: boolean;
-  can_read_status?: boolean;
-  printer_ids?: number[] | null;
-  expires_at?: string | null;
-}
- 
-export interface APIKeyCreateResponse extends APIKey {
-  key: string;  // Full key, only shown on creation
-}
- 
-export interface APIKeyUpdate {
-  name?: string;
-  can_queue?: boolean;
-  can_control_printer?: boolean;
-  can_read_status?: boolean;
-  printer_ids?: number[] | null;
-  enabled?: boolean;
-  expires_at?: string | null;
-}
- 
-// Settings types
-export interface AppSettings {
-  auto_archive: boolean;
-  save_thumbnails: boolean;
-  capture_finish_photo: boolean;
-  default_filament_cost: number;
-  currency: string;
-  energy_cost_per_kwh: number;
-  energy_tracking_mode: 'print' | 'total';
-  check_updates: boolean;
-  notification_language: string;
-  // AMS threshold settings
-  ams_humidity_good: number;  // <= this is green
-  ams_humidity_fair: number;  // <= this is orange, > is red
-  ams_temp_good: number;      // <= this is green/blue
-  ams_temp_fair: number;      // <= this is orange, > is red
-  ams_history_retention_days: number;  // days to keep AMS sensor history
-  // Date/time format settings
-  date_format: 'system' | 'us' | 'eu' | 'iso';
-  time_format: 'system' | '12h' | '24h';
-  // Default printer
-  default_printer_id: number | null;
-}
- 
-export type AppSettingsUpdate = Partial<AppSettings>;
- 
-// Cloud types
-export interface CloudAuthStatus {
-  is_authenticated: boolean;
-  email: string | null;
-}
- 
-export interface CloudLoginResponse {
-  success: boolean;
-  needs_verification: boolean;
-  message: string;
-}
- 
-export interface SlicerSetting {
-  setting_id: string;
-  name: string;
-  type: string;
-  version: string | null;
-  user_id: string | null;
-  updated_time: string | null;
-}
- 
-export interface SlicerSettingsResponse {
-  filament: SlicerSetting[];
-  printer: SlicerSetting[];
-  process: SlicerSetting[];
-}
- 
-export interface SlicerSettingDetail {
-  message?: string | null;
-  code?: string | null;
-  error?: string | null;
-  public: boolean;
-  version?: string | null;
-  type: string;
-  name: string;
-  update_time?: string | null;
-  nickname?: string | null;
-  base_id?: string | null;
-  setting: Record<string, unknown>;
-  filament_id?: string | null;
-  setting_id?: string | null;
-}
- 
-export interface SlicerSettingCreate {
-  type: string;  // 'filament', 'print', or 'printer'
-  name: string;
-  base_id: string;
-  setting: Record<string, unknown>;
-}
- 
-export interface SlicerSettingUpdate {
-  name?: string;
-  setting?: Record<string, unknown>;
-}
- 
-export interface SlicerSettingDeleteResponse {
-  success: boolean;
-  message: string;
-}
- 
-export interface FieldOption {
-  value: string;
-  label: string;
-}
- 
-export interface FieldDefinition {
-  key: string;
-  label: string;
-  type: 'text' | 'number' | 'boolean' | 'select';
-  category: string;
-  description?: string;
-  options?: FieldOption[];
-  unit?: string;
-  min?: number;
-  max?: number;
-  step?: number;
-}
- 
-export interface FieldDefinitionsResponse {
-  version: string;
-  description: string;
-  fields: FieldDefinition[];
-}
- 
-export interface CloudDevice {
-  dev_id: string;
-  name: string;
-  dev_model_name: string | null;
-  dev_product_name: string | null;
-  online: boolean;
-}
- 
-// Smart Plug types
-export interface SmartPlug {
-  id: number;
-  name: string;
-  ip_address: string;
-  printer_id: number | null;
-  enabled: boolean;
-  auto_on: boolean;
-  auto_off: boolean;
-  off_delay_mode: 'time' | 'temperature';
-  off_delay_minutes: number;
-  off_temp_threshold: number;
-  username: string | null;
-  password: string | null;
-  // Power alerts
-  power_alert_enabled: boolean;
-  power_alert_high: number | null;
-  power_alert_low: number | null;
-  power_alert_last_triggered: string | null;
-  // Schedule
-  schedule_enabled: boolean;
-  schedule_on_time: string | null;
-  schedule_off_time: string | null;
-  // Status
-  last_state: string | null;
-  last_checked: string | null;
-  auto_off_executed: boolean;  // True when auto-off was triggered after print
-  created_at: string;
-  updated_at: string;
-}
- 
-export interface SmartPlugCreate {
-  name: string;
-  ip_address: string;
-  printer_id?: number | null;
-  enabled?: boolean;
-  auto_on?: boolean;
-  auto_off?: boolean;
-  off_delay_mode?: 'time' | 'temperature';
-  off_delay_minutes?: number;
-  off_temp_threshold?: number;
-  username?: string | null;
-  password?: string | null;
-  // Power alerts
-  power_alert_enabled?: boolean;
-  power_alert_high?: number | null;
-  power_alert_low?: number | null;
-  // Schedule
-  schedule_enabled?: boolean;
-  schedule_on_time?: string | null;
-  schedule_off_time?: string | null;
-}
- 
-export interface SmartPlugUpdate {
-  name?: string;
-  ip_address?: string;
-  printer_id?: number | null;
-  enabled?: boolean;
-  auto_on?: boolean;
-  auto_off?: boolean;
-  off_delay_mode?: 'time' | 'temperature';
-  off_delay_minutes?: number;
-  off_temp_threshold?: number;
-  username?: string | null;
-  password?: string | null;
-  // Power alerts
-  power_alert_enabled?: boolean;
-  power_alert_high?: number | null;
-  power_alert_low?: number | null;
-  // Schedule
-  schedule_enabled?: boolean;
-  schedule_on_time?: string | null;
-  schedule_off_time?: string | null;
-}
- 
-export interface SmartPlugEnergy {
-  power: number | null;  // Current watts
-  voltage: number | null;  // Volts
-  current: number | null;  // Amps
-  today: number | null;  // kWh used today
-  yesterday: number | null;  // kWh used yesterday
-  total: number | null;  // Total kWh
-  factor: number | null;  // Power factor (0-1)
-  apparent_power: number | null;  // VA
-  reactive_power: number | null;  // VAr
-}
- 
-export interface SmartPlugStatus {
-  state: string | null;
-  reachable: boolean;
-  device_name: string | null;
-  energy: SmartPlugEnergy | null;
-}
- 
-export interface SmartPlugTestResult {
-  success: boolean;
-  state: string | null;
-  device_name: string | null;
-}
- 
-// Print Queue types
-export interface PrintQueueItem {
-  id: number;
-  printer_id: number;
-  archive_id: number;
-  position: number;
-  scheduled_time: string | null;
-  require_previous_success: boolean;
-  auto_off_after: boolean;
-  status: 'pending' | 'printing' | 'completed' | 'failed' | 'skipped' | 'cancelled';
-  started_at: string | null;
-  completed_at: string | null;
-  error_message: string | null;
-  created_at: string;
-  archive_name?: string | null;
-  archive_thumbnail?: string | null;
-  printer_name?: string | null;
-  print_time_seconds?: number | null;  // Estimated print time from archive
-}
- 
-export interface PrintQueueItemCreate {
-  printer_id: number;
-  archive_id: number;
-  scheduled_time?: string | null;
-  require_previous_success?: boolean;
-  auto_off_after?: boolean;
-}
- 
-export interface PrintQueueItemUpdate {
-  printer_id?: number;
-  position?: number;
-  scheduled_time?: string | null;
-  require_previous_success?: boolean;
-  auto_off_after?: boolean;
-}
- 
-// MQTT Logging types
-export interface MQTTLogEntry {
-  timestamp: string;
-  topic: string;
-  direction: 'in' | 'out';
-  payload: Record<string, unknown>;
-}
- 
-export interface MQTTLogsResponse {
-  logging_enabled: boolean;
-  logs: MQTTLogEntry[];
-}
- 
-// K-Profile types
-export interface KProfile {
-  slot_id: number;
-  extruder_id: number;
-  nozzle_id: string;
-  nozzle_diameter: string;
-  filament_id: string;
-  name: string;
-  k_value: string;
-  n_coef: string;
-  ams_id: number;
-  tray_id: number;
-  setting_id: string | null;
-}
- 
-export interface KProfileCreate {
-  slot_id?: number;  // Storage slot, 0 for new profiles
-  extruder_id?: number;
-  nozzle_id: string;
-  nozzle_diameter: string;
-  filament_id: string;
-  name: string;
-  k_value: string;
-  n_coef?: string;
-  ams_id?: number;
-  tray_id?: number;
-  setting_id?: string | null;
-}
- 
-export interface KProfileDelete {
-  slot_id: number;  // cali_idx - calibration index to delete
-  extruder_id: number;
-  nozzle_id: string;  // e.g., "HH00-0.4"
-  nozzle_diameter: string;  // e.g., "0.4"
-  filament_id: string;  // Bambu filament identifier
-  setting_id?: string | null;  // Setting ID (for X1C series)
-}
- 
-export interface KProfilesResponse {
-  profiles: KProfile[];
-  nozzle_diameter: string;
-}
- 
-export interface KProfileNote {
-  setting_id: string;
-  note: string;
-}
- 
-export interface KProfileNotesResponse {
-  notes: Record<string, string>;  // setting_id -> note
-}
- 
-// Slot Preset Mapping
-export interface SlotPresetMapping {
-  ams_id: number;
-  tray_id: number;
-  preset_id: string;
-  preset_name: string;
-}
- 
-// Filament types
-export interface Filament {
-  id: number;
-  name: string;
-  type: string;  // PLA, PETG, ABS, etc.
-  brand: string | null;
-  color: string | null;
-  color_hex: string | null;
-  cost_per_kg: number;
-  spool_weight_g: number;
-  currency: string;
-  density: number | null;
-  print_temp_min: number | null;
-  print_temp_max: number | null;
-  bed_temp_min: number | null;
-  bed_temp_max: number | null;
-  created_at: string;
-  updated_at: string;
-}
- 
-// Notification Provider types
-export type ProviderType = 'callmebot' | 'ntfy' | 'pushover' | 'telegram' | 'email' | 'discord' | 'webhook';
- 
-export interface NotificationProvider {
-  id: number;
-  name: string;
-  provider_type: ProviderType;
-  enabled: boolean;
-  config: Record<string, unknown>;
-  // Print lifecycle events
-  on_print_start: boolean;
-  on_print_complete: boolean;
-  on_print_failed: boolean;
-  on_print_stopped: boolean;
-  on_print_progress: boolean;
-  // Printer status events
-  on_printer_offline: boolean;
-  on_printer_error: boolean;
-  on_filament_low: boolean;
-  on_maintenance_due: boolean;
-  // AMS environmental alarms
-  on_ams_humidity_high: boolean;
-  on_ams_temperature_high: boolean;
-  // Quiet hours
-  quiet_hours_enabled: boolean;
-  quiet_hours_start: string | null;
-  quiet_hours_end: string | null;
-  // Daily digest
-  daily_digest_enabled: boolean;
-  daily_digest_time: string | null;
-  // Printer filter
-  printer_id: number | null;
-  // Status tracking
-  last_success: string | null;
-  last_error: string | null;
-  last_error_at: string | null;
-  // Timestamps
-  created_at: string;
-  updated_at: string;
-}
- 
-export interface NotificationProviderCreate {
-  name: string;
-  provider_type: ProviderType;
-  enabled?: boolean;
-  config: Record<string, unknown>;
-  // Print lifecycle events
-  on_print_start?: boolean;
-  on_print_complete?: boolean;
-  on_print_failed?: boolean;
-  on_print_stopped?: boolean;
-  on_print_progress?: boolean;
-  // Printer status events
-  on_printer_offline?: boolean;
-  on_printer_error?: boolean;
-  on_filament_low?: boolean;
-  on_maintenance_due?: boolean;
-  // AMS environmental alarms
-  on_ams_humidity_high?: boolean;
-  on_ams_temperature_high?: boolean;
-  // Quiet hours
-  quiet_hours_enabled?: boolean;
-  quiet_hours_start?: string | null;
-  quiet_hours_end?: string | null;
-  // Daily digest
-  daily_digest_enabled?: boolean;
-  daily_digest_time?: string | null;
-  // Printer filter
-  printer_id?: number | null;
-}
- 
-export interface NotificationProviderUpdate {
-  name?: string;
-  provider_type?: ProviderType;
-  enabled?: boolean;
-  config?: Record<string, unknown>;
-  // Print lifecycle events
-  on_print_start?: boolean;
-  on_print_complete?: boolean;
-  on_print_failed?: boolean;
-  on_print_stopped?: boolean;
-  on_print_progress?: boolean;
-  // Printer status events
-  on_printer_offline?: boolean;
-  on_printer_error?: boolean;
-  on_filament_low?: boolean;
-  on_maintenance_due?: boolean;
-  // AMS environmental alarms
-  on_ams_humidity_high?: boolean;
-  on_ams_temperature_high?: boolean;
-  // Quiet hours
-  quiet_hours_enabled?: boolean;
-  quiet_hours_start?: string | null;
-  quiet_hours_end?: string | null;
-  // Daily digest
-  daily_digest_enabled?: boolean;
-  daily_digest_time?: string | null;
-  // Printer filter
-  printer_id?: number | null;
-}
- 
-export interface NotificationTestRequest {
-  provider_type: ProviderType;
-  config: Record<string, unknown>;
-}
- 
-export interface NotificationTestResponse {
-  success: boolean;
-  message: string;
-}
- 
-// Provider-specific config types for reference
-export interface CallMeBotConfig {
-  phone: string;
-  apikey: string;
-}
- 
-export interface NtfyConfig {
-  server?: string;
-  topic: string;
-  auth_token?: string | null;
-}
- 
-export interface PushoverConfig {
-  user_key: string;
-  app_token: string;
-  priority?: number;
-}
- 
-export interface TelegramConfig {
-  bot_token: string;
-  chat_id: string;
-}
- 
-export interface EmailConfig {
-  smtp_server: string;
-  smtp_port?: number;
-  username: string;
-  password: string;
-  from_email: string;
-  to_email: string;
-  use_tls?: boolean;
-}
- 
-// Notification Template types
-export interface NotificationTemplate {
-  id: number;
-  event_type: string;
-  name: string;
-  title_template: string;
-  body_template: string;
-  is_default: boolean;
-  created_at: string;
-  updated_at: string;
-}
- 
-export interface NotificationTemplateUpdate {
-  title_template?: string;
-  body_template?: string;
-}
- 
-export interface EventVariablesResponse {
-  event_type: string;
-  event_name: string;
-  variables: string[];
-}
- 
-export interface TemplatePreviewRequest {
-  event_type: string;
-  title_template: string;
-  body_template: string;
-}
- 
-export interface TemplatePreviewResponse {
-  title: string;
-  body: string;
-}
- 
-// Notification Log types
-export interface NotificationLogEntry {
-  id: number;
-  provider_id: number;
-  provider_name: string | null;
-  provider_type: string | null;
-  event_type: string;
-  title: string;
-  message: string;
-  success: boolean;
-  error_message: string | null;
-  printer_id: number | null;
-  printer_name: string | null;
-  created_at: string;
-}
- 
-export interface NotificationLogStats {
-  total: number;
-  success_count: number;
-  failure_count: number;
-  by_event_type: Record<string, number>;
-  by_provider: Record<string, number>;
-}
- 
-// Spoolman types
-export interface SpoolmanStatus {
-  enabled: boolean;
-  connected: boolean;
-  url: string | null;
-}
- 
-export interface SpoolmanSyncResult {
-  success: boolean;
-  synced_count: number;
-  errors: string[];
-}
- 
-// Update types
-export interface VersionInfo {
-  version: string;
-  repo: string;
-}
- 
-export interface UpdateCheckResult {
-  update_available: boolean;
-  current_version: string;
-  latest_version: string | null;
-  release_name?: string;
-  release_notes?: string;
-  release_url?: string;
-  published_at?: string;
-  error?: string;
-  message?: string;
-}
- 
-export interface UpdateStatus {
-  status: 'idle' | 'checking' | 'downloading' | 'installing' | 'complete' | 'error';
-  progress: number;
-  message: string;
-  error: string | null;
-}
- 
-// Maintenance types
-export interface MaintenanceType {
-  id: number;
-  name: string;
-  description: string | null;
-  default_interval_hours: number;
-  interval_type: 'hours' | 'days';  // "hours" = print hours, "days" = calendar days
-  icon: string | null;
-  is_system: boolean;
-  created_at: string;
-}
- 
-export interface MaintenanceTypeCreate {
-  name: string;
-  description?: string | null;
-  default_interval_hours?: number;
-  interval_type?: 'hours' | 'days';
-  icon?: string | null;
-}
- 
-export interface MaintenanceStatus {
-  id: number;
-  printer_id: number;
-  printer_name: string;
-  maintenance_type_id: number;
-  maintenance_type_name: string;
-  maintenance_type_icon: string | null;
-  enabled: boolean;
-  interval_hours: number;  // For hours type: print hours; for days type: number of days
-  interval_type: 'hours' | 'days';
-  current_hours: number;
-  hours_since_maintenance: number;
-  hours_until_due: number;
-  days_since_maintenance: number | null;  // For days type
-  days_until_due: number | null;  // For days type
-  is_due: boolean;
-  is_warning: boolean;
-  last_performed_at: string | null;
-}
- 
-export interface PrinterMaintenanceOverview {
-  printer_id: number;
-  printer_name: string;
-  total_print_hours: number;
-  maintenance_items: MaintenanceStatus[];
-  due_count: number;
-  warning_count: number;
-}
- 
-export interface MaintenanceHistory {
-  id: number;
-  printer_maintenance_id: number;
-  performed_at: string;
-  hours_at_maintenance: number;
-  notes: string | null;
-}
- 
-export interface MaintenanceSummary {
-  total_due: number;
-  total_warning: number;
-  printers_with_issues: Array<{
-    printer_id: number;
-    printer_name: string;
-    due_count: number;
-    warning_count: number;
-  }>;
-}
- 
-// External Links (sidebar)
-export interface ExternalLink {
-  id: number;
-  name: string;
-  url: string;
-  icon: string;
-  custom_icon: string | null;
-  sort_order: number;
-  created_at: string;
-  updated_at: string;
-}
- 
-export interface ExternalLinkCreate {
-  name: string;
-  url: string;
-  icon: string;
-}
- 
-export interface ExternalLinkUpdate {
-  name?: string;
-  url?: string;
-  icon?: string;
-}
- 
-// API functions
-export const api = {
-  // Printers
-  getPrinters: () => request<Printer[]>('/printers/'),
-  getPrinter: (id: number) => request<Printer>(`/printers/${id}`),
-  createPrinter: (data: PrinterCreate) =>
-    request<Printer>('/printers/', {
-      method: 'POST',
-      body: JSON.stringify(data),
-    }),
-  updatePrinter: (id: number, data: Partial<PrinterCreate>) =>
-    request<Printer>(`/printers/${id}`, {
-      method: 'PATCH',
-      body: JSON.stringify(data),
-    }),
-  deletePrinter: (id: number) =>
-    request<void>(`/printers/${id}`, { method: 'DELETE' }),
-  getPrinterStatus: (id: number) =>
-    request<PrinterStatus>(`/printers/${id}/status`),
-  connectPrinter: (id: number) =>
-    request<{ connected: boolean }>(`/printers/${id}/connect`, {
-      method: 'POST',
-    }),
-  disconnectPrinter: (id: number) =>
-    request<{ connected: boolean }>(`/printers/${id}/disconnect`, {
-      method: 'POST',
-    }),
- 
-  // MQTT Debug Logging
-  enableMQTTLogging: (printerId: number) =>
-    request<{ logging_enabled: boolean }>(`/printers/${printerId}/logging/enable`, {
-      method: 'POST',
-    }),
-  disableMQTTLogging: (printerId: number) =>
-    request<{ logging_enabled: boolean }>(`/printers/${printerId}/logging/disable`, {
-      method: 'POST',
-    }),
-  getMQTTLogs: (printerId: number) =>
-    request<MQTTLogsResponse>(`/printers/${printerId}/logging`),
-  clearMQTTLogs: (printerId: number) =>
-    request<{ status: string }>(`/printers/${printerId}/logging`, {
-      method: 'DELETE',
-    }),
- 
-  // Printer File Manager
-  getPrinterFiles: (printerId: number, path = '/') =>
-    request<{
-      path: string;
-      files: Array<{
-        name: string;
-        is_directory: boolean;
-        size: number;
-        path: string;
-      }>;
-    }>(`/printers/${printerId}/files?path=${encodeURIComponent(path)}`),
-  getPrinterFileDownloadUrl: (printerId: number, path: string) =>
-    `${API_BASE}/printers/${printerId}/files/download?path=${encodeURIComponent(path)}`,
-  deletePrinterFile: (printerId: number, path: string) =>
-    request<{ status: string; path: string }>(`/printers/${printerId}/files?path=${encodeURIComponent(path)}`, {
-      method: 'DELETE',
-    }),
-  getPrinterStorage: (printerId: number) =>
-    request<{ used_bytes: number | null; free_bytes: number | null }>(`/printers/${printerId}/storage`),
- 
-  // Archives
-  getArchives: (printerId?: number, projectId?: number, limit = 50, offset = 0) => {
-    const params = new URLSearchParams();
-    if (printerId) params.set('printer_id', String(printerId));
-    if (projectId) params.set('project_id', String(projectId));
-    params.set('limit', String(limit));
-    params.set('offset', String(offset));
-    return request<Archive[]>(`/archives/?${params}`);
-  },
-  getArchive: (id: number) => request<Archive>(`/archives/${id}`),
-  searchArchives: (query: string, options?: {
-    printerId?: number;
-    projectId?: number;
-    status?: string;
-    limit?: number;
-    offset?: number;
-  }) => {
-    const params = new URLSearchParams();
-    params.set('q', query);
-    if (options?.printerId) params.set('printer_id', String(options.printerId));
-    if (options?.projectId) params.set('project_id', String(options.projectId));
-    if (options?.status) params.set('status', options.status);
-    if (options?.limit) params.set('limit', String(options.limit));
-    if (options?.offset) params.set('offset', String(options.offset));
-    return request<Archive[]>(`/archives/search?${params}`);
-  },
-  rebuildSearchIndex: () => request<{ message: string }>('/archives/search/rebuild-index', { method: 'POST' }),
-  updateArchive: (id: number, data: {
-    printer_id?: number | null;
-    project_id?: number | null;
-    print_name?: string;
-    is_favorite?: boolean;
-    tags?: string;
-    notes?: string;
-    cost?: number;
-    failure_reason?: string | null;
-  }) =>
-    request<Archive>(`/archives/${id}`, {
-      method: 'PATCH',
-      body: JSON.stringify(data),
-    }),
-  toggleFavorite: (id: number) =>
-    request<Archive>(`/archives/${id}/favorite`, { method: 'POST' }),
-  deleteArchive: (id: number) =>
-    request<void>(`/archives/${id}`, { method: 'DELETE' }),
-  getArchiveStats: () => request<ArchiveStats>('/archives/stats'),
-  getFailureAnalysis: (options?: { days?: number; printerId?: number; projectId?: number }) => {
-    const params = new URLSearchParams();
-    if (options?.days) params.set('days', String(options.days));
-    if (options?.printerId) params.set('printer_id', String(options.printerId));
-    if (options?.projectId) params.set('project_id', String(options.projectId));
-    return request<FailureAnalysis>(`/archives/analysis/failures?${params}`);
-  },
-  compareArchives: (archiveIds: number[]) =>
-    request<ArchiveComparison>(`/archives/compare?archive_ids=${archiveIds.join(',')}`),
-  findSimilarArchives: (archiveId: number, limit = 10) =>
-    request<SimilarArchive[]>(`/archives/${archiveId}/similar?limit=${limit}`),
-  exportArchives: async (options?: {
-    format?: 'csv' | 'xlsx';
-    fields?: string[];
-    printerId?: number;
-    projectId?: number;
-    status?: string;
-    dateFrom?: string;
-    dateTo?: string;
-    search?: string;
-  }): Promise<{ blob: Blob; filename: string }> => {
-    const params = new URLSearchParams();
-    if (options?.format) params.set('format', options.format);
-    if (options?.fields) params.set('fields', options.fields.join(','));
-    if (options?.printerId) params.set('printer_id', String(options.printerId));
-    if (options?.projectId) params.set('project_id', String(options.projectId));
-    if (options?.status) params.set('status', options.status);
-    if (options?.dateFrom) params.set('date_from', options.dateFrom);
-    if (options?.dateTo) params.set('date_to', options.dateTo);
-    if (options?.search) params.set('search', options.search);
- 
-    const response = await fetch(`${API_BASE}/archives/export?${params}`);
-    if (!response.ok) {
-      const error = await response.json().catch(() => ({}));
-      throw new Error(error.detail || `HTTP ${response.status}`);
-    }
- 
-    const contentDisposition = response.headers.get('Content-Disposition');
-    let filename = options?.format === 'xlsx' ? 'archives_export.xlsx' : 'archives_export.csv';
-    if (contentDisposition) {
-      const match = contentDisposition.match(/filename="?([^"]+)"?/);
-      if (match) filename = match[1];
-    }
- 
-    const blob = await response.blob();
-    return { blob, filename };
-  },
-  exportStats: async (options?: {
-    format?: 'csv' | 'xlsx';
-    days?: number;
-    printerId?: number;
-    projectId?: number;
-  }): Promise<{ blob: Blob; filename: string }> => {
-    const params = new URLSearchParams();
-    if (options?.format) params.set('format', options.format);
-    if (options?.days) params.set('days', String(options.days));
-    if (options?.printerId) params.set('printer_id', String(options.printerId));
-    if (options?.projectId) params.set('project_id', String(options.projectId));
- 
-    const response = await fetch(`${API_BASE}/archives/stats/export?${params}`);
-    if (!response.ok) {
-      const error = await response.json().catch(() => ({}));
-      throw new Error(error.detail || `HTTP ${response.status}`);
-    }
- 
-    const contentDisposition = response.headers.get('Content-Disposition');
-    let filename = options?.format === 'xlsx' ? 'stats_export.xlsx' : 'stats_export.csv';
-    if (contentDisposition) {
-      const match = contentDisposition.match(/filename="?([^"]+)"?/);
-      if (match) filename = match[1];
-    }
- 
-    const blob = await response.blob();
-    return { blob, filename };
-  },
-  getArchiveDuplicates: (id: number) =>
-    request<{ duplicates: ArchiveDuplicate[]; count: number }>(`/archives/${id}/duplicates`),
-  backfillContentHashes: () =>
-    request<{ updated: number; errors: Array<{ id: number; error: string }> }>('/archives/backfill-hashes', {
-      method: 'POST',
-    }),
-  getArchiveThumbnail: (id: number) => `${API_BASE}/archives/${id}/thumbnail`,
-  getArchiveDownload: (id: number) => `${API_BASE}/archives/${id}/download`,
-  getArchiveGcode: (id: number) => `${API_BASE}/archives/${id}/gcode`,
-  getArchiveTimelapse: (id: number) => `${API_BASE}/archives/${id}/timelapse`,
-  scanArchiveTimelapse: (id: number) =>
-    request<{
-      status: string;
-      message: string;
-      filename?: string;
-      available_files?: Array<{ name: string; path: string; size: number; mtime: string | null }>;
-    }>(`/archives/${id}/timelapse/scan`, {
-      method: 'POST',
-    }),
-  selectArchiveTimelapse: (id: number, filename: string) =>
-    request<{ status: string; message: string; filename: string }>(
-      `/archives/${id}/timelapse/select?filename=${encodeURIComponent(filename)}`,
-      { method: 'POST' }
-    ),
-  uploadArchiveTimelapse: async (archiveId: number, file: File): Promise<{ status: string; filename: string }> => {
-    const formData = new FormData();
-    formData.append('file', file);
-    const response = await fetch(`${API_BASE}/archives/${archiveId}/timelapse/upload`, {
-      method: 'POST',
-      body: formData,
-    });
-    if (!response.ok) {
-      const error = await response.json().catch(() => ({}));
-      throw new Error(error.detail || `HTTP ${response.status}`);
-    }
-    return response.json();
-  },
-  // Photos
-  getArchivePhotoUrl: (archiveId: number, filename: string) =>
-    `${API_BASE}/archives/${archiveId}/photos/${encodeURIComponent(filename)}`,
-  uploadArchivePhoto: async (archiveId: number, file: File): Promise<{ status: string; filename: string; photos: string[] }> => {
-    const formData = new FormData();
-    formData.append('file', file);
-    const response = await fetch(`${API_BASE}/archives/${archiveId}/photos`, {
-      method: 'POST',
-      body: formData,
-    });
-    if (!response.ok) {
-      const error = await response.json().catch(() => ({}));
-      throw new Error(error.detail || `HTTP ${response.status}`);
-    }
-    return response.json();
-  },
-  deleteArchivePhoto: (archiveId: number, filename: string) =>
-    request<{ status: string; photos: string[] | null }>(`/archives/${archiveId}/photos/${encodeURIComponent(filename)}`, {
-      method: 'DELETE',
-    }),
-  // Source 3MF (original slicer project file)
-  getSource3mfDownloadUrl: (archiveId: number) =>
-    `${API_BASE}/archives/${archiveId}/source`,
-  getSource3mfForSlicer: (archiveId: number, filename: string) =>
-    `${API_BASE}/archives/${archiveId}/source/${encodeURIComponent(filename.endsWith('.3mf') ? filename : filename + '.3mf')}`,
-  uploadSource3mf: async (archiveId: number, file: File): Promise<{ status: string; filename: string }> => {
-    const formData = new FormData();
-    formData.append('file', file);
-    const response = await fetch(`${API_BASE}/archives/${archiveId}/source`, {
-      method: 'POST',
-      body: formData,
-    });
-    if (!response.ok) {
-      const error = await response.json().catch(() => ({}));
-      throw new Error(error.detail || `HTTP ${response.status}`);
-    }
-    return response.json();
-  },
-  deleteSource3mf: (archiveId: number) =>
-    request<{ status: string }>(`/archives/${archiveId}/source`, {
-      method: 'DELETE',
-    }),
- 
-  // QR Code
-  getArchiveQRCodeUrl: (archiveId: number, size = 200) =>
-    `${API_BASE}/archives/${archiveId}/qrcode?size=${size}`,
-  getArchiveCapabilities: (id: number) =>
-    request<{
-      has_model: boolean;
-      has_gcode: boolean;
-      build_volume: { x: number; y: number; z: number };
-    }>(`/archives/${id}/capabilities`),
-  // Project Page
-  getArchiveProjectPage: (id: number) =>
-    request<{
-      title: string | null;
-      description: string | null;
-      designer: string | null;
-      designer_user_id: string | null;
-      license: string | null;
-      copyright: string | null;
-      creation_date: string | null;
-      modification_date: string | null;
-      origin: string | null;
-      profile_title: string | null;
-      profile_description: string | null;
-      profile_cover: string | null;
-      profile_user_id: string | null;
-      profile_user_name: string | null;
-      design_model_id: string | null;
-      design_profile_id: string | null;
-      design_region: string | null;
-      model_pictures: Array<{ name: string; path: string; url: string }>;
-      profile_pictures: Array<{ name: string; path: string; url: string }>;
-      thumbnails: Array<{ name: string; path: string; url: string }>;
-    }>(`/archives/${id}/project-page`),
-  updateArchiveProjectPage: (id: number, data: {
-    title?: string;
-    description?: string;
-    designer?: string;
-    license?: string;
-    copyright?: string;
-    profile_title?: string;
-    profile_description?: string;
-  }) =>
-    request(`/archives/${id}/project-page`, {
-      method: 'PATCH',
-      body: JSON.stringify(data),
-    }),
-  getArchiveProjectImageUrl: (archiveId: number, imagePath: string) =>
-    `${API_BASE}/archives/${archiveId}/project-image/${encodeURIComponent(imagePath)}`,
-  getArchiveForSlicer: (id: number, filename: string) =>
-    `${API_BASE}/archives/${id}/file/${encodeURIComponent(filename.endsWith('.3mf') ? filename : filename + '.3mf')}`,
-  reprintArchive: (archiveId: number, printerId: number) =>
-    request<{ status: string; printer_id: number; archive_id: number; filename: string }>(
-      `/archives/${archiveId}/reprint?printer_id=${printerId}`,
-      { method: 'POST' }
-    ),
-  uploadArchive: async (file: File, printerId?: number): Promise<Archive> => {
-    const formData = new FormData();
-    formData.append('file', file);
-    const url = printerId
-      ? `${API_BASE}/archives/upload?printer_id=${printerId}`
-      : `${API_BASE}/archives/upload`;
-    const response = await fetch(url, {
-      method: 'POST',
-      body: formData,
-    });
-    if (!response.ok) {
-      const error = await response.json().catch(() => ({}));
-      throw new Error(error.detail || `HTTP ${response.status}`);
-    }
-    return response.json();
-  },
-  uploadArchivesBulk: async (files: File[], printerId?: number): Promise<BulkUploadResult> => {
-    const formData = new FormData();
-    files.forEach((file) => formData.append('files', file));
-    const url = printerId
-      ? `${API_BASE}/archives/upload-bulk?printer_id=${printerId}`
-      : `${API_BASE}/archives/upload-bulk`;
-    const response = await fetch(url, {
-      method: 'POST',
-      body: formData,
-    });
-    if (!response.ok) {
-      const error = await response.json().catch(() => ({}));
-      throw new Error(error.detail || `HTTP ${response.status}`);
-    }
-    return response.json();
-  },
- 
-  // Settings
-  getSettings: () => request<AppSettings>('/settings/'),
-  updateSettings: (data: AppSettingsUpdate) =>
-    request<AppSettings>('/settings/', {
-      method: 'PUT',
-      body: JSON.stringify(data),
-    }),
-  resetSettings: () =>
-    request<AppSettings>('/settings/reset', { method: 'POST' }),
-  exportBackup: async (categories?: Record<string, boolean>): Promise<{ blob: Blob; filename: string }> => {
-    const params = new URLSearchParams();
-    if (categories) {
-      if (categories.settings !== undefined) params.set('include_settings', String(categories.settings));
-      if (categories.notifications !== undefined) params.set('include_notifications', String(categories.notifications));
-      if (categories.templates !== undefined) params.set('include_templates', String(categories.templates));
-      if (categories.smart_plugs !== undefined) params.set('include_smart_plugs', String(categories.smart_plugs));
-      if (categories.printers !== undefined) params.set('include_printers', String(categories.printers));
-      if (categories.filaments !== undefined) params.set('include_filaments', String(categories.filaments));
-      if (categories.maintenance !== undefined) params.set('include_maintenance', String(categories.maintenance));
-      if (categories.archives !== undefined) params.set('include_archives', String(categories.archives));
-      if (categories.access_codes !== undefined) params.set('include_access_codes', String(categories.access_codes));
-    }
-    const url = `${API_BASE}/settings/backup${params.toString() ? '?' + params.toString() : ''}`;
-    const response = await fetch(url);
- 
-    // Get filename from Content-Disposition header
-    const contentDisposition = response.headers.get('Content-Disposition');
-    let filename = 'bambuddy-backup.json';
-    if (contentDisposition) {
-      const match = contentDisposition.match(/filename=([^;]+)/);
-      if (match) filename = match[1].trim();
-    }
- 
-    const blob = await response.blob();
-    return { blob, filename };
-  },
-  importBackup: async (file: File, overwrite = false) => {
-    const formData = new FormData();
-    formData.append('file', file);
-    const url = `${API_BASE}/settings/restore${overwrite ? '?overwrite=true' : ''}`;
-    const response = await fetch(url, {
-      method: 'POST',
-      body: formData,
-    });
-    return response.json() as Promise<{
-      success: boolean;
-      message: string;
-      restored?: Record<string, number>;
-      skipped?: Record<string, number>;
-      skipped_details?: Record<string, string[]>;
-      files_restored?: number;
-      total_skipped?: number;
-    }>;
-  },
-  checkFfmpeg: () =>
-    request<{ installed: boolean; path: string | null }>('/settings/check-ffmpeg'),
- 
-  // Cloud
-  getCloudStatus: () => request<CloudAuthStatus>('/cloud/status'),
-  cloudLogin: (email: string, password: string, region = 'global') =>
-    request<CloudLoginResponse>('/cloud/login', {
-      method: 'POST',
-      body: JSON.stringify({ email, password, region }),
-    }),
-  cloudVerify: (email: string, code: string) =>
-    request<CloudLoginResponse>('/cloud/verify', {
-      method: 'POST',
-      body: JSON.stringify({ email, code }),
-    }),
-  cloudSetToken: (access_token: string) =>
-    request<CloudAuthStatus>('/cloud/token', {
-      method: 'POST',
-      body: JSON.stringify({ access_token }),
-    }),
-  cloudLogout: () =>
-    request<{ success: boolean }>('/cloud/logout', { method: 'POST' }),
-  getCloudSettings: (version = '02.04.00.70') =>
-    request<SlicerSettingsResponse>(`/cloud/settings?version=${version}`),
-  getCloudSettingDetail: (settingId: string) =>
-    request<SlicerSettingDetail>(`/cloud/settings/${settingId}`),
-  createCloudSetting: (data: SlicerSettingCreate) =>
-    request<SlicerSettingDetail>('/cloud/settings', {
-      method: 'POST',
-      body: JSON.stringify(data),
-    }),
-  updateCloudSetting: (settingId: string, data: SlicerSettingUpdate) =>
-    request<SlicerSettingDetail>(`/cloud/settings/${settingId}`, {
-      method: 'PUT',
-      body: JSON.stringify(data),
-    }),
-  deleteCloudSetting: (settingId: string) =>
-    request<SlicerSettingDeleteResponse>(`/cloud/settings/${settingId}`, {
-      method: 'DELETE',
-    }),
-  getCloudDevices: () => request<CloudDevice[]>('/cloud/devices'),
-  getCloudFields: (presetType: 'filament' | 'print' | 'process' | 'printer') =>
-    request<FieldDefinitionsResponse>(`/cloud/fields/${presetType}`),
-  getAllCloudFields: () =>
-    request<Record<string, FieldDefinitionsResponse>>('/cloud/fields'),
- 
-  // Smart Plugs
-  getSmartPlugs: () => request<SmartPlug[]>('/smart-plugs/'),
-  getSmartPlug: (id: number) => request<SmartPlug>(`/smart-plugs/${id}`),
-  getSmartPlugByPrinter: (printerId: number) => request<SmartPlug | null>(`/smart-plugs/by-printer/${printerId}`),
-  createSmartPlug: (data: SmartPlugCreate) =>
-    request<SmartPlug>('/smart-plugs/', {
-      method: 'POST',
-      body: JSON.stringify(data),
-    }),
-  updateSmartPlug: (id: number, data: SmartPlugUpdate) =>
-    request<SmartPlug>(`/smart-plugs/${id}`, {
-      method: 'PATCH',
-      body: JSON.stringify(data),
-    }),
-  deleteSmartPlug: (id: number) =>
-    request<void>(`/smart-plugs/${id}`, { method: 'DELETE' }),
-  controlSmartPlug: (id: number, action: 'on' | 'off' | 'toggle') =>
-    request<{ success: boolean; action: string }>(`/smart-plugs/${id}/control`, {
-      method: 'POST',
-      body: JSON.stringify({ action }),
-    }),
-  getSmartPlugStatus: (id: number) =>
-    request<SmartPlugStatus>(`/smart-plugs/${id}/status`),
-  testSmartPlugConnection: (ip_address: string, username?: string | null, password?: string | null) =>
-    request<SmartPlugTestResult>('/smart-plugs/test-connection', {
-      method: 'POST',
-      body: JSON.stringify({ ip_address, username, password }),
-    }),
- 
-  // Print Queue
-  getQueue: (printerId?: number, status?: string) => {
-    const params = new URLSearchParams();
-    if (printerId) params.set('printer_id', String(printerId));
-    if (status) params.set('status', status);
-    return request<PrintQueueItem[]>(`/queue/?${params}`);
-  },
-  getQueueItem: (id: number) => request<PrintQueueItem>(`/queue/${id}`),
-  addToQueue: (data: PrintQueueItemCreate) =>
-    request<PrintQueueItem>('/queue/', {
-      method: 'POST',
-      body: JSON.stringify(data),
-    }),
-  updateQueueItem: (id: number, data: PrintQueueItemUpdate) =>
-    request<PrintQueueItem>(`/queue/${id}`, {
-      method: 'PATCH',
-      body: JSON.stringify(data),
-    }),
-  removeFromQueue: (id: number) =>
-    request<{ message: string }>(`/queue/${id}`, { method: 'DELETE' }),
-  reorderQueue: (items: { id: number; position: number }[]) =>
-    request<{ message: string }>('/queue/reorder', {
-      method: 'POST',
-      body: JSON.stringify({ items }),
-    }),
-  cancelQueueItem: (id: number) =>
-    request<{ message: string }>(`/queue/${id}/cancel`, { method: 'POST' }),
-  stopQueueItem: (id: number) =>
-    request<{ message: string }>(`/queue/${id}/stop`, { method: 'POST' }),
- 
-  // K-Profiles
-  getKProfiles: (printerId: number, nozzleDiameter = '0.4') =>
-    request<KProfilesResponse>(`/printers/${printerId}/kprofiles/?nozzle_diameter=${nozzleDiameter}`),
-  setKProfile: (printerId: number, profile: KProfileCreate) =>
-    request<{ success: boolean; message: string }>(`/printers/${printerId}/kprofiles/`, {
-      method: 'POST',
-      body: JSON.stringify(profile),
-    }),
-  deleteKProfile: (printerId: number, profile: KProfileDelete) =>
-    request<{ success: boolean; message: string }>(`/printers/${printerId}/kprofiles/`, {
-      method: 'DELETE',
-      body: JSON.stringify(profile),
-    }),
-  setKProfilesBatch: (printerId: number, profiles: KProfileCreate[]) =>
-    request<{ success: boolean; message: string }>(`/printers/${printerId}/kprofiles/batch`, {
-      method: 'POST',
-      body: JSON.stringify(profiles),
-    }),
- 
-  // K-Profile Notes (stored locally, not on printer)
-  getKProfileNotes: (printerId: number) =>
-    request<KProfileNotesResponse>(`/printers/${printerId}/kprofiles/notes`),
-  setKProfileNote: (printerId: number, settingId: string, note: string) =>
-    request<{ success: boolean; message: string }>(`/printers/${printerId}/kprofiles/notes`, {
-      method: 'PUT',
-      body: JSON.stringify({ setting_id: settingId, note }),
-    }),
-  deleteKProfileNote: (printerId: number, settingId: string) =>
-    request<{ success: boolean; message: string }>(`/printers/${printerId}/kprofiles/notes/${encodeURIComponent(settingId)}`, {
-      method: 'DELETE',
-    }),
- 
-  // Slot Preset Mappings
-  getSlotPresets: (printerId: number) =>
-    request<Record<number, SlotPresetMapping>>(`/printers/${printerId}/slot-presets`),
-  getSlotPreset: (printerId: number, amsId: number, trayId: number) =>
-    request<SlotPresetMapping | null>(`/printers/${printerId}/slot-presets/${amsId}/${trayId}`),
-  saveSlotPreset: (printerId: number, amsId: number, trayId: number, presetId: string, presetName: string) =>
-    request<SlotPresetMapping>(`/printers/${printerId}/slot-presets/${amsId}/${trayId}?preset_id=${encodeURIComponent(presetId)}&preset_name=${encodeURIComponent(presetName)}`, {
-      method: 'PUT',
-    }),
-  deleteSlotPreset: (printerId: number, amsId: number, trayId: number) =>
-    request<{ success: boolean }>(`/printers/${printerId}/slot-presets/${amsId}/${trayId}`, {
-      method: 'DELETE',
-    }),
- 
-  // Filaments
-  listFilaments: () => request<Filament[]>('/filaments/'),
-  getFilament: (id: number) => request<Filament>(`/filaments/${id}`),
-  getFilamentsByType: (type: string) => request<Filament[]>(`/filaments/by-type/${type}`),
- 
-  // Notification Providers
-  getNotificationProviders: () => request<NotificationProvider[]>('/notifications/'),
-  getNotificationProvider: (id: number) => request<NotificationProvider>(`/notifications/${id}`),
-  createNotificationProvider: (data: NotificationProviderCreate) =>
-    request<NotificationProvider>('/notifications/', {
-      method: 'POST',
-      body: JSON.stringify(data),
-    }),
-  updateNotificationProvider: (id: number, data: NotificationProviderUpdate) =>
-    request<NotificationProvider>(`/notifications/${id}`, {
-      method: 'PATCH',
-      body: JSON.stringify(data),
-    }),
-  deleteNotificationProvider: (id: number) =>
-    request<{ message: string }>(`/notifications/${id}`, { method: 'DELETE' }),
-  testNotificationProvider: (id: number) =>
-    request<NotificationTestResponse>(`/notifications/${id}/test`, { method: 'POST' }),
-  testNotificationConfig: (data: NotificationTestRequest) =>
-    request<NotificationTestResponse>('/notifications/test-config', {
-      method: 'POST',
-      body: JSON.stringify(data),
-    }),
-  testAllNotificationProviders: () =>
-    request<{
-      tested: number;
-      success: number;
-      failed: number;
-      results: Array<{
-        provider_id: number;
-        provider_name: string;
-        provider_type: string;
-        success: boolean;
-        message: string;
-      }>;
-    }>('/notifications/test-all', { method: 'POST' }),
- 
-  // Notification Templates
-  getNotificationTemplates: () => request<NotificationTemplate[]>('/notification-templates'),
-  getNotificationTemplate: (id: number) => request<NotificationTemplate>(`/notification-templates/${id}`),
-  updateNotificationTemplate: (id: number, data: NotificationTemplateUpdate) =>
-    request<NotificationTemplate>(`/notification-templates/${id}`, {
-      method: 'PUT',
-      body: JSON.stringify(data),
-    }),
-  resetNotificationTemplate: (id: number) =>
-    request<NotificationTemplate>(`/notification-templates/${id}/reset`, {
-      method: 'POST',
-    }),
-  getTemplateVariables: () => request<EventVariablesResponse[]>('/notification-templates/variables'),
-  previewTemplate: (data: TemplatePreviewRequest) =>
-    request<TemplatePreviewResponse>('/notification-templates/preview', {
-      method: 'POST',
-      body: JSON.stringify(data),
-    }),
- 
-  // Notification Logs
-  getNotificationLogs: (params?: {
-    limit?: number;
-    offset?: number;
-    provider_id?: number;
-    event_type?: string;
-    success?: boolean;
-    days?: number;
-  }) => {
-    const searchParams = new URLSearchParams();
-    if (params?.limit) searchParams.set('limit', String(params.limit));
-    if (params?.offset) searchParams.set('offset', String(params.offset));
-    if (params?.provider_id) searchParams.set('provider_id', String(params.provider_id));
-    if (params?.event_type) searchParams.set('event_type', params.event_type);
-    if (params?.success !== undefined) searchParams.set('success', String(params.success));
-    if (params?.days) searchParams.set('days', String(params.days));
-    return request<NotificationLogEntry[]>(`/notifications/logs?${searchParams}`);
-  },
-  getNotificationLogStats: (days = 7) =>
-    request<NotificationLogStats>(`/notifications/logs/stats?days=${days}`),
-  clearNotificationLogs: (olderThanDays = 30) =>
-    request<{ deleted: number; message: string }>(
-      `/notifications/logs?older_than_days=${olderThanDays}`,
-      { method: 'DELETE' }
-    ),
- 
-  // Spoolman Integration
-  getSpoolmanStatus: () => request<SpoolmanStatus>('/spoolman/status'),
-  connectSpoolman: () =>
-    request<{ success: boolean; message: string }>('/spoolman/connect', {
-      method: 'POST',
-    }),
-  disconnectSpoolman: () =>
-    request<{ success: boolean; message: string }>('/spoolman/disconnect', {
-      method: 'POST',
-    }),
-  syncPrinterAms: (printerId: number) =>
-    request<SpoolmanSyncResult>(`/spoolman/sync/${printerId}`, {
-      method: 'POST',
-    }),
-  syncAllPrintersAms: () =>
-    request<SpoolmanSyncResult>('/spoolman/sync-all', {
-      method: 'POST',
-    }),
-  getSpoolmanSpools: () =>
-    request<{ spools: unknown[] }>('/spoolman/spools'),
-  getSpoolmanFilaments: () =>
-    request<{ filaments: unknown[] }>('/spoolman/filaments'),
- 
-  // Updates
-  getVersion: () => request<VersionInfo>('/updates/version'),
-  checkForUpdates: () => request<UpdateCheckResult>('/updates/check'),
-  applyUpdate: () =>
-    request<{ success: boolean; message: string; status: UpdateStatus }>('/updates/apply', {
-      method: 'POST',
-    }),
-  getUpdateStatus: () => request<UpdateStatus>('/updates/status'),
- 
-  // Maintenance
-  getMaintenanceTypes: () => request<MaintenanceType[]>('/maintenance/types'),
-  createMaintenanceType: (data: MaintenanceTypeCreate) =>
-    request<MaintenanceType>('/maintenance/types', {
-      method: 'POST',
-      body: JSON.stringify(data),
-    }),
-  updateMaintenanceType: (id: number, data: Partial<MaintenanceTypeCreate>) =>
-    request<MaintenanceType>(`/maintenance/types/${id}`, {
-      method: 'PATCH',
-      body: JSON.stringify(data),
-    }),
-  deleteMaintenanceType: (id: number) =>
-    request<{ status: string }>(`/maintenance/types/${id}`, { method: 'DELETE' }),
-  getMaintenanceOverview: () => request<PrinterMaintenanceOverview[]>('/maintenance/overview'),
-  getPrinterMaintenance: (printerId: number) =>
-    request<PrinterMaintenanceOverview>(`/maintenance/printers/${printerId}`),
-  updateMaintenanceItem: (itemId: number, data: { custom_interval_hours?: number | null; custom_interval_type?: 'hours' | 'days' | null; enabled?: boolean }) =>
-    request<MaintenanceStatus>(`/maintenance/items/${itemId}`, {
-      method: 'PATCH',
-      body: JSON.stringify(data),
-    }),
-  performMaintenance: (itemId: number, notes?: string) =>
-    request<MaintenanceStatus>(`/maintenance/items/${itemId}/perform`, {
-      method: 'POST',
-      body: JSON.stringify({ notes }),
-    }),
-  getMaintenanceHistory: (itemId: number) =>
-    request<MaintenanceHistory[]>(`/maintenance/items/${itemId}/history`),
-  getMaintenanceSummary: () => request<MaintenanceSummary>('/maintenance/summary'),
-  setPrinterHours: (printerId: number, totalHours: number) =>
-    request<{ printer_id: number; total_hours: number; archive_hours: number; offset_hours: number }>(
-      `/maintenance/printers/${printerId}/hours?total_hours=${totalHours}`,
-      { method: 'PATCH' }
-    ),
- 
-  // Camera
-  getCameraStreamUrl: (printerId: number, fps = 10) =>
-    `${API_BASE}/printers/${printerId}/camera/stream?fps=${fps}`,
-  getCameraSnapshotUrl: (printerId: number) =>
-    `${API_BASE}/printers/${printerId}/camera/snapshot`,
-  testCameraConnection: (printerId: number) =>
-    request<{ success: boolean; message?: string; error?: string }>(`/printers/${printerId}/camera/test`),
- 
-  // External Links
-  getExternalLinks: () => request<ExternalLink[]>('/external-links/'),
-  getExternalLink: (id: number) => request<ExternalLink>(`/external-links/${id}`),
-  createExternalLink: (data: ExternalLinkCreate) =>
-    request<ExternalLink>('/external-links/', {
-      method: 'POST',
-      body: JSON.stringify(data),
-    }),
-  updateExternalLink: (id: number, data: ExternalLinkUpdate) =>
-    request<ExternalLink>(`/external-links/${id}`, {
-      method: 'PATCH',
-      body: JSON.stringify(data),
-    }),
-  deleteExternalLink: (id: number) =>
-    request<{ message: string }>(`/external-links/${id}`, { method: 'DELETE' }),
-  reorderExternalLinks: (ids: number[]) =>
-    request<ExternalLink[]>('/external-links/reorder', {
-      method: 'PUT',
-      body: JSON.stringify({ ids }),
-    }),
-  uploadExternalLinkIcon: async (id: number, file: File): Promise<ExternalLink> => {
-    const formData = new FormData();
-    formData.append('file', file);
-    const response = await fetch(`${API_BASE}/external-links/${id}/icon`, {
-      method: 'POST',
-      body: formData,
-    });
-    if (!response.ok) {
-      const error = await response.json().catch(() => ({}));
-      throw new Error(error.detail || `HTTP ${response.status}`);
-    }
-    return response.json();
-  },
-  deleteExternalLinkIcon: (id: number) =>
-    request<ExternalLink>(`/external-links/${id}/icon`, { method: 'DELETE' }),
-  getExternalLinkIconUrl: (id: number) => `${API_BASE}/external-links/${id}/icon`,
- 
-  // Projects
-  getProjects: (status?: string) => {
-    const params = new URLSearchParams();
-    if (status) params.set('status', status);
-    return request<ProjectListItem[]>(`/projects/?${params}`);
-  },
-  getProject: (id: number) => request<Project>(`/projects/${id}`),
-  createProject: (data: ProjectCreate) =>
-    request<Project>('/projects/', {
-      method: 'POST',
-      body: JSON.stringify(data),
-    }),
-  updateProject: (id: number, data: ProjectUpdate) =>
-    request<Project>(`/projects/${id}`, {
-      method: 'PATCH',
-      body: JSON.stringify(data),
-    }),
-  deleteProject: (id: number) =>
-    request<{ message: string }>(`/projects/${id}`, { method: 'DELETE' }),
-  getProjectArchives: (id: number, limit = 100, offset = 0) =>
-    request<Archive[]>(`/projects/${id}/archives?limit=${limit}&offset=${offset}`),
-  addArchivesToProject: (projectId: number, archiveIds: number[]) =>
-    request<{ message: string }>(`/projects/${projectId}/add-archives`, {
-      method: 'POST',
-      body: JSON.stringify({ archive_ids: archiveIds }),
-    }),
-  removeArchivesFromProject: (projectId: number, archiveIds: number[]) =>
-    request<{ message: string }>(`/projects/${projectId}/remove-archives`, {
-      method: 'POST',
-      body: JSON.stringify({ archive_ids: archiveIds }),
-    }),
-  addQueueItemsToProject: (projectId: number, queueItemIds: number[]) =>
-    request<{ message: string }>(`/projects/${projectId}/add-queue`, {
-      method: 'POST',
-      body: JSON.stringify({ queue_item_ids: queueItemIds }),
-    }),
- 
-  // API Keys
-  getAPIKeys: () => request<APIKey[]>('/api-keys/'),
-  createAPIKey: (data: APIKeyCreate) =>
-    request<APIKeyCreateResponse>('/api-keys/', {
-      method: 'POST',
-      body: JSON.stringify(data),
-    }),
-  updateAPIKey: (id: number, data: APIKeyUpdate) =>
-    request<APIKey>(`/api-keys/${id}`, {
-      method: 'PATCH',
-      body: JSON.stringify(data),
-    }),
-  deleteAPIKey: (id: number) =>
-    request<{ message: string }>(`/api-keys/${id}`, { method: 'DELETE' }),
- 
-  // AMS History
-  getAMSHistory: (printerId: number, amsId: number, hours = 24) =>
-    request<AMSHistoryResponse>(`/ams-history/${printerId}/${amsId}?hours=${hours}`),
-};
- 
-// AMS History types
-export interface AMSHistoryPoint {
-  recorded_at: string;
-  humidity: number | null;
-  humidity_raw: number | null;
-  temperature: number | null;
-}
- 
-export interface AMSHistoryResponse {
-  printer_id: number;
-  ams_id: number;
-  data: AMSHistoryPoint[];
-  min_humidity: number | null;
-  max_humidity: number | null;
-  avg_humidity: number | null;
-  min_temperature: number | null;
-  max_temperature: number | null;
-  avg_temperature: number | null;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/api/index.html b/frontend/coverage/src/api/index.html deleted file mode 100644 index 93a2f03d2..000000000 --- a/frontend/coverage/src/api/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/api - - - - - - - - - -
-
-

All files src/api

-
- -
- 27.54% - Statements - 187/679 -
- - -
- 75% - Branches - 3/4 -
- - -
- 1.76% - Functions - 3/170 -
- - -
- 27.54% - Lines - 187/679 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
client.ts -
-
27.54%187/67975%3/41.76%3/17027.54%187/679
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/AMSHistoryModal.tsx.html b/frontend/coverage/src/components/AMSHistoryModal.tsx.html deleted file mode 100644 index a7df56941..000000000 --- a/frontend/coverage/src/components/AMSHistoryModal.tsx.html +++ /dev/null @@ -1,1198 +0,0 @@ - - - - - - Code coverage report for src/components/AMSHistoryModal.tsx - - - - - - - - - -
-
-

All files / src/components AMSHistoryModal.tsx

-
- -
- 0% - Statements - 0/287 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/287 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useEffect } from 'react';
-import { useQuery } from '@tanstack/react-query';
-import { X, Droplets, Thermometer, TrendingUp, TrendingDown, Minus } from 'lucide-react';
-import {
-  LineChart,
-  Line,
-  XAxis,
-  YAxis,
-  CartesianGrid,
-  Tooltip,
-  ResponsiveContainer,
-  Legend,
-  ReferenceLine,
-} from 'recharts';
-import { api, type AMSHistoryResponse } from '../api/client';
-import { useTranslation } from 'react-i18next';
-import { useTheme } from '../contexts/ThemeContext';
- 
-interface AMSHistoryModalProps {
-  isOpen: boolean;
-  onClose: () => void;
-  printerId: number;
-  printerName: string;
-  amsId: number;
-  amsLabel: string;
-  initialMode?: 'humidity' | 'temperature';
-  thresholds?: {
-    humidityGood: number;
-    humidityFair: number;
-    tempGood: number;
-    tempFair: number;
-  };
-}
- 
-type TimeRange = '6h' | '24h' | '48h' | '7d';
- 
-const TIME_RANGES: { value: TimeRange; label: string; hours: number }[] = [
-  { value: '6h', label: '6h', hours: 6 },
-  { value: '24h', label: '24h', hours: 24 },
-  { value: '48h', label: '48h', hours: 48 },
-  { value: '7d', label: '7d', hours: 168 },
-];
- 
-export function AMSHistoryModal({
-  isOpen,
-  onClose,
-  printerId,
-  printerName,
-  amsId,
-  amsLabel,
-  initialMode = 'humidity',
-  thresholds,
-}: AMSHistoryModalProps) {
-  const { t } = useTranslation();
-  const { theme } = useTheme();
-  const [timeRange, setTimeRange] = useState<TimeRange>('24h');
-  const [mode, setMode] = useState<'humidity' | 'temperature'>(initialMode);
-  const isDark = theme === 'dark';
- 
-  // Close on Escape key
-  useEffect(() => {
-    if (!isOpen) return;
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onClose();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [isOpen, onClose]);
- 
-  const hours = TIME_RANGES.find(r => r.value === timeRange)?.hours || 24;
- 
-  const { data, isLoading, error } = useQuery<AMSHistoryResponse>({
-    queryKey: ['ams-history', printerId, amsId, hours],
-    queryFn: () => api.getAMSHistory(printerId, amsId, hours),
-    enabled: isOpen,
-    refetchInterval: 60000, // Refresh every minute
-  });
- 
-  if (!isOpen) return null;
- 
-  // Format data for chart
-  const chartData = data?.data.map(point => ({
-    time: new Date(point.recorded_at).getTime(),
-    humidity: point.humidity,
-    temperature: point.temperature,
-    timeLabel: new Date(point.recorded_at).toLocaleTimeString([], {
-      hour: '2-digit',
-      minute: '2-digit',
-      ...(hours > 24 ? { day: 'numeric', month: 'short' } : {}),
-    }),
-  })) || [];
- 
-  // Get thresholds
-  const humidityGood = thresholds?.humidityGood || 40;
-  const humidityFair = thresholds?.humidityFair || 60;
-  const tempGood = thresholds?.tempGood || 30;
-  const tempFair = thresholds?.tempFair || 35;
- 
-  // Current values (last data point)
-  const lastPoint = chartData[chartData.length - 1];
-  const currentHumidity = lastPoint?.humidity;
-  const currentTemp = lastPoint?.temperature;
- 
-  // Trend calculation (compare first and last 20% of data)
-  const getTrend = (values: (number | null)[]) => {
-    const filtered = values.filter((v): v is number => v != null);
-    if (filtered.length < 4) return 'stable';
-    const firstQuarter = filtered.slice(0, Math.floor(filtered.length / 4));
-    const lastQuarter = filtered.slice(-Math.floor(filtered.length / 4));
-    const firstAvg = firstQuarter.reduce((a, b) => a + b, 0) / firstQuarter.length;
-    const lastAvg = lastQuarter.reduce((a, b) => a + b, 0) / lastQuarter.length;
-    const diff = lastAvg - firstAvg;
-    if (Math.abs(diff) < 2) return 'stable';
-    return diff > 0 ? 'up' : 'down';
-  };
- 
-  const humidityTrend = getTrend(chartData.map(d => d.humidity));
-  const tempTrend = getTrend(chartData.map(d => d.temperature));
- 
-  const TrendIcon = ({ trend }: { trend: string }) => {
-    if (trend === 'up') return <TrendingUp className="w-4 h-4 text-red-400" />;
-    if (trend === 'down') return <TrendingDown className="w-4 h-4 text-green-400" />;
-    return <Minus className="w-4 h-4 text-gray-400 dark:text-bambu-gray" />;
-  };
- 
-  // Get status color for current value
-  const getHumidityColor = (value: number | undefined | null) => {
-    if (value == null) return '#9ca3af';
-    if (value <= humidityGood) return '#22a352';
-    if (value <= humidityFair) return '#d4a017';
-    return '#c62828';
-  };
- 
-  const getTempColor = (value: number | undefined | null) => {
-    if (value == null) return '#9ca3af';
-    if (value <= tempGood) return '#22a352';
-    if (value <= tempFair) return '#d4a017';
-    return '#c62828';
-  };
- 
-  // Theme-aware styles (using isDark since dark: prefix doesn't work in portals)
-  const modalBg = isDark ? '#2d2d2d' : '#ffffff';
-  const cardBg = isDark ? '#1d1d1d' : '#f3f4f6';
-  const borderColor = isDark ? '#3d3d3d' : '#e5e7eb';
-  const textPrimary = isDark ? '#ffffff' : '#111827';
-  const textSecondary = isDark ? '#9ca3af' : '#4b5563';
- 
-  return (
-    <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50" onClick={onClose}>
-      <div
-        className="rounded-xl w-full max-w-4xl max-h-[90vh] overflow-hidden shadow-xl"
-        style={{ backgroundColor: modalBg }}
-        onClick={e => e.stopPropagation()}
-      >
-        {/* Header */}
-        <div
-          className="flex items-center justify-between px-6 py-4 border-b"
-          style={{ borderColor }}
-        >
-          <div>
-            <h2 className="text-lg font-semibold" style={{ color: textPrimary }}>
-              {amsLabel} {t('common.history', 'History')}
-            </h2>
-            <p className="text-sm" style={{ color: textSecondary }}>{printerName}</p>
-          </div>
-          <button
-            onClick={onClose}
-            className="p-2 rounded-lg transition-colors"
-            style={{ color: textSecondary }}
-          >
-            <X className="w-5 h-5" />
-          </button>
-        </div>
- 
-        {/* Content */}
-        <div className="p-6 space-y-6 overflow-y-auto max-h-[calc(90vh-80px)]">
-          {/* Time Range & Mode Selector */}
-          <div className="flex items-center justify-between">
-            <div className="flex gap-1 rounded-lg p-1" style={{ backgroundColor: cardBg }}>
-              <button
-                onClick={() => setMode('humidity')}
-                className={`flex items-center gap-2 px-3 py-1.5 text-sm rounded-md transition-colors ${
-                  mode === 'humidity' ? 'bg-blue-600 text-white' : ''
-                }`}
-                style={mode !== 'humidity' ? { color: textSecondary } : undefined}
-              >
-                <Droplets className="w-4 h-4" />
-                {t('common.humidity', 'Humidity')}
-              </button>
-              <button
-                onClick={() => setMode('temperature')}
-                className={`flex items-center gap-2 px-3 py-1.5 text-sm rounded-md transition-colors ${
-                  mode === 'temperature' ? 'bg-orange-600 text-white' : ''
-                }`}
-                style={mode !== 'temperature' ? { color: textSecondary } : undefined}
-              >
-                <Thermometer className="w-4 h-4" />
-                {t('common.temperature', 'Temperature')}
-              </button>
-            </div>
- 
-            <div className="flex gap-1 rounded-lg p-1" style={{ backgroundColor: cardBg }}>
-              {TIME_RANGES.map(range => (
-                <button
-                  key={range.value}
-                  onClick={() => setTimeRange(range.value)}
-                  className={`px-3 py-1 text-sm rounded-md transition-colors ${
-                    timeRange === range.value ? 'bg-bambu-green text-white' : ''
-                  }`}
-                  style={timeRange !== range.value ? { color: textSecondary } : undefined}
-                >
-                  {range.label}
-                </button>
-              ))}
-            </div>
-          </div>
- 
-          {/* Stats Cards */}
-          <div className="grid grid-cols-4 gap-4">
-            {mode === 'humidity' ? (
-              <>
-                <div className="rounded-lg p-4" style={{ backgroundColor: cardBg }}>
-                  <p className="text-xs" style={{ color: textSecondary }}>{t('common.current', 'Current')}</p>
-                  <div className="flex items-center gap-2">
-                    <p className="text-2xl font-bold" style={{ color: getHumidityColor(currentHumidity) }}>
-                      {currentHumidity != null ? `${currentHumidity}%` : '—'}
-                    </p>
-                    <TrendIcon trend={humidityTrend} />
-                  </div>
-                </div>
-                <div className="rounded-lg p-4" style={{ backgroundColor: cardBg }}>
-                  <p className="text-xs" style={{ color: textSecondary }}>{t('common.average', 'Average')}</p>
-                  <p className="text-2xl font-bold" style={{ color: textPrimary }}>
-                    {data?.avg_humidity != null ? `${data.avg_humidity}%` : '—'}
-                  </p>
-                </div>
-                <div className="rounded-lg p-4" style={{ backgroundColor: cardBg }}>
-                  <p className="text-xs" style={{ color: textSecondary }}>{t('common.min', 'Min')}</p>
-                  <p className="text-2xl font-bold text-green-500">
-                    {data?.min_humidity != null ? `${data.min_humidity}%` : '—'}
-                  </p>
-                </div>
-                <div className="rounded-lg p-4" style={{ backgroundColor: cardBg }}>
-                  <p className="text-xs" style={{ color: textSecondary }}>{t('common.max', 'Max')}</p>
-                  <p className="text-2xl font-bold text-red-500">
-                    {data?.max_humidity != null ? `${data.max_humidity}%` : '—'}
-                  </p>
-                </div>
-              </>
-            ) : (
-              <>
-                <div className="rounded-lg p-4" style={{ backgroundColor: cardBg }}>
-                  <p className="text-xs" style={{ color: textSecondary }}>{t('common.current', 'Current')}</p>
-                  <div className="flex items-center gap-2">
-                    <p className="text-2xl font-bold" style={{ color: getTempColor(currentTemp) }}>
-                      {currentTemp != null ? `${currentTemp}°C` : '—'}
-                    </p>
-                    <TrendIcon trend={tempTrend} />
-                  </div>
-                </div>
-                <div className="rounded-lg p-4" style={{ backgroundColor: cardBg }}>
-                  <p className="text-xs" style={{ color: textSecondary }}>{t('common.average', 'Average')}</p>
-                  <p className="text-2xl font-bold" style={{ color: textPrimary }}>
-                    {data?.avg_temperature != null ? `${data.avg_temperature}°C` : '—'}
-                  </p>
-                </div>
-                <div className="rounded-lg p-4" style={{ backgroundColor: cardBg }}>
-                  <p className="text-xs" style={{ color: textSecondary }}>{t('common.min', 'Min')}</p>
-                  <p className="text-2xl font-bold text-blue-500">
-                    {data?.min_temperature != null ? `${data.min_temperature}°C` : '—'}
-                  </p>
-                </div>
-                <div className="rounded-lg p-4" style={{ backgroundColor: cardBg }}>
-                  <p className="text-xs" style={{ color: textSecondary }}>{t('common.max', 'Max')}</p>
-                  <p className="text-2xl font-bold text-red-500">
-                    {data?.max_temperature != null ? `${data.max_temperature}°C` : '—'}
-                  </p>
-                </div>
-              </>
-            )}
-          </div>
- 
-          {/* Chart */}
-          <div className="rounded-lg p-4" style={{ backgroundColor: cardBg }}>
-            {isLoading ? (
-              <div className="h-[300px] flex items-center justify-center" style={{ color: textSecondary }}>
-                {t('common.loading', 'Loading...')}
-              </div>
-            ) : error ? (
-              <div className="h-[300px] flex items-center justify-center text-red-500">
-                {t('common.error', 'Error loading data')}
-              </div>
-            ) : chartData.length === 0 ? (
-              <div className="h-[300px] flex items-center justify-center" style={{ color: textSecondary }}>
-                {t('common.noData', 'No data available for this time range')}
-              </div>
-            ) : (
-              <ResponsiveContainer width="100%" height={300}>
-                <LineChart data={chartData}>
-                  <CartesianGrid strokeDasharray="3 3" stroke={isDark ? '#3d3d3d' : '#e5e7eb'} />
-                  <XAxis
-                    dataKey="time"
-                    type="number"
-                    domain={['dataMin', 'dataMax']}
-                    tickFormatter={(ts) => {
-                      const date = new Date(ts);
-                      if (hours > 24) {
-                        return date.toLocaleDateString([], { day: 'numeric', month: 'short' });
-                      }
-                      return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
-                    }}
-                    stroke={isDark ? '#9ca3af' : '#6b7280'}
-                    tick={{ fontSize: 12 }}
-                  />
-                  <YAxis
-                    stroke={isDark ? '#9ca3af' : '#6b7280'}
-                    tick={{ fontSize: 12 }}
-                    domain={mode === 'humidity' ? [0, 100] : ['auto', 'auto']}
-                    tickFormatter={(value) => mode === 'humidity' ? `${value}%` : `${value}°C`}
-                  />
-                  <Tooltip
-                    contentStyle={{
-                      backgroundColor: isDark ? '#2d2d2d' : '#ffffff',
-                      border: `1px solid ${isDark ? '#3d3d3d' : '#e5e7eb'}`,
-                      borderRadius: '8px',
-                      color: isDark ? '#fff' : '#000',
-                    }}
-                    labelFormatter={(ts) => new Date(ts).toLocaleString()}
-                    formatter={(value: number) => [
-                      mode === 'humidity' ? `${value}%` : `${value}°C`,
-                      mode === 'humidity' ? 'Humidity' : 'Temperature'
-                    ]}
-                  />
-                  <Legend />
- 
-                  {/* Threshold lines */}
-                  {mode === 'humidity' ? (
-                    <>
-                      <ReferenceLine y={humidityGood} stroke="#22a352" strokeDasharray="5 5" label={{ value: 'Good', fill: '#22a352', fontSize: 10 }} />
-                      <ReferenceLine y={humidityFair} stroke="#d4a017" strokeDasharray="5 5" label={{ value: 'Fair', fill: '#d4a017', fontSize: 10 }} />
-                    </>
-                  ) : (
-                    <>
-                      <ReferenceLine y={tempGood} stroke="#22a352" strokeDasharray="5 5" label={{ value: 'Good', fill: '#22a352', fontSize: 10 }} />
-                      <ReferenceLine y={tempFair} stroke="#d4a017" strokeDasharray="5 5" label={{ value: 'Fair', fill: '#d4a017', fontSize: 10 }} />
-                    </>
-                  )}
- 
-                  <Line
-                    type="monotone"
-                    dataKey={mode}
-                    name={mode === 'humidity' ? 'Humidity' : 'Temperature'}
-                    stroke={mode === 'humidity' ? '#3b82f6' : '#f97316'}
-                    strokeWidth={2}
-                    dot={false}
-                    activeDot={{ r: 4 }}
-                  />
-                </LineChart>
-              </ResponsiveContainer>
-            )}
-          </div>
- 
-          {/* Info */}
-          <div className="text-xs text-center" style={{ color: textSecondary }}>
-            {t('amsHistory.recordingInfo', 'Data is recorded every 5 minutes while the printer is connected')}
-          </div>
-        </div>
-      </div>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/AddExternalLinkModal.tsx.html b/frontend/coverage/src/components/AddExternalLinkModal.tsx.html deleted file mode 100644 index eedcfdb73..000000000 --- a/frontend/coverage/src/components/AddExternalLinkModal.tsx.html +++ /dev/null @@ -1,982 +0,0 @@ - - - - - - Code coverage report for src/components/AddExternalLinkModal.tsx - - - - - - - - - -
-
-

All files / src/components AddExternalLinkModal.tsx

-
- -
- 0% - Statements - 0/225 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/225 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useEffect, useRef } from 'react';
-import { useMutation, useQueryClient } from '@tanstack/react-query';
-import { X, Save, Loader2, Upload, Trash2 } from 'lucide-react';
-import { api } from '../api/client';
-import type { ExternalLink, ExternalLinkCreate, ExternalLinkUpdate } from '../api/client';
-import { Button } from './Button';
-import { IconPicker, getIconByName } from './IconPicker';
-import { useTheme } from '../contexts/ThemeContext';
- 
-interface AddExternalLinkModalProps {
-  link?: ExternalLink | null;
-  onClose: () => void;
-}
- 
-export function AddExternalLinkModal({ link, onClose }: AddExternalLinkModalProps) {
-  const queryClient = useQueryClient();
-  const { theme } = useTheme();
-  const isEditing = !!link;
-  const fileInputRef = useRef<HTMLInputElement>(null);
- 
-  const [name, setName] = useState(link?.name || '');
-  const [url, setUrl] = useState(link?.url || '');
-  const [icon, setIcon] = useState(link?.icon || 'link');
-  const [useCustomIcon, setUseCustomIcon] = useState(!!link?.custom_icon);
-  const [customIconPreview, setCustomIconPreview] = useState<string | null>(
-    link?.custom_icon ? api.getExternalLinkIconUrl(link.id) : null
-  );
-  const [pendingIconFile, setPendingIconFile] = useState<File | null>(null);
-  const [error, setError] = useState<string | null>(null);
- 
-  // Close on Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onClose();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose]);
- 
-  // Create mutation
-  const createMutation = useMutation({
-    mutationFn: async (data: ExternalLinkCreate) => {
-      const created = await api.createExternalLink(data);
-      // If there's a pending icon file, upload it
-      if (pendingIconFile) {
-        return await api.uploadExternalLinkIcon(created.id, pendingIconFile);
-      }
-      return created;
-    },
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['external-links'] });
-      onClose();
-    },
-    onError: (err: Error) => {
-      setError(err.message);
-    },
-  });
- 
-  // Update mutation
-  const updateMutation = useMutation({
-    mutationFn: async (data: ExternalLinkUpdate) => {
-      let updated = await api.updateExternalLink(link!.id, data);
-      // Handle icon changes
-      if (pendingIconFile) {
-        // Upload new icon
-        updated = await api.uploadExternalLinkIcon(link!.id, pendingIconFile);
-      } else if (!useCustomIcon && link?.custom_icon) {
-        // Remove custom icon if switching to preset
-        updated = await api.deleteExternalLinkIcon(link!.id);
-      }
-      return updated;
-    },
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['external-links'] });
-      onClose();
-    },
-    onError: (err: Error) => {
-      setError(err.message);
-    },
-  });
- 
-  const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {
-    const file = e.target.files?.[0];
-    if (file) {
-      // Validate file type
-      const validTypes = ['image/png', 'image/jpeg', 'image/gif', 'image/svg+xml', 'image/webp', 'image/x-icon'];
-      if (!validTypes.includes(file.type)) {
-        setError('Please select a valid image file (PNG, JPG, GIF, SVG, WebP, or ICO)');
-        return;
-      }
- 
-      // Validate file size (max 1MB)
-      if (file.size > 1024 * 1024) {
-        setError('Image file must be less than 1MB');
-        return;
-      }
- 
-      setPendingIconFile(file);
-      setUseCustomIcon(true);
- 
-      // Create preview
-      const reader = new FileReader();
-      reader.onload = (e) => {
-        setCustomIconPreview(e.target?.result as string);
-      };
-      reader.readAsDataURL(file);
-    }
-  };
- 
-  const handleRemoveCustomIcon = () => {
-    setPendingIconFile(null);
-    setCustomIconPreview(null);
-    setUseCustomIcon(false);
-    if (fileInputRef.current) {
-      fileInputRef.current.value = '';
-    }
-  };
- 
-  const handleSubmit = (e: React.FormEvent) => {
-    e.preventDefault();
-    setError(null);
- 
-    if (!name.trim()) {
-      setError('Name is required');
-      return;
-    }
- 
-    if (!url.trim()) {
-      setError('URL is required');
-      return;
-    }
- 
-    // Validate URL
-    if (!url.startsWith('http://') && !url.startsWith('https://')) {
-      setError('URL must start with http:// or https://');
-      return;
-    }
- 
-    const data = {
-      name: name.trim(),
-      url: url.trim(),
-      icon: useCustomIcon ? icon : icon, // Keep preset icon as fallback
-    };
- 
-    if (isEditing) {
-      updateMutation.mutate(data);
-    } else {
-      createMutation.mutate(data);
-    }
-  };
- 
-  const isPending = createMutation.isPending || updateMutation.isPending;
-  const PresetIcon = getIconByName(icon);
- 
-  return (
-    <div
-      className="fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4"
-      onClick={onClose}
-    >
-      <div
-        className="bg-bambu-dark-secondary rounded-xl border border-bambu-dark-tertiary w-full max-w-md"
-        onClick={(e) => e.stopPropagation()}
-      >
-        {/* Header */}
-        <div className="flex items-center justify-between px-6 py-4 border-b border-bambu-dark-tertiary">
-          <div className="flex items-center gap-3">
-            <div className="p-2 rounded-full bg-bambu-green/20 text-bambu-green">
-              {useCustomIcon && customIconPreview ? (
-                <img src={customIconPreview} alt="" className={`w-5 h-5 rounded ${theme === 'dark' ? 'invert opacity-[0.65]' : 'opacity-60'}`} />
-              ) : (
-                <PresetIcon className="w-5 h-5" />
-              )}
-            </div>
-            <h2 className="text-lg font-semibold text-white">
-              {isEditing ? 'Edit Link' : 'Add External Link'}
-            </h2>
-          </div>
-          <button
-            onClick={onClose}
-            className="text-bambu-gray hover:text-white transition-colors"
-          >
-            <X className="w-5 h-5" />
-          </button>
-        </div>
- 
-        {/* Form */}
-        <form onSubmit={handleSubmit} className="p-6 space-y-4">
-          {error && (
-            <div className="p-3 bg-red-500/20 border border-red-500/50 rounded-lg text-sm text-red-400">
-              {error}
-            </div>
-          )}
- 
-          {/* Name */}
-          <div>
-            <label className="block text-sm text-bambu-gray mb-1">Name *</label>
-            <input
-              type="text"
-              value={name}
-              onChange={(e) => setName(e.target.value)}
-              placeholder="My Link"
-              maxLength={50}
-              className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-            />
-          </div>
- 
-          {/* URL */}
-          <div>
-            <label className="block text-sm text-bambu-gray mb-1">URL *</label>
-            <input
-              type="text"
-              value={url}
-              onChange={(e) => setUrl(e.target.value)}
-              placeholder="https://example.com"
-              className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-            />
-          </div>
- 
-          {/* Icon Section */}
-          <div className="space-y-3">
-            <label className="block text-sm text-bambu-gray">Icon</label>
- 
-            {/* Custom Icon Upload */}
-            <div className="p-3 rounded-lg bg-bambu-dark border border-bambu-dark-tertiary">
-              <div className="flex items-center justify-between mb-2">
-                <span className="text-sm text-white">Custom Icon</span>
-                <input
-                  ref={fileInputRef}
-                  type="file"
-                  accept="image/png,image/jpeg,image/gif,image/svg+xml,image/webp,image/x-icon"
-                  className="hidden"
-                  onChange={handleFileSelect}
-                />
-                {useCustomIcon && customIconPreview ? (
-                  <div className="flex items-center gap-2">
-                    <img src={customIconPreview} alt="Custom icon" className={`w-8 h-8 rounded border border-bambu-dark-tertiary ${theme === 'dark' ? 'invert opacity-[0.65]' : 'opacity-60'}`} />
-                    <button
-                      type="button"
-                      onClick={handleRemoveCustomIcon}
-                      className="p-1 text-red-400 hover:text-red-300 transition-colors"
-                      title="Remove custom icon"
-                    >
-                      <Trash2 className="w-4 h-4" />
-                    </button>
-                  </div>
-                ) : (
-                  <Button
-                    type="button"
-                    variant="secondary"
-                    size="sm"
-                    onClick={() => fileInputRef.current?.click()}
-                  >
-                    <Upload className="w-4 h-4" />
-                    Upload
-                  </Button>
-                )}
-              </div>
-              <p className="text-xs text-bambu-gray">
-                PNG, JPG, GIF, SVG, WebP, or ICO. Max 1MB.
-              </p>
-            </div>
- 
-            {/* Preset Icon Picker */}
-            {!useCustomIcon && (
-              <div>
-                <span className="text-sm text-bambu-gray block mb-2">Or choose a preset icon</span>
-                <IconPicker value={icon} onChange={setIcon} />
-              </div>
-            )}
-          </div>
- 
-          {/* Actions */}
-          <div className="flex gap-3 pt-2">
-            <Button
-              type="button"
-              variant="secondary"
-              onClick={onClose}
-              className="flex-1"
-            >
-              Cancel
-            </Button>
-            <Button
-              type="submit"
-              disabled={isPending}
-              className="flex-1"
-            >
-              {isPending ? (
-                <Loader2 className="w-4 h-4 animate-spin" />
-              ) : (
-                <Save className="w-4 h-4" />
-              )}
-              {isEditing ? 'Save' : 'Add'}
-            </Button>
-          </div>
-        </form>
-      </div>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/AddNotificationModal.tsx.html b/frontend/coverage/src/components/AddNotificationModal.tsx.html deleted file mode 100644 index 5bce441f0..000000000 --- a/frontend/coverage/src/components/AddNotificationModal.tsx.html +++ /dev/null @@ -1,1696 +0,0 @@ - - - - - - Code coverage report for src/components/AddNotificationModal.tsx - - - - - - - - - -
-
-

All files / src/components AddNotificationModal.tsx

-
- -
- 0% - Statements - 0/441 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/441 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -425 -426 -427 -428 -429 -430 -431 -432 -433 -434 -435 -436 -437 -438 -439 -440 -441 -442 -443 -444 -445 -446 -447 -448 -449 -450 -451 -452 -453 -454 -455 -456 -457 -458 -459 -460 -461 -462 -463 -464 -465 -466 -467 -468 -469 -470 -471 -472 -473 -474 -475 -476 -477 -478 -479 -480 -481 -482 -483 -484 -485 -486 -487 -488 -489 -490 -491 -492 -493 -494 -495 -496 -497 -498 -499 -500 -501 -502 -503 -504 -505 -506 -507 -508 -509 -510 -511 -512 -513 -514 -515 -516 -517 -518 -519 -520 -521 -522 -523 -524 -525 -526 -527 -528 -529 -530 -531 -532 -533 -534 -535 -536 -537 -538  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useEffect } from 'react';
-import { useMutation, useQueryClient, useQuery } from '@tanstack/react-query';
-import { X, Save, Loader2, Send, CheckCircle, XCircle } from 'lucide-react';
-import { api } from '../api/client';
-import type { NotificationProvider, NotificationProviderCreate, NotificationProviderUpdate, ProviderType } from '../api/client';
-import { Button } from './Button';
-import { Toggle } from './Toggle';
- 
-interface AddNotificationModalProps {
-  provider?: NotificationProvider | null;
-  onClose: () => void;
-}
- 
-const PROVIDER_OPTIONS: { value: ProviderType; label: string; description: string }[] = [
-  { value: 'discord', label: 'Discord', description: 'Send to Discord channel via webhook' },
-  { value: 'telegram', label: 'Telegram', description: 'Notifications via Telegram bot' },
-  { value: 'ntfy', label: 'ntfy', description: 'Free, self-hostable push notifications' },
-  { value: 'pushover', label: 'Pushover', description: 'Simple, reliable push notifications' },
-  { value: 'email', label: 'Email', description: 'SMTP email notifications' },
-  { value: 'callmebot', label: 'CallMeBot/WhatsApp', description: 'Free WhatsApp notifications via CallMeBot' },
-  { value: 'webhook', label: 'Webhook', description: 'Generic HTTP POST to any URL' },
-];
- 
-export function AddNotificationModal({ provider, onClose }: AddNotificationModalProps) {
-  const queryClient = useQueryClient();
-  const isEditing = !!provider;
- 
-  const [name, setName] = useState(provider?.name || '');
-  const [providerType, setProviderType] = useState<ProviderType>(provider?.provider_type || 'discord');
-  const [printerId, setPrinterId] = useState<number | null>(provider?.printer_id || null);
-  const [quietHoursEnabled, setQuietHoursEnabled] = useState(provider?.quiet_hours_enabled || false);
-  const [quietHoursStart, setQuietHoursStart] = useState(provider?.quiet_hours_start || '22:00');
-  const [quietHoursEnd, setQuietHoursEnd] = useState(provider?.quiet_hours_end || '07:00');
- 
-  // Daily digest
-  const [dailyDigestEnabled, setDailyDigestEnabled] = useState(provider?.daily_digest_enabled || false);
-  const [dailyDigestTime, setDailyDigestTime] = useState(provider?.daily_digest_time || '08:00');
- 
-  // Event toggles
-  const [onPrintStart, setOnPrintStart] = useState(provider?.on_print_start ?? false);
-  const [onPrintComplete, setOnPrintComplete] = useState(provider?.on_print_complete ?? true);
-  const [onPrintFailed, setOnPrintFailed] = useState(provider?.on_print_failed ?? true);
-  const [onPrintStopped, setOnPrintStopped] = useState(provider?.on_print_stopped ?? true);
-  const [onPrintProgress, setOnPrintProgress] = useState(provider?.on_print_progress ?? false);
-  const [onPrinterOffline, setOnPrinterOffline] = useState(provider?.on_printer_offline ?? false);
-  const [onPrinterError, setOnPrinterError] = useState(provider?.on_printer_error ?? false);
-  const [onFilamentLow, setOnFilamentLow] = useState(provider?.on_filament_low ?? false);
-  const [onMaintenanceDue, setOnMaintenanceDue] = useState(provider?.on_maintenance_due ?? false);
- 
-  // Provider-specific config
-  const [config, setConfig] = useState<Record<string, string>>(
-    provider?.config ? Object.fromEntries(Object.entries(provider.config).map(([k, v]) => [k, String(v)])) : {}
-  );
- 
-  const [testResult, setTestResult] = useState<{ success: boolean; message: string } | null>(null);
-  const [error, setError] = useState<string | null>(null);
- 
-  // Fetch printers for linking
-  const { data: printers } = useQuery({
-    queryKey: ['printers'],
-    queryFn: api.getPrinters,
-  });
- 
-  // Close on Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onClose();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose]);
- 
-  // Test configuration mutation
-  const testMutation = useMutation({
-    mutationFn: () => api.testNotificationConfig({ provider_type: providerType, config }),
-    onSuccess: (result) => {
-      setTestResult(result);
-      setError(null);
-    },
-    onError: (err: Error) => {
-      setTestResult({ success: false, message: err.message });
-    },
-  });
- 
-  // Create mutation
-  const createMutation = useMutation({
-    mutationFn: (data: NotificationProviderCreate) => api.createNotificationProvider(data),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['notification-providers'] });
-      onClose();
-    },
-    onError: (err: Error) => {
-      setError(err.message);
-    },
-  });
- 
-  // Update mutation
-  const updateMutation = useMutation({
-    mutationFn: (data: NotificationProviderUpdate) => api.updateNotificationProvider(provider!.id, data),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['notification-providers'] });
-      onClose();
-    },
-    onError: (err: Error) => {
-      setError(err.message);
-    },
-  });
- 
-  const handleSubmit = (e: React.FormEvent) => {
-    e.preventDefault();
-    setError(null);
- 
-    if (!name.trim()) {
-      setError('Name is required');
-      return;
-    }
- 
-    // Validate provider-specific config
-    const requiredFields = getRequiredFields(providerType);
-    for (const field of requiredFields) {
-      if (!config[field.key]?.trim()) {
-        setError(`${field.label} is required`);
-        return;
-      }
-    }
- 
-    const data = {
-      name: name.trim(),
-      provider_type: providerType,
-      config,
-      printer_id: printerId,
-      quiet_hours_enabled: quietHoursEnabled,
-      quiet_hours_start: quietHoursEnabled ? quietHoursStart : null,
-      quiet_hours_end: quietHoursEnabled ? quietHoursEnd : null,
-      // Daily digest
-      daily_digest_enabled: dailyDigestEnabled,
-      daily_digest_time: dailyDigestEnabled ? dailyDigestTime : null,
-      // Event toggles
-      on_print_start: onPrintStart,
-      on_print_complete: onPrintComplete,
-      on_print_failed: onPrintFailed,
-      on_print_stopped: onPrintStopped,
-      on_print_progress: onPrintProgress,
-      on_printer_offline: onPrinterOffline,
-      on_printer_error: onPrinterError,
-      on_filament_low: onFilamentLow,
-      on_maintenance_due: onMaintenanceDue,
-    };
- 
-    if (isEditing) {
-      updateMutation.mutate(data);
-    } else {
-      createMutation.mutate(data);
-    }
-  };
- 
-  const isPending = createMutation.isPending || updateMutation.isPending;
- 
-  // Get config fields for each provider type
-  const getConfigFields = (type: ProviderType) => {
-    switch (type) {
-      case 'callmebot':
-        return [
-          { key: 'phone', label: 'Phone Number', placeholder: '+1234567890', type: 'text', required: true },
-          { key: 'apikey', label: 'API Key', placeholder: 'Your CallMeBot API key', type: 'text', required: true },
-        ];
-      case 'ntfy':
-        return [
-          { key: 'server', label: 'Server URL', placeholder: 'https://ntfy.sh', type: 'text', required: false },
-          { key: 'topic', label: 'Topic', placeholder: 'my-bambuddy', type: 'text', required: true },
-          { key: 'auth_token', label: 'Auth Token', placeholder: 'Optional authentication', type: 'password', required: false },
-        ];
-      case 'pushover':
-        return [
-          { key: 'user_key', label: 'User Key', placeholder: 'Your Pushover user key', type: 'text', required: true },
-          { key: 'app_token', label: 'App Token', placeholder: 'Your Pushover app token', type: 'text', required: true },
-          { key: 'priority', label: 'Priority', placeholder: '0 (normal)', type: 'number', required: false },
-        ];
-      case 'telegram':
-        return [
-          { key: 'bot_token', label: 'Bot Token', placeholder: 'Bot token from @BotFather', type: 'password', required: true },
-          { key: 'chat_id', label: 'Chat ID', placeholder: 'Your chat or group ID', type: 'text', required: true },
-        ];
-      case 'email':
-        return [
-          { key: 'smtp_server', label: 'SMTP Server', placeholder: 'smtp.gmail.com', type: 'text', required: true },
-          { key: 'smtp_port', label: 'SMTP Port', placeholder: '587', type: 'number', required: false },
-          { key: 'security', label: 'Security', type: 'select', required: false, options: [
-            { value: 'starttls', label: 'STARTTLS (Port 587)' },
-            { value: 'ssl', label: 'SSL/TLS (Port 465)' },
-            { value: 'none', label: 'None (Port 25)' },
-          ]},
-          { key: 'auth_enabled', label: 'Authentication', type: 'select', required: false, options: [
-            { value: 'true', label: 'Enabled' },
-            { value: 'false', label: 'Disabled' },
-          ]},
-          { key: 'username', label: 'Username', placeholder: 'your@email.com', type: 'text', required: false },
-          { key: 'password', label: 'Password', placeholder: 'App password', type: 'password', required: false },
-          { key: 'from_email', label: 'From Email', placeholder: 'your@email.com', type: 'text', required: true },
-          { key: 'to_email', label: 'To Email', placeholder: 'recipient@email.com', type: 'text', required: true },
-        ];
-      case 'discord':
-        return [
-          { key: 'webhook_url', label: 'Webhook URL', placeholder: 'https://discord.com/api/webhooks/...', type: 'text', required: true },
-        ];
-      case 'webhook':
-        return [
-          { key: 'webhook_url', label: 'Webhook URL', placeholder: 'https://example.com/webhook', type: 'text', required: true },
-          { key: 'auth_header', label: 'Authorization', placeholder: 'Bearer token (optional)', type: 'password', required: false },
-          { key: 'field_title', label: 'Title Field Name', placeholder: 'title', type: 'text', required: false },
-          { key: 'field_message', label: 'Message Field Name', placeholder: 'message', type: 'text', required: false },
-        ];
-      default:
-        return [];
-    }
-  };
- 
-  const getRequiredFields = (type: ProviderType) => {
-    return getConfigFields(type).filter(f => f.required);
-  };
- 
-  const configFields = getConfigFields(providerType);
- 
-  return (
-    <div
-      className="fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4 overflow-y-auto"
-      onClick={onClose}
-    >
-      <div
-        className="bg-bambu-dark-secondary rounded-xl border border-bambu-dark-tertiary w-full max-w-lg my-8"
-        onClick={(e) => e.stopPropagation()}
-      >
-        {/* Header */}
-        <div className="flex items-center justify-between px-6 py-4 border-b border-bambu-dark-tertiary">
-          <h2 className="text-lg font-semibold text-white">
-            {isEditing ? 'Edit Notification Provider' : 'Add Notification Provider'}
-          </h2>
-          <button
-            onClick={onClose}
-            className="text-bambu-gray hover:text-white transition-colors"
-          >
-            <X className="w-5 h-5" />
-          </button>
-        </div>
- 
-        {/* Form */}
-        <form onSubmit={handleSubmit} className="p-6 space-y-4">
-          {error && (
-            <div className="p-3 bg-red-500/20 border border-red-500/50 rounded-lg text-sm text-red-400">
-              {error}
-            </div>
-          )}
- 
-          {/* Name */}
-          <div>
-            <label className="block text-sm text-bambu-gray mb-1">Name *</label>
-            <input
-              type="text"
-              value={name}
-              onChange={(e) => setName(e.target.value)}
-              placeholder="My Notifications"
-              className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-            />
-          </div>
- 
-          {/* Provider Type */}
-          <div>
-            <label className="block text-sm text-bambu-gray mb-1">Provider Type *</label>
-            <select
-              value={providerType}
-              onChange={(e) => {
-                setProviderType(e.target.value as ProviderType);
-                setConfig({}); // Reset config when changing type
-                setTestResult(null);
-              }}
-              disabled={isEditing}
-              className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none disabled:opacity-50"
-            >
-              {PROVIDER_OPTIONS.map((option) => (
-                <option key={option.value} value={option.value}>
-                  {option.label}
-                </option>
-              ))}
-            </select>
-            <p className="text-xs text-bambu-gray mt-1">
-              {PROVIDER_OPTIONS.find(o => o.value === providerType)?.description}
-            </p>
-          </div>
- 
-          {/* Provider-specific configuration */}
-          <div className="space-y-3">
-            <p className="text-sm text-bambu-gray">Configuration</p>
-            {configFields.map((field) => (
-              <div key={field.key}>
-                <label className="block text-sm text-bambu-gray mb-1">
-                  {field.label} {field.required && '*'}
-                </label>
-                {field.type === 'select' && field.options ? (
-                  <select
-                    value={config[field.key] || field.options[0]?.value || ''}
-                    onChange={(e) => {
-                      setConfig({ ...config, [field.key]: e.target.value });
-                      setTestResult(null);
-                    }}
-                    className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                  >
-                    {field.options.map((opt) => (
-                      <option key={opt.value} value={opt.value}>
-                        {opt.label}
-                      </option>
-                    ))}
-                  </select>
-                ) : (
-                  <input
-                    type={field.type}
-                    value={config[field.key] || ''}
-                    onChange={(e) => {
-                      setConfig({ ...config, [field.key]: e.target.value });
-                      setTestResult(null);
-                    }}
-                    placeholder={field.placeholder}
-                    className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                  />
-                )}
-              </div>
-            ))}
-          </div>
- 
-          {/* Test Button */}
-          <div className="flex gap-2">
-            <Button
-              type="button"
-              variant="secondary"
-              onClick={() => {
-                setTestResult(null);
-                testMutation.mutate();
-              }}
-              disabled={testMutation.isPending || !config[getRequiredFields(providerType)[0]?.key]}
-              className="flex-1"
-            >
-              {testMutation.isPending ? (
-                <Loader2 className="w-4 h-4 animate-spin" />
-              ) : (
-                <Send className="w-4 h-4" />
-              )}
-              Test Configuration
-            </Button>
-          </div>
- 
-          {/* Test Result */}
-          {testResult && (
-            <div className={`p-3 rounded-lg flex items-center gap-2 ${
-              testResult.success
-                ? 'bg-bambu-green/20 border border-bambu-green/50 text-bambu-green'
-                : 'bg-red-500/20 border border-red-500/50 text-red-400'
-            }`}>
-              {testResult.success ? (
-                <>
-                  <CheckCircle className="w-5 h-5" />
-                  <span>{testResult.message}</span>
-                </>
-              ) : (
-                <>
-                  <XCircle className="w-5 h-5" />
-                  <span>{testResult.message}</span>
-                </>
-              )}
-            </div>
-          )}
- 
-          {/* Link to Printer */}
-          <div>
-            <label className="block text-sm text-bambu-gray mb-1">Printer Filter</label>
-            <select
-              value={printerId ?? ''}
-              onChange={(e) => setPrinterId(e.target.value ? Number(e.target.value) : null)}
-              className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-            >
-              <option value="">All printers</option>
-              {printers?.map((p) => (
-                <option key={p.id} value={p.id}>
-                  {p.name}
-                </option>
-              ))}
-            </select>
-            <p className="text-xs text-bambu-gray mt-1">
-              Only send notifications for events from this printer
-            </p>
-          </div>
- 
-          {/* Quiet Hours */}
-          <div className="space-y-2">
-            <div className="flex items-center justify-between">
-              <label className="text-sm text-white">Quiet Hours (Do Not Disturb)</label>
-              <Toggle
-                checked={quietHoursEnabled}
-                onChange={setQuietHoursEnabled}
-              />
-            </div>
-            {quietHoursEnabled && (
-              <div className="grid grid-cols-2 gap-3">
-                <div>
-                  <label className="block text-xs text-bambu-gray mb-1">Start</label>
-                  <input
-                    type="time"
-                    value={quietHoursStart}
-                    onChange={(e) => setQuietHoursStart(e.target.value)}
-                    className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                  />
-                </div>
-                <div>
-                  <label className="block text-xs text-bambu-gray mb-1">End</label>
-                  <input
-                    type="time"
-                    value={quietHoursEnd}
-                    onChange={(e) => setQuietHoursEnd(e.target.value)}
-                    className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                  />
-                </div>
-              </div>
-            )}
-          </div>
- 
-          {/* Daily Digest */}
-          <div className="space-y-2">
-            <div className="flex items-center justify-between">
-              <div>
-                <label className="text-sm text-white">Daily Digest</label>
-                <p className="text-xs text-bambu-gray">Batch notifications into a single daily summary</p>
-              </div>
-              <Toggle
-                checked={dailyDigestEnabled}
-                onChange={setDailyDigestEnabled}
-              />
-            </div>
-            {dailyDigestEnabled && (
-              <div>
-                <label className="block text-xs text-bambu-gray mb-1">Send digest at</label>
-                <input
-                  type="time"
-                  value={dailyDigestTime}
-                  onChange={(e) => setDailyDigestTime(e.target.value)}
-                  className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                />
-                <p className="text-xs text-bambu-gray mt-1">
-                  Events will be collected and sent as a single summary at this time
-                </p>
-              </div>
-            )}
-          </div>
- 
-          {/* Event Toggles */}
-          <div className="space-y-3">
-            <p className="text-sm text-bambu-gray">Notification Events</p>
- 
-            {/* Print Events */}
-            <div className="space-y-2 p-3 bg-bambu-dark rounded-lg">
-              <p className="text-xs text-bambu-gray uppercase tracking-wide mb-2">Print Events</p>
-              <div className="grid grid-cols-2 gap-2">
-                <div className="flex items-center justify-between">
-                  <span className="text-sm text-white">Start</span>
-                  <Toggle checked={onPrintStart} onChange={setOnPrintStart} />
-                </div>
-                <div className="flex items-center justify-between">
-                  <span className="text-sm text-white">Complete</span>
-                  <Toggle checked={onPrintComplete} onChange={setOnPrintComplete} />
-                </div>
-                <div className="flex items-center justify-between">
-                  <span className="text-sm text-white">Failed</span>
-                  <Toggle checked={onPrintFailed} onChange={setOnPrintFailed} />
-                </div>
-                <div className="flex items-center justify-between">
-                  <span className="text-sm text-white">Stopped</span>
-                  <Toggle checked={onPrintStopped} onChange={setOnPrintStopped} />
-                </div>
-                <div className="flex items-center justify-between col-span-2">
-                  <div>
-                    <span className="text-sm text-white">Progress</span>
-                    <span className="text-xs text-bambu-gray ml-1">(25%, 50%, 75%)</span>
-                  </div>
-                  <Toggle checked={onPrintProgress} onChange={setOnPrintProgress} />
-                </div>
-              </div>
-            </div>
- 
-            {/* Printer Status Events */}
-            <div className="space-y-2 p-3 bg-bambu-dark rounded-lg">
-              <p className="text-xs text-bambu-gray uppercase tracking-wide mb-2">Printer Status</p>
-              <div className="grid grid-cols-2 gap-2">
-                <div className="flex items-center justify-between">
-                  <span className="text-sm text-white">Offline</span>
-                  <Toggle checked={onPrinterOffline} onChange={setOnPrinterOffline} />
-                </div>
-                <div className="flex items-center justify-between">
-                  <span className="text-sm text-white">Error</span>
-                  <Toggle checked={onPrinterError} onChange={setOnPrinterError} />
-                </div>
-                <div className="flex items-center justify-between">
-                  <span className="text-sm text-white">Low Filament</span>
-                  <Toggle checked={onFilamentLow} onChange={setOnFilamentLow} />
-                </div>
-                <div className="flex items-center justify-between">
-                  <span className="text-sm text-white">Maintenance</span>
-                  <Toggle checked={onMaintenanceDue} onChange={setOnMaintenanceDue} />
-                </div>
-              </div>
-            </div>
-          </div>
- 
-          {/* Actions */}
-          <div className="flex gap-3 pt-2">
-            <Button
-              type="button"
-              variant="secondary"
-              onClick={onClose}
-              className="flex-1"
-            >
-              Cancel
-            </Button>
-            <Button
-              type="submit"
-              disabled={isPending}
-              className="flex-1"
-            >
-              {isPending ? (
-                <Loader2 className="w-4 h-4 animate-spin" />
-              ) : (
-                <Save className="w-4 h-4" />
-              )}
-              {isEditing ? 'Save' : 'Add'}
-            </Button>
-          </div>
-        </form>
-      </div>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/AddSmartPlugModal.tsx.html b/frontend/coverage/src/components/AddSmartPlugModal.tsx.html deleted file mode 100644 index fcff58368..000000000 --- a/frontend/coverage/src/components/AddSmartPlugModal.tsx.html +++ /dev/null @@ -1,1321 +0,0 @@ - - - - - - Code coverage report for src/components/AddSmartPlugModal.tsx - - - - - - - - - -
-
-

All files / src/components AddSmartPlugModal.tsx

-
- -
- 0% - Statements - 0/332 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/332 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useEffect } from 'react';
-import { useMutation, useQueryClient, useQuery } from '@tanstack/react-query';
-import { X, Save, Loader2, Wifi, WifiOff, CheckCircle, Bell, Clock } from 'lucide-react';
-import { api } from '../api/client';
-import type { SmartPlug, SmartPlugCreate, SmartPlugUpdate } from '../api/client';
-import { Button } from './Button';
- 
-interface AddSmartPlugModalProps {
-  plug?: SmartPlug | null;
-  onClose: () => void;
-}
- 
-export function AddSmartPlugModal({ plug, onClose }: AddSmartPlugModalProps) {
-  const queryClient = useQueryClient();
-  const isEditing = !!plug;
- 
-  const [name, setName] = useState(plug?.name || '');
-  const [ipAddress, setIpAddress] = useState(plug?.ip_address || '');
-  const [username, setUsername] = useState(plug?.username || '');
-  const [password, setPassword] = useState(plug?.password || '');
-  const [printerId, setPrinterId] = useState<number | null>(plug?.printer_id || null);
-  const [testResult, setTestResult] = useState<{ success: boolean; state?: string | null; device_name?: string | null } | null>(null);
-  const [error, setError] = useState<string | null>(null);
- 
-  // Power alert settings
-  const [powerAlertEnabled, setPowerAlertEnabled] = useState(plug?.power_alert_enabled || false);
-  const [powerAlertHigh, setPowerAlertHigh] = useState<string>(plug?.power_alert_high?.toString() || '');
-  const [powerAlertLow, setPowerAlertLow] = useState<string>(plug?.power_alert_low?.toString() || '');
- 
-  // Schedule settings
-  const [scheduleEnabled, setScheduleEnabled] = useState(plug?.schedule_enabled || false);
-  const [scheduleOnTime, setScheduleOnTime] = useState<string>(plug?.schedule_on_time || '');
-  const [scheduleOffTime, setScheduleOffTime] = useState<string>(plug?.schedule_off_time || '');
- 
-  // Fetch printers for linking
-  const { data: printers } = useQuery({
-    queryKey: ['printers'],
-    queryFn: api.getPrinters,
-  });
- 
-  // Fetch existing plugs to check for conflicts
-  const { data: existingPlugs } = useQuery({
-    queryKey: ['smart-plugs'],
-    queryFn: api.getSmartPlugs,
-  });
- 
-  // Close on Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onClose();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose]);
- 
-  // Test connection mutation
-  const testMutation = useMutation({
-    mutationFn: () => api.testSmartPlugConnection(ipAddress, username || null, password || null),
-    onSuccess: (result) => {
-      setTestResult(result);
-      setError(null);
-      // Auto-fill name from device if empty
-      if (!name && result.device_name) {
-        setName(result.device_name);
-      }
-    },
-    onError: (err: Error) => {
-      setTestResult(null);
-      setError(err.message);
-    },
-  });
- 
-  // Create mutation
-  const createMutation = useMutation({
-    mutationFn: (data: SmartPlugCreate) => api.createSmartPlug(data),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['smart-plugs'] });
-      onClose();
-    },
-    onError: (err: Error) => {
-      setError(err.message);
-    },
-  });
- 
-  // Update mutation
-  const updateMutation = useMutation({
-    mutationFn: (data: SmartPlugUpdate) => api.updateSmartPlug(plug!.id, data),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['smart-plugs'] });
-      onClose();
-    },
-    onError: (err: Error) => {
-      setError(err.message);
-    },
-  });
- 
-  // Filter out printers that already have a plug assigned (except current plug's printer)
-  const availablePrinters = printers?.filter(p => {
-    const hasPlug = existingPlugs?.some(ep => ep.printer_id === p.id && ep.id !== plug?.id);
-    return !hasPlug;
-  });
- 
-  const handleSubmit = (e: React.FormEvent) => {
-    e.preventDefault();
-    setError(null);
- 
-    if (!name.trim()) {
-      setError('Name is required');
-      return;
-    }
-    if (!ipAddress.trim()) {
-      setError('IP address is required');
-      return;
-    }
- 
-    const data = {
-      name: name.trim(),
-      ip_address: ipAddress.trim(),
-      username: username.trim() || null,
-      password: password.trim() || null,
-      printer_id: printerId,
-      // Power alerts
-      power_alert_enabled: powerAlertEnabled,
-      power_alert_high: powerAlertHigh ? parseFloat(powerAlertHigh) : null,
-      power_alert_low: powerAlertLow ? parseFloat(powerAlertLow) : null,
-      // Schedule
-      schedule_enabled: scheduleEnabled,
-      schedule_on_time: scheduleOnTime || null,
-      schedule_off_time: scheduleOffTime || null,
-    };
- 
-    if (isEditing) {
-      updateMutation.mutate(data);
-    } else {
-      createMutation.mutate(data);
-    }
-  };
- 
-  const isPending = createMutation.isPending || updateMutation.isPending;
- 
-  return (
-    <div
-      className="fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4"
-      onClick={onClose}
-    >
-      <div
-        className="bg-bambu-dark-secondary rounded-xl border border-bambu-dark-tertiary w-full max-w-md"
-        onClick={(e) => e.stopPropagation()}
-      >
-        {/* Header */}
-        <div className="flex items-center justify-between px-6 py-4 border-b border-bambu-dark-tertiary">
-          <h2 className="text-lg font-semibold text-white">
-            {isEditing ? 'Edit Smart Plug' : 'Add Smart Plug'}
-          </h2>
-          <button
-            onClick={onClose}
-            className="text-bambu-gray hover:text-white transition-colors"
-          >
-            <X className="w-5 h-5" />
-          </button>
-        </div>
- 
-        {/* Form */}
-        <form onSubmit={handleSubmit} className="p-6 space-y-4">
-          {error && (
-            <div className="p-3 bg-red-500/20 border border-red-500/50 rounded-lg text-sm text-red-400">
-              {error}
-            </div>
-          )}
- 
-          {/* IP Address */}
-          <div>
-            <label className="block text-sm text-bambu-gray mb-1">IP Address *</label>
-            <div className="flex gap-2">
-              <input
-                type="text"
-                value={ipAddress}
-                onChange={(e) => {
-                  setIpAddress(e.target.value);
-                  setTestResult(null);
-                }}
-                placeholder="192.168.1.100"
-                className="flex-1 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-              />
-              <Button
-                type="button"
-                variant="secondary"
-                onClick={() => testMutation.mutate()}
-                disabled={!ipAddress.trim() || testMutation.isPending}
-              >
-                {testMutation.isPending ? (
-                  <Loader2 className="w-4 h-4 animate-spin" />
-                ) : (
-                  <Wifi className="w-4 h-4" />
-                )}
-                Test
-              </Button>
-            </div>
-          </div>
- 
-          {/* Test Result */}
-          {testResult && (
-            <div className={`p-3 rounded-lg flex items-center gap-2 ${
-              testResult.success
-                ? 'bg-bambu-green/20 border border-bambu-green/50 text-bambu-green'
-                : 'bg-red-500/20 border border-red-500/50 text-red-400'
-            }`}>
-              {testResult.success ? (
-                <>
-                  <CheckCircle className="w-5 h-5" />
-                  <div>
-                    <p className="font-medium">Connected!</p>
-                    <p className="text-sm opacity-80">
-                      {testResult.device_name && `Device: ${testResult.device_name} - `}
-                      State: {testResult.state}
-                    </p>
-                  </div>
-                </>
-              ) : (
-                <>
-                  <WifiOff className="w-5 h-5" />
-                  <span>Connection failed</span>
-                </>
-              )}
-            </div>
-          )}
- 
-          {/* Name */}
-          <div>
-            <label className="block text-sm text-bambu-gray mb-1">Name *</label>
-            <input
-              type="text"
-              value={name}
-              onChange={(e) => setName(e.target.value)}
-              placeholder="Living Room Plug"
-              className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-            />
-          </div>
- 
-          {/* Authentication (optional) */}
-          <div className="grid grid-cols-2 gap-3">
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">Username</label>
-              <input
-                type="text"
-                value={username}
-                onChange={(e) => setUsername(e.target.value)}
-                placeholder="admin"
-                className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-              />
-            </div>
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">Password</label>
-              <input
-                type="password"
-                value={password}
-                onChange={(e) => setPassword(e.target.value)}
-                placeholder="********"
-                className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-              />
-            </div>
-          </div>
-          <p className="text-xs text-bambu-gray -mt-2">
-            Leave empty if your Tasmota device doesn't require authentication
-          </p>
- 
-          {/* Link to Printer */}
-          <div>
-            <label className="block text-sm text-bambu-gray mb-1">Link to Printer</label>
-            <select
-              value={printerId ?? ''}
-              onChange={(e) => setPrinterId(e.target.value ? Number(e.target.value) : null)}
-              className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-            >
-              <option value="">No printer (manual control only)</option>
-              {availablePrinters?.map((p) => (
-                <option key={p.id} value={p.id}>
-                  {p.name}
-                </option>
-              ))}
-            </select>
-            <p className="text-xs text-bambu-gray mt-1">
-              Linking enables automatic on/off when prints start/complete
-            </p>
-          </div>
- 
-          {/* Power Alerts */}
-          <div className="border-t border-bambu-dark-tertiary pt-4">
-            <div className="flex items-center justify-between mb-3">
-              <div className="flex items-center gap-2">
-                <Bell className="w-4 h-4 text-bambu-green" />
-                <span className="text-white font-medium">Power Alerts</span>
-              </div>
-              <label className="relative inline-flex items-center cursor-pointer">
-                <input
-                  type="checkbox"
-                  checked={powerAlertEnabled}
-                  onChange={(e) => setPowerAlertEnabled(e.target.checked)}
-                  className="sr-only peer"
-                />
-                <div className="w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"></div>
-              </label>
-            </div>
-            {powerAlertEnabled && (
-              <div className="space-y-3">
-                <div className="grid grid-cols-2 gap-3">
-                  <div>
-                    <label className="block text-sm text-bambu-gray mb-1">Alert if above (W)</label>
-                    <input
-                      type="number"
-                      value={powerAlertHigh}
-                      onChange={(e) => setPowerAlertHigh(e.target.value)}
-                      placeholder="e.g. 200"
-                      min="0"
-                      max="5000"
-                      className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                    />
-                  </div>
-                  <div>
-                    <label className="block text-sm text-bambu-gray mb-1">Alert if below (W)</label>
-                    <input
-                      type="number"
-                      value={powerAlertLow}
-                      onChange={(e) => setPowerAlertLow(e.target.value)}
-                      placeholder="e.g. 10"
-                      min="0"
-                      max="5000"
-                      className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                    />
-                  </div>
-                </div>
-                <p className="text-xs text-bambu-gray">
-                  Get notified when power consumption crosses these thresholds. Leave empty to disable that direction.
-                </p>
-              </div>
-            )}
-          </div>
- 
-          {/* Schedule */}
-          <div className="border-t border-bambu-dark-tertiary pt-4">
-            <div className="flex items-center justify-between mb-3">
-              <div className="flex items-center gap-2">
-                <Clock className="w-4 h-4 text-bambu-green" />
-                <span className="text-white font-medium">Daily Schedule</span>
-              </div>
-              <label className="relative inline-flex items-center cursor-pointer">
-                <input
-                  type="checkbox"
-                  checked={scheduleEnabled}
-                  onChange={(e) => setScheduleEnabled(e.target.checked)}
-                  className="sr-only peer"
-                />
-                <div className="w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"></div>
-              </label>
-            </div>
-            {scheduleEnabled && (
-              <div className="space-y-3">
-                <div className="grid grid-cols-2 gap-3">
-                  <div>
-                    <label className="block text-sm text-bambu-gray mb-1">Turn On at</label>
-                    <input
-                      type="time"
-                      value={scheduleOnTime}
-                      onChange={(e) => setScheduleOnTime(e.target.value)}
-                      className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                    />
-                  </div>
-                  <div>
-                    <label className="block text-sm text-bambu-gray mb-1">Turn Off at</label>
-                    <input
-                      type="time"
-                      value={scheduleOffTime}
-                      onChange={(e) => setScheduleOffTime(e.target.value)}
-                      className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                    />
-                  </div>
-                </div>
-                <p className="text-xs text-bambu-gray">
-                  Automatically turn the plug on/off at these times daily. Leave empty to skip that action.
-                </p>
-              </div>
-            )}
-          </div>
- 
-          {/* Actions */}
-          <div className="flex gap-3 pt-2">
-            <Button
-              type="button"
-              variant="secondary"
-              onClick={onClose}
-              className="flex-1"
-            >
-              Cancel
-            </Button>
-            <Button
-              type="submit"
-              disabled={isPending}
-              className="flex-1"
-            >
-              {isPending ? (
-                <Loader2 className="w-4 h-4 animate-spin" />
-              ) : (
-                <Save className="w-4 h-4" />
-              )}
-              {isEditing ? 'Save' : 'Add'}
-            </Button>
-          </div>
-        </form>
-      </div>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/AddToQueueModal.tsx.html b/frontend/coverage/src/components/AddToQueueModal.tsx.html deleted file mode 100644 index ce909d91d..000000000 --- a/frontend/coverage/src/components/AddToQueueModal.tsx.html +++ /dev/null @@ -1,802 +0,0 @@ - - - - - - Code coverage report for src/components/AddToQueueModal.tsx - - - - - - - - - -
-
-

All files / src/components AddToQueueModal.tsx

-
- -
- 0% - Statements - 0/177 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/177 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useEffect } from 'react';
-import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
-import { Calendar, Clock, X, AlertCircle, Power } from 'lucide-react';
-import { api } from '../api/client';
-import type { PrintQueueItemCreate } from '../api/client';
-import { Card, CardContent } from './Card';
-import { Button } from './Button';
-import { useToast } from '../contexts/ToastContext';
- 
-interface AddToQueueModalProps {
-  archiveId: number;
-  archiveName: string;
-  onClose: () => void;
-}
- 
-export function AddToQueueModal({ archiveId, archiveName, onClose }: AddToQueueModalProps) {
-  const queryClient = useQueryClient();
-  const { showToast } = useToast();
- 
-  const [printerId, setPrinterId] = useState<number | null>(null);
-  const [scheduleType, setScheduleType] = useState<'asap' | 'scheduled'>('asap');
-  const [scheduledTime, setScheduledTime] = useState('');
-  const [requirePreviousSuccess, setRequirePreviousSuccess] = useState(false);
-  const [autoOffAfter, setAutoOffAfter] = useState(false);
- 
-  const { data: printers } = useQuery({
-    queryKey: ['printers'],
-    queryFn: () => api.getPrinters(),
-  });
- 
-  // Set default printer if only one available
-  useEffect(() => {
-    if (printers?.length === 1 && !printerId) {
-      setPrinterId(printers[0].id);
-    }
-  }, [printers, printerId]);
- 
-  // Close on Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onClose();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose]);
- 
-  const addMutation = useMutation({
-    mutationFn: (data: PrintQueueItemCreate) => api.addToQueue(data),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['queue'] });
-      showToast('Added to print queue');
-      onClose();
-    },
-    onError: (error: Error) => {
-      showToast(error.message || 'Failed to add to queue', 'error');
-    },
-  });
- 
-  const handleSubmit = (e: React.FormEvent) => {
-    e.preventDefault();
-    if (!printerId) {
-      showToast('Please select a printer', 'error');
-      return;
-    }
- 
-    const data: PrintQueueItemCreate = {
-      printer_id: printerId,
-      archive_id: archiveId,
-      require_previous_success: requirePreviousSuccess,
-      auto_off_after: autoOffAfter,
-    };
- 
-    if (scheduleType === 'scheduled' && scheduledTime) {
-      data.scheduled_time = new Date(scheduledTime).toISOString();
-    }
- 
-    addMutation.mutate(data);
-  };
- 
-  // Get minimum datetime (now + 1 minute)
-  const getMinDateTime = () => {
-    const now = new Date();
-    now.setMinutes(now.getMinutes() + 1);
-    return now.toISOString().slice(0, 16);
-  };
- 
-  return (
-    <div
-      className="fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4"
-      onClick={onClose}
-    >
-      <Card className="w-full max-w-md" onClick={(e) => e.stopPropagation()}>
-        <CardContent className="p-0">
-          {/* Header */}
-          <div className="flex items-center justify-between p-4 border-b border-bambu-dark-tertiary">
-            <div className="flex items-center gap-2">
-              <Calendar className="w-5 h-5 text-bambu-green" />
-              <h2 className="text-xl font-semibold text-white">Schedule Print</h2>
-            </div>
-            <button
-              onClick={onClose}
-              className="text-bambu-gray hover:text-white transition-colors"
-            >
-              <X className="w-5 h-5" />
-            </button>
-          </div>
- 
-          {/* Form */}
-          <form onSubmit={handleSubmit} className="p-4 space-y-4">
-            {/* Archive name */}
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">Print Job</label>
-              <p className="text-white font-medium truncate">{archiveName}</p>
-            </div>
- 
-            {/* Printer selection */}
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">Printer</label>
-              {printers?.length === 0 ? (
-                <div className="flex items-center gap-2 text-red-400 text-sm">
-                  <AlertCircle className="w-4 h-4" />
-                  No printers configured
-                </div>
-              ) : (
-                <select
-                  className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                  value={printerId || ''}
-                  onChange={(e) => setPrinterId(e.target.value ? Number(e.target.value) : null)}
-                  required
-                >
-                  <option value="">Select printer...</option>
-                  {printers?.map((p) => (
-                    <option key={p.id} value={p.id}>{p.name}</option>
-                  ))}
-                </select>
-              )}
-            </div>
- 
-            {/* Schedule type */}
-            <div>
-              <label className="block text-sm text-bambu-gray mb-2">When to print</label>
-              <div className="flex gap-2">
-                <button
-                  type="button"
-                  className={`flex-1 px-3 py-2 rounded-lg border text-sm flex items-center justify-center gap-2 transition-colors ${
-                    scheduleType === 'asap'
-                      ? 'bg-bambu-green border-bambu-green text-white'
-                      : 'bg-bambu-dark border-bambu-dark-tertiary text-bambu-gray hover:text-white'
-                  }`}
-                  onClick={() => setScheduleType('asap')}
-                >
-                  <Clock className="w-4 h-4" />
-                  ASAP (when idle)
-                </button>
-                <button
-                  type="button"
-                  className={`flex-1 px-3 py-2 rounded-lg border text-sm flex items-center justify-center gap-2 transition-colors ${
-                    scheduleType === 'scheduled'
-                      ? 'bg-bambu-green border-bambu-green text-white'
-                      : 'bg-bambu-dark border-bambu-dark-tertiary text-bambu-gray hover:text-white'
-                  }`}
-                  onClick={() => setScheduleType('scheduled')}
-                >
-                  <Calendar className="w-4 h-4" />
-                  Scheduled
-                </button>
-              </div>
-            </div>
- 
-            {/* Scheduled time input */}
-            {scheduleType === 'scheduled' && (
-              <div>
-                <label className="block text-sm text-bambu-gray mb-1">Date & Time</label>
-                <input
-                  type="datetime-local"
-                  className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                  value={scheduledTime}
-                  onChange={(e) => setScheduledTime(e.target.value)}
-                  min={getMinDateTime()}
-                  required
-                />
-              </div>
-            )}
- 
-            {/* Require previous success */}
-            <div className="flex items-center gap-2">
-              <input
-                type="checkbox"
-                id="requirePrevious"
-                checked={requirePreviousSuccess}
-                onChange={(e) => setRequirePreviousSuccess(e.target.checked)}
-                className="rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green"
-              />
-              <label htmlFor="requirePrevious" className="text-sm text-bambu-gray">
-                Only start if previous print succeeded
-              </label>
-            </div>
- 
-            {/* Auto power off */}
-            <div className="flex items-center gap-2">
-              <input
-                type="checkbox"
-                id="autoOffAfter"
-                checked={autoOffAfter}
-                onChange={(e) => setAutoOffAfter(e.target.checked)}
-                className="rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green"
-              />
-              <label htmlFor="autoOffAfter" className="text-sm text-bambu-gray flex items-center gap-1">
-                <Power className="w-3.5 h-3.5" />
-                Power off printer when done
-              </label>
-            </div>
- 
-            {/* Help text */}
-            <p className="text-xs text-bambu-gray">
-              {scheduleType === 'asap'
-                ? 'Print will start as soon as the printer is idle.'
-                : 'Print will start at the scheduled time if the printer is idle. If busy, it will wait until the printer becomes available.'}
-            </p>
- 
-            {/* Actions */}
-            <div className="flex gap-3 pt-2">
-              <Button type="button" variant="secondary" onClick={onClose} className="flex-1">
-                Cancel
-              </Button>
-              <Button
-                type="submit"
-                className="flex-1"
-                disabled={addMutation.isPending || !printerId || printers?.length === 0}
-              >
-                {addMutation.isPending ? 'Adding...' : 'Add to Queue'}
-              </Button>
-            </div>
-          </form>
-        </CardContent>
-      </Card>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/BackupModal.tsx.html b/frontend/coverage/src/components/BackupModal.tsx.html deleted file mode 100644 index ce0c050a0..000000000 --- a/frontend/coverage/src/components/BackupModal.tsx.html +++ /dev/null @@ -1,970 +0,0 @@ - - - - - - Code coverage report for src/components/BackupModal.tsx - - - - - - - - - -
-
-

All files / src/components BackupModal.tsx

-
- -
- 0% - Statements - 0/242 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/242 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useEffect, useState } from 'react';
-import { Download, X, Settings, Bell, FileText, Plug, Printer, Palette, Wrench, Archive, Loader2, Key, AlertTriangle } from 'lucide-react';
-import { useTranslation } from 'react-i18next';
-import { Card, CardContent } from './Card';
-import { Button } from './Button';
-import { Toggle } from './Toggle';
- 
-interface BackupCategory {
-  id: string;
-  labelKey: string;
-  defaultLabel: string;
-  icon: React.ReactNode;
-  default: boolean;
-  description: string;
-}
- 
-const BACKUP_CATEGORIES: BackupCategory[] = [
-  {
-    id: 'settings',
-    labelKey: 'backup.categories.settings',
-    defaultLabel: 'App Settings',
-    icon: <Settings className="w-4 h-4" />,
-    default: true,
-    description: 'Language, theme, update preferences',
-  },
-  {
-    id: 'notifications',
-    labelKey: 'backup.categories.notifications',
-    defaultLabel: 'Notification Providers',
-    icon: <Bell className="w-4 h-4" />,
-    default: true,
-    description: 'ntfy, Pushover, Discord, etc.',
-  },
-  {
-    id: 'templates',
-    labelKey: 'backup.categories.templates',
-    defaultLabel: 'Notification Templates',
-    icon: <FileText className="w-4 h-4" />,
-    default: true,
-    description: 'Custom message templates',
-  },
-  {
-    id: 'smart_plugs',
-    labelKey: 'backup.categories.smartPlugs',
-    defaultLabel: 'Smart Plugs',
-    icon: <Plug className="w-4 h-4" />,
-    default: true,
-    description: 'Tasmota plug configurations',
-  },
-  {
-    id: 'printers',
-    labelKey: 'backup.categories.printers',
-    defaultLabel: 'Printers',
-    icon: <Printer className="w-4 h-4" />,
-    default: false,
-    description: 'Printer info (access codes excluded)',
-  },
-  {
-    id: 'filaments',
-    labelKey: 'backup.categories.filaments',
-    defaultLabel: 'Filament Inventory',
-    icon: <Palette className="w-4 h-4" />,
-    default: false,
-    description: 'Filament types and costs',
-  },
-  {
-    id: 'maintenance',
-    labelKey: 'backup.categories.maintenance',
-    defaultLabel: 'Maintenance Types',
-    icon: <Wrench className="w-4 h-4" />,
-    default: false,
-    description: 'Custom maintenance schedules',
-  },
-  {
-    id: 'archives',
-    labelKey: 'backup.categories.archives',
-    defaultLabel: 'Print Archives',
-    icon: <Archive className="w-4 h-4" />,
-    default: false,
-    description: 'All print data + files (3MF, thumbnails, photos)',
-  },
-];
- 
-interface BackupModalProps {
-  onClose: () => void;
-  onExport: (categories: Record<string, boolean>) => Promise<void>;
-}
- 
-export function BackupModal({ onClose, onExport }: BackupModalProps) {
-  const { t } = useTranslation();
-  const [selected, setSelected] = useState<Record<string, boolean>>(() => {
-    const initial: Record<string, boolean> = {};
-    BACKUP_CATEGORIES.forEach((cat) => {
-      initial[cat.id] = cat.default;
-    });
-    return initial;
-  });
-  const [includeAccessCodes, setIncludeAccessCodes] = useState(false);
-  const [isExporting, setIsExporting] = useState(false);
- 
-  // Close on Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onClose();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose]);
- 
-  const toggleCategory = (id: string) => {
-    setSelected((prev) => ({ ...prev, [id]: !prev[id] }));
-  };
- 
-  const selectAll = () => {
-    const all: Record<string, boolean> = {};
-    BACKUP_CATEGORIES.forEach((cat) => {
-      all[cat.id] = true;
-    });
-    setSelected(all);
-  };
- 
-  const selectNone = () => {
-    const none: Record<string, boolean> = {};
-    BACKUP_CATEGORIES.forEach((cat) => {
-      none[cat.id] = false;
-    });
-    setSelected(none);
-  };
- 
-  const selectedCount = Object.values(selected).filter(Boolean).length;
- 
-  const handleExport = async () => {
-    setIsExporting(true);
-    try {
-      await onExport({ ...selected, access_codes: includeAccessCodes && selected.printers });
-    } finally {
-      setIsExporting(false);
-    }
-  };
- 
-  return (
-    <div
-      className="fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4"
-      onClick={isExporting ? undefined : onClose}
-    >
-      <Card className="w-full max-w-lg" onClick={(e: React.MouseEvent) => e.stopPropagation()}>
-        <CardContent className="p-0">
-          {/* Header */}
-          <div className="flex items-center justify-between p-4 border-b border-bambu-dark-tertiary">
-            <div className="flex items-center gap-3">
-              <div className="p-2 rounded-full bg-bambu-green/20 text-bambu-green">
-                <Download className="w-5 h-5" />
-              </div>
-              <div>
-                <h3 className="text-lg font-semibold text-white">
-                  {t('backup.exportTitle', { defaultValue: 'Export Backup' })}
-                </h3>
-                <p className="text-sm text-bambu-gray">
-                  {t('backup.selectCategories', { defaultValue: 'Select data to include' })}
-                </p>
-              </div>
-            </div>
-            <button
-              onClick={onClose}
-              className="p-2 hover:bg-bambu-dark-tertiary rounded-lg transition-colors"
-            >
-              <X className="w-5 h-5" />
-            </button>
-          </div>
- 
-          {/* Quick actions */}
-          <div className="flex gap-2 px-4 pt-4">
-            <button
-              onClick={selectAll}
-              disabled={isExporting}
-              className="text-sm text-bambu-green hover:text-bambu-green/80 disabled:opacity-50 disabled:cursor-not-allowed"
-            >
-              {t('common.selectAll', { defaultValue: 'Select All' })}
-            </button>
-            <span className="text-bambu-gray">|</span>
-            <button
-              onClick={selectNone}
-              disabled={isExporting}
-              className="text-sm text-bambu-gray hover:text-white disabled:opacity-50 disabled:cursor-not-allowed"
-            >
-              {t('common.selectNone', { defaultValue: 'Select None' })}
-            </button>
-          </div>
- 
-          {/* Categories */}
-          <div className={`p-4 space-y-2 max-h-[400px] overflow-y-auto ${isExporting ? 'opacity-50 pointer-events-none' : ''}`}>
-            {BACKUP_CATEGORIES.map((category) => (
-              <label
-                key={category.id}
-                className={`flex items-center gap-3 p-3 rounded-lg cursor-pointer transition-colors ${
-                  selected[category.id]
-                    ? 'bg-bambu-green/10 border border-bambu-green/30'
-                    : 'bg-bambu-dark hover:bg-bambu-dark-tertiary border border-transparent'
-                }`}
-              >
-                <input
-                  type="checkbox"
-                  checked={selected[category.id]}
-                  onChange={() => toggleCategory(category.id)}
-                  disabled={isExporting}
-                  className="w-4 h-4 rounded border-bambu-gray bg-bambu-dark text-bambu-green focus:ring-bambu-green focus:ring-offset-0"
-                />
-                <div className={`${selected[category.id] ? 'text-bambu-green' : 'text-bambu-gray'}`}>
-                  {category.icon}
-                </div>
-                <div className="flex-1">
-                  <div className="text-white text-sm font-medium">
-                    {t(category.labelKey, { defaultValue: category.defaultLabel })}
-                  </div>
-                  <div className="text-xs text-bambu-gray">{category.description}</div>
-                </div>
-              </label>
-            ))}
-          </div>
- 
-          {/* Archive warning */}
-          {selected.archives && (
-            <div className="mx-4 mb-2 p-3 rounded-lg bg-yellow-500/10 border border-yellow-500/30">
-              <div className="flex items-start gap-2 text-sm">
-                <Archive className="w-4 h-4 text-yellow-500 mt-0.5 flex-shrink-0" />
-                <div className="text-yellow-200 dark:text-yellow-200 text-yellow-700">
-                  <span className="font-medium">ZIP file will be created.</span>
-                  <span className="text-yellow-600 dark:text-yellow-200/70"> Includes all 3MF files, thumbnails, timelapses, and photos. This may take a while and result in a large file.</span>
-                </div>
-              </div>
-            </div>
-          )}
- 
-          {/* Access codes option - only shown when printers are selected */}
-          {selected.printers && (
-            <div className="mx-4 mb-2 p-3 rounded-lg bg-bambu-dark border border-bambu-dark-tertiary">
-              <div className="flex items-center justify-between">
-                <div className="flex items-start gap-2">
-                  <Key className="w-4 h-4 text-orange-500 dark:text-orange-400 mt-0.5 flex-shrink-0" />
-                  <div>
-                    <p className="text-sm font-medium text-white">Include Access Codes</p>
-                    <p className="text-xs text-bambu-gray">For transferring to another machine</p>
-                  </div>
-                </div>
-                <Toggle checked={includeAccessCodes} onChange={setIncludeAccessCodes} />
-              </div>
-              {includeAccessCodes && (
-                <div className="mt-2 p-2 rounded bg-orange-500/10 border border-orange-500/30">
-                  <div className="flex items-start gap-2 text-xs">
-                    <AlertTriangle className="w-3 h-3 text-orange-500 dark:text-orange-400 mt-0.5 flex-shrink-0" />
-                    <span className="text-orange-700 dark:text-orange-200">
-                      Access codes will be included in plain text. Keep this backup file secure!
-                    </span>
-                  </div>
-                </div>
-              )}
-            </div>
-          )}
- 
-          {/* Footer */}
-          <div className="flex items-center justify-between p-4 border-t border-bambu-dark-tertiary">
-            <span className="text-sm text-bambu-gray">
-              {t('backup.selectedCount', {
-                count: selectedCount,
-                defaultValue: `${selectedCount} categories selected`,
-              })}
-            </span>
-            <div className="flex gap-3">
-              <Button variant="secondary" onClick={onClose} disabled={isExporting}>
-                {t('common.cancel', { defaultValue: 'Cancel' })}
-              </Button>
-              <Button
-                onClick={handleExport}
-                disabled={selectedCount === 0 || isExporting}
-                className="bg-bambu-green hover:bg-bambu-green-dark disabled:opacity-50 disabled:cursor-not-allowed min-w-[100px]"
-              >
-                {isExporting ? (
-                  <>
-                    <Loader2 className="w-4 h-4 mr-2 animate-spin" />
-                    {t('backup.exporting', { defaultValue: 'Exporting...' })}
-                  </>
-                ) : (
-                  <>
-                    <Download className="w-4 h-4 mr-2" />
-                    {t('backup.export', { defaultValue: 'Export' })}
-                  </>
-                )}
-              </Button>
-            </div>
-          </div>
-        </CardContent>
-      </Card>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/BatchTagModal.tsx.html b/frontend/coverage/src/components/BatchTagModal.tsx.html deleted file mode 100644 index a00083ea9..000000000 --- a/frontend/coverage/src/components/BatchTagModal.tsx.html +++ /dev/null @@ -1,778 +0,0 @@ - - - - - - Code coverage report for src/components/BatchTagModal.tsx - - - - - - - - - -
-
-

All files / src/components BatchTagModal.tsx

-
- -
- 0% - Statements - 0/178 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/178 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useEffect } from 'react';
-import { useMutation, useQueryClient } from '@tanstack/react-query';
-import { X, Tag, Plus, Loader2 } from 'lucide-react';
-import { api } from '../api/client';
-import { Card, CardContent } from './Card';
-import { Button } from './Button';
-import { useToast } from '../contexts/ToastContext';
- 
-interface BatchTagModalProps {
-  selectedIds: number[];
-  existingTags: string[];
-  onClose: () => void;
-}
- 
-export function BatchTagModal({ selectedIds, existingTags, onClose }: BatchTagModalProps) {
-  const queryClient = useQueryClient();
-  const { showToast } = useToast();
-  const [newTag, setNewTag] = useState('');
-  const [selectedTags, setSelectedTags] = useState<Set<string>>(new Set());
-  const [mode, setMode] = useState<'add' | 'remove'>('add');
- 
-  // Close on Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onClose();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose]);
- 
-  const batchTagMutation = useMutation({
-    mutationFn: async () => {
-      const tagsArray = Array.from(selectedTags);
-      let successCount = 0;
- 
-      // Process sequentially to avoid SQLite database locks
-      for (const id of selectedIds) {
-        try {
-          const archive = await api.getArchive(id);
-          const currentTags = archive.tags ? archive.tags.split(',').map(t => t.trim()).filter(Boolean) : [];
- 
-          let newTags: string[];
-          if (mode === 'add') {
-            // Add tags that aren't already present
-            newTags = [...new Set([...currentTags, ...tagsArray])];
-          } else {
-            // Remove selected tags
-            newTags = currentTags.filter(t => !selectedTags.has(t));
-          }
- 
-          await api.updateArchive(id, { tags: newTags.join(', ') });
-          successCount++;
-        } catch (err) {
-          console.error(`Failed to update archive ${id}:`, err);
-          throw new Error(`Failed on archive ${id}: ${err instanceof Error ? err.message : 'Unknown error'}`);
-        }
-      }
-      return { count: successCount, mode, tags: tagsArray };
-    },
-    onSuccess: ({ count, mode, tags }) => {
-      queryClient.invalidateQueries({ queryKey: ['archives'] });
-      showToast(`${mode === 'add' ? 'Added' : 'Removed'} ${tags.length} tag${tags.length !== 1 ? 's' : ''} ${mode === 'add' ? 'to' : 'from'} ${count} archive${count !== 1 ? 's' : ''}`);
-      onClose();
-    },
-    onError: (error: Error) => {
-      showToast(error.message || 'Failed to update tags', 'error');
-    },
-  });
- 
-  const toggleTag = (tag: string) => {
-    setSelectedTags((prev) => {
-      const next = new Set(prev);
-      if (next.has(tag)) {
-        next.delete(tag);
-      } else {
-        next.add(tag);
-      }
-      return next;
-    });
-  };
- 
-  const addNewTag = () => {
-    if (newTag.trim() && !selectedTags.has(newTag.trim())) {
-      setSelectedTags((prev) => new Set([...prev, newTag.trim()]));
-      setNewTag('');
-    }
-  };
- 
-  const handleKeyDown = (e: React.KeyboardEvent) => {
-    if (e.key === 'Enter') {
-      e.preventDefault();
-      addNewTag();
-    }
-  };
- 
-  return (
-    <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4">
-      <Card className="w-full max-w-md">
-        <CardContent className="p-0">
-          {/* Header */}
-          <div className="flex items-center justify-between p-4 border-b border-bambu-dark-tertiary">
-            <div className="flex items-center gap-2">
-              <Tag className="w-5 h-5 text-bambu-green" />
-              <h2 className="text-xl font-semibold text-white">
-                {mode === 'add' ? 'Add Tags' : 'Remove Tags'}
-              </h2>
-            </div>
-            <button
-              onClick={onClose}
-              className="text-bambu-gray hover:text-white transition-colors"
-            >
-              <X className="w-5 h-5" />
-            </button>
-          </div>
- 
-          {/* Content */}
-          <div className="p-4 space-y-4">
-            <p className="text-sm text-bambu-gray">
-              {mode === 'add' ? 'Add' : 'Remove'} tags for {selectedIds.length} selected archive{selectedIds.length !== 1 ? 's' : ''}
-            </p>
- 
-            {/* Mode toggle */}
-            <div className="flex gap-2">
-              <Button
-                size="sm"
-                variant={mode === 'add' ? 'primary' : 'secondary'}
-                onClick={() => setMode('add')}
-              >
-                Add Tags
-              </Button>
-              <Button
-                size="sm"
-                variant={mode === 'remove' ? 'primary' : 'secondary'}
-                onClick={() => setMode('remove')}
-              >
-                Remove Tags
-              </Button>
-            </div>
- 
-            {/* New tag input (only for add mode) */}
-            {mode === 'add' && (
-              <div className="flex gap-2">
-                <input
-                  type="text"
-                  placeholder="Enter new tag..."
-                  className="flex-1 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none"
-                  value={newTag}
-                  onChange={(e) => setNewTag(e.target.value)}
-                  onKeyDown={handleKeyDown}
-                />
-                <Button size="sm" variant="secondary" onClick={addNewTag} disabled={!newTag.trim()}>
-                  <Plus className="w-4 h-4" />
-                </Button>
-              </div>
-            )}
- 
-            {/* Existing tags */}
-            {existingTags.length > 0 && (
-              <div>
-                <p className="text-xs text-bambu-gray mb-2">Existing tags:</p>
-                <div className="flex flex-wrap gap-2">
-                  {existingTags.map((tag) => (
-                    <button
-                      key={tag}
-                      onClick={() => toggleTag(tag)}
-                      className={`px-2 py-1 rounded text-sm transition-colors ${
-                        selectedTags.has(tag)
-                          ? 'bg-bambu-green text-white'
-                          : 'bg-bambu-dark-tertiary text-bambu-gray-light hover:bg-bambu-dark'
-                      }`}
-                    >
-                      {tag}
-                    </button>
-                  ))}
-                </div>
-              </div>
-            )}
- 
-            {/* Selected tags preview */}
-            {selectedTags.size > 0 && (
-              <div>
-                <p className="text-xs text-bambu-gray mb-2">
-                  Tags to {mode === 'add' ? 'add' : 'remove'}:
-                </p>
-                <div className="flex flex-wrap gap-2">
-                  {Array.from(selectedTags).map((tag) => (
-                    <span
-                      key={tag}
-                      className={`px-2 py-1 rounded text-sm flex items-center gap-1 ${
-                        mode === 'add' ? 'bg-green-500/20 text-green-400' : 'bg-red-500/20 text-red-400'
-                      }`}
-                    >
-                      {tag}
-                      <button onClick={() => toggleTag(tag)} className="hover:opacity-70">
-                        <X className="w-3 h-3" />
-                      </button>
-                    </span>
-                  ))}
-                </div>
-              </div>
-            )}
-          </div>
- 
-          {/* Footer */}
-          <div className="flex gap-3 p-4 border-t border-bambu-dark-tertiary">
-            <Button variant="secondary" onClick={onClose} className="flex-1">
-              Cancel
-            </Button>
-            <Button
-              onClick={() => batchTagMutation.mutate()}
-              disabled={selectedTags.size === 0 || batchTagMutation.isPending}
-              className="flex-1"
-            >
-              {batchTagMutation.isPending ? (
-                <>
-                  <Loader2 className="w-4 h-4 animate-spin" />
-                  Processing...
-                </>
-              ) : (
-                <>
-                  <Tag className="w-4 h-4" />
-                  {mode === 'add' ? 'Add Tags' : 'Remove Tags'}
-                </>
-              )}
-            </Button>
-          </div>
-        </CardContent>
-      </Card>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/Button.tsx.html b/frontend/coverage/src/components/Button.tsx.html deleted file mode 100644 index cef968fbd..000000000 --- a/frontend/coverage/src/components/Button.tsx.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - Code coverage report for src/components/Button.tsx - - - - - - - - - -
-
-

All files / src/components Button.tsx

-
- -
- 100% - Statements - 30/30 -
- - -
- 100% - Branches - 1/1 -
- - -
- 100% - Functions - 1/1 -
- - -
- 100% - Lines - 30/30 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -431x -  -  -  -  -  -  -  -1x -107x -107x -107x -107x -107x -107x -107x -107x -  -107x -107x -107x -107x -107x -107x -107x -107x -  -107x -107x -107x -107x -107x -  -107x -107x -107x -107x -  -107x -107x -  -107x - 
import type { ButtonHTMLAttributes, ReactNode } from 'react';
- 
-interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
-  variant?: 'primary' | 'secondary' | 'danger' | 'ghost';
-  size?: 'sm' | 'md' | 'lg';
-  children: ReactNode;
-}
- 
-export function Button({
-  variant = 'primary',
-  size = 'md',
-  className = '',
-  children,
-  ...props
-}: ButtonProps) {
-  const baseStyles =
-    'inline-flex items-center justify-center font-medium rounded-lg transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-bambu-dark disabled:opacity-50 disabled:cursor-not-allowed';
- 
-  const variants = {
-    primary: 'bg-bambu-green hover:bg-bambu-green-light text-white focus:ring-bambu-green',
-    secondary:
-      'bg-bambu-dark-tertiary hover:bg-bambu-gray-dark text-white focus:ring-bambu-gray',
-    danger: 'bg-red-600 hover:bg-red-700 text-white focus:ring-red-500',
-    ghost:
-      'bg-transparent hover:bg-bambu-dark-tertiary text-bambu-gray-light hover:text-white',
-  };
- 
-  const sizes = {
-    sm: 'px-3 py-1.5 text-sm gap-1.5 min-h-[44px] md:min-h-0',
-    md: 'px-4 py-2 text-sm gap-2 min-h-[44px] md:min-h-0',
-    lg: 'px-6 py-3 text-base gap-2 min-h-[48px] md:min-h-0',
-  };
- 
-  return (
-    <button
-      className={`${baseStyles} ${variants[variant]} ${sizes[size]} ${className}`}
-      {...props}
-    >
-      {children}
-    </button>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/CalendarView.tsx.html b/frontend/coverage/src/components/CalendarView.tsx.html deleted file mode 100644 index 2ac19d51b..000000000 --- a/frontend/coverage/src/components/CalendarView.tsx.html +++ /dev/null @@ -1,901 +0,0 @@ - - - - - - Code coverage report for src/components/CalendarView.tsx - - - - - - - - - -
-
-

All files / src/components CalendarView.tsx

-
- -
- 0% - Statements - 0/222 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/222 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useMemo } from 'react';
-import { ChevronLeft, ChevronRight } from 'lucide-react';
-import type { Archive } from '../api/client';
-import { api } from '../api/client';
- 
-interface CalendarViewProps {
-  archives: Archive[];
-  onArchiveClick?: (archive: Archive) => void;
-}
- 
-function getDaysInMonth(year: number, month: number): number {
-  return new Date(year, month + 1, 0).getDate();
-}
- 
-function getFirstDayOfMonth(year: number, month: number): number {
-  return new Date(year, month, 1).getDay();
-}
- 
-const MONTH_NAMES = [
-  'January', 'February', 'March', 'April', 'May', 'June',
-  'July', 'August', 'September', 'October', 'November', 'December'
-];
- 
-const DAY_NAMES = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
- 
-export function CalendarView({ archives, onArchiveClick }: CalendarViewProps) {
-  const today = new Date();
-  const [currentMonth, setCurrentMonth] = useState(today.getMonth());
-  const [currentYear, setCurrentYear] = useState(today.getFullYear());
-  const [selectedDate, setSelectedDate] = useState<string | null>(null);
- 
-  // Group archives by date
-  const archivesByDate = useMemo(() => {
-    const map = new Map<string, Archive[]>();
-    archives.forEach(archive => {
-      const date = new Date(archive.completed_at || archive.created_at);
-      const key = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
-      const existing = map.get(key) || [];
-      existing.push(archive);
-      map.set(key, existing);
-    });
-    return map;
-  }, [archives]);
- 
-  const daysInMonth = getDaysInMonth(currentYear, currentMonth);
-  const firstDay = getFirstDayOfMonth(currentYear, currentMonth);
- 
-  const prevMonth = () => {
-    if (currentMonth === 0) {
-      setCurrentMonth(11);
-      setCurrentYear(currentYear - 1);
-    } else {
-      setCurrentMonth(currentMonth - 1);
-    }
-  };
- 
-  const nextMonth = () => {
-    if (currentMonth === 11) {
-      setCurrentMonth(0);
-      setCurrentYear(currentYear + 1);
-    } else {
-      setCurrentMonth(currentMonth + 1);
-    }
-  };
- 
-  const goToToday = () => {
-    setCurrentMonth(today.getMonth());
-    setCurrentYear(today.getFullYear());
-  };
- 
-  // Build calendar grid
-  const calendarDays: (number | null)[] = [];
-  for (let i = 0; i < firstDay; i++) {
-    calendarDays.push(null);
-  }
-  for (let day = 1; day <= daysInMonth; day++) {
-    calendarDays.push(day);
-  }
- 
-  const selectedArchives = selectedDate ? archivesByDate.get(selectedDate) || [] : [];
- 
-  return (
-    <div className="flex flex-col lg:flex-row gap-6">
-      {/* Calendar */}
-      <div className="flex-1">
-        {/* Header */}
-        <div className="flex items-center justify-between mb-4">
-          <button
-            onClick={prevMonth}
-            className="p-2 hover:bg-bambu-dark-tertiary rounded-lg transition-colors"
-          >
-            <ChevronLeft className="w-5 h-5 text-bambu-gray" />
-          </button>
-          <div className="flex items-center gap-3">
-            <h2 className="text-lg font-semibold text-white">
-              {MONTH_NAMES[currentMonth]} {currentYear}
-            </h2>
-            <button
-              onClick={goToToday}
-              className="px-2 py-1 text-xs bg-bambu-dark-tertiary hover:bg-bambu-green/20 text-bambu-gray hover:text-white rounded transition-colors"
-            >
-              Today
-            </button>
-          </div>
-          <button
-            onClick={nextMonth}
-            className="p-2 hover:bg-bambu-dark-tertiary rounded-lg transition-colors"
-          >
-            <ChevronRight className="w-5 h-5 text-bambu-gray" />
-          </button>
-        </div>
- 
-        {/* Day headers */}
-        <div className="grid grid-cols-7 gap-1 mb-1">
-          {DAY_NAMES.map(day => (
-            <div key={day} className="text-center text-xs text-bambu-gray py-2">
-              {day}
-            </div>
-          ))}
-        </div>
- 
-        {/* Calendar grid */}
-        <div className="grid grid-cols-7 gap-1">
-          {calendarDays.map((day, index) => {
-            if (day === null) {
-              return <div key={`empty-${index}`} className="aspect-square" />;
-            }
- 
-            const dateKey = `${currentYear}-${String(currentMonth + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`;
-            const dayArchives = archivesByDate.get(dateKey) || [];
-            const hasArchives = dayArchives.length > 0;
-            const isToday = day === today.getDate() && currentMonth === today.getMonth() && currentYear === today.getFullYear();
-            const isSelected = dateKey === selectedDate;
-            const successCount = dayArchives.filter(a => a.status === 'completed').length;
-            const failedCount = dayArchives.filter(a => a.status === 'failed').length;
- 
-            return (
-              <button
-                key={day}
-                onClick={() => setSelectedDate(isSelected ? null : dateKey)}
-                className={`aspect-square rounded-lg p-1 flex flex-col items-center justify-center transition-colors relative ${
-                  isSelected
-                    ? 'bg-bambu-green text-white'
-                    : isToday
-                    ? 'bg-bambu-green/20 text-white ring-2 ring-bambu-green'
-                    : hasArchives
-                    ? 'bg-bambu-dark-tertiary hover:bg-bambu-dark-tertiary/70 text-white'
-                    : 'hover:bg-bambu-dark-tertiary/50 text-bambu-gray'
-                }`}
-              >
-                <span className={`text-sm font-medium ${isToday && !isSelected ? 'text-bambu-green' : ''}`}>
-                  {day}
-                </span>
-                {hasArchives && (
-                  <div className="absolute bottom-1 left-1/2 -translate-x-1/2 flex items-center gap-1">
-                    <div className={`w-2 h-2 rounded-full ${
-                      failedCount > 0 && successCount === 0
-                        ? 'bg-red-400'
-                        : failedCount > 0
-                        ? 'bg-yellow-400'
-                        : 'bg-green-400'
-                    }`} />
-                    <span className="text-xs font-medium">{dayArchives.length}</span>
-                  </div>
-                )}
-              </button>
-            );
-          })}
-        </div>
- 
-        {/* Monthly stats */}
-        <div className="mt-4 pt-4 border-t border-bambu-dark-tertiary">
-          <div className="grid grid-cols-3 gap-4 text-center">
-            <div>
-              <div className="text-2xl font-bold text-white">
-                {archives.filter(a => {
-                  const d = new Date(a.completed_at || a.created_at);
-                  return d.getMonth() === currentMonth && d.getFullYear() === currentYear;
-                }).length}
-              </div>
-              <div className="text-xs text-bambu-gray">Prints this month</div>
-            </div>
-            <div>
-              <div className="text-2xl font-bold text-green-400">
-                {archives.filter(a => {
-                  const d = new Date(a.completed_at || a.created_at);
-                  return d.getMonth() === currentMonth && d.getFullYear() === currentYear && a.status === 'completed';
-                }).length}
-              </div>
-              <div className="text-xs text-bambu-gray">Successful</div>
-            </div>
-            <div>
-              <div className="text-2xl font-bold text-red-400">
-                {archives.filter(a => {
-                  const d = new Date(a.completed_at || a.created_at);
-                  return d.getMonth() === currentMonth && d.getFullYear() === currentYear && a.status === 'failed';
-                }).length}
-              </div>
-              <div className="text-xs text-bambu-gray">Failed</div>
-            </div>
-          </div>
-        </div>
-      </div>
- 
-      {/* Selected day details */}
-      <div className="lg:w-80 bg-bambu-dark rounded-xl p-4">
-        {selectedDate ? (
-          <>
-            <h3 className="text-sm font-medium text-bambu-gray mb-3">
-              {new Date(selectedDate + 'T12:00:00').toLocaleDateString('en-US', {
-                weekday: 'long',
-                month: 'long',
-                day: 'numeric',
-                year: 'numeric'
-              })}
-            </h3>
-            {selectedArchives.length > 0 ? (
-              <div className="space-y-2 max-h-96 overflow-y-auto">
-                {selectedArchives.map(archive => (
-                  <button
-                    key={archive.id}
-                    onClick={() => onArchiveClick?.(archive)}
-                    className="w-full flex items-center gap-3 p-2 rounded-lg hover:bg-bambu-dark-tertiary transition-colors text-left"
-                  >
-                    {archive.thumbnail_path ? (
-                      <img
-                        src={api.getArchiveThumbnail(archive.id)}
-                        alt=""
-                        className="w-12 h-12 rounded object-cover"
-                      />
-                    ) : (
-                      <div className="w-12 h-12 rounded bg-bambu-dark-tertiary flex items-center justify-center">
-                        <span className="text-xs text-bambu-gray">3MF</span>
-                      </div>
-                    )}
-                    <div className="flex-1 min-w-0">
-                      <p className="text-sm text-white truncate">
-                        {archive.print_name || archive.filename}
-                      </p>
-                      <div className="flex items-center gap-2 text-xs">
-                        <span className={archive.status === 'failed' ? 'text-red-400' : 'text-green-400'}>
-                          {archive.status === 'failed' ? 'Failed' : 'Completed'}
-                        </span>
-                        {archive.filament_color && (
-                          <div className="flex gap-0.5">
-                            {archive.filament_color.split(',').map((color, i) => (
-                              <div
-                                key={i}
-                                className="w-3 h-3 rounded-full border border-white/20"
-                                style={{ backgroundColor: color }}
-                              />
-                            ))}
-                          </div>
-                        )}
-                      </div>
-                    </div>
-                  </button>
-                ))}
-              </div>
-            ) : (
-              <p className="text-sm text-bambu-gray">No prints on this day</p>
-            )}
-          </>
-        ) : (
-          <div className="text-center py-8">
-            <p className="text-sm text-bambu-gray">Select a day to see prints</p>
-          </div>
-        )}
-      </div>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/Card.tsx.html b/frontend/coverage/src/components/Card.tsx.html deleted file mode 100644 index b951fbd91..000000000 --- a/frontend/coverage/src/components/Card.tsx.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - Code coverage report for src/components/Card.tsx - - - - - - - - - -
-
-

All files / src/components Card.tsx

-
- -
- 100% - Statements - 19/19 -
- - -
- 100% - Branches - 3/3 -
- - -
- 100% - Functions - 3/3 -
- - -
- 100% - Lines - 19/19 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -331x -  -  -  -  -  -  -  -  -1x -46x -46x -46x -46x -46x -  -46x -46x -  -46x -  -1x -4x -4x -4x -4x -  -4x -  -1x -44x -44x - 
import type { ReactNode, MouseEvent } from 'react';
- 
-interface CardProps {
-  children: ReactNode;
-  className?: string;
-  onClick?: (e: MouseEvent) => void;
-  onContextMenu?: (e: MouseEvent) => void;
-}
- 
-export function Card({ children, className = '', onClick, onContextMenu }: CardProps) {
-  return (
-    <div
-      className={`bg-bambu-dark-secondary rounded-xl border border-bambu-dark-tertiary ${className}`}
-      onClick={onClick}
-      onContextMenu={onContextMenu}
-    >
-      {children}
-    </div>
-  );
-}
- 
-export function CardHeader({ children, className = '' }: CardProps) {
-  return (
-    <div className={`px-6 py-4 border-b border-bambu-dark-tertiary ${className}`}>
-      {children}
-    </div>
-  );
-}
- 
-export function CardContent({ children, className = '' }: CardProps) {
-  return <div className={`p-6 ${className}`}>{children}</div>;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/CompareArchivesModal.tsx.html b/frontend/coverage/src/components/CompareArchivesModal.tsx.html deleted file mode 100644 index 8feda6ec0..000000000 --- a/frontend/coverage/src/components/CompareArchivesModal.tsx.html +++ /dev/null @@ -1,655 +0,0 @@ - - - - - - Code coverage report for src/components/CompareArchivesModal.tsx - - - - - - - - - -
-
-

All files / src/components CompareArchivesModal.tsx

-
- -
- 0% - Statements - 0/149 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/149 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useEffect } from 'react';
-import { useQuery } from '@tanstack/react-query';
-import { X, Check, AlertTriangle, Loader2 } from 'lucide-react';
-import { api } from '../api/client';
-import type { ArchiveComparison } from '../api/client';
-import { Button } from './Button';
- 
-interface CompareArchivesModalProps {
-  archiveIds: number[];
-  onClose: () => void;
-}
- 
-export function CompareArchivesModal({ archiveIds, onClose }: CompareArchivesModalProps) {
-  // Close on Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onClose();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose]);
- 
-  const { data: comparison, isLoading, error } = useQuery({
-    queryKey: ['archive-comparison', archiveIds],
-    queryFn: () => api.compareArchives(archiveIds),
-  });
- 
-  return (
-    <div className="fixed inset-0 bg-black/80 flex items-center justify-center z-50 p-4" onClick={onClose}>
-      <div className="bg-bambu-dark-secondary rounded-lg max-w-4xl w-full max-h-[90vh] flex flex-col border border-bambu-dark-tertiary" onClick={(e) => e.stopPropagation()}>
-        {/* Header */}
-        <div className="flex items-center justify-between p-4 border-b border-bambu-dark-tertiary">
-          <h3 className="text-lg font-semibold text-white">
-            Compare Archives ({archiveIds.length})
-          </h3>
-          <button
-            onClick={onClose}
-            className="text-bambu-gray hover:text-white p-1"
-          >
-            <X className="w-5 h-5" />
-          </button>
-        </div>
- 
-        {/* Content */}
-        <div className="flex-1 overflow-auto p-4 bg-bambu-dark-secondary">
-          {isLoading ? (
-            <div className="flex items-center justify-center py-12">
-              <Loader2 className="w-8 h-8 text-bambu-green animate-spin" />
-            </div>
-          ) : error ? (
-            <div className="text-center py-12 text-red-400">
-              <AlertTriangle className="w-12 h-12 mx-auto mb-4 opacity-50" />
-              <p>Failed to load comparison</p>
-              <p className="text-sm text-bambu-gray mt-2">
-                {error instanceof Error ? error.message : 'Unknown error'}
-              </p>
-            </div>
-          ) : comparison ? (
-            <ComparisonContent comparison={comparison} />
-          ) : null}
-        </div>
- 
-        {/* Footer */}
-        <div className="p-4 border-t border-bambu-dark-tertiary">
-          <Button variant="secondary" onClick={onClose} className="w-full">
-            Close
-          </Button>
-        </div>
-      </div>
-    </div>
-  );
-}
- 
-function ComparisonContent({ comparison }: { comparison: ArchiveComparison }) {
-  return (
-    <div className="space-y-6">
-      {/* Archive Headers */}
-      <div className="overflow-x-auto">
-        <table className="w-full">
-          <thead>
-            <tr>
-              <th className="text-left text-sm text-bambu-gray font-medium pb-2 pr-4 min-w-[150px]">
-                Setting
-              </th>
-              {comparison.archives.map((archive) => (
-                <th
-                  key={archive.id}
-                  className="text-left text-sm font-medium pb-2 px-2 min-w-[120px]"
-                >
-                  <div className="text-white truncate max-w-[150px]" title={archive.print_name}>
-                    {archive.print_name}
-                  </div>
-                  <div className={`text-xs ${
-                    archive.status === 'completed' ? 'text-bambu-green' :
-                    archive.status === 'failed' ? 'text-red-400' : 'text-bambu-gray'
-                  }`}>
-                    {archive.status}
-                  </div>
-                </th>
-              ))}
-            </tr>
-          </thead>
-          <tbody className="divide-y divide-bambu-gray/20">
-            {comparison.comparison.map((field) => (
-              <tr
-                key={field.field}
-                className={field.has_difference ? 'bg-yellow-500/5' : ''}
-              >
-                <td className="py-2 pr-4 text-sm">
-                  <div className="flex items-center gap-2">
-                    {field.has_difference && (
-                      <AlertTriangle className="w-3 h-3 text-yellow-400 flex-shrink-0" />
-                    )}
-                    <span className={field.has_difference ? 'text-yellow-400' : 'text-bambu-gray'}>
-                      {field.label}
-                    </span>
-                  </div>
-                </td>
-                {field.values.map((value, idx) => (
-                  <td key={idx} className="py-2 px-2 text-sm text-white">
-                    {value ?? <span className="text-bambu-gray/50">-</span>}
-                    {field.unit && value !== null && (
-                      <span className="text-bambu-gray ml-1">{field.unit}</span>
-                    )}
-                  </td>
-                ))}
-              </tr>
-            ))}
-          </tbody>
-        </table>
-      </div>
- 
-      {/* Differences Summary */}
-      {comparison.differences.length > 0 && (
-        <div className="p-4 bg-yellow-500/10 border border-yellow-500/30 rounded-lg">
-          <h4 className="text-sm font-medium text-yellow-400 mb-2 flex items-center gap-2">
-            <AlertTriangle className="w-4 h-4" />
-            {comparison.differences.length} Difference{comparison.differences.length > 1 ? 's' : ''} Found
-          </h4>
-          <ul className="text-sm text-white/80 space-y-1">
-            {comparison.differences.slice(0, 5).map((diff) => (
-              <li key={diff.field}>
-                <span className="text-yellow-400">{diff.label}</span>: {diff.values.join(' vs ')} {diff.unit || ''}
-              </li>
-            ))}
-            {comparison.differences.length > 5 && (
-              <li className="text-bambu-gray">
-                ...and {comparison.differences.length - 5} more
-              </li>
-            )}
-          </ul>
-        </div>
-      )}
- 
-      {/* Success Correlation */}
-      {comparison.success_correlation.has_both_outcomes ? (
-        <div className="p-4 bg-bambu-dark rounded-lg">
-          <h4 className="text-sm font-medium text-white mb-3 flex items-center gap-2">
-            <Check className="w-4 h-4 text-bambu-green" />
-            Success/Failure Analysis
-          </h4>
-          <div className="flex items-center gap-4 text-sm mb-3">
-            <span className="text-bambu-green">
-              {comparison.success_correlation.successful_count} successful
-            </span>
-            <span className="text-red-400">
-              {comparison.success_correlation.failed_count} failed
-            </span>
-          </div>
-          {comparison.success_correlation.insights && comparison.success_correlation.insights.length > 0 ? (
-            <div className="space-y-2">
-              {comparison.success_correlation.insights.map((insight) => (
-                <div key={insight.field} className="text-sm p-2 bg-bambu-dark-secondary rounded">
-                  <span className="text-white font-medium">{insight.label}:</span>{' '}
-                  <span className="text-white/80">{insight.insight}</span>
-                </div>
-              ))}
-            </div>
-          ) : (
-            <p className="text-sm text-bambu-gray">No clear correlations found between settings and outcomes.</p>
-          )}
-        </div>
-      ) : (
-        <div className="p-4 bg-bambu-dark rounded-lg text-sm text-bambu-gray">
-          <p>{comparison.success_correlation.message || 'Need both successful and failed prints for correlation analysis.'}</p>
-        </div>
-      )}
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/ConfirmModal.tsx.html b/frontend/coverage/src/components/ConfirmModal.tsx.html deleted file mode 100644 index 35631d865..000000000 --- a/frontend/coverage/src/components/ConfirmModal.tsx.html +++ /dev/null @@ -1,331 +0,0 @@ - - - - - - Code coverage report for src/components/ConfirmModal.tsx - - - - - - - - - -
-
-

All files / src/components ConfirmModal.tsx

-
- -
- 100% - Statements - 61/61 -
- - -
- 100% - Branches - 5/5 -
- - -
- 100% - Functions - 3/3 -
- - -
- 100% - Lines - 61/61 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -831x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -13x -13x -13x -13x -13x -13x -13x -13x -  -13x -13x -1x -1x -13x -13x -13x -  -13x -13x -13x -13x -13x -13x -13x -13x -13x -13x -13x -13x -13x -13x -  -13x -  -13x -13x -13x -13x -  -13x -13x -13x -13x -13x -13x -13x -13x -13x -13x -13x -13x -13x -13x -13x -13x -13x -13x -  -13x -13x -13x -13x -13x -13x -  -13x - 
import { useEffect } from 'react';
-import { AlertTriangle } from 'lucide-react';
-import { Card, CardContent } from './Card';
-import { Button } from './Button';
- 
-interface ConfirmModalProps {
-  title: string;
-  message: string;
-  confirmText?: string;
-  cancelText?: string;
-  variant?: 'danger' | 'warning' | 'default';
-  onConfirm: () => void;
-  onCancel: () => void;
-}
- 
-export function ConfirmModal({
-  title,
-  message,
-  confirmText = 'Confirm',
-  cancelText = 'Cancel',
-  variant = 'default',
-  onConfirm,
-  onCancel,
-}: ConfirmModalProps) {
-  // Close on Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onCancel();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onCancel]);
- 
-  const variantStyles = {
-    danger: {
-      icon: 'text-red-400',
-      button: 'bg-red-500 hover:bg-red-600',
-    },
-    warning: {
-      icon: 'text-yellow-400',
-      button: 'bg-yellow-500 hover:bg-yellow-600',
-    },
-    default: {
-      icon: 'text-bambu-green',
-      button: 'bg-bambu-green hover:bg-bambu-green-dark',
-    },
-  };
- 
-  const styles = variantStyles[variant];
- 
-  return (
-    <div
-      className="fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4"
-      onClick={onCancel}
-    >
-      <Card className="w-full max-w-md" onClick={(e: React.MouseEvent) => e.stopPropagation()}>
-        <CardContent className="p-6">
-          <div className="flex items-start gap-4">
-            <div className={`p-2 rounded-full bg-bambu-dark ${styles.icon}`}>
-              <AlertTriangle className="w-6 h-6" />
-            </div>
-            <div className="flex-1">
-              <h3 className="text-lg font-semibold text-white mb-2">{title}</h3>
-              <p className="text-bambu-gray text-sm">{message}</p>
-            </div>
-          </div>
-          <div className="flex gap-3 mt-6">
-            <Button variant="secondary" onClick={onCancel} className="flex-1">
-              {cancelText}
-            </Button>
-            <Button
-              onClick={onConfirm}
-              className={`flex-1 ${styles.button}`}
-            >
-              {confirmText}
-            </Button>
-          </div>
-        </CardContent>
-      </Card>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/ContextMenu.tsx.html b/frontend/coverage/src/components/ContextMenu.tsx.html deleted file mode 100644 index 5b2e01780..000000000 --- a/frontend/coverage/src/components/ContextMenu.tsx.html +++ /dev/null @@ -1,616 +0,0 @@ - - - - - - Code coverage report for src/components/ContextMenu.tsx - - - - - - - - - -
-
-

All files / src/components ContextMenu.tsx

-
- -
- 0% - Statements - 0/133 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/133 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useEffect, useRef, useState } from 'react';
-import { ChevronRight } from 'lucide-react';
- 
-export interface ContextMenuItem {
-  label: string;
-  icon?: React.ReactNode;
-  onClick: () => void;
-  danger?: boolean;
-  disabled?: boolean;
-  divider?: boolean;
-  submenu?: ContextMenuItem[];
-}
- 
-interface ContextMenuProps {
-  x: number;
-  y: number;
-  items: ContextMenuItem[];
-  onClose: () => void;
-}
- 
-export function ContextMenu({ x, y, items, onClose }: ContextMenuProps) {
-  const menuRef = useRef<HTMLDivElement>(null);
-  const [activeSubmenu, setActiveSubmenu] = useState<number | null>(null);
-  const submenuTimeoutRef = useRef<number | null>(null);
- 
-  useEffect(() => {
-    const handleClickOutside = (e: MouseEvent) => {
-      if (menuRef.current && !menuRef.current.contains(e.target as Node)) {
-        onClose();
-      }
-    };
- 
-    const handleEscape = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') {
-        onClose();
-      }
-    };
- 
-    const handleScroll = () => {
-      onClose();
-    };
- 
-    document.addEventListener('mousedown', handleClickOutside);
-    document.addEventListener('keydown', handleEscape);
-    document.addEventListener('scroll', handleScroll, true);
- 
-    return () => {
-      document.removeEventListener('mousedown', handleClickOutside);
-      document.removeEventListener('keydown', handleEscape);
-      document.removeEventListener('scroll', handleScroll, true);
-      if (submenuTimeoutRef.current) {
-        clearTimeout(submenuTimeoutRef.current);
-      }
-    };
-  }, [onClose]);
- 
-  // Adjust position to keep menu in viewport
-  useEffect(() => {
-    if (menuRef.current) {
-      const rect = menuRef.current.getBoundingClientRect();
-      const viewportWidth = window.innerWidth;
-      const viewportHeight = window.innerHeight;
- 
-      let adjustedX = x;
-      let adjustedY = y;
- 
-      if (x + rect.width > viewportWidth) {
-        adjustedX = viewportWidth - rect.width - 8;
-      }
-      if (y + rect.height > viewportHeight) {
-        adjustedY = viewportHeight - rect.height - 8;
-      }
- 
-      menuRef.current.style.left = `${adjustedX}px`;
-      menuRef.current.style.top = `${adjustedY}px`;
-    }
-  }, [x, y]);
- 
-  const handleMouseEnterSubmenu = (index: number) => {
-    if (submenuTimeoutRef.current) {
-      clearTimeout(submenuTimeoutRef.current);
-      submenuTimeoutRef.current = null;
-    }
-    setActiveSubmenu(index);
-  };
- 
-  const handleMouseLeaveSubmenu = () => {
-    submenuTimeoutRef.current = window.setTimeout(() => {
-      setActiveSubmenu(null);
-    }, 150);
-  };
- 
-  return (
-    <div
-      ref={menuRef}
-      className="fixed z-50 min-w-[180px] bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg shadow-xl py-1"
-      style={{ left: x, top: y }}
-    >
-      {items.map((item, index) => {
-        if (item.divider) {
-          return <div key={index} className="my-1 border-t border-bambu-dark-tertiary" />;
-        }
- 
-        const hasSubmenu = item.submenu && item.submenu.length > 0;
- 
-        return (
-          <div
-            key={index}
-            className="relative"
-            onMouseEnter={() => hasSubmenu && handleMouseEnterSubmenu(index)}
-            onMouseLeave={() => hasSubmenu && handleMouseLeaveSubmenu()}
-          >
-            <button
-              onClick={() => {
-                if (hasSubmenu) {
-                  // Toggle submenu on click as well
-                  setActiveSubmenu(activeSubmenu === index ? null : index);
-                } else if (!item.disabled) {
-                  item.onClick();
-                  onClose();
-                }
-              }}
-              disabled={item.disabled}
-              className={`w-full flex items-center gap-2 px-3 py-2 text-sm text-left transition-colors ${
-                item.disabled
-                  ? 'text-bambu-gray cursor-not-allowed'
-                  : item.danger
-                  ? 'text-red-400 hover:bg-red-400/10'
-                  : 'text-white hover:bg-bambu-dark-tertiary'
-              } ${hasSubmenu && activeSubmenu === index ? 'bg-bambu-dark-tertiary' : ''}`}
-            >
-              {item.icon && <span className="w-4 h-4 flex-shrink-0 flex items-center justify-center">{item.icon}</span>}
-              <span className="flex-1">{item.label}</span>
-              {hasSubmenu && <ChevronRight className="w-4 h-4 text-bambu-gray" />}
-            </button>
-            {/* Submenu */}
-            {hasSubmenu && activeSubmenu === index && (
-              <div
-                className="absolute left-full top-0 ml-1 min-w-[160px] bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg shadow-xl py-1 overflow-hidden max-h-[300px] overflow-y-auto z-[60]"
-                onMouseEnter={() => {
-                  if (submenuTimeoutRef.current) {
-                    clearTimeout(submenuTimeoutRef.current);
-                    submenuTimeoutRef.current = null;
-                  }
-                }}
-                onMouseLeave={() => handleMouseLeaveSubmenu()}
-              >
-                {item.submenu!.map((subItem, subIndex) => (
-                  <button
-                    key={subIndex}
-                    onClick={() => {
-                      if (!subItem.disabled) {
-                        subItem.onClick();
-                        onClose();
-                      }
-                    }}
-                    disabled={subItem.disabled}
-                    className={`w-full flex items-center gap-2 px-3 py-2 text-sm text-left transition-colors ${
-                      subItem.disabled
-                        ? 'text-bambu-gray cursor-not-allowed'
-                        : subItem.danger
-                        ? 'text-red-400 hover:bg-red-400/10'
-                        : 'text-white hover:bg-bambu-dark-tertiary'
-                    }`}
-                  >
-                    {subItem.icon && <span className="w-4 h-4 flex-shrink-0 flex items-center justify-center">{subItem.icon}</span>}
-                    {subItem.label}
-                  </button>
-                ))}
-              </div>
-            )}
-          </div>
-        );
-      })}
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/Dashboard.tsx.html b/frontend/coverage/src/components/Dashboard.tsx.html deleted file mode 100644 index d49cc3b4e..000000000 --- a/frontend/coverage/src/components/Dashboard.tsx.html +++ /dev/null @@ -1,1075 +0,0 @@ - - - - - - Code coverage report for src/components/Dashboard.tsx - - - - - - - - - -
-
-

All files / src/components Dashboard.tsx

-
- -
- 0% - Statements - 0/228 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/228 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useEffect, type ReactNode } from 'react';
-import {
-  DndContext,
-  closestCenter,
-  KeyboardSensor,
-  PointerSensor,
-  useSensor,
-  useSensors,
-  type DragEndEvent,
-} from '@dnd-kit/core';
-import {
-  arrayMove,
-  SortableContext,
-  sortableKeyboardCoordinates,
-  useSortable,
-  rectSortingStrategy,
-} from '@dnd-kit/sortable';
-import { CSS } from '@dnd-kit/utilities';
-import { GripVertical, Eye, EyeOff, RotateCcw, Maximize2, Minimize2 } from 'lucide-react';
-import { Button } from './Button';
- 
-export interface DashboardWidget {
-  id: string;
-  title: string;
-  component: ReactNode;
-  defaultVisible?: boolean;
-  defaultSize?: 1 | 2 | 4; // 1 = quarter, 2 = half, 4 = full width (default)
-}
- 
-interface DashboardProps {
-  widgets: DashboardWidget[];
-  storageKey: string;
-  columns?: number;
-  hideControls?: boolean;
-  onResetLayout?: () => void;
-}
- 
-interface LayoutState {
-  order: string[];
-  hidden: string[];
-  sizes: Record<string, 1 | 2 | 4>;
-}
- 
-function SortableWidget({
-  id,
-  title,
-  children,
-  isHidden,
-  size,
-  onToggleVisibility,
-  onToggleSize,
-}: {
-  id: string;
-  title: string;
-  children: ReactNode;
-  isHidden: boolean;
-  size: 1 | 2 | 4;
-  onToggleVisibility: () => void;
-  onToggleSize: () => void;
-}) {
-  const {
-    attributes,
-    listeners,
-    setNodeRef,
-    transform,
-    transition,
-    isDragging,
-  } = useSortable({ id });
- 
-  const style = {
-    transform: CSS.Transform.toString(transform),
-    transition,
-    opacity: isDragging ? 0.5 : 1,
-  };
- 
-  if (isHidden) return null;
- 
-  return (
-    <div
-      ref={setNodeRef}
-      style={{
-        ...style,
-        gridColumn: `span ${size}`,
-      }}
-      className={`bg-bambu-dark-secondary rounded-xl border border-bambu-dark-tertiary overflow-hidden ${
-        isDragging ? 'ring-2 ring-bambu-green shadow-lg' : ''
-      }`}
-    >
-      {/* Widget Header */}
-      <div className="flex items-center justify-between px-4 py-3 border-b border-bambu-dark-tertiary bg-bambu-dark/30">
-        <div className="flex items-center gap-2">
-          <button
-            {...attributes}
-            {...listeners}
-            className="cursor-grab active:cursor-grabbing p-1 hover:bg-bambu-dark-tertiary rounded transition-colors"
-            title="Drag to reorder"
-          >
-            <GripVertical className="w-6 h-6 md:w-4 md:h-4 text-bambu-gray" />
-          </button>
-          <h3 className="text-sm font-medium text-white">{title}</h3>
-        </div>
-        <div className="flex items-center gap-1">
-          <button
-            onClick={onToggleSize}
-            className="p-1 hover:bg-bambu-dark-tertiary rounded transition-colors"
-            title={`Size: ${size === 1 ? '1/4' : size === 2 ? '1/2' : 'Full'} - Click to cycle`}
-          >
-            {size === 4 ? (
-              <Minimize2 className="w-4 h-4 text-bambu-gray hover:text-white" />
-            ) : (
-              <Maximize2 className="w-4 h-4 text-bambu-gray hover:text-white" />
-            )}
-          </button>
-          <button
-            onClick={onToggleVisibility}
-            className="p-1 hover:bg-bambu-dark-tertiary rounded transition-colors"
-            title="Hide widget"
-          >
-            <EyeOff className="w-4 h-4 text-bambu-gray hover:text-white" />
-          </button>
-        </div>
-      </div>
-      {/* Widget Content */}
-      <div className="p-4">{children}</div>
-    </div>
-  );
-}
- 
-export function Dashboard({ widgets, storageKey, columns = 4, hideControls = false, onResetLayout }: DashboardProps) {
-  // Build default sizes from widget definitions
-  const getDefaultSizes = () => {
-    const sizes: Record<string, 1 | 2 | 4> = {};
-    widgets.forEach((w) => {
-      sizes[w.id] = w.defaultSize || 4;
-    });
-    return sizes;
-  };
- 
-  const [layout, setLayout] = useState<LayoutState>(() => {
-    // Load saved layout from localStorage
-    const saved = localStorage.getItem(storageKey);
-    if (saved) {
-      try {
-        const parsed = JSON.parse(saved);
-        // Ensure sizes exist (for backwards compatibility)
-        if (!parsed.sizes) {
-          parsed.sizes = getDefaultSizes();
-        }
-        return parsed;
-      } catch {
-        // Invalid JSON, use default
-      }
-    }
-    // Default layout: all widgets visible in original order
-    return {
-      order: widgets.map((w) => w.id),
-      hidden: widgets.filter((w) => w.defaultVisible === false).map((w) => w.id),
-      sizes: getDefaultSizes(),
-    };
-  });
- 
-  const [showHiddenPanel, setShowHiddenPanel] = useState(false);
- 
-  // Save layout to localStorage whenever it changes
-  useEffect(() => {
-    localStorage.setItem(storageKey, JSON.stringify(layout));
-  }, [layout, storageKey]);
- 
-  // Ensure all widget IDs are in the order array (for newly added widgets)
-  useEffect(() => {
-    const allIds = widgets.map((w) => w.id);
-    const missingIds = allIds.filter((id) => !layout.order.includes(id));
-    if (missingIds.length > 0) {
-      setLayout((prev) => ({
-        ...prev,
-        order: [...prev.order, ...missingIds],
-      }));
-    }
-  }, [widgets, layout.order]);
- 
-  const sensors = useSensors(
-    useSensor(PointerSensor, {
-      activationConstraint: {
-        distance: 8,
-      },
-    }),
-    useSensor(KeyboardSensor, {
-      coordinateGetter: sortableKeyboardCoordinates,
-    })
-  );
- 
-  const handleDragEnd = (event: DragEndEvent) => {
-    const { active, over } = event;
- 
-    if (over && active.id !== over.id) {
-      setLayout((prev) => {
-        const oldIndex = prev.order.indexOf(active.id as string);
-        const newIndex = prev.order.indexOf(over.id as string);
-        return {
-          ...prev,
-          order: arrayMove(prev.order, oldIndex, newIndex),
-        };
-      });
-    }
-  };
- 
-  const toggleVisibility = (id: string) => {
-    setLayout((prev) => ({
-      ...prev,
-      hidden: prev.hidden.includes(id)
-        ? prev.hidden.filter((h) => h !== id)
-        : [...prev.hidden, id],
-    }));
-  };
- 
-  const toggleSize = (id: string) => {
-    setLayout((prev) => {
-      const currentSize = prev.sizes[id] || 4;
-      // Cycle: 1 → 2 → 4 → 1
-      const nextSize = currentSize === 1 ? 2 : currentSize === 2 ? 4 : 1;
-      return {
-        ...prev,
-        sizes: {
-          ...prev.sizes,
-          [id]: nextSize as 1 | 2 | 4,
-        },
-      };
-    });
-  };
- 
-  const resetLayout = () => {
-    const defaultLayout = {
-      order: widgets.map((w) => w.id),
-      hidden: widgets.filter((w) => w.defaultVisible === false).map((w) => w.id),
-      sizes: getDefaultSizes(),
-    };
-    setLayout(defaultLayout);
-    onResetLayout?.();
-  };
- 
-  // Get ordered widgets
-  const orderedWidgets = layout.order
-    .map((id) => widgets.find((w) => w.id === id))
-    .filter(Boolean) as DashboardWidget[];
- 
-  const visibleWidgets = orderedWidgets.filter((w) => !layout.hidden.includes(w.id));
-  const hiddenWidgets = orderedWidgets.filter((w) => layout.hidden.includes(w.id));
- 
-  return (
-    <div className="space-y-4">
-      {/* Dashboard Controls */}
-      {!hideControls && (
-        <div className="flex items-center justify-end gap-2">
-          {hiddenWidgets.length > 0 && (
-            <Button
-              variant="secondary"
-              size="sm"
-              onClick={() => setShowHiddenPanel(!showHiddenPanel)}
-            >
-              <Eye className="w-4 h-4" />
-              {hiddenWidgets.length} Hidden
-            </Button>
-          )}
-          <Button variant="secondary" size="sm" onClick={resetLayout}>
-            <RotateCcw className="w-4 h-4" />
-            Reset Layout
-          </Button>
-        </div>
-      )}
- 
-      {/* Hidden Widgets Panel */}
-      {showHiddenPanel && hiddenWidgets.length > 0 && (
-        <div className="p-4 bg-bambu-dark rounded-xl border border-bambu-dark-tertiary">
-          <p className="text-sm text-bambu-gray mb-3">Hidden widgets (click to show):</p>
-          <div className="flex flex-wrap gap-2">
-            {hiddenWidgets.map((widget) => (
-              <button
-                key={widget.id}
-                onClick={() => toggleVisibility(widget.id)}
-                className="px-3 py-1.5 bg-bambu-dark-tertiary hover:bg-bambu-green/20 rounded-lg text-sm text-white transition-colors flex items-center gap-2"
-              >
-                <Eye className="w-3 h-3" />
-                {widget.title}
-              </button>
-            ))}
-          </div>
-        </div>
-      )}
- 
-      {/* Draggable Widgets Grid */}
-      <DndContext
-        sensors={sensors}
-        collisionDetection={closestCenter}
-        onDragEnd={handleDragEnd}
-      >
-        <SortableContext items={visibleWidgets.map((w) => w.id)} strategy={rectSortingStrategy}>
-          <div
-            className="grid gap-6"
-            style={{
-              gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))`,
-            }}
-          >
-            {visibleWidgets.map((widget) => (
-              <SortableWidget
-                key={widget.id}
-                id={widget.id}
-                title={widget.title}
-                isHidden={layout.hidden.includes(widget.id)}
-                size={layout.sizes[widget.id] || 2}
-                onToggleVisibility={() => toggleVisibility(widget.id)}
-                onToggleSize={() => toggleSize(widget.id)}
-              >
-                {widget.component}
-              </SortableWidget>
-            ))}
-          </div>
-        </SortableContext>
-      </DndContext>
- 
-      {visibleWidgets.length === 0 && (
-        <div className="text-center py-12 text-bambu-gray">
-          <p>All widgets are hidden.</p>
-          <Button className="mt-4" onClick={resetLayout}>
-            Reset Layout
-          </Button>
-        </div>
-      )}
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/EditArchiveModal.tsx.html b/frontend/coverage/src/components/EditArchiveModal.tsx.html deleted file mode 100644 index 427816069..000000000 --- a/frontend/coverage/src/components/EditArchiveModal.tsx.html +++ /dev/null @@ -1,1243 +0,0 @@ - - - - - - Code coverage report for src/components/EditArchiveModal.tsx - - - - - - - - - -
-
-

All files / src/components EditArchiveModal.tsx

-
- -
- 0% - Statements - 0/307 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/307 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useEffect, useRef } from 'react';
-import { useMutation, useQueryClient, useQuery } from '@tanstack/react-query';
-import { X, Save, Tag, Camera, Trash2, Loader2, Plus, FolderKanban } from 'lucide-react';
-import { api } from '../api/client';
-import type { Archive } from '../api/client';
-import { Button } from './Button';
- 
-const FAILURE_REASONS = [
-  'Adhesion failure',
-  'Spaghetti / Detached',
-  'Layer shift',
-  'Clogged nozzle',
-  'Filament runout',
-  'Warping',
-  'Stringing',
-  'Under-extrusion',
-  'Power failure',
-  'User cancelled',
-  'Other',
-];
- 
-interface EditArchiveModalProps {
-  archive: Archive;
-  onClose: () => void;
-  existingTags?: string[];
-}
- 
-export function EditArchiveModal({ archive, onClose, existingTags = [] }: EditArchiveModalProps) {
-  // Close on Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onClose();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose]);
-  const queryClient = useQueryClient();
-  const [printName, setPrintName] = useState(archive.print_name || '');
-  const [printerId, setPrinterId] = useState<number | null>(archive.printer_id);
-  const [projectId, setProjectId] = useState<number | null>(archive.project_id ?? null);
-  const [notes, setNotes] = useState(archive.notes || '');
-  const [tags, setTags] = useState(archive.tags || '');
-  const [failureReason, setFailureReason] = useState(archive.failure_reason || '');
-  const [photos, setPhotos] = useState<string[]>(archive.photos || []);
-  const [uploadingPhoto, setUploadingPhoto] = useState(false);
-  const [showTagSuggestions, setShowTagSuggestions] = useState(false);
-  const tagInputRef = useRef<HTMLInputElement>(null);
-  const photoInputRef = useRef<HTMLInputElement>(null);
-  const blurTimeoutRef = useRef<number | null>(null);
- 
-  const { data: printers } = useQuery({
-    queryKey: ['printers'],
-    queryFn: api.getPrinters,
-  });
- 
-  const { data: projects } = useQuery({
-    queryKey: ['projects'],
-    queryFn: () => api.getProjects(),
-  });
- 
-  // Get all archives to extract existing tags if not provided
-  const { data: archives } = useQuery({
-    queryKey: ['archives'],
-    queryFn: () => api.getArchives(undefined, 1000, 0),
-    enabled: existingTags.length === 0,
-  });
- 
-  // Extract unique tags from all archives
-  const allTags = existingTags.length > 0
-    ? existingTags
-    : [...new Set(
-        archives?.flatMap(a => a.tags?.split(',').map(t => t.trim()) || []).filter(Boolean) || []
-      )].sort();
- 
-  // Get current tags as array
-  const currentTags = tags.split(',').map(t => t.trim()).filter(Boolean);
- 
-  // Filter suggestions based on what's not already added
-  const tagSuggestions = allTags.filter(t => !currentTags.includes(t));
- 
-  // Add a tag
-  const addTag = (tag: string) => {
-    if (!currentTags.includes(tag)) {
-      const newTags = [...currentTags, tag].join(', ');
-      setTags(newTags);
-    }
-    // Clear any pending blur timeout to prevent hiding suggestions
-    if (blurTimeoutRef.current !== null) {
-      clearTimeout(blurTimeoutRef.current);
-    }
-    tagInputRef.current?.focus();
-  };
- 
-  // Remove a tag
-  const removeTag = (tagToRemove: string) => {
-    const newTags = currentTags.filter(t => t !== tagToRemove).join(', ');
-    setTags(newTags);
-  };
- 
-  const updateMutation = useMutation({
-    mutationFn: (data: Parameters<typeof api.updateArchive>[1]) =>
-      api.updateArchive(archive.id, data),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['archives'] });
-      queryClient.invalidateQueries({ queryKey: ['projects'] });
-      onClose();
-    },
-  });
- 
-  const handlePhotoUpload = async (e: React.ChangeEvent<HTMLInputElement>) => {
-    const file = e.target.files?.[0];
-    if (!file) return;
- 
-    setUploadingPhoto(true);
-    try {
-      const result = await api.uploadArchivePhoto(archive.id, file);
-      setPhotos(result.photos);
-      queryClient.invalidateQueries({ queryKey: ['archives'] });
-    } catch (error) {
-      console.error('Failed to upload photo:', error);
-    } finally {
-      setUploadingPhoto(false);
-      if (photoInputRef.current) {
-        photoInputRef.current.value = '';
-      }
-    }
-  };
- 
-  const handlePhotoDelete = async (filename: string) => {
-    try {
-      const result = await api.deleteArchivePhoto(archive.id, filename);
-      setPhotos(result.photos || []);
-      queryClient.invalidateQueries({ queryKey: ['archives'] });
-    } catch (error) {
-      console.error('Failed to delete photo:', error);
-    }
-  };
- 
-  const handleSubmit = (e: React.FormEvent) => {
-    e.preventDefault();
-    updateMutation.mutate({
-      print_name: printName || undefined,
-      printer_id: printerId,
-      project_id: projectId,
-      notes: notes || undefined,
-      tags: tags || undefined,
-      failure_reason: archive.status === 'failed' ? (failureReason || undefined) : undefined,
-    });
-  };
- 
-  return (
-    <div
-      className="fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4"
-      onClick={onClose}
-    >
-      <div
-        className="bg-bambu-dark-secondary rounded-xl border border-bambu-dark-tertiary w-full max-w-md max-h-[90vh] flex flex-col"
-        onClick={(e) => e.stopPropagation()}
-      >
-        {/* Header */}
-        <div className="flex items-center justify-between px-6 py-4 border-b border-bambu-dark-tertiary">
-          <h2 className="text-lg font-semibold text-white">Edit Archive</h2>
-          <button
-            onClick={onClose}
-            className="text-bambu-gray hover:text-white transition-colors"
-          >
-            <X className="w-5 h-5" />
-          </button>
-        </div>
- 
-        {/* Form */}
-        <form onSubmit={handleSubmit} className="p-6 space-y-4 overflow-y-auto flex-1">
-          {/* Print Name */}
-          <div>
-            <label className="block text-sm text-bambu-gray mb-1">Name</label>
-            <input
-              type="text"
-              value={printName}
-              onChange={(e) => setPrintName(e.target.value)}
-              className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-              placeholder="Print name"
-            />
-          </div>
- 
-          {/* Printer */}
-          <div>
-            <label className="block text-sm text-bambu-gray mb-1">Printer</label>
-            <select
-              value={printerId ?? ''}
-              onChange={(e) => setPrinterId(e.target.value ? Number(e.target.value) : null)}
-              className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-            >
-              <option value="">No printer</option>
-              {printers?.map((p) => (
-                <option key={p.id} value={p.id}>
-                  {p.name}
-                </option>
-              ))}
-            </select>
-          </div>
- 
-          {/* Project */}
-          <div>
-            <label className="block text-sm text-bambu-gray mb-1">
-              <FolderKanban className="w-4 h-4 inline mr-1" />
-              Project
-            </label>
-            <select
-              value={projectId ?? ''}
-              onChange={(e) => setProjectId(e.target.value ? Number(e.target.value) : null)}
-              className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-            >
-              <option value="">No project</option>
-              {projects?.map((p) => (
-                <option key={p.id} value={p.id}>
-                  {p.name}
-                </option>
-              ))}
-            </select>
-          </div>
- 
-          {/* Notes */}
-          <div>
-            <label className="block text-sm text-bambu-gray mb-1">Notes</label>
-            <textarea
-              value={notes}
-              onChange={(e) => setNotes(e.target.value)}
-              rows={3}
-              className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none resize-none"
-              placeholder="Add notes about this print..."
-            />
-          </div>
- 
-          {/* Tags */}
-          <div>
-            <label className="block text-sm text-bambu-gray mb-1">Tags</label>
-            {/* Current tags as chips */}
-            {currentTags.length > 0 && (
-              <div className="flex flex-wrap gap-1.5 mb-2">
-                {currentTags.map((tag) => (
-                  <span
-                    key={tag}
-                    className="inline-flex items-center gap-1 px-2 py-0.5 bg-bambu-dark-tertiary rounded text-sm text-white"
-                  >
-                    <Tag className="w-3 h-3" />
-                    {tag}
-                    <button
-                      type="button"
-                      onClick={() => removeTag(tag)}
-                      className="ml-0.5 text-bambu-gray hover:text-white"
-                    >
-                      <X className="w-3 h-3" />
-                    </button>
-                  </span>
-                ))}
-              </div>
-            )}
-            {/* Tag input with suggestions */}
-            <div className="relative">
-              <input
-                ref={tagInputRef}
-                type="text"
-                value={tags}
-                onChange={(e) => setTags(e.target.value)}
-                onFocus={() => {
-                  if (blurTimeoutRef.current !== null) {
-                    clearTimeout(blurTimeoutRef.current);
-                  }
-                  setShowTagSuggestions(true);
-                }}
-                onBlur={() => {
-                  blurTimeoutRef.current = window.setTimeout(() => setShowTagSuggestions(false), 200);
-                }}
-                className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                placeholder={currentTags.length > 0 ? "Add more tags..." : "Add tags..."}
-              />
-              {/* Suggestions dropdown */}
-              {showTagSuggestions && tagSuggestions.length > 0 && (
-                <div className="absolute top-full left-0 right-0 mt-1 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg shadow-lg z-10 max-h-40 overflow-y-auto">
-                  <div className="p-2 text-xs text-bambu-gray border-b border-bambu-dark-tertiary">
-                    Existing tags (click to add)
-                  </div>
-                  <div className="p-2 flex flex-wrap gap-1.5">
-                    {tagSuggestions.map((tag) => (
-                      <button
-                        key={tag}
-                        type="button"
-                        onClick={() => addTag(tag)}
-                        className="px-2 py-0.5 bg-bambu-dark-tertiary hover:bg-bambu-green/20 rounded text-sm text-bambu-gray hover:text-white transition-colors"
-                      >
-                        {tag}
-                      </button>
-                    ))}
-                  </div>
-                </div>
-              )}
-            </div>
-          </div>
- 
-          {/* Failure Reason - only show for failed prints */}
-          {archive.status === 'failed' && (
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">Failure Reason</label>
-              <select
-                value={failureReason}
-                onChange={(e) => setFailureReason(e.target.value)}
-                className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-              >
-                <option value="">Select reason...</option>
-                {FAILURE_REASONS.map((reason) => (
-                  <option key={reason} value={reason}>
-                    {reason}
-                  </option>
-                ))}
-              </select>
-            </div>
-          )}
- 
-          {/* Photos */}
-          <div>
-            <label className="block text-sm text-bambu-gray mb-1">
-              <Camera className="w-4 h-4 inline mr-1" />
-              Photos of Printed Result
-            </label>
-            {/* Photo grid */}
-            <div className="flex flex-wrap gap-2 mb-2">
-              {photos.map((filename) => (
-                <div key={filename} className="relative group">
-                  <img
-                    src={api.getArchivePhotoUrl(archive.id, filename)}
-                    alt="Print result"
-                    className="w-20 h-20 object-cover rounded-lg border border-bambu-dark-tertiary"
-                  />
-                  <button
-                    type="button"
-                    onClick={() => handlePhotoDelete(filename)}
-                    className="absolute -top-1 -right-1 p-1 bg-red-500 rounded-full opacity-0 group-hover:opacity-100 transition-opacity"
-                  >
-                    <Trash2 className="w-3 h-3 text-white" />
-                  </button>
-                </div>
-              ))}
-              {/* Upload button */}
-              <label className="w-20 h-20 flex items-center justify-center border-2 border-dashed border-bambu-dark-tertiary rounded-lg cursor-pointer hover:border-bambu-green transition-colors">
-                <input
-                  ref={photoInputRef}
-                  type="file"
-                  accept="image/jpeg,image/png,image/webp"
-                  onChange={handlePhotoUpload}
-                  className="hidden"
-                  disabled={uploadingPhoto}
-                />
-                {uploadingPhoto ? (
-                  <Loader2 className="w-6 h-6 text-bambu-gray animate-spin" />
-                ) : (
-                  <Plus className="w-6 h-6 text-bambu-gray" />
-                )}
-              </label>
-            </div>
-            <p className="text-xs text-bambu-gray">Click + to add photos of your printed result</p>
-          </div>
- 
-          {/* Actions */}
-          <div className="flex gap-3 pt-2">
-            <Button
-              type="button"
-              variant="secondary"
-              onClick={onClose}
-              className="flex-1"
-            >
-              Cancel
-            </Button>
-            <Button
-              type="submit"
-              disabled={updateMutation.isPending}
-              className="flex-1"
-            >
-              <Save className="w-4 h-4" />
-              {updateMutation.isPending ? 'Saving...' : 'Save'}
-            </Button>
-          </div>
-        </form>
-      </div>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/EditQueueItemModal.tsx.html b/frontend/coverage/src/components/EditQueueItemModal.tsx.html deleted file mode 100644 index 88cf38cfe..000000000 --- a/frontend/coverage/src/components/EditQueueItemModal.tsx.html +++ /dev/null @@ -1,814 +0,0 @@ - - - - - - Code coverage report for src/components/EditQueueItemModal.tsx - - - - - - - - - -
-
-

All files / src/components EditQueueItemModal.tsx

-
- -
- 0% - Statements - 0/180 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/180 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useEffect } from 'react';
-import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
-import { Calendar, Clock, X, AlertCircle, Power, Pencil } from 'lucide-react';
-import { api } from '../api/client';
-import type { PrintQueueItem, PrintQueueItemUpdate } from '../api/client';
-import { Card, CardContent } from './Card';
-import { Button } from './Button';
-import { useToast } from '../contexts/ToastContext';
- 
-interface EditQueueItemModalProps {
-  item: PrintQueueItem;
-  onClose: () => void;
-}
- 
-export function EditQueueItemModal({ item, onClose }: EditQueueItemModalProps) {
-  const queryClient = useQueryClient();
-  const { showToast } = useToast();
- 
-  const [printerId, setPrinterId] = useState<number>(item.printer_id);
- 
-  // Check if scheduled_time is a "placeholder" far-future date (more than 6 months out)
-  const isPlaceholderDate = item.scheduled_time &&
-    new Date(item.scheduled_time).getTime() > Date.now() + (180 * 24 * 60 * 60 * 1000);
- 
-  const [scheduleType, setScheduleType] = useState<'asap' | 'scheduled'>(
-    item.scheduled_time && !isPlaceholderDate ? 'scheduled' : 'asap'
-  );
-  const [scheduledTime, setScheduledTime] = useState(() => {
-    if (item.scheduled_time && !isPlaceholderDate) {
-      // Convert ISO to local datetime-local format
-      const date = new Date(item.scheduled_time);
-      return date.toISOString().slice(0, 16);
-    }
-    return '';
-  });
-  const [requirePreviousSuccess, setRequirePreviousSuccess] = useState(item.require_previous_success);
-  const [autoOffAfter, setAutoOffAfter] = useState(item.auto_off_after);
- 
-  const { data: printers } = useQuery({
-    queryKey: ['printers'],
-    queryFn: () => api.getPrinters(),
-  });
- 
-  // Close on Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onClose();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose]);
- 
-  const updateMutation = useMutation({
-    mutationFn: (data: PrintQueueItemUpdate) => api.updateQueueItem(item.id, data),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['queue'] });
-      showToast('Queue item updated');
-      onClose();
-    },
-    onError: (error: Error) => {
-      showToast(error.message || 'Failed to update queue item', 'error');
-    },
-  });
- 
-  const handleSubmit = (e: React.FormEvent) => {
-    e.preventDefault();
- 
-    const data: PrintQueueItemUpdate = {
-      printer_id: printerId,
-      require_previous_success: requirePreviousSuccess,
-      auto_off_after: autoOffAfter,
-    };
- 
-    if (scheduleType === 'scheduled' && scheduledTime) {
-      data.scheduled_time = new Date(scheduledTime).toISOString();
-    } else {
-      data.scheduled_time = null;
-    }
- 
-    updateMutation.mutate(data);
-  };
- 
-  // Get minimum datetime (now + 1 minute)
-  const getMinDateTime = () => {
-    const now = new Date();
-    now.setMinutes(now.getMinutes() + 1);
-    return now.toISOString().slice(0, 16);
-  };
- 
-  return (
-    <div
-      className="fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4"
-      onClick={onClose}
-    >
-      <Card className="w-full max-w-md" onClick={(e) => e.stopPropagation()}>
-        <CardContent className="p-0">
-          {/* Header */}
-          <div className="flex items-center justify-between p-4 border-b border-bambu-dark-tertiary">
-            <div className="flex items-center gap-2">
-              <Pencil className="w-5 h-5 text-bambu-green" />
-              <h2 className="text-xl font-semibold text-white">Edit Queue Item</h2>
-            </div>
-            <button
-              onClick={onClose}
-              className="text-bambu-gray hover:text-white transition-colors"
-            >
-              <X className="w-5 h-5" />
-            </button>
-          </div>
- 
-          {/* Form */}
-          <form onSubmit={handleSubmit} className="p-4 space-y-4">
-            {/* Archive name */}
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">Print Job</label>
-              <p className="text-white font-medium truncate">
-                {item.archive_name || `Archive #${item.archive_id}`}
-              </p>
-            </div>
- 
-            {/* Printer selection */}
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">Printer</label>
-              {printers?.length === 0 ? (
-                <div className="flex items-center gap-2 text-red-400 text-sm">
-                  <AlertCircle className="w-4 h-4" />
-                  No printers configured
-                </div>
-              ) : (
-                <select
-                  className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                  value={printerId}
-                  onChange={(e) => setPrinterId(Number(e.target.value))}
-                  required
-                >
-                  {printers?.map((p) => (
-                    <option key={p.id} value={p.id}>{p.name}</option>
-                  ))}
-                </select>
-              )}
-            </div>
- 
-            {/* Schedule type */}
-            <div>
-              <label className="block text-sm text-bambu-gray mb-2">When to print</label>
-              <div className="flex gap-2">
-                <button
-                  type="button"
-                  className={`flex-1 px-3 py-2 rounded-lg border text-sm flex items-center justify-center gap-2 transition-colors ${
-                    scheduleType === 'asap'
-                      ? 'bg-bambu-green border-bambu-green text-white'
-                      : 'bg-bambu-dark border-bambu-dark-tertiary text-bambu-gray hover:text-white'
-                  }`}
-                  onClick={() => setScheduleType('asap')}
-                >
-                  <Clock className="w-4 h-4" />
-                  ASAP (when idle)
-                </button>
-                <button
-                  type="button"
-                  className={`flex-1 px-3 py-2 rounded-lg border text-sm flex items-center justify-center gap-2 transition-colors ${
-                    scheduleType === 'scheduled'
-                      ? 'bg-bambu-green border-bambu-green text-white'
-                      : 'bg-bambu-dark border-bambu-dark-tertiary text-bambu-gray hover:text-white'
-                  }`}
-                  onClick={() => setScheduleType('scheduled')}
-                >
-                  <Calendar className="w-4 h-4" />
-                  Scheduled
-                </button>
-              </div>
-            </div>
- 
-            {/* Scheduled time input */}
-            {scheduleType === 'scheduled' && (
-              <div>
-                <label className="block text-sm text-bambu-gray mb-1">Date & Time</label>
-                <input
-                  type="datetime-local"
-                  className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                  value={scheduledTime}
-                  onChange={(e) => setScheduledTime(e.target.value)}
-                  min={getMinDateTime()}
-                  required
-                />
-              </div>
-            )}
- 
-            {/* Require previous success */}
-            <div className="flex items-center gap-2">
-              <input
-                type="checkbox"
-                id="requirePrevious"
-                checked={requirePreviousSuccess}
-                onChange={(e) => setRequirePreviousSuccess(e.target.checked)}
-                className="rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green"
-              />
-              <label htmlFor="requirePrevious" className="text-sm text-bambu-gray">
-                Only start if previous print succeeded
-              </label>
-            </div>
- 
-            {/* Auto power off */}
-            <div className="flex items-center gap-2">
-              <input
-                type="checkbox"
-                id="autoOffAfter"
-                checked={autoOffAfter}
-                onChange={(e) => setAutoOffAfter(e.target.checked)}
-                className="rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green"
-              />
-              <label htmlFor="autoOffAfter" className="text-sm text-bambu-gray flex items-center gap-1">
-                <Power className="w-3.5 h-3.5" />
-                Power off printer when done
-              </label>
-            </div>
- 
-            {/* Help text */}
-            <p className="text-xs text-bambu-gray">
-              {scheduleType === 'asap'
-                ? 'Print will start as soon as the printer is idle.'
-                : 'Print will start at the scheduled time if the printer is idle. If busy, it will wait until the printer becomes available.'}
-            </p>
- 
-            {/* Actions */}
-            <div className="flex gap-3 pt-2">
-              <Button type="button" variant="secondary" onClick={onClose} className="flex-1">
-                Cancel
-              </Button>
-              <Button
-                type="submit"
-                className="flex-1"
-                disabled={updateMutation.isPending || printers?.length === 0}
-              >
-                {updateMutation.isPending ? 'Saving...' : 'Save Changes'}
-              </Button>
-            </div>
-          </form>
-        </CardContent>
-      </Card>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/ExternalLinksSettings.tsx.html b/frontend/coverage/src/components/ExternalLinksSettings.tsx.html deleted file mode 100644 index 2ecf3cd6c..000000000 --- a/frontend/coverage/src/components/ExternalLinksSettings.tsx.html +++ /dev/null @@ -1,646 +0,0 @@ - - - - - - Code coverage report for src/components/ExternalLinksSettings.tsx - - - - - - - - - -
-
-

All files / src/components ExternalLinksSettings.tsx

-
- -
- 0% - Statements - 0/144 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/144 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState } from 'react';
-import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
-import { Link2, Plus, Pencil, Trash2, GripVertical, Loader2, ExternalLink as ExternalLinkIcon } from 'lucide-react';
-import { api } from '../api/client';
-import type { ExternalLink } from '../api/client';
-import { Card, CardContent, CardHeader } from './Card';
-import { Button } from './Button';
-import { AddExternalLinkModal } from './AddExternalLinkModal';
-import { ConfirmModal } from './ConfirmModal';
-import { getIconByName } from './IconPicker';
- 
-export function ExternalLinksSettings() {
-  const queryClient = useQueryClient();
-  const [showAddModal, setShowAddModal] = useState(false);
-  const [editingLink, setEditingLink] = useState<ExternalLink | null>(null);
-  const [deletingLink, setDeletingLink] = useState<ExternalLink | null>(null);
-  const [draggedId, setDraggedId] = useState<number | null>(null);
- 
-  // Fetch external links
-  const { data: links, isLoading } = useQuery({
-    queryKey: ['external-links'],
-    queryFn: api.getExternalLinks,
-  });
- 
-  // Delete mutation
-  const deleteMutation = useMutation({
-    mutationFn: (id: number) => api.deleteExternalLink(id),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['external-links'] });
-    },
-  });
- 
-  // Reorder mutation
-  const reorderMutation = useMutation({
-    mutationFn: (ids: number[]) => api.reorderExternalLinks(ids),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['external-links'] });
-    },
-  });
- 
-  const handleDragStart = (e: React.DragEvent, id: number) => {
-    setDraggedId(id);
-    e.dataTransfer.effectAllowed = 'move';
-  };
- 
-  const handleDragOver = (e: React.DragEvent) => {
-    e.preventDefault();
-    e.dataTransfer.dropEffect = 'move';
-  };
- 
-  const handleDrop = (e: React.DragEvent, targetId: number) => {
-    e.preventDefault();
-    if (draggedId === null || draggedId === targetId || !links) return;
- 
-    const currentIds = links.map((l) => l.id);
-    const draggedIndex = currentIds.indexOf(draggedId);
-    const targetIndex = currentIds.indexOf(targetId);
- 
-    if (draggedIndex === -1 || targetIndex === -1) return;
- 
-    // Reorder
-    const newIds = [...currentIds];
-    newIds.splice(draggedIndex, 1);
-    newIds.splice(targetIndex, 0, draggedId);
- 
-    reorderMutation.mutate(newIds);
-    setDraggedId(null);
-  };
- 
-  const handleDelete = (link: ExternalLink) => {
-    setDeletingLink(link);
-  };
- 
-  const confirmDelete = () => {
-    if (deletingLink) {
-      deleteMutation.mutate(deletingLink.id);
-      setDeletingLink(null);
-    }
-  };
- 
-  return (
-    <>
-      <Card>
-        <CardHeader>
-          <div className="flex items-center justify-between">
-            <div className="flex items-center gap-2">
-              <Link2 className="w-5 h-5 text-bambu-green" />
-              <h2 className="text-lg font-semibold text-white">Sidebar Links</h2>
-            </div>
-            <Button size="sm" onClick={() => setShowAddModal(true)}>
-              <Plus className="w-4 h-4" />
-              Add Link
-            </Button>
-          </div>
-        </CardHeader>
-        <CardContent>
-          <p className="text-sm text-bambu-gray mb-4">
-            Add external links to the sidebar navigation. Drag to reorder.
-          </p>
- 
-          {isLoading ? (
-            <div className="flex justify-center py-8">
-              <Loader2 className="w-6 h-6 text-bambu-green animate-spin" />
-            </div>
-          ) : links && links.length > 0 ? (
-            <div className="space-y-2">
-              {links.map((link) => {
-                const Icon = getIconByName(link.icon);
-                return (
-                  <div
-                    key={link.id}
-                    draggable
-                    onDragStart={(e) => handleDragStart(e, link.id)}
-                    onDragOver={handleDragOver}
-                    onDrop={(e) => handleDrop(e, link.id)}
-                    className={`flex items-center gap-3 p-3 rounded-lg bg-bambu-dark border border-bambu-dark-tertiary transition-colors ${
-                      draggedId === link.id ? 'opacity-50' : ''
-                    }`}
-                  >
-                    <GripVertical className="w-6 h-6 md:w-4 md:h-4 text-bambu-gray cursor-grab flex-shrink-0" />
-                    <div className="p-2 rounded-lg bg-bambu-dark-tertiary text-bambu-gray">
-                      <Icon className="w-4 h-4" />
-                    </div>
-                    <div className="flex-1 min-w-0">
-                      <div className="flex items-center gap-2">
-                        <span className="text-white font-medium truncate">{link.name}</span>
-                        <ExternalLinkIcon className="w-3 h-3 text-bambu-gray flex-shrink-0" />
-                      </div>
-                      <span className="text-sm text-bambu-gray truncate block">{link.url}</span>
-                    </div>
-                    <div className="flex items-center gap-1 flex-shrink-0">
-                      <button
-                        onClick={() => setEditingLink(link)}
-                        className="p-2 rounded-lg hover:bg-bambu-dark-tertiary text-bambu-gray hover:text-white transition-colors"
-                        title="Edit"
-                      >
-                        <Pencil className="w-4 h-4" />
-                      </button>
-                      <button
-                        onClick={() => handleDelete(link)}
-                        disabled={deleteMutation.isPending}
-                        className="p-2 rounded-lg hover:bg-red-500/20 text-bambu-gray hover:text-red-400 transition-colors disabled:opacity-50"
-                        title="Delete"
-                      >
-                        <Trash2 className="w-4 h-4" />
-                      </button>
-                    </div>
-                  </div>
-                );
-              })}
-            </div>
-          ) : (
-            <div className="text-center py-8 text-bambu-gray">
-              <Link2 className="w-8 h-8 mx-auto mb-2 opacity-50" />
-              <p>No external links configured</p>
-              <p className="text-sm">Click "Add Link" to add one</p>
-            </div>
-          )}
-        </CardContent>
-      </Card>
- 
-      {/* Add/Edit Modal */}
-      {(showAddModal || editingLink) && (
-        <AddExternalLinkModal
-          link={editingLink}
-          onClose={() => {
-            setShowAddModal(false);
-            setEditingLink(null);
-          }}
-        />
-      )}
- 
-      {/* Delete Confirmation Modal */}
-      {deletingLink && (
-        <ConfirmModal
-          title="Delete Link"
-          message={`Are you sure you want to delete "${deletingLink.name}"? This action cannot be undone.`}
-          confirmText="Delete"
-          cancelText="Cancel"
-          variant="danger"
-          onConfirm={confirmDelete}
-          onCancel={() => setDeletingLink(null)}
-        />
-      )}
-    </>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/FilamentTrends.tsx.html b/frontend/coverage/src/components/FilamentTrends.tsx.html deleted file mode 100644 index 4a5c932b8..000000000 --- a/frontend/coverage/src/components/FilamentTrends.tsx.html +++ /dev/null @@ -1,1087 +0,0 @@ - - - - - - Code coverage report for src/components/FilamentTrends.tsx - - - - - - - - - -
-
-

All files / src/components FilamentTrends.tsx

-
- -
- 0% - Statements - 0/261 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/261 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useMemo, useState } from 'react';
-import {
-  AreaChart,
-  Area,
-  XAxis,
-  YAxis,
-  CartesianGrid,
-  Tooltip,
-  ResponsiveContainer,
-  BarChart,
-  Bar,
-  PieChart,
-  Pie,
-  Cell,
-  Legend,
-} from 'recharts';
-import type { Archive } from '../api/client';
- 
-interface FilamentTrendsProps {
-  archives: Archive[];
-  currency?: string;
-}
- 
-type TimeRange = '7d' | '30d' | '90d' | '365d' | 'all';
- 
-const COLORS = ['#00ae42', '#3b82f6', '#f59e0b', '#ef4444', '#8b5cf6', '#ec4899', '#14b8a6', '#f97316'];
- 
-function getDateRange(range: TimeRange): Date {
-  const now = new Date();
-  switch (range) {
-    case '7d':
-      return new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);
-    case '30d':
-      return new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);
-    case '90d':
-      return new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000);
-    case '365d':
-      return new Date(now.getTime() - 365 * 24 * 60 * 60 * 1000);
-    case 'all':
-      return new Date(0);
-  }
-}
- 
-export function FilamentTrends({ archives, currency = '$' }: FilamentTrendsProps) {
-  const [timeRange, setTimeRange] = useState<TimeRange>('30d');
- 
-  // Filter archives by time range
-  const filteredArchives = useMemo(() => {
-    const startDate = getDateRange(timeRange);
-    return archives.filter(a => new Date(a.completed_at || a.created_at) >= startDate);
-  }, [archives, timeRange]);
- 
-  // Calculate daily usage data
-  const dailyData = useMemo(() => {
-    const dataMap = new Map<string, { date: string; filament: number; cost: number; prints: number }>();
- 
-    filteredArchives.forEach(archive => {
-      const date = new Date(archive.completed_at || archive.created_at);
-      const key = date.toISOString().split('T')[0];
- 
-      const existing = dataMap.get(key) || { date: key, filament: 0, cost: 0, prints: 0 };
-      existing.filament += archive.filament_used_grams || 0;
-      existing.cost += archive.cost || 0;
-      existing.prints += 1;
-      dataMap.set(key, existing);
-    });
- 
-    return Array.from(dataMap.values())
-      .sort((a, b) => a.date.localeCompare(b.date))
-      .map(d => ({
-        ...d,
-        dateLabel: new Date(d.date).toLocaleDateString('en-US', { month: 'short', day: 'numeric' }),
-      }));
-  }, [filteredArchives]);
- 
-  // Calculate weekly aggregated data for longer time ranges
-  const weeklyData = useMemo(() => {
-    if (timeRange === '7d' || timeRange === '30d') return dailyData;
- 
-    const dataMap = new Map<string, { week: string; filament: number; cost: number; prints: number }>();
- 
-    filteredArchives.forEach(archive => {
-      const date = new Date(archive.completed_at || archive.created_at);
-      // Get week start (Sunday)
-      const weekStart = new Date(date);
-      weekStart.setDate(date.getDate() - date.getDay());
-      const key = weekStart.toISOString().split('T')[0];
- 
-      const existing = dataMap.get(key) || { week: key, filament: 0, cost: 0, prints: 0 };
-      existing.filament += archive.filament_used_grams || 0;
-      existing.cost += archive.cost || 0;
-      existing.prints += 1;
-      dataMap.set(key, existing);
-    });
- 
-    return Array.from(dataMap.values())
-      .sort((a, b) => a.week.localeCompare(b.week))
-      .map(d => ({
-        date: d.week,
-        dateLabel: `Week of ${new Date(d.week).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}`,
-        ...d,
-      }));
-  }, [filteredArchives, dailyData, timeRange]);
- 
-  // Usage by filament type
-  const filamentTypeData = useMemo(() => {
-    const dataMap = new Map<string, number>();
- 
-    filteredArchives.forEach(archive => {
-      const type = archive.filament_type || 'Unknown';
-      // Handle multiple types (e.g., "PLA, PETG")
-      const types = type.split(', ');
-      types.forEach(t => {
-        const grams = (archive.filament_used_grams || 0) / types.length;
-        dataMap.set(t, (dataMap.get(t) || 0) + grams);
-      });
-    });
- 
-    return Array.from(dataMap.entries())
-      .map(([name, value]) => ({ name, value: Math.round(value) }))
-      .sort((a, b) => b.value - a.value);
-  }, [filteredArchives]);
- 
-  // Monthly comparison data
-  const monthlyComparison = useMemo(() => {
-    const now = new Date();
-    const months: { month: string; filament: number; cost: number; prints: number }[] = [];
- 
-    for (let i = 5; i >= 0; i--) {
-      const monthDate = new Date(now.getFullYear(), now.getMonth() - i, 1);
-      const monthEnd = new Date(now.getFullYear(), now.getMonth() - i + 1, 0);
-      const monthStr = monthDate.toLocaleDateString('en-US', { month: 'short', year: '2-digit' });
- 
-      const monthArchives = archives.filter(a => {
-        const d = new Date(a.completed_at || a.created_at);
-        return d >= monthDate && d <= monthEnd;
-      });
- 
-      months.push({
-        month: monthStr,
-        filament: Math.round(monthArchives.reduce((sum, a) => sum + (a.filament_used_grams || 0), 0)),
-        cost: monthArchives.reduce((sum, a) => sum + (a.cost || 0), 0),
-        prints: monthArchives.length,
-      });
-    }
- 
-    return months;
-  }, [archives]);
- 
-  const chartData = timeRange === '7d' || timeRange === '30d' ? dailyData : weeklyData;
-  const totalFilament = filteredArchives.reduce((sum, a) => sum + (a.filament_used_grams || 0), 0);
-  const totalCost = filteredArchives.reduce((sum, a) => sum + (a.cost || 0), 0);
- 
-  return (
-    <div className="space-y-6">
-      {/* Time Range Selector */}
-      <div className="flex items-center justify-between">
-        <h3 className="text-lg font-semibold text-white">Filament Usage Trends</h3>
-        <div className="flex gap-1 bg-bambu-dark rounded-lg p-1">
-          {(['7d', '30d', '90d', '365d', 'all'] as TimeRange[]).map((range) => (
-            <button
-              key={range}
-              onClick={() => setTimeRange(range)}
-              className={`px-3 py-1 text-sm rounded-md transition-colors ${
-                timeRange === range
-                  ? 'bg-bambu-green text-white'
-                  : 'text-bambu-gray hover:text-white'
-              }`}
-            >
-              {range === 'all' ? 'All' : range.replace('d', 'D')}
-            </button>
-          ))}
-        </div>
-      </div>
- 
-      {/* Summary Cards */}
-      <div className="grid grid-cols-3 gap-4">
-        <div className="bg-bambu-dark rounded-lg p-4">
-          <p className="text-sm text-bambu-gray">Period Filament</p>
-          <p className="text-2xl font-bold text-white">{(totalFilament / 1000).toFixed(2)}kg</p>
-          <p className="text-xs text-bambu-gray">{totalFilament.toFixed(0)}g total</p>
-        </div>
-        <div className="bg-bambu-dark rounded-lg p-4">
-          <p className="text-sm text-bambu-gray">Period Cost</p>
-          <p className="text-2xl font-bold text-white">{currency}{totalCost.toFixed(2)}</p>
-          <p className="text-xs text-bambu-gray">{filteredArchives.length} prints</p>
-        </div>
-        <div className="bg-bambu-dark rounded-lg p-4">
-          <p className="text-sm text-bambu-gray">Avg per Print</p>
-          <p className="text-2xl font-bold text-white">
-            {filteredArchives.length > 0
-              ? (totalFilament / filteredArchives.length).toFixed(0)
-              : 0}g
-          </p>
-          <p className="text-xs text-bambu-gray">
-            {currency}{filteredArchives.length > 0 ? (totalCost / filteredArchives.length).toFixed(2) : '0.00'} avg
-          </p>
-        </div>
-      </div>
- 
-      {/* Usage Over Time Chart */}
-      {chartData.length > 0 ? (
-        <div className="bg-bambu-dark rounded-lg p-4">
-          <h4 className="text-sm font-medium text-bambu-gray mb-4">Usage Over Time</h4>
-          <ResponsiveContainer width="100%" height={250}>
-            <AreaChart data={chartData}>
-              <defs>
-                <linearGradient id="colorFilament" x1="0" y1="0" x2="0" y2="1">
-                  <stop offset="5%" stopColor="#00ae42" stopOpacity={0.3}/>
-                  <stop offset="95%" stopColor="#00ae42" stopOpacity={0}/>
-                </linearGradient>
-              </defs>
-              <CartesianGrid strokeDasharray="3 3" stroke="#3d3d3d" />
-              <XAxis
-                dataKey="dateLabel"
-                stroke="#9ca3af"
-                tick={{ fontSize: 12 }}
-                interval="preserveStartEnd"
-              />
-              <YAxis
-                stroke="#9ca3af"
-                tick={{ fontSize: 12 }}
-                tickFormatter={(value) => `${value}g`}
-              />
-              <Tooltip
-                contentStyle={{
-                  backgroundColor: '#2d2d2d',
-                  border: '1px solid #3d3d3d',
-                  borderRadius: '8px',
-                }}
-                labelStyle={{ color: '#fff' }}
-                formatter={(value: number) => [`${value.toFixed(0)}g`, 'Filament']}
-              />
-              <Area
-                type="monotone"
-                dataKey="filament"
-                stroke="#00ae42"
-                strokeWidth={2}
-                fillOpacity={1}
-                fill="url(#colorFilament)"
-              />
-            </AreaChart>
-          </ResponsiveContainer>
-        </div>
-      ) : (
-        <div className="bg-bambu-dark rounded-lg p-8 text-center text-bambu-gray">
-          No data for selected time range
-        </div>
-      )}
- 
-      {/* Bottom Charts */}
-      <div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
-        {/* Filament Type Distribution */}
-        <div className="bg-bambu-dark rounded-lg p-4">
-          <h4 className="text-sm font-medium text-bambu-gray mb-4">By Filament Type</h4>
-          {filamentTypeData.length > 0 ? (
-            <div className="flex items-center gap-4">
-              <ResponsiveContainer width={160} height={160}>
-                <PieChart>
-                  <Pie
-                    data={filamentTypeData}
-                    cx="50%"
-                    cy="50%"
-                    innerRadius={40}
-                    outerRadius={70}
-                    paddingAngle={2}
-                    dataKey="value"
-                  >
-                    {filamentTypeData.map((_, index) => (
-                      <Cell key={`cell-${index}`} fill={COLORS[index % COLORS.length]} />
-                    ))}
-                  </Pie>
-                  <Tooltip
-                    contentStyle={{
-                      backgroundColor: '#2d2d2d',
-                      border: '1px solid #3d3d3d',
-                      borderRadius: '8px',
-                    }}
-                    formatter={(value: number) => [`${value}g`, 'Usage']}
-                  />
-                </PieChart>
-              </ResponsiveContainer>
-              <div className="flex-1 space-y-2 overflow-hidden">
-                {filamentTypeData.map((entry, index) => {
-                  const total = filamentTypeData.reduce((sum, e) => sum + e.value, 0);
-                  const percent = total > 0 ? ((entry.value / total) * 100).toFixed(0) : 0;
-                  return (
-                    <div key={entry.name} className="flex items-center gap-2 text-sm">
-                      <div
-                        className="w-3 h-3 rounded-sm flex-shrink-0"
-                        style={{ backgroundColor: COLORS[index % COLORS.length] }}
-                      />
-                      <span className="text-white truncate flex-1">{entry.name}</span>
-                      <span className="text-bambu-gray flex-shrink-0">{percent}%</span>
-                    </div>
-                  );
-                })}
-              </div>
-            </div>
-          ) : (
-            <div className="h-[160px] flex items-center justify-center text-bambu-gray">
-              No filament data
-            </div>
-          )}
-        </div>
- 
-        {/* Monthly Comparison */}
-        <div className="bg-bambu-dark rounded-lg p-4">
-          <h4 className="text-sm font-medium text-bambu-gray mb-4">Monthly Comparison</h4>
-          <ResponsiveContainer width="100%" height={200}>
-            <BarChart data={monthlyComparison}>
-              <CartesianGrid strokeDasharray="3 3" stroke="#3d3d3d" />
-              <XAxis dataKey="month" stroke="#9ca3af" tick={{ fontSize: 12 }} />
-              <YAxis stroke="#9ca3af" tick={{ fontSize: 12 }} tickFormatter={(v) => `${v}g`} />
-              <Tooltip
-                contentStyle={{
-                  backgroundColor: '#2d2d2d',
-                  border: '1px solid #3d3d3d',
-                  borderRadius: '8px',
-                }}
-                formatter={(value: number, name: string) => [
-                  name === 'filament' ? `${value}g` : name === 'cost' ? `${currency}${value.toFixed(2)}` : value,
-                  name === 'filament' ? 'Filament' : name === 'cost' ? 'Cost' : 'Prints'
-                ]}
-              />
-              <Legend />
-              <Bar dataKey="filament" name="Filament (g)" fill="#00ae42" radius={[4, 4, 0, 0]} />
-            </BarChart>
-          </ResponsiveContainer>
-        </div>
-      </div>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/FileManagerModal.tsx.html b/frontend/coverage/src/components/FileManagerModal.tsx.html deleted file mode 100644 index 557bcd388..000000000 --- a/frontend/coverage/src/components/FileManagerModal.tsx.html +++ /dev/null @@ -1,1117 +0,0 @@ - - - - - - Code coverage report for src/components/FileManagerModal.tsx - - - - - - - - - -
-
-

All files / src/components FileManagerModal.tsx

-
- -
- 0% - Statements - 0/261 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/261 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useEffect } from 'react';
-import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
-import {
-  X,
-  Folder,
-  File,
-  ChevronLeft,
-  Download,
-  Trash2,
-  Loader2,
-  HardDrive,
-  RefreshCw,
-  Film,
-  FileBox,
-  FileText,
-  Image,
-  Search,
-} from 'lucide-react';
-import { api } from '../api/client';
-import { Button } from './Button';
-import { ConfirmModal } from './ConfirmModal';
-import { useToast } from '../contexts/ToastContext';
- 
-interface FileManagerModalProps {
-  printerId: number;
-  printerName: string;
-  onClose: () => void;
-}
- 
-function formatFileSize(bytes: number): string {
-  if (bytes === 0) return '0 B';
-  const k = 1024;
-  const sizes = ['B', 'KB', 'MB', 'GB'];
-  const i = Math.floor(Math.log(bytes) / Math.log(k));
-  return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;
-}
- 
-function formatStorageSize(bytes: number): string {
-  if (bytes === 0) return '0 GB';
-  const gb = bytes / (1024 * 1024 * 1024);
-  if (gb >= 1) {
-    return `${gb.toFixed(1)} GB`;
-  }
-  const mb = bytes / (1024 * 1024);
-  return `${mb.toFixed(0)} MB`;
-}
- 
-function getFileIcon(filename: string, isDirectory: boolean) {
-  if (isDirectory) return Folder;
- 
-  const ext = filename.toLowerCase().split('.').pop() || '';
-  switch (ext) {
-    case '3mf':
-      return FileBox;
-    case 'gcode':
-      return FileText;
-    case 'mp4':
-    case 'avi':
-      return Film;
-    case 'png':
-    case 'jpg':
-    case 'jpeg':
-      return Image;
-    default:
-      return File;
-  }
-}
- 
-export function FileManagerModal({ printerId, printerName, onClose }: FileManagerModalProps) {
-  const { showToast } = useToast();
-  const queryClient = useQueryClient();
-  const [currentPath, setCurrentPath] = useState('/');
-  const [selectedFile, setSelectedFile] = useState<string | null>(null);
-  const [searchQuery, setSearchQuery] = useState('');
-  const [fileToDelete, setFileToDelete] = useState<string | null>(null);
- 
-  // Close on Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onClose();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose]);
- 
-  const { data, isLoading, refetch } = useQuery({
-    queryKey: ['printerFiles', printerId, currentPath],
-    queryFn: () => api.getPrinterFiles(printerId, currentPath),
-  });
- 
-  const { data: storageData } = useQuery({
-    queryKey: ['printerStorage', printerId],
-    queryFn: () => api.getPrinterStorage(printerId),
-    staleTime: 30000, // Cache for 30 seconds
-  });
- 
-  const deleteMutation = useMutation({
-    mutationFn: (path: string) => api.deletePrinterFile(printerId, path),
-    onSuccess: (_, path) => {
-      showToast(`Deleted: ${path.split('/').pop()}`);
-      queryClient.invalidateQueries({ queryKey: ['printerFiles', printerId] });
-      setSelectedFile(null);
-    },
-    onError: (error: Error) => {
-      showToast(`Delete failed: ${error.message}`, 'error');
-    },
-  });
- 
-  const navigateToFolder = (path: string) => {
-    setCurrentPath(path);
-    setSelectedFile(null);
-  };
- 
-  const navigateUp = () => {
-    if (currentPath === '/') return;
-    const parts = currentPath.split('/').filter(Boolean);
-    parts.pop();
-    setCurrentPath(parts.length ? '/' + parts.join('/') : '/');
-    setSelectedFile(null);
-  };
- 
-  const handleDownload = (path: string) => {
-    window.open(api.getPrinterFileDownloadUrl(printerId, path), '_blank');
-  };
- 
-  const handleDelete = (path: string) => {
-    setFileToDelete(path);
-  };
- 
-  // Quick navigation buttons for common directories
-  const quickDirs = [
-    { path: '/', label: 'Root' },
-    { path: '/cache', label: 'Cache' },
-    { path: '/model', label: 'Models' },
-    { path: '/timelapse', label: 'Timelapse' },
-  ];
- 
-  return (
-    <div
-      className="fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4"
-      onClick={onClose}
-    >
-      <div
-        className="w-full max-w-3xl max-h-[85vh] flex flex-col bg-bambu-dark-secondary rounded-xl border border-bambu-dark-tertiary overflow-hidden"
-        onClick={(e) => e.stopPropagation()}
-      >
-        {/* Header */}
-        <div className="flex items-center justify-between p-4 border-b border-bambu-dark-tertiary flex-shrink-0">
-            <div className="flex items-center gap-3">
-              <HardDrive className="w-5 h-5 text-bambu-green" />
-              <div>
-                <h2 className="text-lg font-semibold text-white">File Manager</h2>
-                <p className="text-sm text-bambu-gray">{printerName}</p>
-              </div>
-            </div>
-            <div className="flex items-center gap-4">
-              {/* Storage info */}
-              {storageData && (storageData.used_bytes != null || storageData.free_bytes != null) && (
-                <div className="text-sm text-bambu-gray flex items-center gap-2">
-                  {storageData.used_bytes != null && (
-                    <span>Used: {formatStorageSize(storageData.used_bytes)}</span>
-                  )}
-                  {storageData.used_bytes != null && storageData.free_bytes != null && (
-                    <span className="text-bambu-dark-tertiary">|</span>
-                  )}
-                  {storageData.free_bytes != null && (
-                    <span>Free: {formatStorageSize(storageData.free_bytes)}</span>
-                  )}
-                </div>
-              )}
-              <button
-                onClick={onClose}
-                className="text-bambu-gray hover:text-white transition-colors"
-              >
-                <X className="w-5 h-5" />
-              </button>
-            </div>
-          </div>
- 
-        {/* Quick Navigation */}
-        <div className="flex items-center gap-2 p-3 border-b border-bambu-dark-tertiary bg-bambu-dark/50 flex-shrink-0">
-          {quickDirs.map((dir) => (
-            <button
-              key={dir.path}
-              onClick={() => {
-                navigateToFolder(dir.path);
-                setSearchQuery('');
-              }}
-              className={`px-3 py-1 text-sm rounded-full transition-colors ${
-                currentPath === dir.path
-                  ? 'bg-bambu-green text-white'
-                  : 'bg-bambu-dark-tertiary text-bambu-gray hover:text-white'
-              }`}
-            >
-              {dir.label}
-            </button>
-          ))}
-          <div className="flex-1" />
-          <div className="relative">
-            <Search className="absolute left-2.5 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray" />
-            <input
-              type="text"
-              placeholder="Filter files..."
-              value={searchQuery}
-              onChange={(e) => setSearchQuery(e.target.value)}
-              className="w-40 pl-8 pr-3 py-1.5 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none"
-            />
-          </div>
-          <Button
-            variant="secondary"
-            size="sm"
-            onClick={() => refetch()}
-            disabled={isLoading}
-          >
-            <RefreshCw className={`w-4 h-4 ${isLoading ? 'animate-spin' : ''}`} />
-          </Button>
-        </div>
- 
-        {/* Path breadcrumb */}
-        <div className="flex items-center gap-2 px-4 py-2 bg-bambu-dark text-sm flex-shrink-0">
-            <button
-              onClick={navigateUp}
-              disabled={currentPath === '/'}
-              className="p-1 rounded hover:bg-bambu-dark-tertiary disabled:opacity-50 disabled:cursor-not-allowed"
-            >
-              <ChevronLeft className="w-4 h-4" />
-            </button>
-            <span className="text-bambu-gray font-mono">{currentPath}</span>
-          </div>
- 
-        {/* File list */}
-        <div className="flex-1 overflow-y-auto p-2 min-h-0">
-            {isLoading ? (
-              <div className="flex items-center justify-center py-12">
-                <Loader2 className="w-8 h-8 text-bambu-green animate-spin" />
-              </div>
-            ) : !data?.files?.length ? (
-              <div className="text-center py-12 text-bambu-gray">
-                No files in this directory
-              </div>
-            ) : (
-              <div className="space-y-1">
-                {/* Filter and sort: directories first, then files */}
-                {[...data.files]
-                  .filter((file) =>
-                    !searchQuery || file.name.toLowerCase().includes(searchQuery.toLowerCase())
-                  )
-                  .sort((a, b) => {
-                    if (a.is_directory && !b.is_directory) return -1;
-                    if (!a.is_directory && b.is_directory) return 1;
-                    return a.name.localeCompare(b.name);
-                  })
-                  .map((file) => {
-                    const FileIcon = getFileIcon(file.name, file.is_directory);
-                    const isSelected = selectedFile === file.path;
- 
-                    return (
-                      <div
-                        key={file.path}
-                        className={`flex items-center gap-3 p-2 rounded-lg cursor-pointer transition-colors ${
-                          isSelected
-                            ? 'bg-bambu-green/20 border border-bambu-green/50'
-                            : 'hover:bg-bambu-dark-tertiary'
-                        }`}
-                        onClick={() => {
-                          if (file.is_directory) {
-                            navigateToFolder(file.path);
-                          } else {
-                            setSelectedFile(isSelected ? null : file.path);
-                          }
-                        }}
-                      >
-                        <FileIcon
-                          className={`w-5 h-5 flex-shrink-0 ${
-                            file.is_directory ? 'text-bambu-green' : 'text-bambu-gray'
-                          }`}
-                        />
-                        <span className="flex-1 text-white truncate">{file.name}</span>
-                        {!file.is_directory && (
-                          <span className="text-sm text-bambu-gray">
-                            {formatFileSize(file.size)}
-                          </span>
-                        )}
-                        {file.is_directory && (
-                          <ChevronLeft className="w-4 h-4 text-bambu-gray rotate-180" />
-                        )}
-                      </div>
-                    );
-                  })}
-              </div>
-            )}
-          </div>
- 
-        {/* Action bar */}
-        <div className="flex items-center justify-between p-4 border-t border-bambu-dark-tertiary bg-bambu-dark/50 flex-shrink-0">
-          <div className="text-sm text-bambu-gray">
-            {searchQuery
-              ? `${data?.files?.filter(f => f.name.toLowerCase().includes(searchQuery.toLowerCase())).length || 0} of ${data?.files?.length || 0} items`
-              : `${data?.files?.length || 0} items`
-            }
-          </div>
-          <div className="flex gap-2">
-            <Button
-              variant="secondary"
-              disabled={!selectedFile}
-              onClick={() => selectedFile && handleDownload(selectedFile)}
-            >
-              <Download className="w-4 h-4" />
-              Download
-            </Button>
-            <Button
-              variant="secondary"
-              disabled={!selectedFile || deleteMutation.isPending}
-              onClick={() => selectedFile && handleDelete(selectedFile)}
-              className="text-red-400 hover:text-red-300"
-            >
-              {deleteMutation.isPending ? (
-                <Loader2 className="w-4 h-4 animate-spin" />
-              ) : (
-                <Trash2 className="w-4 h-4" />
-              )}
-              Delete
-            </Button>
-          </div>
-        </div>
-      </div>
- 
-      {/* Delete Confirmation Modal */}
-      {fileToDelete && (
-        <ConfirmModal
-          title="Delete File"
-          message={`Delete "${fileToDelete.split('/').pop()}"? This cannot be undone.`}
-          confirmText="Delete"
-          variant="danger"
-          onConfirm={() => {
-            deleteMutation.mutate(fileToDelete);
-            setFileToDelete(null);
-          }}
-          onCancel={() => setFileToDelete(null)}
-        />
-      )}
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/GcodeViewer.tsx.html b/frontend/coverage/src/components/GcodeViewer.tsx.html deleted file mode 100644 index f93c925e7..000000000 --- a/frontend/coverage/src/components/GcodeViewer.tsx.html +++ /dev/null @@ -1,667 +0,0 @@ - - - - - - Code coverage report for src/components/GcodeViewer.tsx - - - - - - - - - -
-
-

All files / src/components GcodeViewer.tsx

-
- -
- 0% - Statements - 0/139 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/139 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useEffect, useRef, useState } from 'react';
-import { WebGLPreview, init } from 'gcode-preview';
-import { Loader2, Layers, ChevronLeft, ChevronRight, FileWarning } from 'lucide-react';
- 
-interface BuildVolume {
-  x: number;
-  y: number;
-  z: number;
-}
- 
-interface GcodeViewerProps {
-  gcodeUrl: string;
-  buildVolume?: BuildVolume;
-  className?: string;
-}
- 
-export function GcodeViewer({ gcodeUrl, buildVolume = { x: 256, y: 256, z: 256 }, className = '' }: GcodeViewerProps) {
-  const canvasRef = useRef<HTMLCanvasElement>(null);
-  const previewRef = useRef<WebGLPreview | null>(null);
-  const [loading, setLoading] = useState(true);
-  const [error, setError] = useState<string | null>(null);
-  const [notSliced, setNotSliced] = useState(false);
-  const [currentLayer, setCurrentLayer] = useState(0);
-  const [totalLayers, setTotalLayers] = useState(0);
- 
-  useEffect(() => {
-    if (!canvasRef.current) return;
- 
-    const canvas = canvasRef.current;
- 
-    // Initialize the preview
-    const preview = init({
-      canvas,
-      buildVolume: buildVolume,
-      backgroundColor: 0x1a1a1a,
-      travelColor: 0x444444,
-      extrusionColor: 0x00ae42,
-      topLayerColor: 0x00ff5a,
-      lastSegmentColor: 0xffffff,
-      lineWidth: 2,
-      renderTravel: false,
-      renderExtrusion: true,
-    });
- 
-    previewRef.current = preview;
- 
-    // Fetch and parse G-code
-    setLoading(true);
-    setError(null);
-    setNotSliced(false);
- 
-    fetch(gcodeUrl)
-      .then(async response => {
-        if (!response.ok) {
-          if (response.status === 404) {
-            const data = await response.json().catch(() => ({}));
-            if (data.detail?.includes('sliced')) {
-              setNotSliced(true);
-              throw new Error('not_sliced');
-            }
-          }
-          throw new Error('Failed to load G-code');
-        }
-        return response.text();
-      })
-      .then(gcode => {
-        // Parse G-code
-        preview.processGCode(gcode);
- 
-        // Get layer count
-        const layers = preview.layers?.length || 0;
-        setTotalLayers(layers);
-        setCurrentLayer(layers);
- 
-        // Render all layers initially
-        preview.render();
-        setLoading(false);
-      })
-      .catch(err => {
-        setError(err.message);
-        setLoading(false);
-      });
- 
-    // Handle resize
-    const handleResize = () => {
-      if (canvas.parentElement) {
-        const rect = canvas.parentElement.getBoundingClientRect();
-        canvas.width = rect.width;
-        canvas.height = rect.height;
-        preview.resize();
-      }
-    };
- 
-    handleResize();
-    window.addEventListener('resize', handleResize);
- 
-    return () => {
-      window.removeEventListener('resize', handleResize);
-      preview.dispose();
-    };
-  }, [gcodeUrl, buildVolume]);
- 
-  const handleLayerChange = (layer: number) => {
-    if (!previewRef.current) return;
-    const newLayer = Math.max(1, Math.min(layer, totalLayers));
-    setCurrentLayer(newLayer);
-    // Clear and re-render up to the specified layer
-    previewRef.current.render();
-  };
- 
-  const handleSliderChange = (e: React.ChangeEvent<HTMLInputElement>) => {
-    handleLayerChange(parseInt(e.target.value, 10));
-  };
- 
-  return (
-    <div className={`relative flex flex-col h-full ${className}`}>
-      {/* Canvas container */}
-      <div className="flex-1 relative bg-bambu-dark rounded-lg overflow-hidden">
-        <canvas
-          ref={canvasRef}
-          className="w-full h-full"
-        />
- 
-        {loading && (
-          <div className="absolute inset-0 flex items-center justify-center bg-bambu-dark/80">
-            <div className="text-center">
-              <Loader2 className="w-8 h-8 animate-spin text-bambu-green mx-auto mb-2" />
-              <p className="text-bambu-gray text-sm">Loading G-code...</p>
-            </div>
-          </div>
-        )}
- 
-        {notSliced && (
-          <div className="absolute inset-0 flex items-center justify-center bg-bambu-dark/80">
-            <div className="text-center max-w-sm px-4">
-              <FileWarning className="w-12 h-12 text-bambu-gray mx-auto mb-3" />
-              <p className="text-white font-medium mb-2">G-code not available</p>
-              <p className="text-bambu-gray text-sm">
-                This file hasn't been sliced yet. G-code preview is only available
-                after slicing the model in Bambu Studio or Orca Slicer.
-              </p>
-            </div>
-          </div>
-        )}
- 
-        {error && !notSliced && (
-          <div className="absolute inset-0 flex items-center justify-center bg-bambu-dark/80">
-            <div className="text-center text-red-400">
-              <p className="text-sm">{error}</p>
-            </div>
-          </div>
-        )}
-      </div>
- 
-      {/* Layer controls */}
-      {!loading && !error && !notSliced && totalLayers > 0 && (
-        <div className="mt-4 px-2">
-          <div className="flex items-center gap-3">
-            <Layers className="w-4 h-4 text-bambu-gray flex-shrink-0" />
- 
-            <button
-              onClick={() => handleLayerChange(currentLayer - 1)}
-              disabled={currentLayer <= 1}
-              className="p-1 rounded hover:bg-bambu-dark-tertiary disabled:opacity-30 disabled:cursor-not-allowed"
-            >
-              <ChevronLeft className="w-4 h-4" />
-            </button>
- 
-            <input
-              type="range"
-              min={1}
-              max={totalLayers}
-              value={currentLayer}
-              onChange={handleSliderChange}
-              className="flex-1 h-2 bg-bambu-dark-tertiary rounded-lg appearance-none cursor-pointer accent-bambu-green"
-            />
- 
-            <button
-              onClick={() => handleLayerChange(currentLayer + 1)}
-              disabled={currentLayer >= totalLayers}
-              className="p-1 rounded hover:bg-bambu-dark-tertiary disabled:opacity-30 disabled:cursor-not-allowed"
-            >
-              <ChevronRight className="w-4 h-4" />
-            </button>
- 
-            <span className="text-sm text-bambu-gray min-w-[80px] text-right">
-              {currentLayer} / {totalLayers}
-            </span>
-          </div>
-        </div>
-      )}
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/HMSErrorModal.tsx.html b/frontend/coverage/src/components/HMSErrorModal.tsx.html deleted file mode 100644 index c8b2ae8cf..000000000 --- a/frontend/coverage/src/components/HMSErrorModal.tsx.html +++ /dev/null @@ -1,577 +0,0 @@ - - - - - - Code coverage report for src/components/HMSErrorModal.tsx - - - - - - - - - -
-
-

All files / src/components HMSErrorModal.tsx

-
- -
- 0% - Statements - 0/118 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/118 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
// HMS Error Modal - Updated Dec 4 2025 for attr field support
-import { useEffect } from 'react';
-import { X, AlertTriangle, AlertCircle, Info, ExternalLink } from 'lucide-react';
-import type { HMSError } from '../api/client';
- 
-interface HMSErrorModalProps {
-  printerName: string;
-  errors: HMSError[];
-  onClose: () => void;
-}
- 
-// HMS error code descriptions keyed by full HMS code (attr + code combined)
-// Format: "AAAA_BBBB_CCCC_DDDD" where AAAA_BBBB is from attr, CCCC_DDDD is from code
-const HMS_DESCRIPTIONS: Record<string, string> = {
-  // H2D specific errors
-  '0700_5500_0002_0001': 'A binding error occurred between AMS and the extruder. Please perform AMS initialization again.',
-  '0500_0300_0002_000E': 'Some modules are incompatible with the printer firmware version. Please update firmware.',
-  // Common errors
-  '0300_0100_0002_0054': 'The heatbed temperature is abnormal. The sensor may be disconnected or damaged.',
-  '0500_0100_0005_0005': 'Motor driver overheated. Let the printer cool down.',
-  '0500_0100_0005_0006': 'Motor driver communication error.',
-  '0700_0100_0007_0001': 'AMS communication error.',
-  '0700_0100_0007_0002': 'AMS filament runout.',
-  '0700_0100_0007_0003': 'AMS filament not detected.',
-  '0C00_0100_000C_0003': 'First layer inspection failed.',
-  '0C00_0100_000C_0004': 'Nozzle clog detected.',
-  '0C00_0100_000C_8000': 'Foreign object detected on print bed.',
-  '0500_0100_0005_0000': 'Motor X axis lost steps.',
-  '0500_0100_0005_0001': 'Motor Y axis lost steps.',
-  '0500_0100_0005_0002': 'Motor Z axis lost steps.',
-};
- 
-function getSeverityInfo(severity: number): { label: string; color: string; bgColor: string; Icon: typeof AlertTriangle } {
-  switch (severity) {
-    case 1:
-      return { label: 'Fatal', color: 'text-red-500', bgColor: 'bg-red-500/20', Icon: AlertTriangle };
-    case 2:
-      return { label: 'Serious', color: 'text-red-400', bgColor: 'bg-red-500/15', Icon: AlertTriangle };
-    case 3:
-      return { label: 'Warning', color: 'text-orange-400', bgColor: 'bg-orange-500/20', Icon: AlertCircle };
-    case 4:
-    default:
-      return { label: 'Info', color: 'text-blue-400', bgColor: 'bg-blue-500/20', Icon: Info };
-  }
-}
- 
-function getFullHMSCode(attr: number, code: number): string {
-  // Construct the full HMS code from attr and code
-  // Format: AAAA_BBBB_CCCC_DDDD
-  // AAAA_BBBB from attr, CCCC_DDDD from code
-  const a1 = ((attr >> 24) & 0xFF).toString(16).padStart(2, '0').toUpperCase();
-  const a2 = ((attr >> 16) & 0xFF).toString(16).padStart(2, '0').toUpperCase();
-  const a3 = ((attr >> 8) & 0xFF).toString(16).padStart(2, '0').toUpperCase();
-  const a4 = (attr & 0xFF).toString(16).padStart(2, '0').toUpperCase();
- 
-  const c1 = ((code >> 24) & 0xFF).toString(16).padStart(2, '0').toUpperCase();
-  const c2 = ((code >> 16) & 0xFF).toString(16).padStart(2, '0').toUpperCase();
-  const c3 = ((code >> 8) & 0xFF).toString(16).padStart(2, '0').toUpperCase();
-  const c4 = (code & 0xFF).toString(16).padStart(2, '0').toUpperCase();
- 
-  return `${a1}${a2}_${a3}${a4}_${c1}${c2}_${c3}${c4}`;
-}
- 
-function getHMSWikiUrl(attr: number, code: number, printerName: string): string {
-  // Construct wiki URL from attr and code
-  const fullCode = getFullHMSCode(attr, code);
- 
-  // Use H2 wiki path for H2D printers, otherwise use X1 path
-  const isH2 = printerName.toLowerCase().includes('h2');
-  const basePath = isH2 ? 'h2' : 'x1';
- 
-  return `https://wiki.bambulab.com/en/${basePath}/troubleshooting/hmscode/${fullCode}`;
-}
- 
-export function HMSErrorModal({ printerName, errors, onClose }: HMSErrorModalProps) {
-  // Debug: log errors to see what data we're receiving
-  console.log('HMSErrorModal errors:', JSON.stringify(errors, null, 2));
- 
-  // Close on Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onClose();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose]);
- 
-  return (
-    <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4">
-      <div className="bg-bambu-dark-secondary rounded-lg shadow-xl max-w-lg w-full max-h-[80vh] flex flex-col">
-        {/* Header */}
-        <div className="flex items-center justify-between p-4 border-b border-bambu-dark-tertiary">
-          <div className="flex items-center gap-2">
-            <AlertTriangle className="w-5 h-5 text-orange-400" />
-            <h2 className="text-lg font-semibold text-white">HMS Errors - {printerName}</h2>
-          </div>
-          <button
-            onClick={onClose}
-            className="p-1 hover:bg-bambu-dark-tertiary rounded-lg transition-colors"
-          >
-            <X className="w-5 h-5 text-bambu-gray" />
-          </button>
-        </div>
- 
-        {/* Content */}
-        <div className="flex-1 overflow-y-auto p-4">
-          {errors.length === 0 ? (
-            <div className="text-center py-8 text-bambu-gray">
-              <AlertCircle className="w-12 h-12 mx-auto mb-3 opacity-30" />
-              <p>No HMS errors</p>
-            </div>
-          ) : (
-            <div className="space-y-3">
-              {errors.map((error, index) => {
-                const { label, color, bgColor, Icon } = getSeverityInfo(error.severity);
-                const codeNum = parseInt(error.code.replace('0x', ''), 16) || 0;
-                const fullHMSCode = getFullHMSCode(error.attr, codeNum);
-                const description = HMS_DESCRIPTIONS[fullHMSCode] || 'Unknown error. Click the link below for details.';
-                const wikiUrl = getHMSWikiUrl(error.attr, codeNum, printerName);
-                const displayCode = `HMS_${fullHMSCode.replace(/_/g, '-')}`;
- 
-                return (
-                  <div
-                    key={`${error.code}-${index}`}
-                    className={`p-4 rounded-lg ${bgColor} border border-white/10`}
-                  >
-                    <div className="flex items-start gap-3">
-                      <Icon className={`w-5 h-5 ${color} flex-shrink-0 mt-0.5`} />
-                      <div className="flex-1 min-w-0">
-                        <div className="flex items-center gap-2 mb-1">
-                          <span className={`font-mono text-sm ${color}`}>{displayCode}</span>
-                          <span className={`text-xs px-2 py-0.5 rounded-full ${bgColor} ${color}`}>
-                            {label}
-                          </span>
-                        </div>
-                        <p className="text-sm text-bambu-gray mb-2">{description}</p>
-                        <a
-                          href={wikiUrl}
-                          target="_blank"
-                          rel="noopener noreferrer"
-                          className="inline-flex items-center gap-1 text-xs text-bambu-green hover:underline"
-                        >
-                          <ExternalLink className="w-3 h-3" />
-                          View on Bambu Lab Wiki
-                        </a>
-                      </div>
-                    </div>
-                  </div>
-                );
-              })}
-            </div>
-          )}
-        </div>
- 
-        {/* Footer */}
-        <div className="p-4 border-t border-bambu-dark-tertiary">
-          <p className="text-xs text-bambu-gray">
-            HMS (Health Management System) monitors printer health. Clear errors on the printer to dismiss them here.
-          </p>
-        </div>
-      </div>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/IconPicker.tsx.html b/frontend/coverage/src/components/IconPicker.tsx.html deleted file mode 100644 index 06b538740..000000000 --- a/frontend/coverage/src/components/IconPicker.tsx.html +++ /dev/null @@ -1,481 +0,0 @@ - - - - - - Code coverage report for src/components/IconPicker.tsx - - - - - - - - - -
-
-

All files / src/components IconPicker.tsx

-
- -
- 0% - Statements - 0/79 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/79 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState } from 'react';
-import {
-  Globe,
-  Link,
-  ExternalLink,
-  Book,
-  FileText,
-  Home,
-  Star,
-  Heart,
-  Bookmark,
-  ShoppingCart,
-  Music,
-  Video,
-  Image,
-  Camera,
-  Map,
-  Compass,
-  Coffee,
-  Gift,
-  Wrench,
-  Zap,
-  Cloud,
-  Database,
-  Folder,
-  Mail,
-  Phone,
-  User,
-  Users,
-  Server,
-  Terminal,
-  Code,
-  type LucideIcon,
-} from 'lucide-react';
- 
-// Available icons for external links
-export const AVAILABLE_ICONS: { name: string; icon: LucideIcon }[] = [
-  { name: 'globe', icon: Globe },
-  { name: 'link', icon: Link },
-  { name: 'external-link', icon: ExternalLink },
-  { name: 'book', icon: Book },
-  { name: 'file-text', icon: FileText },
-  { name: 'home', icon: Home },
-  { name: 'star', icon: Star },
-  { name: 'heart', icon: Heart },
-  { name: 'bookmark', icon: Bookmark },
-  { name: 'shopping-cart', icon: ShoppingCart },
-  { name: 'music', icon: Music },
-  { name: 'video', icon: Video },
-  { name: 'image', icon: Image },
-  { name: 'camera', icon: Camera },
-  { name: 'map', icon: Map },
-  { name: 'compass', icon: Compass },
-  { name: 'coffee', icon: Coffee },
-  { name: 'gift', icon: Gift },
-  { name: 'wrench', icon: Wrench },
-  { name: 'zap', icon: Zap },
-  { name: 'cloud', icon: Cloud },
-  { name: 'database', icon: Database },
-  { name: 'folder', icon: Folder },
-  { name: 'mail', icon: Mail },
-  { name: 'phone', icon: Phone },
-  { name: 'user', icon: User },
-  { name: 'users', icon: Users },
-  { name: 'server', icon: Server },
-  { name: 'terminal', icon: Terminal },
-  { name: 'code', icon: Code },
-];
- 
-// Helper to get icon component by name
-export function getIconByName(name: string): LucideIcon {
-  const found = AVAILABLE_ICONS.find((i) => i.name === name);
-  return found?.icon || Link;
-}
- 
-interface IconPickerProps {
-  value: string;
-  onChange: (value: string) => void;
-}
- 
-export function IconPicker({ value, onChange }: IconPickerProps) {
-  const [isOpen, setIsOpen] = useState(false);
- 
-  const SelectedIcon = getIconByName(value);
- 
-  return (
-    <div className="relative">
-      <button
-        type="button"
-        onClick={() => setIsOpen(!isOpen)}
-        className="flex items-center gap-2 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white hover:border-bambu-gray focus:border-bambu-green focus:outline-none w-full"
-      >
-        <SelectedIcon className="w-5 h-5" />
-        <span className="text-sm text-bambu-gray flex-1 text-left">{value}</span>
-      </button>
- 
-      {isOpen && (
-        <>
-          {/* Backdrop */}
-          <div
-            className="fixed inset-0 z-40"
-            onClick={() => setIsOpen(false)}
-          />
- 
-          {/* Dropdown */}
-          <div className="absolute z-50 mt-1 w-full max-h-64 overflow-y-auto bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg shadow-lg">
-            <div className="grid grid-cols-5 gap-1 p-2">
-              {AVAILABLE_ICONS.map(({ name, icon: Icon }) => (
-                <button
-                  key={name}
-                  type="button"
-                  onClick={() => {
-                    onChange(name);
-                    setIsOpen(false);
-                  }}
-                  className={`p-2 rounded-lg transition-colors flex items-center justify-center ${
-                    value === name
-                      ? 'bg-bambu-green text-white'
-                      : 'hover:bg-bambu-dark-tertiary text-bambu-gray hover:text-white'
-                  }`}
-                  title={name}
-                >
-                  <Icon className="w-5 h-5" />
-                </button>
-              ))}
-            </div>
-          </div>
-        </>
-      )}
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/KProfilesView.tsx.html b/frontend/coverage/src/components/KProfilesView.tsx.html deleted file mode 100644 index a5cd995db..000000000 --- a/frontend/coverage/src/components/KProfilesView.tsx.html +++ /dev/null @@ -1,4552 +0,0 @@ - - - - - - Code coverage report for src/components/KProfilesView.tsx - - - - - - - - - -
-
-

All files / src/components KProfilesView.tsx

-
- -
- 0% - Statements - 0/1161 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1161 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -425 -426 -427 -428 -429 -430 -431 -432 -433 -434 -435 -436 -437 -438 -439 -440 -441 -442 -443 -444 -445 -446 -447 -448 -449 -450 -451 -452 -453 -454 -455 -456 -457 -458 -459 -460 -461 -462 -463 -464 -465 -466 -467 -468 -469 -470 -471 -472 -473 -474 -475 -476 -477 -478 -479 -480 -481 -482 -483 -484 -485 -486 -487 -488 -489 -490 -491 -492 -493 -494 -495 -496 -497 -498 -499 -500 -501 -502 -503 -504 -505 -506 -507 -508 -509 -510 -511 -512 -513 -514 -515 -516 -517 -518 -519 -520 -521 -522 -523 -524 -525 -526 -527 -528 -529 -530 -531 -532 -533 -534 -535 -536 -537 -538 -539 -540 -541 -542 -543 -544 -545 -546 -547 -548 -549 -550 -551 -552 -553 -554 -555 -556 -557 -558 -559 -560 -561 -562 -563 -564 -565 -566 -567 -568 -569 -570 -571 -572 -573 -574 -575 -576 -577 -578 -579 -580 -581 -582 -583 -584 -585 -586 -587 -588 -589 -590 -591 -592 -593 -594 -595 -596 -597 -598 -599 -600 -601 -602 -603 -604 -605 -606 -607 -608 -609 -610 -611 -612 -613 -614 -615 -616 -617 -618 -619 -620 -621 -622 -623 -624 -625 -626 -627 -628 -629 -630 -631 -632 -633 -634 -635 -636 -637 -638 -639 -640 -641 -642 -643 -644 -645 -646 -647 -648 -649 -650 -651 -652 -653 -654 -655 -656 -657 -658 -659 -660 -661 -662 -663 -664 -665 -666 -667 -668 -669 -670 -671 -672 -673 -674 -675 -676 -677 -678 -679 -680 -681 -682 -683 -684 -685 -686 -687 -688 -689 -690 -691 -692 -693 -694 -695 -696 -697 -698 -699 -700 -701 -702 -703 -704 -705 -706 -707 -708 -709 -710 -711 -712 -713 -714 -715 -716 -717 -718 -719 -720 -721 -722 -723 -724 -725 -726 -727 -728 -729 -730 -731 -732 -733 -734 -735 -736 -737 -738 -739 -740 -741 -742 -743 -744 -745 -746 -747 -748 -749 -750 -751 -752 -753 -754 -755 -756 -757 -758 -759 -760 -761 -762 -763 -764 -765 -766 -767 -768 -769 -770 -771 -772 -773 -774 -775 -776 -777 -778 -779 -780 -781 -782 -783 -784 -785 -786 -787 -788 -789 -790 -791 -792 -793 -794 -795 -796 -797 -798 -799 -800 -801 -802 -803 -804 -805 -806 -807 -808 -809 -810 -811 -812 -813 -814 -815 -816 -817 -818 -819 -820 -821 -822 -823 -824 -825 -826 -827 -828 -829 -830 -831 -832 -833 -834 -835 -836 -837 -838 -839 -840 -841 -842 -843 -844 -845 -846 -847 -848 -849 -850 -851 -852 -853 -854 -855 -856 -857 -858 -859 -860 -861 -862 -863 -864 -865 -866 -867 -868 -869 -870 -871 -872 -873 -874 -875 -876 -877 -878 -879 -880 -881 -882 -883 -884 -885 -886 -887 -888 -889 -890 -891 -892 -893 -894 -895 -896 -897 -898 -899 -900 -901 -902 -903 -904 -905 -906 -907 -908 -909 -910 -911 -912 -913 -914 -915 -916 -917 -918 -919 -920 -921 -922 -923 -924 -925 -926 -927 -928 -929 -930 -931 -932 -933 -934 -935 -936 -937 -938 -939 -940 -941 -942 -943 -944 -945 -946 -947 -948 -949 -950 -951 -952 -953 -954 -955 -956 -957 -958 -959 -960 -961 -962 -963 -964 -965 -966 -967 -968 -969 -970 -971 -972 -973 -974 -975 -976 -977 -978 -979 -980 -981 -982 -983 -984 -985 -986 -987 -988 -989 -990 -991 -992 -993 -994 -995 -996 -997 -998 -999 -1000 -1001 -1002 -1003 -1004 -1005 -1006 -1007 -1008 -1009 -1010 -1011 -1012 -1013 -1014 -1015 -1016 -1017 -1018 -1019 -1020 -1021 -1022 -1023 -1024 -1025 -1026 -1027 -1028 -1029 -1030 -1031 -1032 -1033 -1034 -1035 -1036 -1037 -1038 -1039 -1040 -1041 -1042 -1043 -1044 -1045 -1046 -1047 -1048 -1049 -1050 -1051 -1052 -1053 -1054 -1055 -1056 -1057 -1058 -1059 -1060 -1061 -1062 -1063 -1064 -1065 -1066 -1067 -1068 -1069 -1070 -1071 -1072 -1073 -1074 -1075 -1076 -1077 -1078 -1079 -1080 -1081 -1082 -1083 -1084 -1085 -1086 -1087 -1088 -1089 -1090 -1091 -1092 -1093 -1094 -1095 -1096 -1097 -1098 -1099 -1100 -1101 -1102 -1103 -1104 -1105 -1106 -1107 -1108 -1109 -1110 -1111 -1112 -1113 -1114 -1115 -1116 -1117 -1118 -1119 -1120 -1121 -1122 -1123 -1124 -1125 -1126 -1127 -1128 -1129 -1130 -1131 -1132 -1133 -1134 -1135 -1136 -1137 -1138 -1139 -1140 -1141 -1142 -1143 -1144 -1145 -1146 -1147 -1148 -1149 -1150 -1151 -1152 -1153 -1154 -1155 -1156 -1157 -1158 -1159 -1160 -1161 -1162 -1163 -1164 -1165 -1166 -1167 -1168 -1169 -1170 -1171 -1172 -1173 -1174 -1175 -1176 -1177 -1178 -1179 -1180 -1181 -1182 -1183 -1184 -1185 -1186 -1187 -1188 -1189 -1190 -1191 -1192 -1193 -1194 -1195 -1196 -1197 -1198 -1199 -1200 -1201 -1202 -1203 -1204 -1205 -1206 -1207 -1208 -1209 -1210 -1211 -1212 -1213 -1214 -1215 -1216 -1217 -1218 -1219 -1220 -1221 -1222 -1223 -1224 -1225 -1226 -1227 -1228 -1229 -1230 -1231 -1232 -1233 -1234 -1235 -1236 -1237 -1238 -1239 -1240 -1241 -1242 -1243 -1244 -1245 -1246 -1247 -1248 -1249 -1250 -1251 -1252 -1253 -1254 -1255 -1256 -1257 -1258 -1259 -1260 -1261 -1262 -1263 -1264 -1265 -1266 -1267 -1268 -1269 -1270 -1271 -1272 -1273 -1274 -1275 -1276 -1277 -1278 -1279 -1280 -1281 -1282 -1283 -1284 -1285 -1286 -1287 -1288 -1289 -1290 -1291 -1292 -1293 -1294 -1295 -1296 -1297 -1298 -1299 -1300 -1301 -1302 -1303 -1304 -1305 -1306 -1307 -1308 -1309 -1310 -1311 -1312 -1313 -1314 -1315 -1316 -1317 -1318 -1319 -1320 -1321 -1322 -1323 -1324 -1325 -1326 -1327 -1328 -1329 -1330 -1331 -1332 -1333 -1334 -1335 -1336 -1337 -1338 -1339 -1340 -1341 -1342 -1343 -1344 -1345 -1346 -1347 -1348 -1349 -1350 -1351 -1352 -1353 -1354 -1355 -1356 -1357 -1358 -1359 -1360 -1361 -1362 -1363 -1364 -1365 -1366 -1367 -1368 -1369 -1370 -1371 -1372 -1373 -1374 -1375 -1376 -1377 -1378 -1379 -1380 -1381 -1382 -1383 -1384 -1385 -1386 -1387 -1388 -1389 -1390 -1391 -1392 -1393 -1394 -1395 -1396 -1397 -1398 -1399 -1400 -1401 -1402 -1403 -1404 -1405 -1406 -1407 -1408 -1409 -1410 -1411 -1412 -1413 -1414 -1415 -1416 -1417 -1418 -1419 -1420 -1421 -1422 -1423 -1424 -1425 -1426 -1427 -1428 -1429 -1430 -1431 -1432 -1433 -1434 -1435 -1436 -1437 -1438 -1439 -1440 -1441 -1442 -1443 -1444 -1445 -1446 -1447 -1448 -1449 -1450 -1451 -1452 -1453 -1454 -1455 -1456 -1457 -1458 -1459 -1460 -1461 -1462 -1463 -1464 -1465 -1466 -1467 -1468 -1469 -1470 -1471 -1472 -1473 -1474 -1475 -1476 -1477 -1478 -1479 -1480 -1481 -1482 -1483 -1484 -1485 -1486 -1487 -1488 -1489 -1490  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import React, { useState, useEffect, useCallback } from 'react';
-import { useQuery, useMutation } from '@tanstack/react-query';
-import {
-  Gauge,
-  Loader2,
-  RefreshCw,
-  Printer,
-  Plus,
-  X,
-  AlertCircle,
-  WifiOff,
-  Trash2,
-  Search,
-  Copy,
-  Download,
-  Upload,
-  CheckSquare,
-  Square,
-  StickyNote,
-} from 'lucide-react';
-import { api } from '../api/client';
-import type { KProfile, KProfileCreate, KProfileDelete } from '../api/client';
-import { Card, CardContent } from './Card';
-import { Button } from './Button';
-import { useToast } from '../contexts/ToastContext';
- 
-interface KProfileCardProps {
-  profile: KProfile;
-  onEdit: () => void;
-  onCopy?: () => void;
-  selectionMode?: boolean;
-  isSelected?: boolean;
-  onToggleSelect?: () => void;
-  note?: string;  // Note text to display as preview
-}
- 
-// Truncate to 3 decimal places (like Bambu Studio) instead of rounding
-const truncateK = (value: string) => {
-  const num = parseFloat(value);
-  return (Math.trunc(num * 1000) / 1000).toFixed(3);
-};
- 
-// Get flow type label from nozzle_id (e.g., "HH00-0.4" -> "HF", "HS00-0.4" -> "S")
-const getFlowTypeLabel = (nozzleId: string) => {
-  if (nozzleId.startsWith('HH')) return 'HF';  // High Flow
-  return 'S';  // Standard Flow (default)
-};
- 
-// Extract nozzle type prefix from nozzle_id (e.g., "HH00-0.4" -> "HH00")
-const getNozzleTypePrefix = (nozzleId: string) => {
-  const match = nozzleId.match(/^([A-Z]{2}\d{2})/);
-  return match ? match[1] : 'HH00';
-};
- 
-// Extract filament name from profile name (e.g., "High Flow_Devil Design PLA Basic" -> "Devil Design PLA Basic")
-const extractFilamentName = (profileName: string) => {
-  // Profile names are formatted as "{Flow Type}_{Filament Name}" or "{Flow Type} {Filament Name}"
-  // Remove common prefixes - check both underscore and space separators
-  const prefixes = [
-    'High Flow_', 'High Flow ',  // underscore or space
-    'Standard_', 'Standard ',
-    'HF_', 'HF ',
-    'S_', 'S ',
-  ];
-  for (const prefix of prefixes) {
-    if (profileName.startsWith(prefix)) {
-      return profileName.slice(prefix.length);
-    }
-  }
-  // If no prefix found, check for underscore separator
-  const underscoreIdx = profileName.indexOf('_');
-  if (underscoreIdx > 0) {
-    return profileName.slice(underscoreIdx + 1);
-  }
-  return profileName;
-};
- 
-function KProfileCard({ profile, onEdit, onCopy, selectionMode, isSelected, onToggleSelect, note }: KProfileCardProps) {
-  const flowType = getFlowTypeLabel(profile.nozzle_id);
-  const diameter = profile.nozzle_diameter;
- 
-  const handleClick = () => {
-    if (selectionMode && onToggleSelect) {
-      onToggleSelect();
-    } else {
-      onEdit();
-    }
-  };
- 
-  return (
-    <div className="flex items-center gap-2">
-      {selectionMode && (
-        <button
-          onClick={onToggleSelect}
-          className="text-bambu-gray hover:text-white transition-colors p-1"
-        >
-          {isSelected ? (
-            <CheckSquare className="w-4 h-4 text-bambu-green" />
-          ) : (
-            <Square className="w-4 h-4" />
-          )}
-        </button>
-      )}
-      <button
-        onClick={handleClick}
-        className={`flex-1 text-left px-3 py-2 bg-bambu-dark rounded hover:bg-bambu-dark-tertiary transition-colors ${isSelected ? 'ring-1 ring-bambu-green' : ''}`}
-      >
-        <div className="flex items-center gap-2">
-          <span className="text-bambu-green font-mono text-sm font-bold whitespace-nowrap">
-            {truncateK(profile.k_value)}
-          </span>
-          <span className="text-white text-sm truncate flex-1" title={profile.name}>
-            {profile.name || 'Unnamed'}
-          </span>
-          {note && (
-            <span title="Has note">
-              <StickyNote className="w-3 h-3 text-yellow-500" />
-            </span>
-          )}
-          <span className="text-xs text-bambu-gray whitespace-nowrap">
-            {flowType} {diameter}
-          </span>
-        </div>
-        {note && (
-          <div className="text-xs mt-0.5 truncate text-yellow-500/70" title={note}>
-            Note: {note.length > 50 ? note.substring(0, 50) + '...' : note}
-          </div>
-        )}
-      </button>
-      {!selectionMode && onCopy && (
-        <button
-          onClick={(e) => {
-            e.stopPropagation();
-            onCopy();
-          }}
-          className="text-bambu-gray hover:text-white transition-colors p-1"
-          title="Copy profile"
-        >
-          <Copy className="w-4 h-4" />
-        </button>
-      )}
-    </div>
-  );
-}
- 
-interface KProfileModalProps {
-  profile?: KProfile;
-  printerId: number;
-  nozzleDiameter: string;
-  existingProfiles?: KProfile[];  // Existing profiles for filament selection
-  isDualNozzle?: boolean;  // Whether this is a dual-nozzle printer
-  initialNote?: string;  // Initial note value for the profile
-  initialNoteKey?: string | null;  // Key the note was stored under (for clearing)
-  onClose: () => void;
-  onSave: () => void;
-  onSaveNote?: (settingId: string, note: string) => void;  // Callback to save note
-}
- 
-function KProfileModal({
-  profile,
-  printerId,
-  nozzleDiameter,
-  existingProfiles = [],
-  isDualNozzle = false,
-  initialNote = '',
-  initialNoteKey = null,
-  onClose,
-  onSave,
-  onSaveNote,
-}: KProfileModalProps) {
-  const { showToast } = useToast();
- 
-  const [name, setName] = useState(profile?.name || '');
-  const [kValue, setKValue] = useState(
-    profile?.k_value ? truncateK(profile.k_value) : '0.020'
-  );
-  const [filamentId, setFilamentId] = useState(profile?.filament_id || '');
-  // Split nozzle into type and diameter
-  const [nozzleType, setNozzleType] = useState(
-    profile?.nozzle_id ? getNozzleTypePrefix(profile.nozzle_id) : 'HH00'
-  );
-  const [modalDiameter, setModalDiameter] = useState(
-    profile?.nozzle_diameter || nozzleDiameter
-  );
-  // For new profiles on dual-nozzle: allow selecting multiple extruders
-  // For editing: use single extruder from the profile
-  const [selectedExtruders, setSelectedExtruders] = useState<number[]>(
-    profile ? [profile.extruder_id] : isDualNozzle ? [0, 1] : [0]  // Default: both extruders for new dual-nozzle profiles
-  );
-  const [isSyncing, setIsSyncing] = useState(false);
-  const [savingProgress, setSavingProgress] = useState({ current: 0, total: 0 });
-  const [note, setNote] = useState(initialNote);
- 
-  // Extract unique filaments from existing K-profiles on the printer
-  // These have valid filament_ids that the printer recognizes
-  const knownFilaments = React.useMemo(() => {
-    const filamentMap = new Map<string, { id: string; name: string }>();
-    for (const p of existingProfiles) {
-      if (p.filament_id && !filamentMap.has(p.filament_id)) {
-        const filamentName = extractFilamentName(p.name || '');
-        filamentMap.set(p.filament_id, {
-          id: p.filament_id,
-          name: filamentName || p.filament_id,
-        });
-      }
-    }
-    return Array.from(filamentMap.values()).sort((a, b) =>
-      a.name.localeCompare(b.name)
-    );
-  }, [existingProfiles]);
- 
-  const saveMutation = useMutation({
-    mutationFn: (data: KProfileCreate) => {
-      console.log('[KProfile] Calling API...');
-      return api.setKProfile(printerId, data);
-    },
-    onSuccess: (result) => {
-      console.log('[KProfile] Save success:', result);
-      showToast('K-profile saved');
-      // Save note if it changed (including clearing it)
-      if (onSaveNote && note !== initialNote) {
-        let profileKey: string;
-        if (note === '' && initialNoteKey) {
-          // Clearing note: use the same key it was stored under
-          profileKey = initialNoteKey;
-        } else if (profile && profile.slot_id > 0) {
-          // Editing: use setting_id if available, or composite key with slot_id
-          profileKey = profile.setting_id || `slot_${profile.slot_id}_${profile.filament_id}_${profile.extruder_id}`;
-        } else {
-          // New profile: use name as key (will be matched when profile is loaded)
-          profileKey = `name_${name}_${filamentId}`;
-        }
-        onSaveNote(profileKey, note);
-      }
-      // Show syncing indicator while printer processes the command
-      setIsSyncing(true);
-      // Add delay before closing to give printer time to process the save
-      // onSave will trigger refetch in the parent component
-      setTimeout(() => {
-        setIsSyncing(false);
-        onSave();
-      }, 2500);
-    },
-    onError: (error: Error) => {
-      console.error('[KProfile] Save error:', error);
-      showToast(error.message, 'error');
-      setIsSyncing(false);
-    },
-  });
- 
-  const deleteMutation = useMutation({
-    mutationFn: (data: KProfileDelete) => {
-      console.log('[KProfile] Deleting profile...');
-      return api.deleteKProfile(printerId, data);
-    },
-    onSuccess: (result) => {
-      console.log('[KProfile] Delete success:', result);
-      showToast('K-profile deleted');
-      // Show syncing indicator while printer processes the command
-      setIsSyncing(true);
-      // Add longer delay for delete - printer needs more time to process
-      // before it can return the updated profile list
-      setTimeout(() => {
-        setIsSyncing(false);
-        onClose();
-      }, 4000);
-    },
-    onError: (error: Error) => {
-      console.error('[KProfile] Delete error:', error);
-      showToast(error.message, 'error');
-      setIsSyncing(false);
-    },
-  });
- 
-  const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);
- 
-  const handleDelete = () => {
-    if (!profile) return;
-    deleteMutation.mutate({
-      slot_id: profile.slot_id,
-      extruder_id: profile.extruder_id,
-      nozzle_id: profile.nozzle_id,
-      nozzle_diameter: profile.nozzle_diameter,
-      filament_id: profile.filament_id,
-      setting_id: profile.setting_id,
-    });
-  };
- 
-  const handleSubmit = async (e: React.FormEvent) => {
-    e.preventDefault();
- 
-    // Validate at least one extruder is selected for dual-nozzle
-    if (isDualNozzle && !profile && selectedExtruders.length === 0) {
-      showToast('Please select at least one extruder', 'error');
-      return;
-    }
- 
-    // Format k_value to 6 decimal places for Bambu protocol
-    const formattedKValue = parseFloat(kValue).toFixed(6);
-    // Combine nozzle type and diameter into nozzle_id (e.g., "HH00-0.4")
-    const nozzleId = `${nozzleType}-${modalDiameter}`;
- 
-    // For editing or single extruder: just save one profile
-    if (profile || selectedExtruders.length === 1) {
-      const payload = {
-        name: name,
-        k_value: formattedKValue,
-        filament_id: filamentId,
-        nozzle_id: nozzleId,
-        nozzle_diameter: modalDiameter,
-        extruder_id: profile ? profile.extruder_id : selectedExtruders[0],
-        setting_id: profile?.setting_id,
-        slot_id: profile?.slot_id ?? 0,
-      };
-      console.log('[KProfile] Saving profile:', payload);
-      saveMutation.mutate(payload);
-      return;
-    }
- 
-    // For new profiles with multiple extruders: use batch endpoint
-    setIsSyncing(true);
-    setSavingProgress({ current: 1, total: selectedExtruders.length });
- 
-    // Build payload for all selected extruders
-    const batchPayload = selectedExtruders.map(extruderId => ({
-      name: name,
-      k_value: formattedKValue,
-      filament_id: filamentId,
-      nozzle_id: nozzleId,
-      nozzle_diameter: modalDiameter,
-      extruder_id: extruderId,
-      setting_id: undefined,
-      slot_id: 0,
-    }));
- 
-    console.log(`[KProfile] Saving ${batchPayload.length} profiles in batch:`, batchPayload);
- 
-    try {
-      await api.setKProfilesBatch(printerId, batchPayload);
-      showToast(`K-profile saved to ${selectedExtruders.length} extruders`);
-      // Save note for new batch profiles
-      if (onSaveNote && note) {
-        const profileKey = `name_${name}_${filamentId}`;
-        onSaveNote(profileKey, note);
-      }
-    } catch (error) {
-      console.error('[KProfile] Failed to save batch:', error);
-      showToast('Failed to save K-profiles', 'error');
-      setIsSyncing(false);
-      setSavingProgress({ current: 0, total: 0 });
-      return;
-    }
- 
-    setSavingProgress({ current: selectedExtruders.length, total: selectedExtruders.length });
-    // Wait for final sync before closing
-    // onSave will trigger refetch in the parent component
-    setTimeout(() => {
-      setIsSyncing(false);
-      setSavingProgress({ current: 0, total: 0 });
-      onSave();
-    }, 3000);
-  };
- 
-  return (
-    <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4">
-      <Card className="w-full max-w-md relative">
-        {/* Syncing overlay */}
-        {isSyncing && (
-          <div className="absolute inset-0 bg-bambu-dark-secondary/90 flex flex-col items-center justify-center z-10 rounded-lg">
-            <Loader2 className="w-8 h-8 text-bambu-green animate-spin mb-3" />
-            <p className="text-white font-medium">
-              {savingProgress.total > 1
-                ? `Saving to extruder ${savingProgress.current}/${savingProgress.total}...`
-                : 'Syncing with printer...'}
-            </p>
-            <p className="text-bambu-gray text-sm mt-1">Please wait</p>
-          </div>
-        )}
-        <CardContent className="p-0">
-          <div className="flex items-center justify-between p-4 border-b border-bambu-dark-tertiary">
-            <h2 className="text-xl font-semibold text-white">
-              {profile ? 'Edit K-Profile' : 'Add K-Profile'}
-            </h2>
-            <button
-              onClick={onClose}
-              className="text-bambu-gray hover:text-white transition-colors"
-              disabled={isSyncing}
-            >
-              <X className="w-5 h-5" />
-            </button>
-          </div>
- 
-          <form onSubmit={handleSubmit} className="p-4 space-y-4">
-            {/* Profile Name - read-only when editing */}
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">Profile Name</label>
-              <input
-                type="text"
-                value={name}
-                onChange={(e) => setName(e.target.value)}
-                disabled={!!profile}
-                className={`w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none ${profile ? 'opacity-60 cursor-not-allowed' : ''}`}
-                placeholder="My PLA Profile"
-                required={!profile}
-              />
-            </div>
- 
-            {/* K-Value - always editable */}
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">K-Value</label>
-              <input
-                type="text"
-                inputMode="decimal"
-                value={kValue}
-                onChange={(e) => {
-                  // Allow typing any decimal value
-                  const val = e.target.value;
-                  if (val === '' || /^\d*\.?\d*$/.test(val)) {
-                    setKValue(val);
-                  }
-                }}
-                onBlur={(e) => {
-                  // Format to 3 decimal places on blur
-                  const num = parseFloat(e.target.value);
-                  if (!isNaN(num)) {
-                    setKValue((Math.trunc(num * 1000) / 1000).toFixed(3));
-                  }
-                }}
-                className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none font-mono"
-                placeholder="0.020"
-                required
-              />
-              <p className="text-xs text-bambu-gray mt-1">
-                Typical range: 0.01 - 0.06 for PLA, 0.02 - 0.10 for PETG
-              </p>
-            </div>
- 
-            {/* Filament - read-only when editing */}
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">Filament</label>
-              <select
-                value={filamentId}
-                onChange={(e) => {
-                  const newFilamentId = e.target.value;
-                  setFilamentId(newFilamentId);
-                  // Auto-generate profile name when filament is selected (for new profiles)
-                  // Only auto-generate if name is empty - don't overwrite user input
-                  if (!profile && newFilamentId && !name) {
-                    const selectedFilament = knownFilaments.find(f => f.id === newFilamentId);
-                    if (selectedFilament) {
-                      const flowLabel = nozzleType === 'HH00' ? 'HF' : 'S';
-                      setName(`${flowLabel} ${selectedFilament.name}`);
-                    }
-                  }
-                }}
-                disabled={!!profile}
-                className={`w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none ${profile ? 'opacity-60 cursor-not-allowed' : ''}`}
-                required={!profile}
-              >
-                <option value="">Select filament...</option>
-                {/* Show current filament when editing - look up from knownFilaments */}
-                {profile?.filament_id && (
-                  <option key={profile.filament_id} value={profile.filament_id}>
-                    {knownFilaments.find(f => f.id === profile.filament_id)?.name || profile.filament_id}
-                  </option>
-                )}
-                {/* Show known filaments from existing K-profiles (for new profiles) */}
-                {!profile && knownFilaments.map((f) => (
-                  <option key={f.id} value={f.id}>
-                    {f.name}
-                  </option>
-                ))}
-              </select>
-              {!profile && knownFilaments.length === 0 && (
-                <p className="text-xs text-bambu-gray mt-1">
-                  No filaments found. Create a K-profile in Bambu Studio first.
-                </p>
-              )}
-            </div>
- 
-            {/* Flow Type and Nozzle Size - read-only when editing */}
-            <div className="grid grid-cols-2 gap-4">
-              <div>
-                <label className="block text-sm text-bambu-gray mb-1">Flow Type</label>
-                <select
-                  value={nozzleType}
-                  onChange={(e) => {
-                    const newNozzleType = e.target.value;
-                    setNozzleType(newNozzleType);
-                    // Update profile name when flow type changes (for new profiles)
-                    // Only auto-generate if name is empty - don't overwrite user input
-                    if (!profile && filamentId && !name) {
-                      const selectedFilament = knownFilaments.find(f => f.id === filamentId);
-                      if (selectedFilament) {
-                        const flowLabel = newNozzleType === 'HS00' ? 'HF' : 'S';
-                        setName(`${flowLabel} ${selectedFilament.name}`);
-                      }
-                    }
-                  }}
-                  disabled={!!profile}
-                  className={`w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none ${profile ? 'opacity-60 cursor-not-allowed' : ''}`}
-                >
-                  <option value="HH00">High Flow</option>
-                  <option value="HS00">Standard</option>
-                </select>
-              </div>
-              <div>
-                <label className="block text-sm text-bambu-gray mb-1">Nozzle Size</label>
-                <select
-                  value={modalDiameter}
-                  onChange={(e) => setModalDiameter(e.target.value)}
-                  disabled={!!profile}
-                  className={`w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none ${profile ? 'opacity-60 cursor-not-allowed' : ''}`}
-                >
-                  <option value="0.2">0.2mm</option>
-                  <option value="0.4">0.4mm</option>
-                  <option value="0.6">0.6mm</option>
-                  <option value="0.8">0.8mm</option>
-                </select>
-              </div>
-            </div>
- 
-            {/* Extruder - only show for dual-nozzle printers */}
-            {isDualNozzle && (
-              <div>
-                <label className="block text-sm text-bambu-gray mb-1">
-                  {profile ? 'Extruder' : 'Extruders'}
-                </label>
-                {profile ? (
-                  // Read-only display for editing
-                  <div className="px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white opacity-60">
-                    {profile.extruder_id === 1 ? 'Left' : 'Right'}
-                  </div>
-                ) : (
-                  // Checkboxes for new profile - can select both
-                  <div className="flex gap-4">
-                    <label className="flex items-center gap-2 cursor-pointer">
-                      <input
-                        type="checkbox"
-                        checked={selectedExtruders.includes(1)}
-                        onChange={(e) => {
-                          if (e.target.checked) {
-                            setSelectedExtruders([...selectedExtruders, 1]);
-                          } else {
-                            setSelectedExtruders(selectedExtruders.filter(id => id !== 1));
-                          }
-                        }}
-                        className="w-4 h-4 rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green focus:ring-offset-0 accent-bambu-green"
-                      />
-                      <span className="text-white">Left</span>
-                    </label>
-                    <label className="flex items-center gap-2 cursor-pointer">
-                      <input
-                        type="checkbox"
-                        checked={selectedExtruders.includes(0)}
-                        onChange={(e) => {
-                          if (e.target.checked) {
-                            setSelectedExtruders([...selectedExtruders, 0]);
-                          } else {
-                            setSelectedExtruders(selectedExtruders.filter(id => id !== 0));
-                          }
-                        }}
-                        className="w-4 h-4 rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green focus:ring-offset-0 accent-bambu-green"
-                      />
-                      <span className="text-white">Right</span>
-                    </label>
-                  </div>
-                )}
-              </div>
-            )}
- 
-            {/* Notes */}
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">Notes (stored locally)</label>
-              <textarea
-                value={note}
-                onChange={(e) => setNote(e.target.value)}
-                placeholder="Add notes about this profile..."
-                rows={2}
-                className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none resize-none"
-              />
-              <p className="text-xs text-bambu-gray mt-1">
-                Notes are saved in Bambuddy, not on the printer
-              </p>
-            </div>
- 
-            <div className="flex gap-2 pt-4">
-              {profile && (
-                <Button
-                  type="button"
-                  variant="secondary"
-                  onClick={() => setShowDeleteConfirm(true)}
-                  disabled={deleteMutation.isPending || isSyncing}
-                  className="text-red-500 hover:bg-red-500/10"
-                >
-                  {deleteMutation.isPending ? (
-                    <Loader2 className="w-4 h-4 animate-spin" />
-                  ) : (
-                    <Trash2 className="w-4 h-4" />
-                  )}
-                </Button>
-              )}
-              <Button
-                type="button"
-                variant="secondary"
-                onClick={onClose}
-                disabled={isSyncing}
-                className="flex-1"
-              >
-                Cancel
-              </Button>
-              <Button
-                type="submit"
-                disabled={saveMutation.isPending || isSyncing}
-                className="flex-1"
-              >
-                {saveMutation.isPending ? (
-                  <Loader2 className="w-4 h-4 animate-spin" />
-                ) : (
-                  <Gauge className="w-4 h-4" />
-                )}
-                Save
-              </Button>
-            </div>
-          </form>
-        </CardContent>
-      </Card>
- 
-      {/* Delete Confirmation Modal */}
-      {showDeleteConfirm && (
-        <div className="fixed inset-0 bg-black/70 flex items-center justify-center z-[60]">
-          <Card className="w-full max-w-sm">
-            <CardContent className="p-6">
-              <div className="flex items-center gap-3 mb-4">
-                <div className="w-10 h-10 rounded-full bg-red-500/20 flex items-center justify-center">
-                  <Trash2 className="w-5 h-5 text-red-500" />
-                </div>
-                <div>
-                  <h3 className="text-lg font-semibold text-white">Delete Profile</h3>
-                  <p className="text-sm text-bambu-gray">This cannot be undone</p>
-                </div>
-              </div>
-              <p className="text-bambu-gray mb-6">
-                Are you sure you want to delete <span className="text-white font-medium">"{profile?.name}"</span> from the printer?
-              </p>
-              <div className="flex gap-3">
-                <Button
-                  variant="secondary"
-                  onClick={() => setShowDeleteConfirm(false)}
-                  className="flex-1"
-                >
-                  Cancel
-                </Button>
-                <Button
-                  onClick={() => {
-                    setShowDeleteConfirm(false);
-                    handleDelete();
-                  }}
-                  disabled={deleteMutation.isPending}
-                  className="flex-1 bg-red-500 hover:bg-red-600 text-white"
-                >
-                  {deleteMutation.isPending ? (
-                    <Loader2 className="w-4 h-4 animate-spin" />
-                  ) : (
-                    <Trash2 className="w-4 h-4" />
-                  )}
-                  Delete
-                </Button>
-              </div>
-            </CardContent>
-          </Card>
-        </div>
-      )}
-    </div>
-  );
-}
- 
-type ExtruderFilter = 'all' | 'left' | 'right';
-type FlowTypeFilter = 'all' | 'hf' | 's';
-type SortOption = 'name' | 'k_value' | 'filament';
- 
-// localStorage keys
-const STORAGE_KEYS = {
-  NOZZLE_DIAMETER: 'bambusy_kprofiles_nozzle',
-  SORT_OPTION: 'bambusy_kprofiles_sort',
-};
- 
-export function KProfilesView() {
-  const { showToast } = useToast();
-  const [selectedPrinter, setSelectedPrinter] = useState<number | null>(null);
-  // Load nozzle diameter from localStorage
-  const [nozzleDiameter, setNozzleDiameter] = useState(() => {
-    const saved = localStorage.getItem(STORAGE_KEYS.NOZZLE_DIAMETER);
-    return saved || '0.4';
-  });
-  const [editingProfile, setEditingProfile] = useState<KProfile | null>(null);
-  const [showAddModal, setShowAddModal] = useState(false);
-  const [copyingProfile, setCopyingProfile] = useState<KProfile | null>(null);
-  const [searchQuery, setSearchQuery] = useState('');
-  const [extruderFilter, setExtruderFilter] = useState<ExtruderFilter>('all');
-  const [flowTypeFilter, setFlowTypeFilter] = useState<FlowTypeFilter>('all');
-  // Load sort option from localStorage
-  const [sortOption, setSortOption] = useState<SortOption>(() => {
-    const saved = localStorage.getItem(STORAGE_KEYS.SORT_OPTION);
-    return (saved as SortOption) || 'name';
-  });
-  // Bulk selection mode
-  // Use composite key: `${slot_id}_${extruder_id}` since slot_id alone is not unique across extruders
-  const [selectionMode, setSelectionMode] = useState(false);
-  const [selectedProfiles, setSelectedProfiles] = useState<Set<string>>(new Set());
-  const [showBulkDeleteConfirm, setShowBulkDeleteConfirm] = useState(false);
-  const [bulkDeleteInProgress, setBulkDeleteInProgress] = useState(false);
- 
-  // Helper to create unique profile key for selection
-  const getProfileKey = (profile: KProfile) => `${profile.slot_id}_${profile.extruder_id}`;
- 
-  // Save nozzle diameter to localStorage when it changes
-  useEffect(() => {
-    localStorage.setItem(STORAGE_KEYS.NOZZLE_DIAMETER, nozzleDiameter);
-  }, [nozzleDiameter]);
- 
-  // Save sort option to localStorage when it changes
-  useEffect(() => {
-    localStorage.setItem(STORAGE_KEYS.SORT_OPTION, sortOption);
-  }, [sortOption]);
- 
-  // Get available printers
-  const { data: printers, isLoading: printersLoading } = useQuery({
-    queryKey: ['printers'],
-    queryFn: api.getPrinters,
-  });
- 
-  // Get K-profiles for selected printer (filtered by nozzle diameter)
-  const {
-    data: kprofiles,
-    isLoading: kprofilesLoading,
-    isFetching,
-    error: kprofilesError,
-    refetch: refetchProfiles,
-  } = useQuery({
-    queryKey: ['kprofiles', selectedPrinter, nozzleDiameter],
-    queryFn: async () => {
-      console.log('[KProfiles] Fetching profiles for printer', selectedPrinter, 'nozzle', nozzleDiameter);
-      const result = await api.getKProfiles(selectedPrinter!, nozzleDiameter);
-      console.log('[KProfiles] Received profiles:', result?.profiles?.length || 0, 'profiles');
-      return result;
-    },
-    enabled: !!selectedPrinter,
-    retry: false,
-    staleTime: 0,  // Always consider data stale to ensure fresh fetch
-    gcTime: 0,  // Don't cache results
-    refetchOnMount: 'always',  // Always refetch when component mounts
-  });
- 
-  // Also fetch 0.4mm profiles for the filament dropdown (most filaments are calibrated for 0.4mm)
-  const { data: allProfiles } = useQuery({
-    queryKey: ['kprofiles', selectedPrinter, '0.4'],
-    queryFn: () => api.getKProfiles(selectedPrinter!, '0.4'),
-    enabled: !!selectedPrinter,
-    staleTime: 60000,  // Cache for 1 minute
-  });
- 
-  // Fetch K-profile notes (stored locally)
-  const {
-    data: notesData,
-    refetch: refetchNotes,
-  } = useQuery({
-    queryKey: ['kprofile-notes', selectedPrinter],
-    queryFn: () => api.getKProfileNotes(selectedPrinter!),
-    enabled: !!selectedPrinter,
-    staleTime: 30000,  // Cache for 30 seconds
-  });
- 
-  // Check if error is due to printer not being connected
-  const isOfflineError = kprofilesError?.message?.includes('not connected');
- 
-  // Auto-select first connected printer
-  useEffect(() => {
-    if (!selectedPrinter && printers && printers.length > 0) {
-      const activePrinter = printers.find((p) => p.is_active);
-      if (activePrinter) {
-        setSelectedPrinter(activePrinter.id);
-      }
-    }
-  }, [selectedPrinter, printers]);
- 
-  // Refetch profiles when printer selection changes
-  useEffect(() => {
-    if (selectedPrinter) {
-      // Delay refetch to ensure query is enabled after state update
-      const timer = setTimeout(() => {
-        refetchProfiles();
-      }, 150);
-      return () => clearTimeout(timer);
-    }
-  }, [selectedPrinter, nozzleDiameter]); // eslint-disable-line react-hooks/exhaustive-deps
- 
-  // Get connected printers for display
-  const connectedPrinters = printers?.filter((p) => p.is_active) || [];
- 
-  // Filter and sort profiles
-  // Note: nozzle diameter filtering is done server-side via MQTT request
-  const filteredProfiles = React.useMemo(() => {
-    if (!kprofiles?.profiles) return [];
- 
-    const filtered = kprofiles.profiles.filter((p) => {
-      // Search filter - match name or filament_id (case-insensitive)
-      const query = searchQuery.toLowerCase();
-      const matchesSearch =
-        !query ||
-        p.name.toLowerCase().includes(query) ||
-        p.filament_id.toLowerCase().includes(query);
- 
-      // Extruder filter
-      const matchesExtruder =
-        extruderFilter === 'all' ||
-        (extruderFilter === 'left' && p.extruder_id === 1) ||
-        (extruderFilter === 'right' && p.extruder_id === 0);
- 
-      // Flow type filter (HH = High Flow, HS = Standard)
-      const matchesFlowType =
-        flowTypeFilter === 'all' ||
-        (flowTypeFilter === 'hf' && p.nozzle_id.startsWith('HH')) ||
-        (flowTypeFilter === 's' && p.nozzle_id.startsWith('HS'));
- 
-      return matchesSearch && matchesExtruder && matchesFlowType;
-    });
- 
-    // Sort profiles
-    return filtered.sort((a, b) => {
-      switch (sortOption) {
-        case 'k_value':
-          return parseFloat(a.k_value) - parseFloat(b.k_value);
-        case 'filament':
-          return extractFilamentName(a.name).localeCompare(extractFilamentName(b.name));
-        case 'name':
-        default:
-          return a.name.localeCompare(b.name);
-      }
-    });
-  }, [kprofiles?.profiles, searchQuery, extruderFilter, flowTypeFilter, sortOption]);
- 
-  // Check if selected printer is dual-nozzle (auto-detected from MQTT temperature data)
-  const selectedPrinterData = printers?.find((p) => p.id === selectedPrinter);
-  const isDualNozzle = selectedPrinterData?.nozzle_count === 2;
- 
-  // Keyboard shortcuts
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      // Don't trigger shortcuts when typing in input fields
-      if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement || e.target instanceof HTMLSelectElement) {
-        return;
-      }
-      // Don't trigger when modal is open
-      if (editingProfile || showAddModal || copyingProfile) {
-        return;
-      }
- 
-      if (e.key === 'r' || e.key === 'R') {
-        e.preventDefault();
-        refetchProfiles();
-      } else if (e.key === 'n' || e.key === 'N') {
-        e.preventDefault();
-        setShowAddModal(true);
-      } else if (e.key === 'Escape' && selectionMode) {
-        e.preventDefault();
-        setSelectionMode(false);
-        setSelectedProfiles(new Set());
-      }
-    };
- 
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [editingProfile, showAddModal, copyingProfile, selectionMode, refetchProfiles]);
- 
-  // Export profiles to JSON file
-  const handleExport = useCallback(() => {
-    if (!kprofiles?.profiles || kprofiles.profiles.length === 0) {
-      showToast('No profiles to export', 'error');
-      return;
-    }
- 
-    const exportData = {
-      version: 1,
-      exported_at: new Date().toISOString(),
-      printer: selectedPrinterData?.name || 'Unknown',
-      nozzle_diameter: nozzleDiameter,
-      profiles: kprofiles.profiles.map(p => ({
-        name: p.name,
-        k_value: p.k_value,
-        filament_id: p.filament_id,
-        nozzle_id: p.nozzle_id,
-        nozzle_diameter: p.nozzle_diameter,
-        extruder_id: p.extruder_id,
-      })),
-    };
- 
-    const blob = new Blob([JSON.stringify(exportData, null, 2)], { type: 'application/json' });
-    const url = URL.createObjectURL(blob);
-    const a = document.createElement('a');
-    a.href = url;
-    a.download = `kprofiles_${selectedPrinterData?.name || 'printer'}_${nozzleDiameter}mm_${new Date().toISOString().split('T')[0]}.json`;
-    document.body.appendChild(a);
-    a.click();
-    document.body.removeChild(a);
-    URL.revokeObjectURL(url);
-    showToast(`Exported ${kprofiles.profiles.length} profiles`);
-  }, [kprofiles?.profiles, selectedPrinterData, nozzleDiameter, showToast]);
- 
-  // Import profiles from JSON file
-  const handleImport = useCallback(() => {
-    const input = document.createElement('input');
-    input.type = 'file';
-    input.accept = '.json';
-    input.onchange = async (e) => {
-      const file = (e.target as HTMLInputElement).files?.[0];
-      if (!file) return;
- 
-      try {
-        const text = await file.text();
-        const data = JSON.parse(text);
- 
-        if (!data.profiles || !Array.isArray(data.profiles)) {
-          showToast('Invalid file format', 'error');
-          return;
-        }
- 
-        // Import profiles one by one
-        let imported = 0;
-        for (const p of data.profiles) {
-          if (!p.name || !p.k_value || !p.filament_id) continue;
- 
-          try {
-            await api.setKProfile(selectedPrinter!, {
-              name: p.name,
-              k_value: parseFloat(p.k_value).toFixed(6),
-              filament_id: p.filament_id,
-              nozzle_id: p.nozzle_id || `HH00-${nozzleDiameter}`,
-              nozzle_diameter: p.nozzle_diameter || nozzleDiameter,
-              extruder_id: p.extruder_id ?? 0,
-              slot_id: 0, // Always create new
-            });
-            imported++;
-            // Small delay between imports
-            await new Promise(resolve => setTimeout(resolve, 500));
-          } catch (err) {
-            console.error('Failed to import profile:', p.name, err);
-          }
-        }
- 
-        showToast(`Imported ${imported} of ${data.profiles.length} profiles`);
-        refetchProfiles();
-      } catch (err) {
-        console.error('Import error:', err);
-        showToast('Failed to parse import file', 'error');
-      }
-    };
-    input.click();
-  }, [selectedPrinter, nozzleDiameter, showToast, refetchProfiles]);
- 
-  // Toggle profile selection using composite key
-  const toggleProfileSelection = useCallback((profileKey: string) => {
-    setSelectedProfiles(prev => {
-      const next = new Set(prev);
-      if (next.has(profileKey)) {
-        next.delete(profileKey);
-      } else {
-        next.add(profileKey);
-      }
-      return next;
-    });
-  }, []);
- 
-  // Select all visible profiles
-  const selectAllProfiles = useCallback(() => {
-    setSelectedProfiles(new Set(filteredProfiles.map(p => getProfileKey(p))));
-  }, [filteredProfiles, getProfileKey]);
- 
-  // Delete selected profiles
-  const handleBulkDelete = useCallback(() => {
-    if (selectedProfiles.size === 0) return;
-    setShowBulkDeleteConfirm(true);
-  }, [selectedProfiles.size]);
- 
-  // Execute the actual bulk delete
-  const executeBulkDelete = useCallback(async () => {
-    const profilesToDelete = filteredProfiles.filter(p => selectedProfiles.has(getProfileKey(p)));
-    setBulkDeleteInProgress(true);
- 
-    let deleted = 0;
-    for (const profile of profilesToDelete) {
-      try {
-        await api.deleteKProfile(selectedPrinter!, {
-          slot_id: profile.slot_id,
-          extruder_id: profile.extruder_id,
-          nozzle_id: profile.nozzle_id,
-          nozzle_diameter: profile.nozzle_diameter,
-          filament_id: profile.filament_id,
-          setting_id: profile.setting_id,
-        });
-        deleted++;
-        // Small delay between deletes
-        await new Promise(resolve => setTimeout(resolve, 300));
-      } catch (err) {
-        console.error('Failed to delete profile:', profile.name, err);
-      }
-    }
- 
-    showToast(`Deleted ${deleted} profiles`);
-    setBulkDeleteInProgress(false);
-    setShowBulkDeleteConfirm(false);
-    setSelectionMode(false);
-    setSelectedProfiles(new Set());
-    refetchProfiles();
-  }, [selectedPrinter, selectedProfiles, filteredProfiles, showToast, refetchProfiles, getProfileKey]);
- 
-  // Generate possible keys for a profile (for notes lookup)
-  // Returns array of keys to check: setting_id, slot-based, name-based
-  const getProfileKeys = useCallback((profile: KProfile): string[] => {
-    const keys: string[] = [];
-    if (profile.setting_id) {
-      keys.push(profile.setting_id);
-    }
-    // Slot-based key (for profiles without setting_id)
-    keys.push(`slot_${profile.slot_id}_${profile.filament_id}_${profile.extruder_id}`);
-    // Name-based key (for newly created profiles)
-    keys.push(`name_${profile.name}_${profile.filament_id}`);
-    return keys;
-  }, []);
- 
-  // Save note for a profile
-  const handleSaveNote = useCallback(async (profileKey: string, noteText: string) => {
-    if (!selectedPrinter) return;
-    try {
-      await api.setKProfileNote(selectedPrinter, profileKey, noteText);
-      refetchNotes();
-    } catch (err) {
-      console.error('Failed to save note:', err);
-      showToast('Failed to save note', 'error');
-    }
-  }, [selectedPrinter, refetchNotes, showToast]);
- 
-  // Get note for a profile (checks all possible keys)
-  // Returns { note, key } so we know which key the note was stored under
-  const getNoteWithKey = useCallback((profile: KProfile): { note: string; key: string | null } => {
-    if (!notesData?.notes) return { note: '', key: null };
-    const keys = getProfileKeys(profile);
-    for (const key of keys) {
-      if (notesData.notes[key]) {
-        return { note: notesData.notes[key], key };
-      }
-    }
-    return { note: '', key: null };
-  }, [notesData, getProfileKeys]);
- 
-  // Simple getter for display purposes
-  const getNote = useCallback((profile: KProfile) => {
-    return getNoteWithKey(profile).note;
-  }, [getNoteWithKey]);
- 
-  if (printersLoading) {
-    return (
-      <div className="flex justify-center py-12">
-        <Loader2 className="w-8 h-8 text-bambu-green animate-spin" />
-      </div>
-    );
-  }
- 
-  if (!printers || printers.length === 0) {
-    return (
-      <Card>
-        <CardContent className="py-12 text-center">
-          <AlertCircle className="w-12 h-12 text-bambu-gray mx-auto mb-4" />
-          <h3 className="text-lg font-semibold text-white mb-2">No Printers Configured</h3>
-          <p className="text-bambu-gray">
-            Add a printer in Settings to manage K-profiles
-          </p>
-        </CardContent>
-      </Card>
-    );
-  }
- 
-  if (connectedPrinters.length === 0) {
-    return (
-      <Card>
-        <CardContent className="py-12 text-center">
-          <Printer className="w-12 h-12 text-bambu-gray mx-auto mb-4" />
-          <h3 className="text-lg font-semibold text-white mb-2">No Active Printers</h3>
-          <p className="text-bambu-gray">
-            Enable a printer connection to view its K-profiles
-          </p>
-        </CardContent>
-      </Card>
-    );
-  }
- 
-  return (
-    <>
-      {/* Loading overlay when refetching profiles (not initial load) */}
-      {isFetching && !kprofilesLoading && (
-        <div className="fixed inset-0 bg-black/50 flex flex-col items-center justify-center z-40">
-          <Loader2 className="w-10 h-10 text-bambu-green animate-spin mb-3" />
-          <p className="text-white font-medium">Loading K-Profiles...</p>
-        </div>
-      )}
- 
-      {/* Printer & Nozzle Selector */}
-      <div className="flex flex-wrap gap-4 mb-6">
-        <div className="flex-1 min-w-48">
-          <label className="block text-sm text-bambu-gray mb-1">Printer</label>
-          <select
-            value={selectedPrinter || ''}
-            onChange={(e) => setSelectedPrinter(parseInt(e.target.value))}
-            className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-          >
-            {connectedPrinters.map((printer) => (
-              <option key={printer.id} value={printer.id}>
-                {printer.name}
-              </option>
-            ))}
-          </select>
-        </div>
- 
-        <div className="w-32">
-          <label className="block text-sm text-bambu-gray mb-1">Nozzle</label>
-          <select
-            value={nozzleDiameter}
-            onChange={(e) => setNozzleDiameter(e.target.value)}
-            className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-          >
-            <option value="0.2">0.2mm</option>
-            <option value="0.4">0.4mm</option>
-            <option value="0.6">0.6mm</option>
-            <option value="0.8">0.8mm</option>
-          </select>
-        </div>
- 
-        <div className="flex items-end gap-2">
-          <Button
-            variant="secondary"
-            onClick={() => refetchProfiles()}
-            disabled={isFetching}
-          >
-            <RefreshCw className={`w-4 h-4 ${isFetching ? 'animate-spin' : ''}`} />
-            Refresh
-          </Button>
-          <Button onClick={() => setShowAddModal(true)}>
-            <Plus className="w-4 h-4" />
-            Add Profile
-          </Button>
-        </div>
-      </div>
- 
-      {/* Search & Filter Row */}
-      <div className="flex flex-wrap gap-4 mb-4">
-        <div className="flex-1 min-w-48 relative">
-          <Search className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray" />
-          <input
-            type="text"
-            value={searchQuery}
-            onChange={(e) => setSearchQuery(e.target.value)}
-            placeholder="Search by name or filament..."
-            className="w-full pl-10 pr-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"
-          />
-        </div>
-        {isDualNozzle && (
-          <div className="w-36">
-            <select
-              value={extruderFilter}
-              onChange={(e) => setExtruderFilter(e.target.value as ExtruderFilter)}
-              className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-            >
-              <option value="all">All Extruders</option>
-              <option value="left">Left Only</option>
-              <option value="right">Right Only</option>
-            </select>
-          </div>
-        )}
-        <div className="w-32">
-          <select
-            value={flowTypeFilter}
-            onChange={(e) => setFlowTypeFilter(e.target.value as FlowTypeFilter)}
-            className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-          >
-            <option value="all">All Flow</option>
-            <option value="hf">HF Only</option>
-            <option value="s">S Only</option>
-          </select>
-        </div>
-        <div className="w-32">
-          <select
-            value={sortOption}
-            onChange={(e) => setSortOption(e.target.value as SortOption)}
-            className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-          >
-            <option value="name">Sort: Name</option>
-            <option value="k_value">Sort: K-Value</option>
-            <option value="filament">Sort: Filament</option>
-          </select>
-        </div>
-      </div>
- 
-      {/* Toolbar Row */}
-      <div className="flex flex-wrap gap-2 mb-6">
-        <Button
-          variant="secondary"
-          onClick={handleExport}
-          disabled={!kprofiles?.profiles?.length}
-          title="Export profiles to JSON"
-        >
-          <Download className="w-4 h-4" />
-          Export
-        </Button>
-        <Button
-          variant="secondary"
-          onClick={handleImport}
-          title="Import profiles from JSON"
-        >
-          <Upload className="w-4 h-4" />
-          Import
-        </Button>
-        <div className="flex-1" />
-        {selectionMode ? (
-          <>
-            <Button
-              variant="secondary"
-              onClick={selectAllProfiles}
-              title="Select all visible profiles"
-            >
-              <CheckSquare className="w-4 h-4" />
-              Select All
-            </Button>
-            <Button
-              variant="secondary"
-              onClick={handleBulkDelete}
-              disabled={selectedProfiles.size === 0}
-              className="text-red-500 hover:bg-red-500/10"
-              title={`Delete ${selectedProfiles.size} selected profiles`}
-            >
-              <Trash2 className="w-4 h-4" />
-              Delete ({selectedProfiles.size})
-            </Button>
-            <Button
-              variant="secondary"
-              onClick={() => {
-                setSelectionMode(false);
-                setSelectedProfiles(new Set());
-              }}
-            >
-              <X className="w-4 h-4" />
-              Cancel
-            </Button>
-          </>
-        ) : (
-          <Button
-            variant="secondary"
-            onClick={() => setSelectionMode(true)}
-            disabled={!filteredProfiles.length}
-            title="Enter selection mode for bulk delete"
-          >
-            <CheckSquare className="w-4 h-4" />
-            Select
-          </Button>
-        )}
-      </div>
- 
-      {/* K-Profiles Grid */}
-      {kprofilesLoading ? (
-        <div className="flex justify-center py-12">
-          <Loader2 className="w-8 h-8 text-bambu-green animate-spin" />
-        </div>
-      ) : isOfflineError ? (
-        <Card>
-          <CardContent className="py-12 text-center">
-            <WifiOff className="w-12 h-12 text-bambu-gray mx-auto mb-4" />
-            <h3 className="text-lg font-semibold text-white mb-2">Printer Offline</h3>
-            <p className="text-bambu-gray mb-4">
-              The selected printer is not connected. Power it on to view K-profiles.
-            </p>
-            <Button variant="secondary" onClick={() => refetchProfiles()}>
-              <RefreshCw className="w-4 h-4" />
-              Retry
-            </Button>
-          </CardContent>
-        </Card>
-      ) : filteredProfiles.length > 0 ? (
-        isDualNozzle ? (
-          // Dual-nozzle: show Left/Right columns
-          <div className="grid grid-cols-2 gap-4">
-            {/* Left Extruder (extruder_id 1 on Bambu) */}
-            <div>
-              <h3 className="text-sm font-medium text-bambu-gray mb-2 px-1">Left Extruder</h3>
-              <div className="space-y-1">
-                {filteredProfiles
-                  .filter((p) => p.extruder_id === 1)
-                  .map((profile) => (
-                    <KProfileCard
-                      key={getProfileKey(profile)}
-                      profile={profile}
-                      onEdit={() => setEditingProfile(profile)}
-                      onCopy={() => setCopyingProfile(profile)}
-                      selectionMode={selectionMode}
-                      isSelected={selectedProfiles.has(getProfileKey(profile))}
-                      onToggleSelect={() => toggleProfileSelection(getProfileKey(profile))}
-                      note={getNote(profile)}
-                    />
-                  ))}
-              </div>
-            </div>
-            {/* Right Extruder (extruder_id 0 on Bambu) */}
-            <div>
-              <h3 className="text-sm font-medium text-bambu-gray mb-2 px-1">Right Extruder</h3>
-              <div className="space-y-1">
-                {filteredProfiles
-                  .filter((p) => p.extruder_id === 0)
-                  .map((profile) => (
-                    <KProfileCard
-                      key={getProfileKey(profile)}
-                      profile={profile}
-                      onEdit={() => setEditingProfile(profile)}
-                      onCopy={() => setCopyingProfile(profile)}
-                      selectionMode={selectionMode}
-                      isSelected={selectedProfiles.has(getProfileKey(profile))}
-                      onToggleSelect={() => toggleProfileSelection(getProfileKey(profile))}
-                      note={getNote(profile)}
-                    />
-                  ))}
-              </div>
-            </div>
-          </div>
-        ) : (
-          // Single-nozzle: show all profiles in one list
-          <div className="space-y-1">
-            {filteredProfiles.map((profile) => (
-              <KProfileCard
-                key={getProfileKey(profile)}
-                profile={profile}
-                onEdit={() => setEditingProfile(profile)}
-                onCopy={() => setCopyingProfile(profile)}
-                selectionMode={selectionMode}
-                isSelected={selectedProfiles.has(getProfileKey(profile))}
-                onToggleSelect={() => toggleProfileSelection(getProfileKey(profile))}
-                note={getNote(profile)}
-              />
-            ))}
-          </div>
-        )
-      ) : searchQuery || extruderFilter !== 'all' || flowTypeFilter !== 'all' ? (
-        <Card>
-          <CardContent className="py-12 text-center">
-            <Search className="w-12 h-12 text-bambu-gray mx-auto mb-4" />
-            <h3 className="text-lg font-semibold text-white mb-2">No Matching Profiles</h3>
-            <p className="text-bambu-gray">
-              No profiles match your search criteria
-            </p>
-          </CardContent>
-        </Card>
-      ) : (
-        <Card>
-          <CardContent className="py-12 text-center">
-            <Gauge className="w-12 h-12 text-bambu-gray mx-auto mb-4" />
-            <h3 className="text-lg font-semibold text-white mb-2">No K-Profiles</h3>
-            <p className="text-bambu-gray mb-4">
-              No pressure advance profiles found for {nozzleDiameter}mm nozzle
-            </p>
-            <Button onClick={() => setShowAddModal(true)}>
-              <Plus className="w-4 h-4" />
-              Create First Profile
-            </Button>
-          </CardContent>
-        </Card>
-      )}
- 
-      {/* Edit Modal */}
-      {editingProfile && selectedPrinter && (() => {
-        const { note, key } = getNoteWithKey(editingProfile);
-        return (
-          <KProfileModal
-            profile={editingProfile}
-            printerId={selectedPrinter}
-            nozzleDiameter={nozzleDiameter}
-            existingProfiles={allProfiles?.profiles || kprofiles?.profiles}
-            isDualNozzle={isDualNozzle}
-            initialNote={note}
-            initialNoteKey={key}
-            onSaveNote={handleSaveNote}
-            onClose={() => {
-              console.log('[KProfiles] Edit modal onClose - refetching profiles...');
-              setEditingProfile(null);
-              refetchProfiles();  // Refetch after close (handles delete case)
-            }}
-            onSave={() => {
-              setEditingProfile(null);
-              refetchProfiles();
-            }}
-          />
-        );
-      })()}
- 
-      {/* Add Modal */}
-      {showAddModal && selectedPrinter && (
-        <KProfileModal
-          printerId={selectedPrinter}
-          nozzleDiameter={nozzleDiameter}
-          existingProfiles={allProfiles?.profiles || kprofiles?.profiles}
-          isDualNozzle={isDualNozzle}
-          onSaveNote={handleSaveNote}
-          onClose={() => {
-            setShowAddModal(false);
-            refetchProfiles();  // Refetch after close
-          }}
-          onSave={() => {
-            setShowAddModal(false);
-            refetchProfiles();
-          }}
-        />
-      )}
- 
-      {/* Copy Modal - opens add modal with prefilled values from source profile */}
-      {copyingProfile && selectedPrinter && (
-        <KProfileModal
-          printerId={selectedPrinter}
-          nozzleDiameter={nozzleDiameter}
-          existingProfiles={allProfiles?.profiles || kprofiles?.profiles}
-          isDualNozzle={isDualNozzle}
-          onSaveNote={handleSaveNote}
-          // Pass profile data but without slot_id to create a new profile
-          profile={{
-            ...copyingProfile,
-            slot_id: 0,  // Force new profile creation
-            name: `${copyingProfile.name} (Copy)`,  // Indicate it's a copy
-          }}
-          onClose={() => {
-            setCopyingProfile(null);
-            refetchProfiles();
-          }}
-          onSave={() => {
-            setCopyingProfile(null);
-            refetchProfiles();
-          }}
-        />
-      )}
- 
-      {/* Bulk Delete Confirmation Modal */}
-      {showBulkDeleteConfirm && (
-        <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4">
-          <Card className="w-full max-w-sm">
-            <CardContent className="p-6">
-              <div className="flex items-center gap-3 mb-4">
-                <div className="w-10 h-10 rounded-full bg-red-500/20 flex items-center justify-center">
-                  <Trash2 className="w-5 h-5 text-red-500" />
-                </div>
-                <div>
-                  <h3 className="text-lg font-semibold text-white">Delete Profiles</h3>
-                  <p className="text-sm text-bambu-gray">This cannot be undone</p>
-                </div>
-              </div>
-              <p className="text-bambu-gray mb-6">
-                Are you sure you want to delete <span className="text-white font-medium">{selectedProfiles.size}</span> selected profiles from the printer?
-              </p>
-              <div className="flex gap-3">
-                <Button
-                  variant="secondary"
-                  onClick={() => setShowBulkDeleteConfirm(false)}
-                  disabled={bulkDeleteInProgress}
-                  className="flex-1"
-                >
-                  Cancel
-                </Button>
-                <Button
-                  onClick={executeBulkDelete}
-                  disabled={bulkDeleteInProgress}
-                  className="flex-1 bg-red-500 hover:bg-red-600 text-white"
-                >
-                  {bulkDeleteInProgress ? (
-                    <Loader2 className="w-4 h-4 animate-spin" />
-                  ) : (
-                    <Trash2 className="w-4 h-4" />
-                  )}
-                  Delete
-                </Button>
-              </div>
-            </CardContent>
-          </Card>
-        </div>
-      )}
-    </>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/KeyboardShortcutsModal.tsx.html b/frontend/coverage/src/components/KeyboardShortcutsModal.tsx.html deleted file mode 100644 index d2d590352..000000000 --- a/frontend/coverage/src/components/KeyboardShortcutsModal.tsx.html +++ /dev/null @@ -1,526 +0,0 @@ - - - - - - Code coverage report for src/components/KeyboardShortcutsModal.tsx - - - - - - - - - -
-
-

All files / src/components KeyboardShortcutsModal.tsx

-
- -
- 0% - Statements - 0/109 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/109 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useEffect } from 'react';
-import { X, Keyboard, ExternalLink } from 'lucide-react';
-import { useTranslation } from 'react-i18next';
-import { Card, CardContent } from './Card';
- 
-interface NavItem {
-  id: string;
-  to: string;
-  labelKey: string;
-}
- 
-interface SidebarItem {
-  type: 'nav' | 'external';
-  label: string;
-  labelKey?: string;
-}
- 
-interface KeyboardShortcutsModalProps {
-  onClose: () => void;
-  navItems?: NavItem[];
-  sidebarItems?: SidebarItem[];
-}
- 
-function getShortcuts(
-  sidebarItems: SidebarItem[] | undefined,
-  navItems: NavItem[] | undefined,
-  t: (key: string) => string
-) {
-  // Use sidebarItems if provided (new format), otherwise fall back to navItems
-  const navShortcuts = sidebarItems
-    ? sidebarItems.slice(0, 9).map((item, index) => ({
-        keys: [String(index + 1)],
-        description: item.type === 'external'
-          ? `Open ${item.label}`
-          : `Go to ${item.labelKey ? t(item.labelKey) : item.label}`,
-        isExternal: item.type === 'external',
-      }))
-    : navItems
-    ? navItems.map((item, index) => ({
-        keys: [String(index + 1)],
-        description: `Go to ${t(item.labelKey)}`,
-        isExternal: false,
-      }))
-    : [
-        { keys: ['1'], description: 'Go to Printers', isExternal: false },
-        { keys: ['2'], description: 'Go to Archives', isExternal: false },
-        { keys: ['3'], description: 'Go to Queue', isExternal: false },
-        { keys: ['4'], description: 'Go to Statistics', isExternal: false },
-        { keys: ['5'], description: 'Go to Cloud Profiles', isExternal: false },
-        { keys: ['6'], description: 'Go to Settings', isExternal: false },
-      ];
- 
-  return [
-    { category: 'Navigation', items: navShortcuts },
-    { category: 'Archives', items: [
-      { keys: ['/'], description: 'Focus search', isExternal: false },
-      { keys: ['U'], description: 'Open upload modal', isExternal: false },
-      { keys: ['Esc'], description: 'Clear selection / blur input', isExternal: false },
-      { keys: ['Right-click'], description: 'Context menu on cards', isExternal: false },
-    ]},
-    { category: 'K-Profiles', items: [
-      { keys: ['R'], description: 'Refresh profiles', isExternal: false },
-      { keys: ['N'], description: 'New profile', isExternal: false },
-      { keys: ['Esc'], description: 'Exit selection mode', isExternal: false },
-    ]},
-    { category: 'General', items: [
-      { keys: ['?'], description: 'Show this help', isExternal: false },
-    ]},
-  ];
-}
- 
-function KeyBadge({ children }: { children: string }) {
-  return (
-    <kbd className="px-2 py-1 text-xs font-mono bg-bambu-dark border border-bambu-dark-tertiary rounded text-white">
-      {children}
-    </kbd>
-  );
-}
- 
-export function KeyboardShortcutsModal({ onClose, navItems, sidebarItems }: KeyboardShortcutsModalProps) {
-  const { t } = useTranslation();
-  const shortcuts = getShortcuts(sidebarItems, navItems, t);
- 
-  // Close on Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onClose();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose]);
- 
-  return (
-    <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4" onClick={onClose}>
-      <Card className="w-full max-w-md" onClick={(e) => e.stopPropagation()}>
-        <CardContent className="p-0">
-          {/* Header */}
-          <div className="flex items-center justify-between p-4 border-b border-bambu-dark-tertiary">
-            <div className="flex items-center gap-2">
-              <Keyboard className="w-5 h-5 text-bambu-green" />
-              <h2 className="text-xl font-semibold text-white">Keyboard Shortcuts</h2>
-            </div>
-            <button
-              onClick={onClose}
-              className="text-bambu-gray hover:text-white transition-colors"
-            >
-              <X className="w-5 h-5" />
-            </button>
-          </div>
- 
-          {/* Shortcuts List */}
-          <div className="p-4 space-y-6 max-h-[60vh] overflow-y-auto">
-            {shortcuts.map((section) => (
-              <div key={section.category}>
-                <h3 className="text-sm font-medium text-bambu-gray mb-3">{section.category}</h3>
-                <div className="space-y-2">
-                  {section.items.map((shortcut) => (
-                    <div key={shortcut.description} className="flex items-center justify-between">
-                      <span className="text-white text-sm flex items-center gap-1.5">
-                        {shortcut.description}
-                        {shortcut.isExternal && (
-                          <ExternalLink className="w-3 h-3 text-bambu-gray" />
-                        )}
-                      </span>
-                      <div className="flex gap-1">
-                        {shortcut.keys.map((key) => (
-                          <KeyBadge key={key}>{key}</KeyBadge>
-                        ))}
-                      </div>
-                    </div>
-                  ))}
-                </div>
-              </div>
-            ))}
-          </div>
- 
-          {/* Footer */}
-          <div className="p-4 border-t border-bambu-dark-tertiary">
-            <p className="text-xs text-bambu-gray text-center">
-              Press <KeyBadge>Esc</KeyBadge> or click outside to close
-            </p>
-          </div>
-        </CardContent>
-      </Card>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/Layout.tsx.html b/frontend/coverage/src/components/Layout.tsx.html deleted file mode 100644 index bd69a7786..000000000 --- a/frontend/coverage/src/components/Layout.tsx.html +++ /dev/null @@ -1,1810 +0,0 @@ - - - - - - Code coverage report for src/components/Layout.tsx - - - - - - - - - -
-
-

All files / src/components Layout.tsx

-
- -
- 0% - Statements - 0/439 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/439 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -425 -426 -427 -428 -429 -430 -431 -432 -433 -434 -435 -436 -437 -438 -439 -440 -441 -442 -443 -444 -445 -446 -447 -448 -449 -450 -451 -452 -453 -454 -455 -456 -457 -458 -459 -460 -461 -462 -463 -464 -465 -466 -467 -468 -469 -470 -471 -472 -473 -474 -475 -476 -477 -478 -479 -480 -481 -482 -483 -484 -485 -486 -487 -488 -489 -490 -491 -492 -493 -494 -495 -496 -497 -498 -499 -500 -501 -502 -503 -504 -505 -506 -507 -508 -509 -510 -511 -512 -513 -514 -515 -516 -517 -518 -519 -520 -521 -522 -523 -524 -525 -526 -527 -528 -529 -530 -531 -532 -533 -534 -535 -536 -537 -538 -539 -540 -541 -542 -543 -544 -545 -546 -547 -548 -549 -550 -551 -552 -553 -554 -555 -556 -557 -558 -559 -560 -561 -562 -563 -564 -565 -566 -567 -568 -569 -570 -571 -572 -573 -574 -575 -576  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useEffect, useCallback, useRef } from 'react';
-import { NavLink, Outlet, useNavigate, useLocation } from 'react-router-dom';
-import { Printer, Archive, Calendar, BarChart3, Cloud, Settings, Sun, Moon, ChevronLeft, ChevronRight, Keyboard, Github, GripVertical, ArrowUpCircle, Wrench, FolderKanban, X, Menu, type LucideIcon } from 'lucide-react';
-import { useTranslation } from 'react-i18next';
-import { useTheme } from '../contexts/ThemeContext';
-import { KeyboardShortcutsModal } from './KeyboardShortcutsModal';
-import { useQuery } from '@tanstack/react-query';
-import { api } from '../api/client';
-import { getIconByName } from './IconPicker';
-import { useIsMobile } from '../hooks/useIsMobile';
- 
-interface NavItem {
-  id: string;
-  to: string;
-  icon: LucideIcon;
-  labelKey: string; // Translation key
-}
- 
-export const defaultNavItems: NavItem[] = [
-  { id: 'printers', to: '/', icon: Printer, labelKey: 'nav.printers' },
-  { id: 'archives', to: '/archives', icon: Archive, labelKey: 'nav.archives' },
-  { id: 'queue', to: '/queue', icon: Calendar, labelKey: 'nav.queue' },
-  { id: 'stats', to: '/stats', icon: BarChart3, labelKey: 'nav.stats' },
-  { id: 'profiles', to: '/profiles', icon: Cloud, labelKey: 'nav.profiles' },
-  { id: 'maintenance', to: '/maintenance', icon: Wrench, labelKey: 'nav.maintenance' },
-  { id: 'projects', to: '/projects', icon: FolderKanban, labelKey: 'nav.projects' },
-  { id: 'settings', to: '/settings', icon: Settings, labelKey: 'nav.settings' },
-];
- 
-// Get unified sidebar order from localStorage
-function getSidebarOrder(): string[] {
-  const stored = localStorage.getItem('sidebarOrder');
-  if (stored) {
-    try {
-      return JSON.parse(stored);
-    } catch {
-      return defaultNavItems.map(i => i.id);
-    }
-  }
-  return defaultNavItems.map(i => i.id);
-}
- 
-// Save unified sidebar order to localStorage
-function saveSidebarOrder(order: string[]) {
-  localStorage.setItem('sidebarOrder', JSON.stringify(order));
-}
- 
-// Check if an ID is an external link
-function isExternalLinkId(id: string): boolean {
-  return id.startsWith('ext-');
-}
- 
-// Get default view from localStorage
-export function getDefaultView(): string {
-  return localStorage.getItem('defaultView') || '/';
-}
- 
-// Save default view to localStorage
-export function setDefaultView(path: string) {
-  localStorage.setItem('defaultView', path);
-}
- 
-export function Layout() {
-  const navigate = useNavigate();
-  const location = useLocation();
-  const { theme, toggleTheme } = useTheme();
-  const { t } = useTranslation();
-  const isMobile = useIsMobile();
-  const [sidebarExpanded, setSidebarExpanded] = useState(() => {
-    const stored = localStorage.getItem('sidebarExpanded');
-    return stored !== 'false';
-  });
-  const [mobileDrawerOpen, setMobileDrawerOpen] = useState(false);
-  const [showShortcuts, setShowShortcuts] = useState(false);
-  const [sidebarOrder, setSidebarOrder] = useState<string[]>(getSidebarOrder);
-  const [draggedId, setDraggedId] = useState<string | null>(null);
-  const [dragOverId, setDragOverId] = useState<string | null>(null);
-  const hasRedirected = useRef(false);
-  const [dismissedUpdateVersion, setDismissedUpdateVersion] = useState<string | null>(() =>
-    sessionStorage.getItem('dismissedUpdateVersion')
-  );
- 
-  // Check for updates
-  const { data: versionInfo } = useQuery({
-    queryKey: ['version'],
-    queryFn: api.getVersion,
-    staleTime: Infinity,
-  });
- 
-  const { data: settings } = useQuery({
-    queryKey: ['settings'],
-    queryFn: api.getSettings,
-    staleTime: 5 * 60 * 1000, // 5 minutes
-  });
- 
-  const { data: updateCheck } = useQuery({
-    queryKey: ['updateCheck'],
-    queryFn: api.checkForUpdates,
-    enabled: settings?.check_updates !== false,
-    staleTime: 60 * 60 * 1000, // 1 hour
-    refetchInterval: 60 * 60 * 1000, // Check every hour
-  });
- 
-  // Fetch external links for sidebar
-  const { data: externalLinks } = useQuery({
-    queryKey: ['external-links'],
-    queryFn: api.getExternalLinks,
-  });
- 
-  // Build the unified sidebar items list
-  const navItemsMap = new Map(defaultNavItems.map(item => [item.id, item]));
-  const extLinksMap = new Map((externalLinks || []).map(link => [`ext-${link.id}`, link]));
- 
-  // Compute the ordered sidebar: include stored order + any new items
-  const orderedSidebarIds = (() => {
-    const result: string[] = [];
-    const seen = new Set<string>();
- 
-    // Add items in stored order
-    for (const id of sidebarOrder) {
-      if (navItemsMap.has(id) || extLinksMap.has(id)) {
-        result.push(id);
-        seen.add(id);
-      }
-    }
- 
-    // Add any new internal nav items not in stored order
-    for (const item of defaultNavItems) {
-      if (!seen.has(item.id)) {
-        result.push(item.id);
-        seen.add(item.id);
-      }
-    }
- 
-    // Add any new external links not in stored order
-    for (const link of externalLinks || []) {
-      const extId = `ext-${link.id}`;
-      if (!seen.has(extId)) {
-        result.push(extId);
-        seen.add(extId);
-      }
-    }
- 
-    return result;
-  })();
- 
-  // Unified drag handlers
-  const handleDragStart = (e: React.DragEvent, id: string) => {
-    setDraggedId(id);
-    e.dataTransfer.effectAllowed = 'move';
-    e.dataTransfer.setData('text/plain', id);
-  };
- 
-  const handleDragOver = (e: React.DragEvent, id: string) => {
-    e.preventDefault();
-    e.dataTransfer.dropEffect = 'move';
-    setDragOverId(id);
-  };
- 
-  const handleDragLeave = () => {
-    setDragOverId(null);
-  };
- 
-  const handleDrop = (e: React.DragEvent, targetId: string) => {
-    e.preventDefault();
-    if (draggedId === null || draggedId === targetId) {
-      setDraggedId(null);
-      setDragOverId(null);
-      return;
-    }
- 
-    const currentOrder = [...orderedSidebarIds];
-    const draggedIndex = currentOrder.indexOf(draggedId);
-    const targetIndex = currentOrder.indexOf(targetId);
- 
-    if (draggedIndex === -1 || targetIndex === -1) {
-      setDraggedId(null);
-      setDragOverId(null);
-      return;
-    }
- 
-    // Reorder
-    currentOrder.splice(draggedIndex, 1);
-    currentOrder.splice(targetIndex, 0, draggedId);
- 
-    // Save to localStorage and update state
-    setSidebarOrder(currentOrder);
-    saveSidebarOrder(currentOrder);
- 
-    setDraggedId(null);
-    setDragOverId(null);
-  };
- 
-  const handleDragEnd = () => {
-    setDraggedId(null);
-    setDragOverId(null);
-  };
- 
-  // Show update banner if update available and not dismissed for this version
-  const showUpdateBanner = updateCheck?.update_available &&
-    updateCheck.latest_version &&
-    updateCheck.latest_version !== dismissedUpdateVersion;
- 
-  const dismissUpdateBanner = () => {
-    if (updateCheck?.latest_version) {
-      sessionStorage.setItem('dismissedUpdateVersion', updateCheck.latest_version);
-      setDismissedUpdateVersion(updateCheck.latest_version);
-    }
-  };
- 
-  // Redirect to default view on initial load
-  useEffect(() => {
-    if (!hasRedirected.current && location.pathname === '/') {
-      const defaultView = getDefaultView();
-      if (defaultView !== '/') {
-        hasRedirected.current = true;
-        navigate(defaultView, { replace: true });
-      }
-    }
-  }, [location.pathname, navigate]);
- 
-  useEffect(() => {
-    localStorage.setItem('sidebarExpanded', String(sidebarExpanded));
-  }, [sidebarExpanded]);
- 
-  // Close mobile drawer on navigation
-  useEffect(() => {
-    if (isMobile) {
-      setMobileDrawerOpen(false);
-    }
-  }, [location.pathname, isMobile]);
- 
-  // Global keyboard shortcuts for navigation
-  const handleKeyDown = useCallback((e: KeyboardEvent) => {
-    const target = e.target as HTMLElement;
-    // Ignore if typing in an input/textarea
-    if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {
-      return;
-    }
- 
-    // Number keys for navigation (1-9) - follows sidebar order including external links
-    if (!e.metaKey && !e.ctrlKey && !e.altKey) {
-      const keyNum = parseInt(e.key);
-      if (keyNum >= 1 && keyNum <= orderedSidebarIds.length && keyNum <= 9) {
-        const id = orderedSidebarIds[keyNum - 1];
-        e.preventDefault();
- 
-        if (isExternalLinkId(id)) {
-          // External link - navigate to iframe page
-          const linkId = id.replace('ext-', '');
-          navigate(`/external/${linkId}`);
-        } else {
-          // Internal nav item
-          const navItem = navItemsMap.get(id);
-          if (navItem) {
-            navigate(navItem.to);
-          }
-        }
-        return;
-      }
- 
-      switch (e.key) {
-        case '?':
-          e.preventDefault();
-          setShowShortcuts(true);
-          break;
-        case 'Escape':
-          setShowShortcuts(false);
-          break;
-      }
-    }
-  }, [navigate, orderedSidebarIds, navItemsMap]);
- 
-  useEffect(() => {
-    document.addEventListener('keydown', handleKeyDown);
-    return () => document.removeEventListener('keydown', handleKeyDown);
-  }, [handleKeyDown]);
- 
-  return (
-    <div className="flex min-h-screen">
-      {/* Mobile Header */}
-      {isMobile && (
-        <header className="fixed top-0 left-0 right-0 z-40 h-14 bg-bambu-dark-secondary border-b border-bambu-dark-tertiary flex items-center px-4">
-          <button
-            onClick={() => setMobileDrawerOpen(true)}
-            className="p-2 -ml-2 rounded-lg hover:bg-bambu-dark-tertiary transition-colors"
-            aria-label="Open menu"
-          >
-            <Menu className="w-6 h-6 text-white" />
-          </button>
-          <img
-            src={theme === 'dark' ? '/img/bambuddy_logo_dark.png' : '/img/bambuddy_logo_light.png'}
-            alt="Bambuddy"
-            className="h-8 ml-3"
-          />
-        </header>
-      )}
- 
-      {/* Mobile Drawer Backdrop */}
-      {isMobile && mobileDrawerOpen && (
-        <div
-          className="fixed inset-0 bg-black/60 z-40 transition-opacity"
-          onClick={() => setMobileDrawerOpen(false)}
-        />
-      )}
- 
-      {/* Sidebar / Mobile Drawer */}
-      <aside
-        className={`bg-bambu-dark-secondary border-r border-bambu-dark-tertiary flex flex-col transition-all duration-300 ${
-          isMobile
-            ? `fixed inset-y-0 left-0 z-50 w-72 transform ${mobileDrawerOpen ? 'translate-x-0' : '-translate-x-full'}`
-            : `fixed inset-y-0 left-0 z-30 ${sidebarExpanded ? 'w-64' : 'w-16'}`
-        }`}
-      >
-        {/* Logo */}
-        <div className={`border-b border-bambu-dark-tertiary flex items-center justify-center ${isMobile || sidebarExpanded ? 'p-4' : 'p-2'}`}>
-          <img
-            src={theme === 'dark' ? '/img/bambuddy_logo_dark.png' : '/img/bambuddy_logo_light.png'}
-            alt="Bambuddy"
-            className={isMobile || sidebarExpanded ? 'h-16 w-auto' : 'h-8 w-8 object-cover object-left'}
-          />
-        </div>
- 
-        {/* Navigation */}
-        <nav className="flex-1 p-2">
-          <ul className="space-y-2">
-            {orderedSidebarIds.map((id) => {
-              const isExternal = isExternalLinkId(id);
- 
-              if (isExternal) {
-                // Render external link
-                const link = extLinksMap.get(id);
-                if (!link) return null;
- 
-                const LinkIcon = link.custom_icon ? null : getIconByName(link.icon);
-                return (
-                  <li
-                    key={id}
-                    draggable
-                    onDragStart={(e) => handleDragStart(e, id)}
-                    onDragOver={(e) => handleDragOver(e, id)}
-                    onDragLeave={handleDragLeave}
-                    onDrop={(e) => handleDrop(e, id)}
-                    onDragEnd={handleDragEnd}
-                    className={`relative ${
-                      draggedId === id ? 'opacity-50' : ''
-                    } ${
-                      dragOverId === id && draggedId !== id
-                        ? 'before:absolute before:left-0 before:right-0 before:top-0 before:h-0.5 before:bg-bambu-green'
-                        : ''
-                    }`}
-                  >
-                    <NavLink
-                      to={`/external/${link.id}`}
-                      className={({ isActive }) =>
-                        `flex items-center ${isMobile || sidebarExpanded ? 'gap-3 px-4' : 'justify-center px-2'} py-3 rounded-lg transition-colors group ${
-                          isActive
-                            ? 'bg-bambu-green text-white'
-                            : 'text-bambu-gray-light hover:bg-bambu-dark-tertiary hover:text-white'
-                        }`
-                      }
-                      title={!isMobile && !sidebarExpanded ? link.name : undefined}
-                    >
-                      {sidebarExpanded && !isMobile && (
-                        <GripVertical className="w-4 h-4 flex-shrink-0 opacity-0 group-hover:opacity-50 cursor-grab active:cursor-grabbing -ml-1" />
-                      )}
-                      {link.custom_icon ? (
-                        <img
-                          src={`/api/v1/external-links/${link.id}/icon`}
-                          alt=""
-                          className={`w-5 h-5 flex-shrink-0 ${theme === 'dark' ? 'invert opacity-[0.65]' : 'opacity-60'}`}
-                        />
-                      ) : (
-                        LinkIcon && <LinkIcon className="w-5 h-5 flex-shrink-0" />
-                      )}
-                      {(isMobile || sidebarExpanded) && <span>{link.name}</span>}
-                    </NavLink>
-                  </li>
-                );
-              } else {
-                // Render internal nav item
-                const navItem = navItemsMap.get(id);
-                if (!navItem) return null;
- 
-                const { to, icon: Icon, labelKey } = navItem;
-                return (
-                  <li
-                    key={id}
-                    draggable
-                    onDragStart={(e) => handleDragStart(e, id)}
-                    onDragOver={(e) => handleDragOver(e, id)}
-                    onDragLeave={handleDragLeave}
-                    onDrop={(e) => handleDrop(e, id)}
-                    onDragEnd={handleDragEnd}
-                    className={`relative ${
-                      draggedId === id ? 'opacity-50' : ''
-                    } ${
-                      dragOverId === id && draggedId !== id
-                        ? 'before:absolute before:left-0 before:right-0 before:top-0 before:h-0.5 before:bg-bambu-green'
-                        : ''
-                    }`}
-                  >
-                    <NavLink
-                      to={to}
-                      className={({ isActive }) =>
-                        `flex items-center ${isMobile || sidebarExpanded ? 'gap-3 px-4' : 'justify-center px-2'} py-3 rounded-lg transition-colors group ${
-                          isActive
-                            ? 'bg-bambu-green text-white'
-                            : 'text-bambu-gray-light hover:bg-bambu-dark-tertiary hover:text-white'
-                        }`
-                      }
-                      title={!isMobile && !sidebarExpanded ? t(labelKey) : undefined}
-                    >
-                      {sidebarExpanded && !isMobile && (
-                        <GripVertical className="w-4 h-4 flex-shrink-0 opacity-0 group-hover:opacity-50 cursor-grab active:cursor-grabbing -ml-1" />
-                      )}
-                      <Icon className="w-5 h-5 flex-shrink-0" />
-                      {(isMobile || sidebarExpanded) && <span>{t(labelKey)}</span>}
-                    </NavLink>
-                  </li>
-                );
-              }
-            })}
-          </ul>
-        </nav>
- 
-        {/* Collapse toggle - hide on mobile */}
-        {!isMobile && (
-          <button
-            onClick={() => setSidebarExpanded(!sidebarExpanded)}
-            className="p-2 mx-2 mb-2 rounded-lg hover:bg-bambu-dark-tertiary transition-colors text-bambu-gray-light hover:text-white flex items-center justify-center"
-            title={sidebarExpanded ? t('nav.collapseSidebar') : t('nav.expandSidebar')}
-          >
-            {sidebarExpanded ? (
-              <ChevronLeft className="w-5 h-5" />
-            ) : (
-              <ChevronRight className="w-5 h-5" />
-            )}
-          </button>
-        )}
- 
-        {/* Footer */}
-        <div className="p-2 border-t border-bambu-dark-tertiary">
-          {isMobile || sidebarExpanded ? (
-            <div className="flex items-center justify-between px-2">
-              <div className="flex items-center gap-2">
-                <span className="text-sm text-bambu-gray">v{versionInfo?.version || '...'}</span>
-                {updateCheck?.update_available && (
-                  <button
-                    onClick={() => navigate('/settings')}
-                    className="flex items-center gap-1 text-xs text-bambu-green hover:text-bambu-green/80 transition-colors"
-                    title={t('nav.updateAvailable', { version: updateCheck.latest_version })}
-                  >
-                    <ArrowUpCircle className="w-4 h-4" />
-                    <span>{t('nav.update')}</span>
-                  </button>
-                )}
-              </div>
-              <div className="flex items-center gap-1">
-                <a
-                  href="https://github.com/maziggy/bambuddy"
-                  target="_blank"
-                  rel="noopener noreferrer"
-                  className="p-2 rounded-lg hover:bg-bambu-dark-tertiary transition-colors text-bambu-gray-light hover:text-white"
-                  title={t('nav.viewOnGithub')}
-                >
-                  <Github className="w-5 h-5" />
-                </a>
-                <button
-                  onClick={() => setShowShortcuts(true)}
-                  className="p-2 rounded-lg hover:bg-bambu-dark-tertiary transition-colors text-bambu-gray-light hover:text-white"
-                  title={t('nav.keyboardShortcuts')}
-                >
-                  <Keyboard className="w-5 h-5" />
-                </button>
-                <button
-                  onClick={toggleTheme}
-                  className="p-2 rounded-lg hover:bg-bambu-dark-tertiary transition-colors text-bambu-gray-light hover:text-white"
-                  title={theme === 'dark' ? t('nav.switchToLight') : t('nav.switchToDark')}
-                >
-                  {theme === 'dark' ? <Sun className="w-5 h-5" /> : <Moon className="w-5 h-5" />}
-                </button>
-              </div>
-            </div>
-          ) : (
-            <div className="flex flex-col items-center gap-1">
-              {updateCheck?.update_available && (
-                <button
-                  onClick={() => navigate('/settings')}
-                  className="p-2 rounded-lg hover:bg-bambu-dark-tertiary transition-colors text-bambu-green hover:text-bambu-green/80"
-                  title={t('nav.updateAvailable', { version: updateCheck.latest_version })}
-                >
-                  <ArrowUpCircle className="w-5 h-5" />
-                </button>
-              )}
-              <a
-                href="https://github.com/maziggy/bambuddy"
-                target="_blank"
-                rel="noopener noreferrer"
-                className="p-2 rounded-lg hover:bg-bambu-dark-tertiary transition-colors text-bambu-gray-light hover:text-white"
-                title={t('nav.viewOnGithub')}
-              >
-                <Github className="w-5 h-5" />
-              </a>
-              <button
-                onClick={() => setShowShortcuts(true)}
-                className="p-2 rounded-lg hover:bg-bambu-dark-tertiary transition-colors text-bambu-gray-light hover:text-white"
-                title={t('nav.keyboardShortcuts')}
-              >
-                <Keyboard className="w-5 h-5" />
-              </button>
-              <button
-                onClick={toggleTheme}
-                className="p-2 rounded-lg hover:bg-bambu-dark-tertiary transition-colors text-bambu-gray-light hover:text-white"
-                title={theme === 'dark' ? t('nav.switchToLight') : t('nav.switchToDark')}
-              >
-                {theme === 'dark' ? <Sun className="w-5 h-5" /> : <Moon className="w-5 h-5" />}
-              </button>
-            </div>
-          )}
-        </div>
-      </aside>
- 
-      {/* Main content */}
-      <main className={`flex-1 bg-bambu-dark overflow-auto transition-all duration-300 ${
-        isMobile ? 'mt-14' : sidebarExpanded ? 'ml-64' : 'ml-16'
-      }`}>
-        {/* Persistent update banner */}
-        {showUpdateBanner && (
-          <div className="bg-bambu-green/20 border-b border-bambu-green/30 px-4 py-2 flex items-center justify-between">
-            <div className="flex items-center gap-2 text-sm">
-              <ArrowUpCircle className="w-4 h-4 text-bambu-green" />
-              <span>
-                {t('nav.updateAvailableBanner', {
-                  version: updateCheck?.latest_version,
-                  defaultValue: `Version ${updateCheck?.latest_version} is available!`
-                })}
-              </span>
-              <button
-                onClick={() => navigate('/settings')}
-                className="text-bambu-green hover:text-bambu-green/80 font-medium underline"
-              >
-                {t('nav.viewUpdate', { defaultValue: 'View update' })}
-              </button>
-            </div>
-            <button
-              onClick={dismissUpdateBanner}
-              className="p-1 hover:bg-bambu-dark-tertiary rounded transition-colors"
-              title={t('common.dismiss', { defaultValue: 'Dismiss' })}
-            >
-              <X className="w-4 h-4" />
-            </button>
-          </div>
-        )}
-        <Outlet />
-      </main>
- 
-      {/* Keyboard Shortcuts Modal */}
-      {showShortcuts && (
-        <KeyboardShortcutsModal
-          onClose={() => setShowShortcuts(false)}
-          sidebarItems={orderedSidebarIds.map(id => {
-            if (isExternalLinkId(id)) {
-              const extLink = extLinksMap.get(id);
-              return extLink ? { type: 'external' as const, label: extLink.name } : null;
-            } else {
-              const navItem = navItemsMap.get(id);
-              return navItem ? { type: 'nav' as const, label: navItem.labelKey, labelKey: navItem.labelKey } : null;
-            }
-          }).filter(Boolean) as { type: 'nav' | 'external'; label: string; labelKey?: string }[]}
-        />
-      )}
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/MQTTDebugModal.tsx.html b/frontend/coverage/src/components/MQTTDebugModal.tsx.html deleted file mode 100644 index 5eef8c77c..000000000 --- a/frontend/coverage/src/components/MQTTDebugModal.tsx.html +++ /dev/null @@ -1,1072 +0,0 @@ - - - - - - Code coverage report for src/components/MQTTDebugModal.tsx - - - - - - - - - -
-
-

All files / src/components MQTTDebugModal.tsx

-
- -
- 0% - Statements - 0/256 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/256 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
-import { X, Play, Square, Trash2, RefreshCw, ArrowDown, ArrowUp, Search } from 'lucide-react';
-import { api, type MQTTLogEntry } from '../api/client';
-import { Button } from './Button';
-import { useState, useEffect, useRef, useMemo } from 'react';
- 
-interface MQTTDebugModalProps {
-  printerId: number;
-  printerName: string;
-  onClose: () => void;
-}
- 
-export function MQTTDebugModal({ printerId, printerName, onClose }: MQTTDebugModalProps) {
-  const queryClient = useQueryClient();
-  const [autoScroll, setAutoScroll] = useState(true);
-  const [expandedLogs, setExpandedLogs] = useState<Set<number>>(new Set());
-  const [searchQuery, setSearchQuery] = useState('');
-  const [directionFilter, setDirectionFilter] = useState<'all' | 'in' | 'out'>('all');
-  const logContainerRef = useRef<HTMLDivElement>(null);
- 
-  const { data, isLoading, refetch } = useQuery({
-    queryKey: ['mqtt-logs', printerId],
-    queryFn: () => api.getMQTTLogs(printerId),
-    refetchInterval: 1000, // Poll every second when logging is enabled
-  });
- 
-  const enableMutation = useMutation({
-    mutationFn: () => api.enableMQTTLogging(printerId),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['mqtt-logs', printerId] });
-    },
-  });
- 
-  const disableMutation = useMutation({
-    mutationFn: () => api.disableMQTTLogging(printerId),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['mqtt-logs', printerId] });
-    },
-  });
- 
-  const clearMutation = useMutation({
-    mutationFn: () => api.clearMQTTLogs(printerId),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['mqtt-logs', printerId] });
-    },
-  });
- 
-  // Close on Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onClose();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose]);
- 
-  // Auto-scroll to bottom when new logs arrive
-  useEffect(() => {
-    if (autoScroll && logContainerRef.current) {
-      logContainerRef.current.scrollTop = logContainerRef.current.scrollHeight;
-    }
-  }, [data?.logs, autoScroll]);
- 
-  const toggleExpand = (index: number) => {
-    setExpandedLogs((prev) => {
-      const newSet = new Set(prev);
-      if (newSet.has(index)) {
-        newSet.delete(index);
-      } else {
-        newSet.add(index);
-      }
-      return newSet;
-    });
-  };
- 
-  const formatTimestamp = (timestamp: string) => {
-    const date = new Date(timestamp);
-    return date.toLocaleTimeString('en-US', { hour12: false, fractionalSecondDigits: 3 });
-  };
- 
-  const formatPayload = (payload: unknown, expanded: boolean): string => {
-    if (payload === undefined || payload === null) {
-      return '<empty>';
-    }
-    // If payload is already a string, parse it first to format nicely
-    const obj = typeof payload === 'string' ? JSON.parse(payload) : payload;
-    const json = JSON.stringify(obj, null, expanded ? 2 : 0);
-    if (!expanded && json.length > 100) {
-      return json.substring(0, 100) + '...';
-    }
-    return json;
-  };
- 
-  const loggingEnabled = data?.logging_enabled ?? false;
-  const logs = data?.logs ?? [];
- 
-  // Filter logs based on search query and direction filter
-  const filteredLogs = useMemo(() => {
-    return logs.filter((log) => {
-      // Direction filter
-      if (directionFilter !== 'all' && log.direction !== directionFilter) {
-        return false;
-      }
-      // Search filter
-      if (searchQuery.trim()) {
-        const query = searchQuery.toLowerCase();
-        const topicMatch = log.topic.toLowerCase().includes(query);
-        const payloadStr = JSON.stringify(log.payload).toLowerCase();
-        const payloadMatch = payloadStr.includes(query);
-        return topicMatch || payloadMatch;
-      }
-      return true;
-    });
-  }, [logs, searchQuery, directionFilter]);
- 
-  return (
-    <div className="fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4">
-      <div className="bg-bambu-dark-secondary rounded-lg max-w-4xl w-full max-h-[85vh] flex flex-col">
-        {/* Header */}
-        <div className="flex items-center justify-between p-4 border-b border-bambu-dark-tertiary">
-          <div>
-            <h2 className="text-lg font-semibold text-white">MQTT Debug Log</h2>
-            <p className="text-sm text-bambu-gray">{printerName}</p>
-          </div>
-          <button
-            onClick={onClose}
-            className="text-bambu-gray hover:text-white transition-colors"
-          >
-            <X className="w-5 h-5" />
-          </button>
-        </div>
- 
-        {/* Controls */}
-        <div className="flex flex-col gap-2 p-4 border-b border-bambu-dark-tertiary">
-          <div className="flex items-center gap-2">
-            {loggingEnabled ? (
-              <Button
-                size="sm"
-                variant="secondary"
-                onClick={() => disableMutation.mutate()}
-                disabled={disableMutation.isPending}
-              >
-                <Square className="w-4 h-4" />
-                Stop
-              </Button>
-            ) : (
-              <Button
-                size="sm"
-                onClick={() => enableMutation.mutate()}
-                disabled={enableMutation.isPending}
-              >
-                <Play className="w-4 h-4" />
-                Start Logging
-              </Button>
-            )}
-            <Button
-              size="sm"
-              variant="secondary"
-              onClick={() => clearMutation.mutate()}
-              disabled={clearMutation.isPending || logs.length === 0}
-            >
-              <Trash2 className="w-4 h-4" />
-              Clear
-            </Button>
-            <Button
-              size="sm"
-              variant="secondary"
-              onClick={() => refetch()}
-              disabled={isLoading}
-            >
-              <RefreshCw className={`w-4 h-4 ${isLoading ? 'animate-spin' : ''}`} />
-            </Button>
-            <div className="flex-1" />
-            <label className="flex items-center gap-2 text-sm text-bambu-gray cursor-pointer">
-              <input
-                type="checkbox"
-                checked={autoScroll}
-                onChange={(e) => setAutoScroll(e.target.checked)}
-                className="rounded border-bambu-dark-tertiary"
-              />
-              Auto-scroll
-            </label>
-            <span className="text-sm text-bambu-gray">
-              {filteredLogs.length}/{logs.length}
-            </span>
-          </div>
- 
-          {/* Search and Filter Row */}
-          <div className="flex items-center gap-2">
-            <div className="relative flex-1">
-              <Search className="absolute left-2.5 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray" />
-              <input
-                type="text"
-                placeholder="Search topic or payload..."
-                value={searchQuery}
-                onChange={(e) => setSearchQuery(e.target.value)}
-                className="w-full pl-8 pr-3 py-1.5 text-sm bg-bambu-dark border border-bambu-dark-tertiary rounded text-white placeholder-bambu-gray focus:border-bambu-green focus:outline-none"
-              />
-              {searchQuery && (
-                <button
-                  onClick={() => setSearchQuery('')}
-                  className="absolute right-2 top-1/2 -translate-y-1/2 text-bambu-gray hover:text-white"
-                >
-                  <X className="w-4 h-4" />
-                </button>
-              )}
-            </div>
-            <div className="flex items-center gap-1 bg-bambu-dark rounded border border-bambu-dark-tertiary">
-              <button
-                onClick={() => setDirectionFilter('all')}
-                className={`px-2 py-1.5 text-xs rounded-l transition-colors ${
-                  directionFilter === 'all'
-                    ? 'bg-bambu-green text-white'
-                    : 'text-bambu-gray hover:text-white'
-                }`}
-              >
-                All
-              </button>
-              <button
-                onClick={() => setDirectionFilter('in')}
-                className={`px-2 py-1.5 text-xs transition-colors flex items-center gap-1 ${
-                  directionFilter === 'in'
-                    ? 'bg-blue-500 text-white'
-                    : 'text-bambu-gray hover:text-white'
-                }`}
-              >
-                <ArrowDown className="w-3 h-3" />
-                In
-              </button>
-              <button
-                onClick={() => setDirectionFilter('out')}
-                className={`px-2 py-1.5 text-xs rounded-r transition-colors flex items-center gap-1 ${
-                  directionFilter === 'out'
-                    ? 'bg-green-500 text-white'
-                    : 'text-bambu-gray hover:text-white'
-                }`}
-              >
-                <ArrowUp className="w-3 h-3" />
-                Out
-              </button>
-            </div>
-          </div>
-        </div>
- 
-        {/* Log Content */}
-        <div
-          ref={logContainerRef}
-          className="flex-1 overflow-auto p-4 font-mono text-xs bg-black min-h-[400px]"
-        >
-          {logs.length === 0 ? (
-            <div className="flex flex-col items-center justify-center h-full text-bambu-gray">
-              <p className="mb-2">No messages logged yet</p>
-              {!loggingEnabled && (
-                <p className="text-sm">Click "Start Logging" to begin capturing MQTT messages</p>
-              )}
-            </div>
-          ) : filteredLogs.length === 0 ? (
-            <div className="flex flex-col items-center justify-center h-full text-bambu-gray">
-              <p className="mb-2">No messages match your filter</p>
-              <p className="text-sm">Try adjusting your search or filter criteria</p>
-            </div>
-          ) : (
-            <div className="space-y-1">
-              {filteredLogs.map((log: MQTTLogEntry, index: number) => {
-                const isExpanded = expandedLogs.has(index);
-                const isIncoming = log.direction === 'in';
- 
-                return (
-                  <div
-                    key={index}
-                    className={`p-2 rounded cursor-pointer hover:bg-bambu-dark-secondary transition-colors ${
-                      isExpanded ? 'bg-bambu-dark-secondary' : ''
-                    }`}
-                    onClick={() => toggleExpand(index)}
-                  >
-                    <div className="flex items-start gap-2">
-                      <span className="text-bambu-gray shrink-0">
-                        {formatTimestamp(log.timestamp)}
-                      </span>
-                      <span
-                        className={`shrink-0 ${
-                          isIncoming ? 'text-blue-400' : 'text-green-400'
-                        }`}
-                        title={isIncoming ? 'Incoming' : 'Outgoing'}
-                      >
-                        {isIncoming ? (
-                          <ArrowDown className="w-3 h-3" />
-                        ) : (
-                          <ArrowUp className="w-3 h-3" />
-                        )}
-                      </span>
-                      <span className="text-purple-400 shrink-0">{log.topic}</span>
-                    </div>
-                    {isExpanded ? (
-                      <pre className="mt-2 p-3 bg-gray-900 border border-gray-700 rounded text-green-400 overflow-x-auto whitespace-pre-wrap break-all max-h-96 overflow-y-auto text-xs">
-                        {formatPayload(log.payload, true)}
-                      </pre>
-                    ) : (
-                      <pre className="mt-1 text-white/80 truncate">
-                        {formatPayload(log.payload, false)}
-                      </pre>
-                    )}
-                  </div>
-                );
-              })}
-            </div>
-          )}
-        </div>
- 
-        {/* Footer */}
-        <div className="flex items-center justify-between p-4 border-t border-bambu-dark-tertiary">
-          <div className="text-sm text-bambu-gray">
-            {loggingEnabled ? (
-              <span className="flex items-center gap-2">
-                <span className="w-2 h-2 bg-green-500 rounded-full animate-pulse" />
-                Logging active - messages will auto-refresh
-              </span>
-            ) : (
-              <span>Logging stopped</span>
-            )}
-          </div>
-          <Button variant="secondary" onClick={onClose}>
-            Close
-          </Button>
-        </div>
-      </div>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/ModelViewer.tsx.html b/frontend/coverage/src/components/ModelViewer.tsx.html deleted file mode 100644 index b741fae01..000000000 --- a/frontend/coverage/src/components/ModelViewer.tsx.html +++ /dev/null @@ -1,1630 +0,0 @@ - - - - - - Code coverage report for src/components/ModelViewer.tsx - - - - - - - - - -
-
-

All files / src/components ModelViewer.tsx

-
- -
- 0% - Statements - 0/367 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/367 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -425 -426 -427 -428 -429 -430 -431 -432 -433 -434 -435 -436 -437 -438 -439 -440 -441 -442 -443 -444 -445 -446 -447 -448 -449 -450 -451 -452 -453 -454 -455 -456 -457 -458 -459 -460 -461 -462 -463 -464 -465 -466 -467 -468 -469 -470 -471 -472 -473 -474 -475 -476 -477 -478 -479 -480 -481 -482 -483 -484 -485 -486 -487 -488 -489 -490 -491 -492 -493 -494 -495 -496 -497 -498 -499 -500 -501 -502 -503 -504 -505 -506 -507 -508 -509 -510 -511 -512 -513 -514 -515 -516  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useEffect, useRef, useState } from 'react';
-import * as THREE from 'three';
-import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
-import { mergeGeometries } from 'three/examples/jsm/utils/BufferGeometryUtils.js';
-import JSZip from 'jszip';
-import { Loader2, RotateCcw, ZoomIn, ZoomOut } from 'lucide-react';
-import { Button } from './Button';
- 
-interface BuildVolume {
-  x: number;
-  y: number;
-  z: number;
-}
- 
-interface ModelViewerProps {
-  url: string;
-  buildVolume?: BuildVolume;
-  className?: string;
-}
- 
-interface MeshData {
-  vertices: number[];
-  triangles: number[];
-}
- 
-interface ObjectData {
-  id: string;
-  meshes: MeshData[];
-}
- 
-interface BuildItem {
-  objectId: string;
-  transform: THREE.Matrix4;
-}
- 
-// Parse 3MF transform - keep in 3MF coordinate space (Z-up)
-function parseTransform3MF(transformStr: string | null): THREE.Matrix4 {
-  const matrix = new THREE.Matrix4();
-  if (!transformStr) {
-    return matrix; // Identity matrix
-  }
- 
-  // 3MF transform is a 3x4 affine matrix in row-major order:
-  // "m00 m01 m02 m10 m11 m12 m20 m21 m22 m30 m31 m32"
-  // Where (m30, m31, m32) is the translation vector
-  const values = transformStr.trim().split(/\s+/).map(parseFloat);
-  if (values.length >= 12) {
-    // Three.js Matrix4.set takes row-major order arguments:
-    // set(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44)
-    // 3MF row-major: m00, m01, m02, m10, m11, m12, m20, m21, m22, m30, m31, m32
-    matrix.set(
-      values[0], values[1], values[2], values[9],   // m00, m01, m02, tx
-      values[3], values[4], values[5], values[10],  // m10, m11, m12, ty
-      values[6], values[7], values[8], values[11],  // m20, m21, m22, tz
-      0, 0, 0, 1
-    );
-  }
-  return matrix;
-}
- 
-// Alias for backwards compatibility
-const parseTransform = parseTransform3MF;
- 
-async function parseMeshFromDoc(doc: Document): Promise<MeshData[]> {
-  const meshes: MeshData[] = [];
-  const meshElements = doc.getElementsByTagName('mesh');
- 
-  for (let j = 0; j < meshElements.length; j++) {
-    const meshEl = meshElements[j];
-    const vertices: number[] = [];
-    const triangles: number[] = [];
- 
-    const vertexElements = meshEl.getElementsByTagName('vertex');
-    for (let k = 0; k < vertexElements.length; k++) {
-      const v = vertexElements[k];
-      vertices.push(
-        parseFloat(v.getAttribute('x') || '0'),
-        parseFloat(v.getAttribute('y') || '0'),
-        parseFloat(v.getAttribute('z') || '0')
-      );
-    }
- 
-    const triangleElements = meshEl.getElementsByTagName('triangle');
-    for (let k = 0; k < triangleElements.length; k++) {
-      const t = triangleElements[k];
-      triangles.push(
-        parseInt(t.getAttribute('v1') || '0'),
-        parseInt(t.getAttribute('v2') || '0'),
-        parseInt(t.getAttribute('v3') || '0')
-      );
-    }
- 
-    if (vertices.length > 0 && triangles.length > 0) {
-      meshes.push({ vertices, triangles });
-    }
-  }
-  return meshes;
-}
- 
-async function parse3MF(arrayBuffer: ArrayBuffer): Promise<{ objects: Map<string, ObjectData>; buildItems: BuildItem[] }> {
-  const zip = await JSZip.loadAsync(arrayBuffer);
-  const objects = new Map<string, ObjectData>();
-  const buildItems: BuildItem[] = [];
-  const parser = new DOMParser();
- 
-  // Helper to load and parse a model file from the zip
-  async function loadModelFile(path: string): Promise<Document | null> {
-    // Normalize path (remove leading slash)
-    const normalizedPath = path.startsWith('/') ? path.slice(1) : path;
-    const file = zip.files[normalizedPath];
-    if (!file) return null;
-    const content = await file.async('string');
-    return parser.parseFromString(content, 'application/xml');
-  }
- 
-  // Find the main 3D model file
-  const mainModelPath = Object.keys(zip.files).find(
-    (name) => name === '3D/3dmodel.model' || name.endsWith('/3dmodel.model')
-  );
- 
-  if (!mainModelPath) {
-    // Fallback: try to find any .model file
-    const anyModelPath = Object.keys(zip.files).find((name) => name.endsWith('.model'));
-    if (anyModelPath) {
-      const doc = await loadModelFile(anyModelPath);
-      if (doc) {
-        const meshes = await parseMeshFromDoc(doc);
-        if (meshes.length > 0) {
-          objects.set('1', { id: '1', meshes });
-        }
-      }
-    }
-    return { objects, buildItems };
-  }
- 
-  const mainDoc = await loadModelFile(mainModelPath);
-  if (!mainDoc) return { objects, buildItems };
- 
-  // Parse objects - Bambu Studio uses components to reference external files
-  const objectElements = mainDoc.getElementsByTagName('object');
-  for (let i = 0; i < objectElements.length; i++) {
-    const objEl = objectElements[i];
-    const objectId = objEl.getAttribute('id');
-    if (!objectId) continue;
- 
-    const meshes: MeshData[] = [];
- 
-    // Check for direct mesh in this object
-    const objMeshElements = objEl.getElementsByTagName('mesh');
-    for (let j = 0; j < objMeshElements.length; j++) {
-      const meshEl = objMeshElements[j];
-      const vertices: number[] = [];
-      const triangles: number[] = [];
- 
-      const vertexElements = meshEl.getElementsByTagName('vertex');
-      for (let k = 0; k < vertexElements.length; k++) {
-        const v = vertexElements[k];
-        vertices.push(
-          parseFloat(v.getAttribute('x') || '0'),
-          parseFloat(v.getAttribute('y') || '0'),
-          parseFloat(v.getAttribute('z') || '0')
-        );
-      }
- 
-      const triangleElements = meshEl.getElementsByTagName('triangle');
-      for (let k = 0; k < triangleElements.length; k++) {
-        const t = triangleElements[k];
-        triangles.push(
-          parseInt(t.getAttribute('v1') || '0'),
-          parseInt(t.getAttribute('v2') || '0'),
-          parseInt(t.getAttribute('v3') || '0')
-        );
-      }
- 
-      if (vertices.length > 0 && triangles.length > 0) {
-        meshes.push({ vertices, triangles });
-      }
-    }
- 
-    // Check for component references (Bambu Studio style)
-    const componentElements = objEl.getElementsByTagName('component');
-    for (let j = 0; j < componentElements.length; j++) {
-      const compEl = componentElements[j];
-      // p:path attribute contains the external file reference
-      const extPath = compEl.getAttribute('p:path') || compEl.getAttributeNS('http://schemas.microsoft.com/3dmanufacturing/production/2015/06', 'path');
- 
-      if (extPath) {
-        const extDoc = await loadModelFile(extPath);
-        if (extDoc) {
-          const extMeshes = await parseMeshFromDoc(extDoc);
- 
-          // Apply component transform if present
-          const compTransformStr = compEl.getAttribute('transform');
-          const compTransform = parseTransform(compTransformStr);
- 
-          for (const mesh of extMeshes) {
-            if (compTransformStr) {
-              // Apply transform to vertices (in 3MF coordinate space, before Y/Z swap)
-              const transformedVertices: number[] = [];
-              for (let k = 0; k < mesh.vertices.length; k += 3) {
-                const v = new THREE.Vector3(mesh.vertices[k], mesh.vertices[k + 1], mesh.vertices[k + 2]);
-                v.applyMatrix4(compTransform);
-                transformedVertices.push(v.x, v.y, v.z);
-              }
-              meshes.push({ vertices: transformedVertices, triangles: mesh.triangles });
-            } else {
-              meshes.push(mesh);
-            }
-          }
-        }
-      }
-    }
- 
-    if (meshes.length > 0) {
-      objects.set(objectId, { id: objectId, meshes });
-    }
-  }
- 
-  // Parse build items (placement on build plate)
-  const buildElements = mainDoc.getElementsByTagName('build');
-  if (buildElements.length > 0) {
-    const itemElements = buildElements[0].getElementsByTagName('item');
-    for (let i = 0; i < itemElements.length; i++) {
-      const itemEl = itemElements[i];
-      const objectId = itemEl.getAttribute('objectid');
-      if (!objectId) continue;
- 
-      const transform = parseTransform(itemEl.getAttribute('transform'));
-      buildItems.push({ objectId, transform });
-    }
-  }
- 
-  return { objects, buildItems };
-}
- 
-function createGeometryFromMesh(mesh: MeshData): THREE.BufferGeometry {
-  const geometry = new THREE.BufferGeometry();
- 
-  // Convert from 3MF Z-up to Three.js Y-up coordinate system
-  // 3MF: X right, Y back, Z up -> Three.js: X right, Y up, Z forward
-  const positions = new Float32Array(mesh.vertices.length);
-  for (let i = 0; i < mesh.vertices.length; i += 3) {
-    positions[i] = mesh.vertices[i];       // X stays X
-    positions[i + 1] = mesh.vertices[i + 2]; // Y becomes Z (up)
-    positions[i + 2] = mesh.vertices[i + 1]; // Z becomes Y
-  }
- 
-  geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));
-  geometry.setIndex(mesh.triangles);
- 
-  // Compute normals
-  geometry.computeVertexNormals();
- 
-  return geometry;
-}
- 
-export function ModelViewer({ url, buildVolume = { x: 256, y: 256, z: 256 }, className = '' }: ModelViewerProps) {
-  const containerRef = useRef<HTMLDivElement>(null);
-  const rendererRef = useRef<THREE.WebGLRenderer | null>(null);
-  const sceneRef = useRef<THREE.Scene | null>(null);
-  const cameraRef = useRef<THREE.PerspectiveCamera | null>(null);
-  const controlsRef = useRef<OrbitControls | null>(null);
-  const [loading, setLoading] = useState(true);
-  const [error, setError] = useState<string | null>(null);
- 
-  useEffect(() => {
-    if (!containerRef.current) return;
- 
-    const container = containerRef.current;
-    const width = container.clientWidth;
-    const height = container.clientHeight;
- 
-    // Scene
-    const scene = new THREE.Scene();
-    scene.background = new THREE.Color(0x1a1a1a);
-    sceneRef.current = scene;
- 
-    // Camera
-    const camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 10000);
-    camera.position.set(150, 150, 150);
-    cameraRef.current = camera;
- 
-    // Renderer
-    const renderer = new THREE.WebGLRenderer({ antialias: true });
-    renderer.setSize(width, height);
-    renderer.setPixelRatio(window.devicePixelRatio);
-    container.appendChild(renderer.domElement);
-    rendererRef.current = renderer;
- 
-    // Controls
-    const controls = new OrbitControls(camera, renderer.domElement);
-    controls.enableDamping = true;
-    controls.dampingFactor = 0.05;
-    controlsRef.current = controls;
- 
-    // Lights
-    const ambientLight = new THREE.AmbientLight(0xffffff, 0.6);
-    scene.add(ambientLight);
- 
-    const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);
-    directionalLight.position.set(100, 100, 100);
-    scene.add(directionalLight);
- 
-    const directionalLight2 = new THREE.DirectionalLight(0xffffff, 0.4);
-    directionalLight2.position.set(-100, 50, -100);
-    scene.add(directionalLight2);
- 
-    // Grid - use the larger dimension for the grid size
-    const gridSize = Math.max(buildVolume.x, buildVolume.y);
-    const gridDivisions = Math.ceil(gridSize / 16);
-    const gridHelper = new THREE.GridHelper(gridSize, gridDivisions, 0x444444, 0x333333);
-    scene.add(gridHelper);
- 
-    // Build plate indicator
-    const plateGeometry = new THREE.PlaneGeometry(buildVolume.x, buildVolume.y);
-    const plateMaterial = new THREE.MeshBasicMaterial({
-      color: 0x00ae42,
-      transparent: true,
-      opacity: 0.15,
-      side: THREE.DoubleSide,
-    });
-    const plate = new THREE.Mesh(plateGeometry, plateMaterial);
-    plate.rotation.x = -Math.PI / 2;
-    plate.position.y = -0.5; // Slightly below Y=0 so models sit on top
-    scene.add(plate);
- 
-    // Animation loop - keep it simple for reliability
-    let animationId: number;
-    const animate = () => {
-      animationId = requestAnimationFrame(animate);
-      controls.update();
-      renderer.render(scene, camera);
-    };
-    animate();
- 
-    // Load 3MF
-    fetch(url)
-      .then((res) => {
-        if (!res.ok) throw new Error('Failed to load file');
-        return res.arrayBuffer();
-      })
-      .then(parse3MF)
-      .then(({ objects, buildItems }) => {
-        if (objects.size === 0) {
-          throw new Error('No meshes found in 3MF file');
-        }
- 
-        const material = new THREE.MeshPhongMaterial({
-          color: 0x00ae42,
-          shininess: 30,
-          flatShading: false,
-        });
- 
-        const group = new THREE.Group();
-        const allGeometries: THREE.BufferGeometry[] = [];
- 
-        // If we have build items, use them for positioning
-        if (buildItems.length > 0) {
-          for (const item of buildItems) {
-            const objectData = objects.get(item.objectId);
-            if (!objectData) continue;
- 
-            for (const meshData of objectData.meshes) {
-              // Apply build transform to vertices in 3MF space BEFORE coordinate conversion
-              const transformedVertices: number[] = [];
-              for (let k = 0; k < meshData.vertices.length; k += 3) {
-                const v = new THREE.Vector3(
-                  meshData.vertices[k],
-                  meshData.vertices[k + 1],
-                  meshData.vertices[k + 2]
-                );
-                v.applyMatrix4(item.transform);
-                transformedVertices.push(v.x, v.y, v.z);
-              }
-              // Now create geometry with coordinate conversion
-              const geometry = createGeometryFromMesh({
-                vertices: transformedVertices,
-                triangles: meshData.triangles,
-              });
-              allGeometries.push(geometry);
-            }
-          }
-        } else {
-          // Fallback: just add all objects without transforms
-          for (const objectData of objects.values()) {
-            for (const meshData of objectData.meshes) {
-              const geometry = createGeometryFromMesh(meshData);
-              allGeometries.push(geometry);
-            }
-          }
-        }
- 
-        // Merge all geometries into one for better performance
-        if (allGeometries.length > 0) {
-          const mergedGeometry = allGeometries.length === 1
-            ? allGeometries[0]
-            : mergeGeometries(allGeometries, false);
- 
-          if (mergedGeometry) {
-            const mesh = new THREE.Mesh(mergedGeometry, material);
-            group.add(mesh);
-          }
- 
-          // Dispose individual geometries if merged
-          if (allGeometries.length > 1) {
-            for (const geom of allGeometries) {
-              geom.dispose();
-            }
-          }
-        }
- 
-        // Get bounding box to position model
-        const box = new THREE.Box3().setFromObject(group);
-        const center = box.getCenter(new THREE.Vector3());
- 
-        // Always place models on the build plate (Y=0)
-        group.position.y = -box.min.y;
- 
-        // For models without build transforms, also center X/Z
-        if (buildItems.length === 0) {
-          group.position.x = -center.x;
-          group.position.z = -center.z;
-        }
- 
-        scene.add(group);
- 
-        // Recalculate bounding box after positioning
-        const finalBox = new THREE.Box3().setFromObject(group);
-        const finalCenter = finalBox.getCenter(new THREE.Vector3());
-        const finalSize = finalBox.getSize(new THREE.Vector3());
- 
-        // Adjust camera to fit model
-        const maxDim = Math.max(finalSize.x, finalSize.y, finalSize.z);
-        const cameraDistance = maxDim * 1.8;
-        camera.position.set(
-          finalCenter.x + cameraDistance * 0.7,
-          finalCenter.y + cameraDistance * 0.5,
-          finalCenter.z + cameraDistance * 0.7
-        );
-        controls.target.copy(finalCenter);
-        controls.update();
- 
-        setLoading(false);
-      })
-      .catch((err) => {
-        setError(err.message);
-        setLoading(false);
-      });
- 
-    // Handle resize
-    const handleResize = () => {
-      if (!container) return;
-      const w = container.clientWidth;
-      const h = container.clientHeight;
-      camera.aspect = w / h;
-      camera.updateProjectionMatrix();
-      renderer.setSize(w, h);
-    };
-    window.addEventListener('resize', handleResize);
- 
-    return () => {
-      window.removeEventListener('resize', handleResize);
-      cancelAnimationFrame(animationId);
-      controls.dispose();
-      renderer.dispose();
-      container.removeChild(renderer.domElement);
-    };
-  }, [url, buildVolume]);
- 
-  const resetView = () => {
-    if (cameraRef.current && controlsRef.current) {
-      cameraRef.current.position.set(150, 150, 150);
-      controlsRef.current.target.set(0, 50, 0);
-      controlsRef.current.update();
-    }
-  };
- 
-  const zoom = (factor: number) => {
-    if (cameraRef.current) {
-      cameraRef.current.position.multiplyScalar(factor);
-    }
-  };
- 
-  return (
-    <div className={`relative ${className}`}>
-      <div ref={containerRef} className="w-full h-full min-h-[400px]" />
- 
-      {loading && (
-        <div className="absolute inset-0 flex items-center justify-center bg-bambu-dark/80">
-          <Loader2 className="w-8 h-8 text-bambu-green animate-spin" />
-        </div>
-      )}
- 
-      {error && (
-        <div className="absolute inset-0 flex items-center justify-center bg-bambu-dark/80">
-          <p className="text-red-400">{error}</p>
-        </div>
-      )}
- 
-      {!loading && !error && (
-        <div className="absolute bottom-4 right-4 flex gap-2">
-          <Button variant="secondary" size="sm" onClick={() => zoom(0.8)}>
-            <ZoomIn className="w-4 h-4" />
-          </Button>
-          <Button variant="secondary" size="sm" onClick={() => zoom(1.25)}>
-            <ZoomOut className="w-4 h-4" />
-          </Button>
-          <Button variant="secondary" size="sm" onClick={resetView}>
-            <RotateCcw className="w-4 h-4" />
-          </Button>
-        </div>
-      )}
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/ModelViewerModal.tsx.html b/frontend/coverage/src/components/ModelViewerModal.tsx.html deleted file mode 100644 index 916b966eb..000000000 --- a/frontend/coverage/src/components/ModelViewerModal.tsx.html +++ /dev/null @@ -1,535 +0,0 @@ - - - - - - Code coverage report for src/components/ModelViewerModal.tsx - - - - - - - - - -
-
-

All files / src/components ModelViewerModal.tsx

-
- -
- 0% - Statements - 0/104 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/104 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useEffect } from 'react';
-import { X, ExternalLink, Box, Code2, Loader2 } from 'lucide-react';
-import { ModelViewer } from './ModelViewer';
-import { GcodeViewer } from './GcodeViewer';
-import { Button } from './Button';
-import { api } from '../api/client';
- 
-type ViewTab = '3d' | 'gcode';
- 
-interface ModelViewerModalProps {
-  archiveId: number;
-  title: string;
-  onClose: () => void;
-}
- 
-interface Capabilities {
-  has_model: boolean;
-  has_gcode: boolean;
-  build_volume: { x: number; y: number; z: number };
-}
- 
-export function ModelViewerModal({ archiveId, title, onClose }: ModelViewerModalProps) {
-  const [activeTab, setActiveTab] = useState<ViewTab | null>(null);
-  const [capabilities, setCapabilities] = useState<Capabilities | null>(null);
-  const [loading, setLoading] = useState(true);
- 
-  // Close on Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onClose();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose]);
- 
-  useEffect(() => {
-    api.getArchiveCapabilities(archiveId)
-      .then(caps => {
-        setCapabilities(caps);
-        // Auto-select the first available tab
-        if (caps.has_model) {
-          setActiveTab('3d');
-        } else if (caps.has_gcode) {
-          setActiveTab('gcode');
-        }
-        setLoading(false);
-      })
-      .catch(() => {
-        // Fallback to 3D model tab if capabilities check fails
-        setCapabilities({ has_model: true, has_gcode: false, build_volume: { x: 256, y: 256, z: 256 } });
-        setActiveTab('3d');
-        setLoading(false);
-      });
-  }, [archiveId]);
- 
-  const handleOpenInSlicer = () => {
-    // Use bambustudioopen:// protocol like MakerWorld does
-    // URL must include .3mf filename for Bambu Studio to recognize the format
-    const filename = title || 'model';
-    const downloadUrl = `${window.location.origin}${api.getArchiveForSlicer(archiveId, filename)}`;
-    window.location.href = `bambustudioopen://${encodeURIComponent(downloadUrl)}`;
-  };
- 
-  return (
-    <div
-      className="fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-8"
-      onClick={onClose}
-    >
-      <div
-        className="bg-bambu-dark-secondary rounded-xl border border-bambu-dark-tertiary w-full max-w-4xl h-[80vh] flex flex-col"
-        onClick={(e) => e.stopPropagation()}
-      >
-        {/* Header */}
-        <div className="flex items-center justify-between px-6 py-4 border-b border-bambu-dark-tertiary">
-          <h2 className="text-lg font-semibold text-white truncate flex-1 mr-4">{title}</h2>
-          <div className="flex items-center gap-2">
-            <Button variant="secondary" size="sm" onClick={handleOpenInSlicer}>
-              <ExternalLink className="w-4 h-4" />
-              Open in Slicer
-            </Button>
-            <Button variant="ghost" size="sm" onClick={onClose}>
-              <X className="w-5 h-5" />
-            </Button>
-          </div>
-        </div>
- 
-        {/* Tabs - only show if we have capabilities */}
-        {capabilities && (
-          <div className="flex border-b border-bambu-dark-tertiary">
-            <button
-              onClick={() => capabilities.has_model && setActiveTab('3d')}
-              disabled={!capabilities.has_model}
-              className={`flex items-center gap-2 px-6 py-3 text-sm font-medium transition-colors ${
-                activeTab === '3d'
-                  ? 'text-bambu-green border-b-2 border-bambu-green'
-                  : capabilities.has_model
-                    ? 'text-bambu-gray hover:text-white'
-                    : 'text-bambu-gray/30 cursor-not-allowed'
-              }`}
-            >
-              <Box className="w-4 h-4" />
-              3D Model
-              {!capabilities.has_model && <span className="text-xs">(not available)</span>}
-            </button>
-            <button
-              onClick={() => capabilities.has_gcode && setActiveTab('gcode')}
-              disabled={!capabilities.has_gcode}
-              className={`flex items-center gap-2 px-6 py-3 text-sm font-medium transition-colors ${
-                activeTab === 'gcode'
-                  ? 'text-bambu-green border-b-2 border-bambu-green'
-                  : capabilities.has_gcode
-                    ? 'text-bambu-gray hover:text-white'
-                    : 'text-bambu-gray/30 cursor-not-allowed'
-              }`}
-            >
-              <Code2 className="w-4 h-4" />
-              G-code Preview
-              {!capabilities.has_gcode && <span className="text-xs">(not sliced)</span>}
-            </button>
-          </div>
-        )}
- 
-        {/* Viewer */}
-        <div className="flex-1 overflow-hidden p-4">
-          {loading ? (
-            <div className="w-full h-full flex items-center justify-center">
-              <Loader2 className="w-8 h-8 animate-spin text-bambu-green" />
-            </div>
-          ) : activeTab === '3d' && capabilities ? (
-            <ModelViewer
-              url={api.getArchiveDownload(archiveId)}
-              buildVolume={capabilities.build_volume}
-              className="w-full h-full"
-            />
-          ) : activeTab === 'gcode' && capabilities ? (
-            <GcodeViewer
-              gcodeUrl={api.getArchiveGcode(archiveId)}
-              buildVolume={capabilities.build_volume}
-              className="w-full h-full"
-            />
-          ) : (
-            <div className="w-full h-full flex items-center justify-center text-bambu-gray">
-              No preview available for this file
-            </div>
-          )}
-        </div>
-      </div>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/NotificationLogViewer.tsx.html b/frontend/coverage/src/components/NotificationLogViewer.tsx.html deleted file mode 100644 index e589722ec..000000000 --- a/frontend/coverage/src/components/NotificationLogViewer.tsx.html +++ /dev/null @@ -1,946 +0,0 @@ - - - - - - Code coverage report for src/components/NotificationLogViewer.tsx - - - - - - - - - -
-
-

All files / src/components NotificationLogViewer.tsx

-
- -
- 0% - Statements - 0/221 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/221 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState } from 'react';
-import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
-import { History, CheckCircle, XCircle, Loader2, Trash2, RefreshCw, ChevronDown, ChevronUp } from 'lucide-react';
-import { api } from '../api/client';
-import type { NotificationLogEntry } from '../api/client';
-import { Button } from './Button';
-import { useToast } from '../contexts/ToastContext';
- 
-const EVENT_LABELS: Record<string, string> = {
-  print_start: 'Print Started',
-  print_complete: 'Print Complete',
-  print_failed: 'Print Failed',
-  print_stopped: 'Print Stopped',
-  print_progress: 'Progress',
-  printer_offline: 'Printer Offline',
-  printer_error: 'Printer Error',
-  filament_low: 'Low Filament',
-  maintenance_due: 'Maintenance Due',
-  test: 'Test',
-};
- 
-const EVENT_COLORS: Record<string, string> = {
-  print_start: 'text-blue-400',
-  print_complete: 'text-bambu-green',
-  print_failed: 'text-red-400',
-  print_stopped: 'text-orange-400',
-  print_progress: 'text-yellow-400',
-  printer_offline: 'text-gray-400',
-  printer_error: 'text-rose-400',
-  filament_low: 'text-cyan-400',
-  maintenance_due: 'text-purple-400',
-  test: 'text-bambu-gray',
-};
- 
-interface NotificationLogViewerProps {
-  onClose: () => void;
-}
- 
-export function NotificationLogViewer({ onClose }: NotificationLogViewerProps) {
-  const queryClient = useQueryClient();
-  const { showToast } = useToast();
-  const [days, setDays] = useState(7);
-  const [expandedId, setExpandedId] = useState<number | null>(null);
-  const [showFailedOnly, setShowFailedOnly] = useState(false);
- 
-  const { data: logs, isLoading, refetch, isRefetching } = useQuery({
-    queryKey: ['notification-logs', days, showFailedOnly],
-    queryFn: () => api.getNotificationLogs({
-      days,
-      limit: 100,
-      success: showFailedOnly ? false : undefined,
-    }),
-  });
- 
-  const { data: stats } = useQuery({
-    queryKey: ['notification-log-stats', days],
-    queryFn: () => api.getNotificationLogStats(days),
-  });
- 
-  const clearMutation = useMutation({
-    mutationFn: () => api.clearNotificationLogs(30),
-    onSuccess: (data) => {
-      showToast(data.message, 'success');
-      queryClient.invalidateQueries({ queryKey: ['notification-logs'] });
-      queryClient.invalidateQueries({ queryKey: ['notification-log-stats'] });
-    },
-    onError: (error: Error) => {
-      showToast(`Failed to clear logs: ${error.message}`, 'error');
-    },
-  });
- 
-  const formatDate = (dateStr: string) => {
-    const date = new Date(dateStr);
-    const now = new Date();
-    const diff = now.getTime() - date.getTime();
- 
-    if (diff < 60000) return 'Just now';
-    if (diff < 3600000) return `${Math.floor(diff / 60000)}m ago`;
-    if (diff < 86400000) return `${Math.floor(diff / 3600000)}h ago`;
- 
-    return date.toLocaleDateString() + ' ' + date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
-  };
- 
-  return (
-    <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4">
-      <div className="bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg w-full max-w-3xl max-h-[85vh] flex flex-col">
-        {/* Header */}
-        <div className="p-4 border-b border-bambu-dark-tertiary flex items-center justify-between">
-          <div className="flex items-center gap-3">
-            <History className="w-5 h-5 text-bambu-green" />
-            <h2 className="text-lg font-semibold text-white">Notification Log</h2>
-          </div>
-          <button
-            onClick={onClose}
-            className="text-bambu-gray hover:text-white transition-colors"
-          >
-            &times;
-          </button>
-        </div>
- 
-        {/* Stats Bar */}
-        {stats && (
-          <div className="px-4 py-3 border-b border-bambu-dark-tertiary bg-bambu-dark/50">
-            <div className="flex items-center gap-6 text-sm">
-              <span className="text-bambu-gray">
-                Last {days} days: <span className="text-white font-medium">{stats.total}</span> notifications
-              </span>
-              <span className="flex items-center gap-1 text-bambu-green">
-                <CheckCircle className="w-4 h-4" />
-                {stats.success_count} sent
-              </span>
-              {stats.failure_count > 0 && (
-                <span className="flex items-center gap-1 text-red-400">
-                  <XCircle className="w-4 h-4" />
-                  {stats.failure_count} failed
-                </span>
-              )}
-            </div>
-          </div>
-        )}
- 
-        {/* Filters */}
-        <div className="px-4 py-3 border-b border-bambu-dark-tertiary flex items-center gap-4">
-          <select
-            value={days}
-            onChange={(e) => setDays(Number(e.target.value))}
-            className="px-3 py-1.5 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm focus:outline-none focus:ring-1 focus:ring-bambu-green"
-          >
-            <option value={1}>Last 24 hours</option>
-            <option value={7}>Last 7 days</option>
-            <option value={30}>Last 30 days</option>
-            <option value={90}>Last 90 days</option>
-          </select>
- 
-          <label className="flex items-center gap-2 text-sm text-bambu-gray cursor-pointer">
-            <input
-              type="checkbox"
-              checked={showFailedOnly}
-              onChange={(e) => setShowFailedOnly(e.target.checked)}
-              className="rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green"
-            />
-            Show failed only
-          </label>
- 
-          <div className="flex-1" />
- 
-          <Button
-            size="sm"
-            variant="secondary"
-            onClick={() => refetch()}
-            disabled={isRefetching}
-          >
-            {isRefetching ? (
-              <Loader2 className="w-4 h-4 animate-spin" />
-            ) : (
-              <RefreshCw className="w-4 h-4" />
-            )}
-            Refresh
-          </Button>
- 
-          <Button
-            size="sm"
-            variant="secondary"
-            onClick={() => clearMutation.mutate()}
-            disabled={clearMutation.isPending}
-            className="text-red-400 hover:text-red-300"
-          >
-            {clearMutation.isPending ? (
-              <Loader2 className="w-4 h-4 animate-spin" />
-            ) : (
-              <Trash2 className="w-4 h-4" />
-            )}
-            Clear Old
-          </Button>
-        </div>
- 
-        {/* Log List */}
-        <div className="flex-1 overflow-y-auto p-4">
-          {isLoading ? (
-            <div className="flex justify-center py-12">
-              <Loader2 className="w-6 h-6 text-bambu-green animate-spin" />
-            </div>
-          ) : logs && logs.length > 0 ? (
-            <div className="space-y-2">
-              {logs.map((log) => (
-                <LogEntry
-                  key={log.id}
-                  log={log}
-                  isExpanded={expandedId === log.id}
-                  onToggle={() => setExpandedId(expandedId === log.id ? null : log.id)}
-                  formatDate={formatDate}
-                />
-              ))}
-            </div>
-          ) : (
-            <div className="text-center py-12 text-bambu-gray">
-              <History className="w-12 h-12 mx-auto mb-3 opacity-30" />
-              <p className="text-sm">
-                {showFailedOnly ? 'No failed notifications' : 'No notifications logged'}
-              </p>
-            </div>
-          )}
-        </div>
-      </div>
-    </div>
-  );
-}
- 
-function LogEntry({
-  log,
-  isExpanded,
-  onToggle,
-  formatDate,
-}: {
-  log: NotificationLogEntry;
-  isExpanded: boolean;
-  onToggle: () => void;
-  formatDate: (date: string) => string;
-}) {
-  return (
-    <div
-      className={`border rounded-lg overflow-hidden transition-colors ${
-        log.success
-          ? 'border-bambu-dark-tertiary bg-bambu-dark/30'
-          : 'border-red-500/30 bg-red-500/5'
-      }`}
-    >
-      <button
-        className="w-full px-3 py-2 flex items-center gap-3 text-left hover:bg-bambu-dark/50 transition-colors"
-        onClick={onToggle}
-      >
-        {log.success ? (
-          <CheckCircle className="w-4 h-4 text-bambu-green shrink-0" />
-        ) : (
-          <XCircle className="w-4 h-4 text-red-400 shrink-0" />
-        )}
- 
-        <span className={`text-xs font-medium ${EVENT_COLORS[log.event_type] || 'text-bambu-gray'}`}>
-          {EVENT_LABELS[log.event_type] || log.event_type}
-        </span>
- 
-        <span className="text-sm text-white truncate flex-1">
-          {log.provider_name || 'Unknown Provider'}
-        </span>
- 
-        {log.printer_name && (
-          <span className="text-xs text-bambu-gray">
-            {log.printer_name}
-          </span>
-        )}
- 
-        <span className="text-xs text-bambu-gray shrink-0">
-          {formatDate(log.created_at)}
-        </span>
- 
-        {isExpanded ? (
-          <ChevronUp className="w-4 h-4 text-bambu-gray shrink-0" />
-        ) : (
-          <ChevronDown className="w-4 h-4 text-bambu-gray shrink-0" />
-        )}
-      </button>
- 
-      {isExpanded && (
-        <div className="px-3 py-2 border-t border-bambu-dark-tertiary bg-bambu-dark/20 space-y-2">
-          <div>
-            <p className="text-xs text-bambu-gray mb-1">Title</p>
-            <p className="text-sm text-white">{log.title}</p>
-          </div>
-          <div>
-            <p className="text-xs text-bambu-gray mb-1">Message</p>
-            <p className="text-sm text-white whitespace-pre-wrap">{log.message}</p>
-          </div>
-          {!log.success && log.error_message && (
-            <div>
-              <p className="text-xs text-red-400 mb-1">Error</p>
-              <p className="text-sm text-red-300">{log.error_message}</p>
-            </div>
-          )}
-          <div className="flex gap-4 text-xs text-bambu-gray pt-1">
-            <span>Provider: {log.provider_type}</span>
-            <span>Time: {new Date(log.created_at).toLocaleString()}</span>
-          </div>
-        </div>
-      )}
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/NotificationProviderCard.tsx.html b/frontend/coverage/src/components/NotificationProviderCard.tsx.html deleted file mode 100644 index 91736a3c8..000000000 --- a/frontend/coverage/src/components/NotificationProviderCard.tsx.html +++ /dev/null @@ -1,1429 +0,0 @@ - - - - - - Code coverage report for src/components/NotificationProviderCard.tsx - - - - - - - - - -
-
-

All files / src/components NotificationProviderCard.tsx

-
- -
- 0% - Statements - 0/340 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/340 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -425 -426 -427 -428 -429 -430 -431 -432 -433 -434 -435 -436 -437 -438 -439 -440 -441 -442 -443 -444 -445 -446 -447 -448 -449  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState } from 'react';
-import { useMutation, useQueryClient, useQuery } from '@tanstack/react-query';
-import { Bell, Trash2, Settings2, Edit2, Send, Loader2, CheckCircle, XCircle, Moon, Clock, ChevronDown, ChevronUp, Calendar } from 'lucide-react';
-import { api } from '../api/client';
-import type { NotificationProvider, NotificationProviderUpdate } from '../api/client';
-import { Card, CardContent } from './Card';
-import { Button } from './Button';
-import { ConfirmModal } from './ConfirmModal';
-import { Toggle } from './Toggle';
- 
-interface NotificationProviderCardProps {
-  provider: NotificationProvider;
-  onEdit: (provider: NotificationProvider) => void;
-}
- 
-const PROVIDER_LABELS: Record<string, string> = {
-  callmebot: 'CallMeBot/WhatsApp',
-  ntfy: 'ntfy',
-  pushover: 'Pushover',
-  telegram: 'Telegram',
-  email: 'Email',
-  discord: 'Discord',
-  webhook: 'Webhook',
-};
- 
-export function NotificationProviderCard({ provider, onEdit }: NotificationProviderCardProps) {
-  const queryClient = useQueryClient();
-  const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);
-  const [isExpanded, setIsExpanded] = useState(false);
-  const [testResult, setTestResult] = useState<{ success: boolean; message: string } | null>(null);
- 
-  // Fetch printers for linking
-  const { data: printers } = useQuery({
-    queryKey: ['printers'],
-    queryFn: api.getPrinters,
-  });
- 
-  const linkedPrinter = printers?.find(p => p.id === provider.printer_id);
- 
-  // Update mutation
-  const updateMutation = useMutation({
-    mutationFn: (data: NotificationProviderUpdate) => api.updateNotificationProvider(provider.id, data),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['notification-providers'] });
-    },
-  });
- 
-  // Delete mutation
-  const deleteMutation = useMutation({
-    mutationFn: () => api.deleteNotificationProvider(provider.id),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['notification-providers'] });
-    },
-  });
- 
-  // Test mutation
-  const testMutation = useMutation({
-    mutationFn: () => api.testNotificationProvider(provider.id),
-    onSuccess: (result) => {
-      setTestResult(result);
-      queryClient.invalidateQueries({ queryKey: ['notification-providers'] });
-    },
-    onError: (err: Error) => {
-      setTestResult({ success: false, message: err.message });
-    },
-  });
- 
-  // Format time for display
-  const formatTime = (time: string | null) => {
-    if (!time) return '';
-    return time;
-  };
- 
-  return (
-    <>
-      <Card className="relative">
-        <CardContent className="p-4">
-          {/* Header Row */}
-          <div className="flex items-start justify-between mb-3">
-            <div className="flex items-center gap-3">
-              <div className={`p-2 rounded-lg ${provider.enabled ? 'bg-bambu-green/20' : 'bg-bambu-dark'}`}>
-                <Bell className={`w-5 h-5 ${provider.enabled ? 'text-bambu-green' : 'text-bambu-gray'}`} />
-              </div>
-              <div>
-                <h3 className="font-medium text-white">{provider.name}</h3>
-                <p className="text-sm text-bambu-gray">{PROVIDER_LABELS[provider.provider_type] || provider.provider_type}</p>
-              </div>
-            </div>
- 
-            {/* Quick enable/disable toggle + Status indicator */}
-            <div className="flex items-center gap-3">
-              {provider.last_success && (
-                <span className="text-xs text-bambu-green hidden sm:inline">Last: {new Date(provider.last_success).toLocaleDateString()}</span>
-              )}
-              {/* Only show error if it's more recent than last success */}
-              {provider.last_error && provider.last_error_at && (
-                !provider.last_success || new Date(provider.last_error_at) > new Date(provider.last_success)
-              ) && (
-                <span className="text-xs text-red-400" title={provider.last_error}>Error</span>
-              )}
-              <Toggle
-                checked={provider.enabled}
-                onChange={(checked) => updateMutation.mutate({ enabled: checked })}
-              />
-            </div>
-          </div>
- 
-          {/* Linked Printer */}
-          {linkedPrinter && (
-            <div className="mb-3 px-2 py-1.5 bg-bambu-dark rounded-lg">
-              <span className="text-xs text-bambu-gray">Printer: </span>
-              <span className="text-sm text-white">{linkedPrinter.name}</span>
-            </div>
-          )}
-          {!linkedPrinter && !provider.printer_id && (
-            <div className="mb-3 px-2 py-1.5 bg-bambu-dark rounded-lg">
-              <span className="text-xs text-bambu-gray">All printers</span>
-            </div>
-          )}
- 
-          {/* Event summary - show all event tags */}
-          <div className="mb-3 flex flex-wrap gap-1">
-            {provider.on_print_start && (
-              <span className="px-2 py-0.5 bg-blue-500/20 text-blue-400 text-xs rounded">Start</span>
-            )}
-            {provider.on_print_complete && (
-              <span className="px-2 py-0.5 bg-bambu-green/20 text-bambu-green text-xs rounded">Complete</span>
-            )}
-            {provider.on_print_failed && (
-              <span className="px-2 py-0.5 bg-red-500/20 text-red-400 text-xs rounded">Failed</span>
-            )}
-            {provider.on_print_stopped && (
-              <span className="px-2 py-0.5 bg-orange-500/20 text-orange-400 text-xs rounded">Stopped</span>
-            )}
-            {provider.on_print_progress && (
-              <span className="px-2 py-0.5 bg-yellow-500/20 text-yellow-400 text-xs rounded">Progress</span>
-            )}
-            {provider.on_printer_offline && (
-              <span className="px-2 py-0.5 bg-gray-500/20 text-gray-400 text-xs rounded">Offline</span>
-            )}
-            {provider.on_printer_error && (
-              <span className="px-2 py-0.5 bg-rose-500/20 text-rose-400 text-xs rounded">Error</span>
-            )}
-            {provider.on_filament_low && (
-              <span className="px-2 py-0.5 bg-cyan-500/20 text-cyan-400 text-xs rounded">Low Filament</span>
-            )}
-            {provider.on_maintenance_due && (
-              <span className="px-2 py-0.5 bg-purple-500/20 text-purple-400 text-xs rounded">Maintenance</span>
-            )}
-            {provider.on_ams_humidity_high && (
-              <span className="px-2 py-0.5 bg-blue-600/20 text-blue-300 text-xs rounded">Humidity</span>
-            )}
-            {provider.on_ams_temperature_high && (
-              <span className="px-2 py-0.5 bg-orange-600/20 text-orange-300 text-xs rounded">Temperature</span>
-            )}
-            {provider.quiet_hours_enabled && (
-              <span className="px-2 py-0.5 bg-indigo-500/20 text-indigo-400 text-xs rounded flex items-center gap-1">
-                <Moon className="w-3 h-3" />
-                Quiet
-              </span>
-            )}
-            {provider.daily_digest_enabled && (
-              <span className="px-2 py-0.5 bg-emerald-500/20 text-emerald-400 text-xs rounded flex items-center gap-1">
-                <Calendar className="w-3 h-3" />
-                Digest {provider.daily_digest_time}
-              </span>
-            )}
-          </div>
- 
-          {/* Test Button */}
-          <div className="mb-3">
-            <Button
-              size="sm"
-              variant="secondary"
-              disabled={testMutation.isPending}
-              onClick={() => {
-                setTestResult(null);
-                testMutation.mutate();
-              }}
-              className="w-full"
-            >
-              {testMutation.isPending ? (
-                <Loader2 className="w-4 h-4 animate-spin" />
-              ) : (
-                <Send className="w-4 h-4" />
-              )}
-              Send Test Notification
-            </Button>
-          </div>
- 
-          {/* Test Result */}
-          {testResult && (
-            <div className={`mb-3 p-2 rounded-lg flex items-center gap-2 text-sm ${
-              testResult.success
-                ? 'bg-bambu-green/20 text-bambu-green'
-                : 'bg-red-500/20 text-red-400'
-            }`}>
-              {testResult.success ? (
-                <CheckCircle className="w-4 h-4" />
-              ) : (
-                <XCircle className="w-4 h-4" />
-              )}
-              <span>{testResult.message}</span>
-            </div>
-          )}
- 
-          {/* Toggle Settings Panel */}
-          <button
-            onClick={() => setIsExpanded(!isExpanded)}
-            className="w-full flex items-center justify-between py-2 text-sm text-bambu-gray hover:text-white transition-colors border-t border-bambu-dark-tertiary"
-          >
-            <span className="flex items-center gap-2">
-              <Settings2 className="w-4 h-4" />
-              Event Settings
-            </span>
-            {isExpanded ? (
-              <ChevronUp className="w-4 h-4" />
-            ) : (
-              <ChevronDown className="w-4 h-4" />
-            )}
-          </button>
- 
-          {/* Expanded Settings */}
-          {isExpanded && (
-            <div className="pt-3 border-t border-bambu-dark-tertiary space-y-4">
-              {/* Enabled Toggle */}
-              <div className="flex items-center justify-between">
-                <div>
-                  <p className="text-sm text-white">Enabled</p>
-                  <p className="text-xs text-bambu-gray">Send notifications from this provider</p>
-                </div>
-                <Toggle
-                  checked={provider.enabled}
-                  onChange={(checked) => updateMutation.mutate({ enabled: checked })}
-                />
-              </div>
- 
-              {/* Print Lifecycle Events */}
-              <div className="space-y-2">
-                <p className="text-xs text-bambu-gray uppercase tracking-wide">Print Events</p>
- 
-                <div className="flex items-center justify-between">
-                  <p className="text-sm text-white">Print Started</p>
-                  <Toggle
-                    checked={provider.on_print_start}
-                    onChange={(checked) => updateMutation.mutate({ on_print_start: checked })}
-                  />
-                </div>
- 
-                <div className="flex items-center justify-between">
-                  <p className="text-sm text-white">Print Completed</p>
-                  <Toggle
-                    checked={provider.on_print_complete}
-                    onChange={(checked) => updateMutation.mutate({ on_print_complete: checked })}
-                  />
-                </div>
- 
-                <div className="flex items-center justify-between">
-                  <p className="text-sm text-white">Print Failed</p>
-                  <Toggle
-                    checked={provider.on_print_failed}
-                    onChange={(checked) => updateMutation.mutate({ on_print_failed: checked })}
-                  />
-                </div>
- 
-                <div className="flex items-center justify-between">
-                  <p className="text-sm text-white">Print Stopped</p>
-                  <Toggle
-                    checked={provider.on_print_stopped}
-                    onChange={(checked) => updateMutation.mutate({ on_print_stopped: checked })}
-                  />
-                </div>
- 
-                <div className="flex items-center justify-between">
-                  <div>
-                    <p className="text-sm text-white">Progress Milestones</p>
-                    <p className="text-xs text-bambu-gray">Notify at 25%, 50%, 75%</p>
-                  </div>
-                  <Toggle
-                    checked={provider.on_print_progress}
-                    onChange={(checked) => updateMutation.mutate({ on_print_progress: checked })}
-                  />
-                </div>
-              </div>
- 
-              {/* Printer Status Events */}
-              <div className="space-y-2">
-                <p className="text-xs text-bambu-gray uppercase tracking-wide">Printer Status</p>
- 
-                <div className="flex items-center justify-between">
-                  <p className="text-sm text-white">Printer Offline</p>
-                  <Toggle
-                    checked={provider.on_printer_offline}
-                    onChange={(checked) => updateMutation.mutate({ on_printer_offline: checked })}
-                  />
-                </div>
- 
-                <div className="flex items-center justify-between">
-                  <p className="text-sm text-white">Printer Error</p>
-                  <Toggle
-                    checked={provider.on_printer_error}
-                    onChange={(checked) => updateMutation.mutate({ on_printer_error: checked })}
-                  />
-                </div>
- 
-                <div className="flex items-center justify-between">
-                  <p className="text-sm text-white">Low Filament</p>
-                  <Toggle
-                    checked={provider.on_filament_low}
-                    onChange={(checked) => updateMutation.mutate({ on_filament_low: checked })}
-                  />
-                </div>
- 
-                <div className="flex items-center justify-between">
-                  <div>
-                    <p className="text-sm text-white">Maintenance Due</p>
-                    <p className="text-xs text-bambu-gray">Notify when maintenance is needed</p>
-                  </div>
-                  <Toggle
-                    checked={provider.on_maintenance_due ?? false}
-                    onChange={(checked) => updateMutation.mutate({ on_maintenance_due: checked })}
-                  />
-                </div>
-              </div>
- 
-              {/* AMS Environmental Alarms */}
-              <div className="space-y-2">
-                <p className="text-xs text-bambu-gray uppercase tracking-wide">AMS Alarms</p>
- 
-                <div className="flex items-center justify-between">
-                  <div>
-                    <p className="text-sm text-white">Humidity High</p>
-                    <p className="text-xs text-bambu-gray">Notify when humidity exceeds threshold</p>
-                  </div>
-                  <Toggle
-                    checked={provider.on_ams_humidity_high ?? false}
-                    onChange={(checked) => updateMutation.mutate({ on_ams_humidity_high: checked })}
-                  />
-                </div>
- 
-                <div className="flex items-center justify-between">
-                  <div>
-                    <p className="text-sm text-white">Temperature High</p>
-                    <p className="text-xs text-bambu-gray">Notify when temperature exceeds threshold</p>
-                  </div>
-                  <Toggle
-                    checked={provider.on_ams_temperature_high ?? false}
-                    onChange={(checked) => updateMutation.mutate({ on_ams_temperature_high: checked })}
-                  />
-                </div>
-              </div>
- 
-              {/* Quiet Hours */}
-              <div className="space-y-2">
-                <div className="flex items-center justify-between">
-                  <div className="flex items-center gap-2">
-                    <Moon className="w-4 h-4 text-purple-400" />
-                    <p className="text-sm text-white">Quiet Hours</p>
-                  </div>
-                  <Toggle
-                    checked={provider.quiet_hours_enabled}
-                    onChange={(checked) => updateMutation.mutate({ quiet_hours_enabled: checked })}
-                  />
-                </div>
- 
-                {provider.quiet_hours_enabled && (
-                  <div className="pl-4 border-l-2 border-bambu-dark-tertiary space-y-2">
-                    <p className="text-xs text-bambu-gray">No notifications during these hours</p>
-                    <div className="flex items-center gap-2">
-                      <Clock className="w-4 h-4 text-bambu-gray" />
-                      <span className="text-sm text-white">
-                        {formatTime(provider.quiet_hours_start) || '22:00'} - {formatTime(provider.quiet_hours_end) || '07:00'}
-                      </span>
-                    </div>
-                    <p className="text-xs text-bambu-gray">Edit provider to change quiet hours</p>
-                  </div>
-                )}
-              </div>
- 
-              {/* Daily Digest */}
-              <div className="space-y-2">
-                <div className="flex items-center justify-between">
-                  <div className="flex items-center gap-2">
-                    <Calendar className="w-4 h-4 text-emerald-400" />
-                    <p className="text-sm text-white">Daily Digest</p>
-                  </div>
-                  <Toggle
-                    checked={provider.daily_digest_enabled}
-                    onChange={(checked) => updateMutation.mutate({ daily_digest_enabled: checked })}
-                  />
-                </div>
- 
-                {provider.daily_digest_enabled && (
-                  <div className="pl-4 border-l-2 border-bambu-dark-tertiary space-y-2">
-                    <p className="text-xs text-bambu-gray">Batch notifications into a single daily summary</p>
-                    <div className="flex items-center gap-2">
-                      <Clock className="w-4 h-4 text-bambu-gray" />
-                      <span className="text-sm text-white">
-                        Send at {formatTime(provider.daily_digest_time) || '08:00'}
-                      </span>
-                    </div>
-                    <p className="text-xs text-bambu-gray">Edit provider to change digest time</p>
-                  </div>
-                )}
-              </div>
- 
-              {/* Action Buttons */}
-              <div className="flex gap-2 pt-2">
-                <Button
-                  size="sm"
-                  variant="secondary"
-                  onClick={() => onEdit(provider)}
-                  className="flex-1"
-                >
-                  <Edit2 className="w-4 h-4" />
-                  Edit
-                </Button>
-                <Button
-                  size="sm"
-                  variant="secondary"
-                  onClick={() => setShowDeleteConfirm(true)}
-                  className="text-red-400 hover:text-red-300"
-                >
-                  <Trash2 className="w-4 h-4" />
-                </Button>
-              </div>
-            </div>
-          )}
-        </CardContent>
-      </Card>
- 
-      {/* Delete Confirmation */}
-      {showDeleteConfirm && (
-        <ConfirmModal
-          title="Delete Notification Provider"
-          message={`Are you sure you want to delete "${provider.name}"? This cannot be undone.`}
-          confirmText="Delete"
-          variant="danger"
-          onConfirm={() => {
-            deleteMutation.mutate();
-            setShowDeleteConfirm(false);
-          }}
-          onCancel={() => setShowDeleteConfirm(false)}
-        />
-      )}
-    </>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/NotificationTemplateEditor.tsx.html b/frontend/coverage/src/components/NotificationTemplateEditor.tsx.html deleted file mode 100644 index b2cbce9c8..000000000 --- a/frontend/coverage/src/components/NotificationTemplateEditor.tsx.html +++ /dev/null @@ -1,913 +0,0 @@ - - - - - - Code coverage report for src/components/NotificationTemplateEditor.tsx - - - - - - - - - -
-
-

All files / src/components NotificationTemplateEditor.tsx

-
- -
- 0% - Statements - 0/205 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/205 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useEffect, useRef } from 'react';
-import { useMutation, useQueryClient, useQuery } from '@tanstack/react-query';
-import { X, Save, Loader2, RotateCcw, Plus, Eye } from 'lucide-react';
-import { api } from '../api/client';
-import type { NotificationTemplate, NotificationTemplateUpdate } from '../api/client';
-import { Button } from './Button';
- 
-interface NotificationTemplateEditorProps {
-  template: NotificationTemplate;
-  onClose: () => void;
-}
- 
-export function NotificationTemplateEditor({ template, onClose }: NotificationTemplateEditorProps) {
-  const queryClient = useQueryClient();
-  const bodyRef = useRef<HTMLTextAreaElement>(null);
- 
-  const [titleTemplate, setTitleTemplate] = useState(template.title_template);
-  const [bodyTemplate, setBodyTemplate] = useState(template.body_template);
-  const [error, setError] = useState<string | null>(null);
-  const [showPreview, setShowPreview] = useState(true);
- 
-  // Fetch variables for this event type
-  const { data: variablesData } = useQuery({
-    queryKey: ['template-variables'],
-    queryFn: api.getTemplateVariables,
-  });
- 
-  // Get variables for this template's event type
-  const eventVariables = variablesData?.find(v => v.event_type === template.event_type);
- 
-  // Live preview
-  const { data: preview, isLoading: previewLoading } = useQuery({
-    queryKey: ['template-preview', template.event_type, titleTemplate, bodyTemplate],
-    queryFn: () => api.previewTemplate({
-      event_type: template.event_type,
-      title_template: titleTemplate,
-      body_template: bodyTemplate,
-    }),
-    enabled: showPreview && titleTemplate.length > 0 && bodyTemplate.length > 0,
-  });
- 
-  // Close on Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onClose();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose]);
- 
-  // Update mutation
-  const updateMutation = useMutation({
-    mutationFn: (data: NotificationTemplateUpdate) => api.updateNotificationTemplate(template.id, data),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['notification-templates'] });
-      onClose();
-    },
-    onError: (err: Error) => {
-      setError(err.message);
-    },
-  });
- 
-  // Reset mutation
-  const resetMutation = useMutation({
-    mutationFn: () => api.resetNotificationTemplate(template.id),
-    onSuccess: (resetTemplate) => {
-      setTitleTemplate(resetTemplate.title_template);
-      setBodyTemplate(resetTemplate.body_template);
-      queryClient.invalidateQueries({ queryKey: ['notification-templates'] });
-    },
-    onError: (err: Error) => {
-      setError(err.message);
-    },
-  });
- 
-  const handleSubmit = (e: React.FormEvent) => {
-    e.preventDefault();
-    setError(null);
- 
-    if (!titleTemplate.trim()) {
-      setError('Title is required');
-      return;
-    }
-    if (!bodyTemplate.trim()) {
-      setError('Body is required');
-      return;
-    }
- 
-    updateMutation.mutate({
-      title_template: titleTemplate,
-      body_template: bodyTemplate,
-    });
-  };
- 
-  const insertVariable = (variable: string) => {
-    const textarea = bodyRef.current;
-    if (!textarea) return;
- 
-    const start = textarea.selectionStart;
-    const end = textarea.selectionEnd;
-    const text = bodyTemplate;
-    const before = text.substring(0, start);
-    const after = text.substring(end);
-    const newValue = before + `{${variable}}` + after;
- 
-    setBodyTemplate(newValue);
- 
-    // Restore focus and cursor position
-    setTimeout(() => {
-      textarea.focus();
-      const newCursor = start + variable.length + 2;
-      textarea.setSelectionRange(newCursor, newCursor);
-    }, 0);
-  };
- 
-  const hasChanges = titleTemplate !== template.title_template || bodyTemplate !== template.body_template;
- 
-  return (
-    <div className="fixed inset-0 bg-black/80 flex items-center justify-center z-50 p-4">
-      <div className="bg-bambu-dark-secondary rounded-lg w-full max-w-2xl max-h-[90vh] flex flex-col">
-        {/* Header */}
-        <div className="flex items-center justify-between p-4 border-b border-bambu-dark-tertiary shrink-0">
-          <h2 className="text-lg font-semibold text-white">
-            Edit Template: {template.name}
-          </h2>
-          <button
-            onClick={onClose}
-            className="p-1 hover:bg-bambu-dark-tertiary rounded transition-colors"
-          >
-            <X className="w-5 h-5 text-bambu-gray" />
-          </button>
-        </div>
- 
-        {/* Content */}
-        <form onSubmit={handleSubmit} className="flex-1 overflow-y-auto p-4 space-y-4">
-          {error && (
-            <div className="p-3 bg-red-500/20 border border-red-500/50 rounded text-red-400 text-sm">
-              {error}
-            </div>
-          )}
- 
-          {/* Title */}
-          <div>
-            <label className="block text-sm font-medium text-bambu-gray mb-1">
-              Title
-            </label>
-            <input
-              type="text"
-              value={titleTemplate}
-              onChange={(e) => setTitleTemplate(e.target.value)}
-              className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white focus:outline-none focus:ring-1 focus:ring-bambu-green"
-              placeholder="Notification title..."
-            />
-          </div>
- 
-          {/* Body */}
-          <div>
-            <label className="block text-sm font-medium text-bambu-gray mb-1">
-              Body
-            </label>
-            <textarea
-              ref={bodyRef}
-              value={bodyTemplate}
-              onChange={(e) => setBodyTemplate(e.target.value)}
-              rows={4}
-              className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white focus:outline-none focus:ring-1 focus:ring-bambu-green font-mono text-sm resize-none"
-              placeholder="Notification body..."
-            />
-          </div>
- 
-          {/* Available Variables */}
-          {eventVariables && (
-            <div>
-              <label className="block text-sm font-medium text-bambu-gray mb-2">
-                Available Variables
-              </label>
-              <div className="flex flex-wrap gap-2">
-                {eventVariables.variables.map((variable) => (
-                  <button
-                    key={variable}
-                    type="button"
-                    onClick={() => insertVariable(variable)}
-                    className="inline-flex items-center gap-1 px-2 py-1 bg-bambu-dark hover:bg-bambu-dark-tertiary border border-bambu-dark-tertiary rounded text-xs text-bambu-gray hover:text-white transition-colors"
-                  >
-                    <Plus className="w-3 h-3" />
-                    {variable}
-                  </button>
-                ))}
-              </div>
-              <p className="text-xs text-bambu-gray/60 mt-1">
-                Click to insert at cursor position in body
-              </p>
-            </div>
-          )}
- 
-          {/* Preview */}
-          <div>
-            <div className="flex items-center justify-between mb-2">
-              <label className="text-sm font-medium text-bambu-gray flex items-center gap-2">
-                <Eye className="w-4 h-4" />
-                Live Preview
-              </label>
-              <button
-                type="button"
-                onClick={() => setShowPreview(!showPreview)}
-                className="text-xs text-bambu-green hover:text-bambu-green-light"
-              >
-                {showPreview ? 'Hide' : 'Show'}
-              </button>
-            </div>
-            {showPreview && (
-              <div className="bg-bambu-dark border border-bambu-dark-tertiary rounded p-3 space-y-2">
-                {previewLoading ? (
-                  <div className="flex items-center gap-2 text-bambu-gray text-sm">
-                    <Loader2 className="w-4 h-4 animate-spin" />
-                    Loading preview...
-                  </div>
-                ) : preview ? (
-                  <>
-                    <div>
-                      <span className="text-xs text-bambu-gray">Title:</span>
-                      <div className="text-white font-medium">{preview.title}</div>
-                    </div>
-                    <div>
-                      <span className="text-xs text-bambu-gray">Body:</span>
-                      <div className="text-white whitespace-pre-wrap text-sm">{preview.body}</div>
-                    </div>
-                  </>
-                ) : (
-                  <div className="text-bambu-gray text-sm">
-                    Enter template content to see preview
-                  </div>
-                )}
-              </div>
-            )}
-          </div>
-        </form>
- 
-        {/* Footer */}
-        <div className="flex items-center justify-between p-4 border-t border-bambu-dark-tertiary shrink-0">
-          <Button
-            type="button"
-            variant="ghost"
-            onClick={() => resetMutation.mutate()}
-            disabled={resetMutation.isPending}
-            className="text-orange-400 hover:text-orange-300"
-          >
-            {resetMutation.isPending ? (
-              <Loader2 className="w-4 h-4 animate-spin mr-2" />
-            ) : (
-              <RotateCcw className="w-4 h-4 mr-2" />
-            )}
-            Reset to Default
-          </Button>
- 
-          <div className="flex gap-2">
-            <Button type="button" variant="secondary" onClick={onClose}>
-              Cancel
-            </Button>
-            <Button
-              onClick={handleSubmit}
-              disabled={updateMutation.isPending || !hasChanges}
-            >
-              {updateMutation.isPending ? (
-                <Loader2 className="w-4 h-4 animate-spin mr-2" />
-              ) : (
-                <Save className="w-4 h-4 mr-2" />
-              )}
-              Save
-            </Button>
-          </div>
-        </div>
-      </div>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/PhotoGalleryModal.tsx.html b/frontend/coverage/src/components/PhotoGalleryModal.tsx.html deleted file mode 100644 index b35b1c6ec..000000000 --- a/frontend/coverage/src/components/PhotoGalleryModal.tsx.html +++ /dev/null @@ -1,598 +0,0 @@ - - - - - - Code coverage report for src/components/PhotoGalleryModal.tsx - - - - - - - - - -
-
-

All files / src/components PhotoGalleryModal.tsx

-
- -
- 0% - Statements - 0/124 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/124 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useEffect } from 'react';
-import { X, ChevronLeft, ChevronRight, Download, Trash2 } from 'lucide-react';
-import { api } from '../api/client';
-import { Button } from './Button';
-import { ConfirmModal } from './ConfirmModal';
- 
-interface PhotoGalleryModalProps {
-  archiveId: number;
-  archiveName: string;
-  photos: string[];
-  onClose: () => void;
-  onDelete?: (filename: string) => void;
-}
- 
-export function PhotoGalleryModal({
-  archiveId,
-  archiveName,
-  photos,
-  onClose,
-  onDelete,
-}: PhotoGalleryModalProps) {
-  const [currentIndex, setCurrentIndex] = useState(0);
-  const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);
- 
-  // Keyboard navigation
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onClose();
-      if (e.key === 'ArrowLeft') setCurrentIndex((i) => Math.max(0, i - 1));
-      if (e.key === 'ArrowRight') setCurrentIndex((i) => Math.min(photos.length - 1, i + 1));
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose, photos.length]);
- 
-  // Reset index if photos change
-  useEffect(() => {
-    if (currentIndex >= photos.length) {
-      setCurrentIndex(Math.max(0, photos.length - 1));
-    }
-  }, [photos.length, currentIndex]);
- 
-  if (photos.length === 0) {
-    onClose();
-    return null;
-  }
- 
-  const currentPhoto = photos[currentIndex];
-  const photoUrl = api.getArchivePhotoUrl(archiveId, currentPhoto);
- 
-  const handleDownload = () => {
-    const link = document.createElement('a');
-    link.href = photoUrl;
-    link.download = `${archiveName}_photo_${currentIndex + 1}.jpg`;
-    link.click();
-  };
- 
-  const handleDelete = () => {
-    if (onDelete) {
-      setShowDeleteConfirm(true);
-    }
-  };
- 
-  return (
-    <div
-      className="fixed inset-0 bg-black/90 flex items-center justify-center z-50"
-      onClick={onClose}
-    >
-      <div
-        className="relative w-full h-full flex flex-col"
-        onClick={(e) => e.stopPropagation()}
-      >
-        {/* Header */}
-        <div className="flex items-center justify-between px-6 py-4 bg-black/50">
-          <div>
-            <h2 className="text-lg font-semibold text-white">{archiveName}</h2>
-            <p className="text-sm text-bambu-gray">
-              Photo {currentIndex + 1} of {photos.length}
-            </p>
-          </div>
-          <div className="flex items-center gap-2">
-            <Button variant="secondary" size="sm" onClick={handleDownload}>
-              <Download className="w-4 h-4" />
-              Download
-            </Button>
-            {onDelete && (
-              <Button variant="secondary" size="sm" onClick={handleDelete} className="text-red-400 hover:text-red-300">
-                <Trash2 className="w-4 h-4" />
-              </Button>
-            )}
-            <button
-              onClick={onClose}
-              className="p-2 text-bambu-gray hover:text-white transition-colors"
-            >
-              <X className="w-6 h-6" />
-            </button>
-          </div>
-        </div>
- 
-        {/* Image */}
-        <div className="flex-1 min-h-0 flex items-center justify-center p-4 relative overflow-hidden">
-          {/* Previous button */}
-          {currentIndex > 0 && (
-            <button
-              onClick={() => setCurrentIndex((i) => i - 1)}
-              className="absolute left-4 z-10 p-3 bg-black/50 hover:bg-black/70 rounded-full transition-colors"
-            >
-              <ChevronLeft className="w-8 h-8 text-white" />
-            </button>
-          )}
- 
-          {/* Image */}
-          <img
-            src={photoUrl}
-            alt={`Photo ${currentIndex + 1}`}
-            className="max-w-full max-h-full object-contain rounded-lg"
-            style={{ maxHeight: 'calc(100vh - 200px)' }}
-          />
- 
-          {/* Next button */}
-          {currentIndex < photos.length - 1 && (
-            <button
-              onClick={() => setCurrentIndex((i) => i + 1)}
-              className="absolute right-4 z-10 p-3 bg-black/50 hover:bg-black/70 rounded-full transition-colors"
-            >
-              <ChevronRight className="w-8 h-8 text-white" />
-            </button>
-          )}
-        </div>
- 
-        {/* Thumbnails */}
-        {photos.length > 1 && (
-          <div className="flex justify-center gap-2 p-4 bg-black/50">
-            {photos.map((photo, index) => (
-              <button
-                key={photo}
-                onClick={() => setCurrentIndex(index)}
-                className={`w-16 h-16 rounded-lg overflow-hidden border-2 transition-colors ${
-                  index === currentIndex
-                    ? 'border-bambu-green'
-                    : 'border-transparent hover:border-bambu-gray'
-                }`}
-              >
-                <img
-                  src={api.getArchivePhotoUrl(archiveId, photo)}
-                  alt={`Thumbnail ${index + 1}`}
-                  className="w-full h-full object-cover"
-                />
-              </button>
-            ))}
-          </div>
-        )}
-      </div>
- 
-      {/* Delete Confirmation Modal */}
-      {showDeleteConfirm && (
-        <ConfirmModal
-          title="Delete Photo"
-          message="Delete this photo? This cannot be undone."
-          confirmText="Delete"
-          variant="danger"
-          onConfirm={() => {
-            onDelete?.(currentPhoto);
-            setShowDeleteConfirm(false);
-          }}
-          onCancel={() => setShowDeleteConfirm(false)}
-        />
-      )}
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/PrintCalendar.tsx.html b/frontend/coverage/src/components/PrintCalendar.tsx.html deleted file mode 100644 index 348145a84..000000000 --- a/frontend/coverage/src/components/PrintCalendar.tsx.html +++ /dev/null @@ -1,502 +0,0 @@ - - - - - - Code coverage report for src/components/PrintCalendar.tsx - - - - - - - - - -
-
-

All files / src/components PrintCalendar.tsx

-
- -
- 0% - Statements - 0/105 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/105 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useMemo } from 'react';
- 
-interface PrintCalendarProps {
-  printDates: string[]; // Array of ISO date strings
-  months?: number; // How many months to show (default 3)
-}
- 
-export function PrintCalendar({ printDates, months = 3 }: PrintCalendarProps) {
-  const { weeks, monthLabels, printCounts } = useMemo(() => {
-    // Count prints per day
-    const counts: Record<string, number> = {};
-    printDates.forEach((date) => {
-      const day = date.split('T')[0];
-      counts[day] = (counts[day] || 0) + 1;
-    });
- 
-    // Generate weeks for the last N months
-    const today = new Date();
-    const startDate = new Date(today);
-    startDate.setMonth(startDate.getMonth() - months);
-    startDate.setDate(startDate.getDate() - startDate.getDay()); // Start from Sunday
- 
-    const weeks: Date[][] = [];
-    const monthLabels: { month: string; weekIndex: number }[] = [];
-    let currentWeek: Date[] = [];
-    let lastMonth = -1;
- 
-    const current = new Date(startDate);
-    let weekIndex = 0;
- 
-    while (current <= today) {
-      if (current.getDay() === 0 && currentWeek.length > 0) {
-        weeks.push(currentWeek);
-        currentWeek = [];
-        weekIndex++;
-      }
- 
-      // Track month labels
-      if (current.getMonth() !== lastMonth) {
-        monthLabels.push({
-          month: current.toLocaleDateString('en-US', { month: 'short' }),
-          weekIndex,
-        });
-        lastMonth = current.getMonth();
-      }
- 
-      currentWeek.push(new Date(current));
-      current.setDate(current.getDate() + 1);
-    }
- 
-    if (currentWeek.length > 0) {
-      weeks.push(currentWeek);
-    }
- 
-    return { weeks, monthLabels, printCounts: counts };
-  }, [printDates, months]);
- 
-  const maxCount = Math.max(1, ...Object.values(printCounts));
- 
-  const getColor = (count: number) => {
-    if (count === 0) return 'bg-bambu-dark';
-    const intensity = count / maxCount;
-    if (intensity <= 0.25) return 'bg-bambu-green/30';
-    if (intensity <= 0.5) return 'bg-bambu-green/50';
-    if (intensity <= 0.75) return 'bg-bambu-green/75';
-    return 'bg-bambu-green';
-  };
- 
-  const dayLabels = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
- 
-  return (
-    <div className="overflow-x-auto">
-      {/* Month labels */}
-      <div className="flex mb-1 ml-8">
-        {monthLabels.map(({ month, weekIndex }, i) => (
-          <div
-            key={i}
-            className="text-xs text-bambu-gray"
-            style={{ marginLeft: i === 0 ? 0 : `${(weekIndex - (monthLabels[i - 1]?.weekIndex || 0)) * 14 - 24}px` }}
-          >
-            {month}
-          </div>
-        ))}
-      </div>
- 
-      <div className="flex gap-0.5">
-        {/* Day labels */}
-        <div className="flex flex-col gap-0.5 mr-1">
-          {dayLabels.map((day, i) => (
-            <div
-              key={day}
-              className="h-3 text-xs text-bambu-gray flex items-center"
-              style={{ visibility: i % 2 === 1 ? 'visible' : 'hidden' }}
-            >
-              {day}
-            </div>
-          ))}
-        </div>
- 
-        {/* Calendar grid */}
-        {weeks.map((week, weekIndex) => (
-          <div key={weekIndex} className="flex flex-col gap-0.5">
-            {[0, 1, 2, 3, 4, 5, 6].map((dayOfWeek) => {
-              const day = week.find((d) => d.getDay() === dayOfWeek);
-              if (!day) {
-                return <div key={dayOfWeek} className="w-3 h-3" />;
-              }
- 
-              const dateStr = day.toISOString().split('T')[0];
-              const count = printCounts[dateStr] || 0;
-              const isToday = dateStr === new Date().toISOString().split('T')[0];
- 
-              return (
-                <div
-                  key={dayOfWeek}
-                  className={`w-3 h-3 rounded-sm ${getColor(count)} ${isToday ? 'ring-1 ring-white' : ''}`}
-                  title={`${day.toLocaleDateString()}: ${count} print${count !== 1 ? 's' : ''}`}
-                />
-              );
-            })}
-          </div>
-        ))}
-      </div>
- 
-      {/* Legend */}
-      <div className="flex items-center gap-2 mt-3 text-xs text-bambu-gray">
-        <span>Less</span>
-        <div className="flex gap-0.5">
-          <div className="w-3 h-3 rounded-sm bg-bambu-dark" />
-          <div className="w-3 h-3 rounded-sm bg-bambu-green/30" />
-          <div className="w-3 h-3 rounded-sm bg-bambu-green/50" />
-          <div className="w-3 h-3 rounded-sm bg-bambu-green/75" />
-          <div className="w-3 h-3 rounded-sm bg-bambu-green" />
-        </div>
-        <span>More</span>
-      </div>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/PrinterQueueWidget.tsx.html b/frontend/coverage/src/components/PrinterQueueWidget.tsx.html deleted file mode 100644 index c41b2de33..000000000 --- a/frontend/coverage/src/components/PrinterQueueWidget.tsx.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - - Code coverage report for src/components/PrinterQueueWidget.tsx - - - - - - - - - -
-
-

All files / src/components PrinterQueueWidget.tsx

-
- -
- 0% - Statements - 0/51 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/51 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useQuery } from '@tanstack/react-query';
-import { Clock, Calendar, ChevronRight } from 'lucide-react';
-import { Link } from 'react-router-dom';
-import { api } from '../api/client';
- 
-interface PrinterQueueWidgetProps {
-  printerId: number;
-}
- 
-function formatRelativeTime(dateString: string | null): string {
-  if (!dateString) return 'ASAP';
-  const date = new Date(dateString);
-  const now = new Date();
-  const diff = date.getTime() - now.getTime();
- 
-  if (diff < 0) return 'Now';
-  if (diff < 60000) return 'In <1 min';
-  if (diff < 3600000) return `In ${Math.round(diff / 60000)} min`;
-  if (diff < 86400000) return `In ${Math.round(diff / 3600000)}h`;
-  return date.toLocaleDateString();
-}
- 
-export function PrinterQueueWidget({ printerId }: PrinterQueueWidgetProps) {
-  const { data: queue } = useQuery({
-    queryKey: ['queue', printerId, 'pending'],
-    queryFn: () => api.getQueue(printerId, 'pending'),
-    refetchInterval: 30000,
-  });
- 
-  const nextItem = queue?.[0];
-  const totalPending = queue?.length || 0;
- 
-  if (totalPending === 0) {
-    return null;
-  }
- 
-  return (
-    <Link
-      to="/queue"
-      className="block mb-3 p-3 bg-bambu-dark rounded-lg hover:bg-bambu-dark-tertiary transition-colors"
-    >
-      <div className="flex items-center justify-between gap-3">
-        <div className="flex items-center gap-3 min-w-0 flex-1">
-          <Calendar className="w-5 h-5 text-yellow-400 flex-shrink-0" />
-          <div className="min-w-0 flex-1">
-            <p className="text-xs text-bambu-gray">Next in queue</p>
-            <p className="text-sm text-white truncate">
-              {nextItem?.archive_name || `Archive #${nextItem?.archive_id}`}
-            </p>
-          </div>
-        </div>
-        <div className="flex items-center gap-2 flex-shrink-0">
-          <span className="text-xs text-bambu-gray flex items-center gap-1">
-            <Clock className="w-3 h-3" />
-            {formatRelativeTime(nextItem?.scheduled_time || null)}
-          </span>
-          {totalPending > 1 && (
-            <span className="text-xs px-1.5 py-0.5 bg-yellow-400/20 text-yellow-400 rounded">
-              +{totalPending - 1}
-            </span>
-          )}
-          <ChevronRight className="w-4 h-4 text-bambu-gray" />
-        </div>
-      </div>
-    </Link>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/ProjectPageModal.tsx.html b/frontend/coverage/src/components/ProjectPageModal.tsx.html deleted file mode 100644 index f0065d801..000000000 --- a/frontend/coverage/src/components/ProjectPageModal.tsx.html +++ /dev/null @@ -1,1510 +0,0 @@ - - - - - - Code coverage report for src/components/ProjectPageModal.tsx - - - - - - - - - -
-
-

All files / src/components ProjectPageModal.tsx

-
- -
- 0% - Statements - 0/345 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/345 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -425 -426 -427 -428 -429 -430 -431 -432 -433 -434 -435 -436 -437 -438 -439 -440 -441 -442 -443 -444 -445 -446 -447 -448 -449 -450 -451 -452 -453 -454 -455 -456 -457 -458 -459 -460 -461 -462 -463 -464 -465 -466 -467 -468 -469 -470 -471 -472 -473 -474 -475 -476  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useEffect } from 'react';
-import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
-import {
-  X,
-  User,
-  Calendar,
-  FileText,
-  Image,
-  Edit3,
-  Save,
-  ExternalLink,
-  ChevronLeft,
-  ChevronRight,
-} from 'lucide-react';
-import { api } from '../api/client';
-import { Button } from './Button';
-import { RichTextEditor } from './RichTextEditor';
- 
-interface ProjectPageModalProps {
-  archiveId: number;
-  archiveName?: string;
-  onClose: () => void;
-}
- 
-export function ProjectPageModal({ archiveId, archiveName, onClose }: ProjectPageModalProps) {
-  const queryClient = useQueryClient();
-  const [isEditing, setIsEditing] = useState(false);
-  const [selectedImageIndex, setSelectedImageIndex] = useState<number | null>(null);
-  const [editData, setEditData] = useState<{
-    title?: string;
-    description?: string;
-    designer?: string;
-    license?: string;
-    profile_title?: string;
-    profile_description?: string;
-  }>({});
- 
-  const { data: projectPage, isLoading, error } = useQuery({
-    queryKey: ['archive-project-page', archiveId],
-    queryFn: () => api.getArchiveProjectPage(archiveId),
-  });
- 
-  const updateMutation = useMutation({
-    mutationFn: (data: typeof editData) => api.updateArchiveProjectPage(archiveId, data),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['archive-project-page', archiveId] });
-      setIsEditing(false);
-      setEditData({});
-    },
-  });
- 
-  // Handle escape key to close modal
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') {
-        if (selectedImageIndex !== null) {
-          setSelectedImageIndex(null);
-        } else if (isEditing) {
-          handleCancelEdit();
-        } else {
-          onClose();
-        }
-      }
-    };
-    document.addEventListener('keydown', handleKeyDown);
-    return () => document.removeEventListener('keydown', handleKeyDown);
-  }, [selectedImageIndex, isEditing, onClose]);
- 
-  // Combine all images for gallery
-  const allImages = [
-    ...(projectPage?.model_pictures || []),
-    ...(projectPage?.profile_pictures || []),
-  ];
- 
-  const handleStartEdit = () => {
-    setEditData({
-      title: projectPage?.title || '',
-      description: projectPage?.description || '',
-      designer: projectPage?.designer || '',
-      license: projectPage?.license || '',
-      profile_title: projectPage?.profile_title || '',
-      profile_description: projectPage?.profile_description || '',
-    });
-    setIsEditing(true);
-  };
- 
-  const handleSave = () => {
-    updateMutation.mutate(editData);
-  };
- 
-  const handleCancelEdit = () => {
-    setIsEditing(false);
-    setEditData({});
-  };
- 
-  // Sanitize HTML content (basic XSS prevention)
-  const sanitizeHtml = (html: string) => {
-    // Allow basic formatting tags only
-    const allowed = ['p', 'br', 'b', 'strong', 'i', 'em', 'u', 'a', 'ul', 'ol', 'li', 'figure', 'img'];
-    const doc = new DOMParser().parseFromString(html, 'text/html');
- 
-    const clean = (node: Node): string => {
-      if (node.nodeType === Node.TEXT_NODE) {
-        return node.textContent || '';
-      }
-      if (node.nodeType === Node.ELEMENT_NODE) {
-        const el = node as Element;
-        const tag = el.tagName.toLowerCase();
- 
-        if (!allowed.includes(tag)) {
-          // Return children content without the tag
-          return Array.from(el.childNodes).map(clean).join('');
-        }
- 
-        // Build allowed attributes
-        let attrs = '';
-        if (tag === 'a' && el.getAttribute('href')) {
-          const href = el.getAttribute('href');
-          if (href?.toLowerCase().startsWith('http')) {
-            attrs = ` href="${href}" target="_blank" rel="noopener noreferrer"`;
-          }
-        }
-        if (tag === 'img') {
-          const src = el.getAttribute('src');
-          // Only render img if it has a valid http(s) URL, otherwise skip entirely
-          if (!src?.toLowerCase().startsWith('http')) {
-            return ''; // Skip images without valid URLs
-          }
-          attrs = ` src="${src}" style="max-width: 100%; height: auto;"`;
-        }
- 
-        const children = Array.from(el.childNodes).map(clean).join('');
- 
-        if (['br', 'img'].includes(tag)) {
-          return `<${tag}${attrs} />`;
-        }
-        return `<${tag}${attrs}>${children}</${tag}>`;
-      }
-      return '';
-    };
- 
-    return Array.from(doc.body.childNodes).map(clean).join('');
-  };
- 
-  const hasContent = projectPage && (
-    projectPage.title ||
-    projectPage.description ||
-    projectPage.designer ||
-    projectPage.profile_title ||
-    allImages.length > 0
-  );
- 
-  // Handle backdrop click to close modal
-  const handleBackdropClick = (e: React.MouseEvent) => {
-    if (e.target === e.currentTarget) {
-      onClose();
-    }
-  };
- 
-  return (
-    <div
-      className="fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4"
-      onClick={handleBackdropClick}
-    >
-      <div className="bg-bambu-dark-secondary rounded-xl max-w-4xl w-full max-h-[90vh] overflow-hidden flex flex-col">
-        {/* Header */}
-        <div className="flex items-center justify-between p-4 border-b border-bambu-dark-tertiary">
-          <div className="flex items-center gap-3">
-            <FileText className="w-5 h-5 text-bambu-green" />
-            <h2 className="text-lg font-semibold text-white">
-              Project Page
-              {archiveName && <span className="text-bambu-gray ml-2">- {archiveName}</span>}
-            </h2>
-          </div>
-          <div className="flex items-center gap-2">
-            {!isEditing && hasContent && (
-              <Button variant="ghost" size="sm" onClick={handleStartEdit}>
-                <Edit3 className="w-4 h-4 mr-1" />
-                Edit
-              </Button>
-            )}
-            {isEditing && (
-              <>
-                <Button variant="ghost" size="sm" onClick={handleCancelEdit}>
-                  Cancel
-                </Button>
-                <Button
-                  variant="primary"
-                  size="sm"
-                  onClick={handleSave}
-                  disabled={updateMutation.isPending}
-                >
-                  <Save className="w-4 h-4 mr-1" />
-                  Save
-                </Button>
-              </>
-            )}
-            <button
-              onClick={onClose}
-              className="p-2 hover:bg-bambu-dark-tertiary rounded-lg transition-colors"
-            >
-              <X className="w-5 h-5 text-bambu-gray" />
-            </button>
-          </div>
-        </div>
- 
-        {/* Content */}
-        <div className="flex-1 overflow-y-auto p-6">
-          {isLoading && (
-            <div className="flex items-center justify-center py-12">
-              <div className="animate-spin rounded-full h-8 w-8 border-2 border-bambu-green border-t-transparent" />
-            </div>
-          )}
- 
-          {error && (
-            <div className="text-red-400 text-center py-12">
-              Failed to load project page data
-            </div>
-          )}
- 
-          {projectPage && !hasContent && (
-            <div className="text-bambu-gray text-center py-12">
-              <FileText className="w-12 h-12 mx-auto mb-4 opacity-50" />
-              <p>No project page data found in this 3MF file.</p>
-              <p className="text-sm mt-2">
-                Project pages are typically included in files downloaded from MakerWorld.
-              </p>
-            </div>
-          )}
- 
-          {projectPage && hasContent && (
-            <div className="space-y-6">
-              {/* Title & Designer */}
-              <div className="space-y-4">
-                {isEditing ? (
-                  <input
-                    type="text"
-                    value={editData.title || ''}
-                    onChange={(e) => setEditData({ ...editData, title: e.target.value })}
-                    placeholder="Title"
-                    className="w-full bg-bambu-dark border border-bambu-dark-tertiary rounded-lg px-4 py-2 text-white text-xl font-semibold"
-                  />
-                ) : (
-                  projectPage.title && (
-                    <h3 className="text-xl font-semibold text-white">{projectPage.title}</h3>
-                  )
-                )}
- 
-                <div className="flex flex-wrap gap-4 text-sm">
-                  {isEditing ? (
-                    <div className="flex items-center gap-2">
-                      <User className="w-4 h-4 text-bambu-gray" />
-                      <input
-                        type="text"
-                        value={editData.designer || ''}
-                        onChange={(e) => setEditData({ ...editData, designer: e.target.value })}
-                        placeholder="Designer"
-                        className="bg-bambu-dark border border-bambu-dark-tertiary rounded px-2 py-1 text-white"
-                      />
-                    </div>
-                  ) : (
-                    projectPage.designer && (
-                      <div className="flex items-center gap-2 text-bambu-gray">
-                        <User className="w-4 h-4" />
-                        <span>{projectPage.designer}</span>
-                        {projectPage.designer_user_id && (
-                          <a
-                            href={`https://makerworld.com/en/@${projectPage.designer_user_id}`}
-                            target="_blank"
-                            rel="noopener noreferrer"
-                            className="text-bambu-green hover:underline"
-                          >
-                            <ExternalLink className="w-3 h-3" />
-                          </a>
-                        )}
-                      </div>
-                    )
-                  )}
- 
-                  {projectPage.creation_date && (
-                    <div className="flex items-center gap-2 text-bambu-gray">
-                      <Calendar className="w-4 h-4" />
-                      <span>{projectPage.creation_date}</span>
-                    </div>
-                  )}
- 
-                  {isEditing ? (
-                    <div className="flex items-center gap-2">
-                      <FileText className="w-4 h-4 text-bambu-gray" />
-                      <input
-                        type="text"
-                        value={editData.license || ''}
-                        onChange={(e) => setEditData({ ...editData, license: e.target.value })}
-                        placeholder="License"
-                        className="bg-bambu-dark border border-bambu-dark-tertiary rounded px-2 py-1 text-white"
-                      />
-                    </div>
-                  ) : (
-                    projectPage.license && (
-                      <div className="flex items-center gap-2 text-bambu-gray">
-                        <FileText className="w-4 h-4" />
-                        <span>{projectPage.license}</span>
-                      </div>
-                    )
-                  )}
- 
-                  {projectPage.origin && (
-                    <span className="px-2 py-0.5 bg-bambu-dark rounded text-bambu-gray">
-                      {projectPage.origin}
-                    </span>
-                  )}
-                </div>
-              </div>
- 
-              {/* Description */}
-              {(projectPage.description || isEditing) && (
-                <div className="space-y-2">
-                  <h4 className="text-sm font-medium text-bambu-gray uppercase tracking-wide">
-                    Description
-                  </h4>
-                  {isEditing ? (
-                    <RichTextEditor
-                      content={editData.description || ''}
-                      onChange={(html) => setEditData({ ...editData, description: html })}
-                      placeholder="Enter description..."
-                    />
-                  ) : (
-                    <div
-                      className="prose prose-invert prose-sm max-w-none text-bambu-gray-light"
-                      dangerouslySetInnerHTML={{
-                        __html: sanitizeHtml(projectPage.description || ''),
-                      }}
-                    />
-                  )}
-                </div>
-              )}
- 
-              {/* Profile Info */}
-              {(projectPage.profile_title || projectPage.profile_description || isEditing) && (
-                <div className="space-y-2 p-4 bg-bambu-dark rounded-lg">
-                  <h4 className="text-sm font-medium text-bambu-gray uppercase tracking-wide">
-                    Print Profile
-                  </h4>
-                  {isEditing ? (
-                    <div className="space-y-2">
-                      <input
-                        type="text"
-                        value={editData.profile_title || ''}
-                        onChange={(e) => setEditData({ ...editData, profile_title: e.target.value })}
-                        placeholder="Profile Title"
-                        className="w-full bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded px-3 py-2 text-white"
-                      />
-                      <RichTextEditor
-                        content={editData.profile_description || ''}
-                        onChange={(html) => setEditData({ ...editData, profile_description: html })}
-                        placeholder="Profile description..."
-                      />
-                    </div>
-                  ) : (
-                    <>
-                      {projectPage.profile_title && (
-                        <p className="text-white font-medium">{projectPage.profile_title}</p>
-                      )}
-                      {projectPage.profile_description && (
-                        <div
-                          className="prose prose-invert prose-sm max-w-none text-bambu-gray-light"
-                          dangerouslySetInnerHTML={{
-                            __html: sanitizeHtml(projectPage.profile_description),
-                          }}
-                        />
-                      )}
-                      {projectPage.profile_user_name && (
-                        <p className="text-sm text-bambu-gray">
-                          by {projectPage.profile_user_name}
-                        </p>
-                      )}
-                    </>
-                  )}
-                </div>
-              )}
- 
-              {/* Image Gallery */}
-              {allImages.length > 0 && (
-                <div className="space-y-2">
-                  <h4 className="text-sm font-medium text-bambu-gray uppercase tracking-wide flex items-center gap-2">
-                    <Image className="w-4 h-4" />
-                    Images ({allImages.length})
-                  </h4>
-                  <div className="grid grid-cols-3 sm:grid-cols-4 md:grid-cols-5 gap-2">
-                    {allImages.map((img, index) => (
-                      <button
-                        key={img.path}
-                        onClick={() => setSelectedImageIndex(index)}
-                        className="aspect-square rounded-lg overflow-hidden border border-bambu-dark-tertiary hover:border-bambu-green transition-colors"
-                      >
-                        <img
-                          src={img.url}
-                          alt={img.name}
-                          className="w-full h-full object-cover"
-                        />
-                      </button>
-                    ))}
-                  </div>
-                </div>
-              )}
- 
-              {/* MakerWorld Link */}
-              {projectPage.design_model_id && (
-                <div className="pt-4 border-t border-bambu-dark-tertiary">
-                  <a
-                    href={`https://makerworld.com/en/models/${projectPage.design_model_id}`}
-                    target="_blank"
-                    rel="noopener noreferrer"
-                    className="inline-flex items-center gap-2 text-bambu-green hover:underline"
-                  >
-                    <ExternalLink className="w-4 h-4" />
-                    View on MakerWorld
-                  </a>
-                </div>
-              )}
-            </div>
-          )}
-        </div>
-      </div>
- 
-      {/* Image Lightbox */}
-      {selectedImageIndex !== null && allImages[selectedImageIndex] && (
-        <div
-          className="fixed inset-0 bg-black/90 flex items-center justify-center z-60"
-          onClick={() => setSelectedImageIndex(null)}
-        >
-          <button
-            onClick={(e) => {
-              e.stopPropagation();
-              setSelectedImageIndex(Math.max(0, selectedImageIndex - 1));
-            }}
-            disabled={selectedImageIndex === 0}
-            className="absolute left-4 p-2 bg-bambu-dark-secondary rounded-full hover:bg-bambu-dark-tertiary disabled:opacity-30"
-          >
-            <ChevronLeft className="w-6 h-6 text-white" />
-          </button>
- 
-          <img
-            src={allImages[selectedImageIndex].url}
-            alt={allImages[selectedImageIndex].name}
-            className="max-w-[90vw] max-h-[90vh] object-contain"
-            onClick={(e) => e.stopPropagation()}
-          />
- 
-          <button
-            onClick={(e) => {
-              e.stopPropagation();
-              setSelectedImageIndex(Math.min(allImages.length - 1, selectedImageIndex + 1));
-            }}
-            disabled={selectedImageIndex === allImages.length - 1}
-            className="absolute right-4 p-2 bg-bambu-dark-secondary rounded-full hover:bg-bambu-dark-tertiary disabled:opacity-30"
-          >
-            <ChevronRight className="w-6 h-6 text-white" />
-          </button>
- 
-          <button
-            onClick={() => setSelectedImageIndex(null)}
-            className="absolute top-4 right-4 p-2 bg-bambu-dark-secondary rounded-full hover:bg-bambu-dark-tertiary"
-          >
-            <X className="w-6 h-6 text-white" />
-          </button>
- 
-          <div className="absolute bottom-4 text-white text-sm">
-            {selectedImageIndex + 1} / {allImages.length}
-          </div>
-        </div>
-      )}
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/QRCodeModal.tsx.html b/frontend/coverage/src/components/QRCodeModal.tsx.html deleted file mode 100644 index 8edfb588f..000000000 --- a/frontend/coverage/src/components/QRCodeModal.tsx.html +++ /dev/null @@ -1,307 +0,0 @@ - - - - - - Code coverage report for src/components/QRCodeModal.tsx - - - - - - - - - -
-
-

All files / src/components QRCodeModal.tsx

-
- -
- 0% - Statements - 0/51 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/51 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useEffect } from 'react';
-import { X, Download } from 'lucide-react';
-import { Button } from './Button';
-import { api } from '../api/client';
- 
-interface QRCodeModalProps {
-  archiveId: number;
-  archiveName: string;
-  onClose: () => void;
-}
- 
-export function QRCodeModal({ archiveId, archiveName, onClose }: QRCodeModalProps) {
-  const qrCodeUrl = api.getArchiveQRCodeUrl(archiveId, 300);
- 
-  // Close on Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onClose();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose]);
- 
-  const handleDownload = () => {
-    const link = document.createElement('a');
-    link.href = qrCodeUrl;
-    link.download = `${archiveName}_qrcode.png`;
-    link.click();
-  };
- 
-  return (
-    <div
-      className="fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4"
-      onClick={onClose}
-    >
-      <div
-        className="bg-bambu-dark-secondary rounded-xl border border-bambu-dark-tertiary w-full max-w-sm"
-        onClick={(e) => e.stopPropagation()}
-      >
-        {/* Header */}
-        <div className="flex items-center justify-between px-6 py-4 border-b border-bambu-dark-tertiary">
-          <h2 className="text-lg font-semibold text-white">QR Code</h2>
-          <button
-            onClick={onClose}
-            className="text-bambu-gray hover:text-white transition-colors"
-          >
-            <X className="w-5 h-5" />
-          </button>
-        </div>
- 
-        {/* Content */}
-        <div className="p-6 flex flex-col items-center">
-          <p className="text-sm text-bambu-gray mb-4 text-center truncate max-w-full">
-            {archiveName}
-          </p>
-          <div className="bg-white p-4 rounded-lg mb-4">
-            <img
-              src={qrCodeUrl}
-              alt="QR Code"
-              className="w-64 h-64"
-            />
-          </div>
-          <p className="text-xs text-bambu-gray mb-4 text-center">
-            Scan to open this archive
-          </p>
-          <Button onClick={handleDownload} className="w-full">
-            <Download className="w-4 h-4" />
-            Download QR Code
-          </Button>
-        </div>
-      </div>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/ReprintModal.tsx.html b/frontend/coverage/src/components/ReprintModal.tsx.html deleted file mode 100644 index 7767a5705..000000000 --- a/frontend/coverage/src/components/ReprintModal.tsx.html +++ /dev/null @@ -1,511 +0,0 @@ - - - - - - Code coverage report for src/components/ReprintModal.tsx - - - - - - - - - -
-
-

All files / src/components ReprintModal.tsx

-
- -
- 0% - Statements - 0/102 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/102 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useEffect } from 'react';
-import { useQuery, useMutation } from '@tanstack/react-query';
-import { X, Printer, Loader2 } from 'lucide-react';
-import { api } from '../api/client';
-import { Card, CardContent } from './Card';
-import { Button } from './Button';
- 
-interface ReprintModalProps {
-  archiveId: number;
-  archiveName: string;
-  onClose: () => void;
-  onSuccess: () => void;
-}
- 
-export function ReprintModal({ archiveId, archiveName, onClose, onSuccess }: ReprintModalProps) {
-  const [selectedPrinter, setSelectedPrinter] = useState<number | null>(null);
- 
-  // Close on Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onClose();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose]);
- 
-  const { data: printers, isLoading: loadingPrinters } = useQuery({
-    queryKey: ['printers'],
-    queryFn: api.getPrinters,
-  });
- 
-  const reprintMutation = useMutation({
-    mutationFn: () => {
-      if (!selectedPrinter) throw new Error('No printer selected');
-      return api.reprintArchive(archiveId, selectedPrinter);
-    },
-    onSuccess: () => {
-      onSuccess();
-      onClose();
-    },
-  });
- 
-  const activePrinters = printers?.filter((p) => p.is_active) || [];
- 
-  return (
-    <div className="fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-8">
-      <Card className="w-full max-w-md">
-        <CardContent>
-          {/* Header */}
-          <div className="flex items-center justify-between mb-4">
-            <h2 className="text-lg font-semibold text-white">Re-print</h2>
-            <Button variant="ghost" size="sm" onClick={onClose}>
-              <X className="w-5 h-5" />
-            </Button>
-          </div>
- 
-          <p className="text-sm text-bambu-gray mb-4">
-            Send <span className="text-white">{archiveName}</span> to a printer
-          </p>
- 
-          {/* Printer selection */}
-          {loadingPrinters ? (
-            <div className="flex justify-center py-8">
-              <Loader2 className="w-6 h-6 text-bambu-green animate-spin" />
-            </div>
-          ) : activePrinters.length === 0 ? (
-            <div className="text-center py-8 text-bambu-gray">
-              No active printers available
-            </div>
-          ) : (
-            <div className="space-y-2 mb-6">
-              {activePrinters.map((printer) => (
-                <button
-                  key={printer.id}
-                  onClick={() => setSelectedPrinter(printer.id)}
-                  className={`w-full flex items-center gap-3 p-3 rounded-lg border transition-colors ${
-                    selectedPrinter === printer.id
-                      ? 'border-bambu-green bg-bambu-green/10'
-                      : 'border-bambu-dark-tertiary bg-bambu-dark hover:border-bambu-gray'
-                  }`}
-                >
-                  <div
-                    className={`p-2 rounded-lg ${
-                      selectedPrinter === printer.id
-                        ? 'bg-bambu-green/20'
-                        : 'bg-bambu-dark-tertiary'
-                    }`}
-                  >
-                    <Printer
-                      className={`w-5 h-5 ${
-                        selectedPrinter === printer.id
-                          ? 'text-bambu-green'
-                          : 'text-bambu-gray'
-                      }`}
-                    />
-                  </div>
-                  <div className="text-left">
-                    <p className="text-white font-medium">{printer.name}</p>
-                    <p className="text-xs text-bambu-gray">
-                      {printer.model || 'Unknown model'} • {printer.ip_address}
-                    </p>
-                  </div>
-                </button>
-              ))}
-            </div>
-          )}
- 
-          {/* Error message */}
-          {reprintMutation.isError && (
-            <div className="mb-4 p-3 bg-red-500/20 border border-red-500/50 rounded-lg text-sm text-red-400">
-              {(reprintMutation.error as Error).message || 'Failed to start print'}
-            </div>
-          )}
- 
-          {/* Actions */}
-          <div className="flex gap-3">
-            <Button variant="secondary" onClick={onClose} className="flex-1">
-              Cancel
-            </Button>
-            <Button
-              onClick={() => reprintMutation.mutate()}
-              disabled={!selectedPrinter || reprintMutation.isPending}
-              className="flex-1"
-            >
-              {reprintMutation.isPending ? (
-                <>
-                  <Loader2 className="w-4 h-4 animate-spin" />
-                  Sending...
-                </>
-              ) : (
-                <>
-                  <Printer className="w-4 h-4" />
-                  Print
-                </>
-              )}
-            </Button>
-          </div>
-        </CardContent>
-      </Card>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/RestoreModal.tsx.html b/frontend/coverage/src/components/RestoreModal.tsx.html deleted file mode 100644 index da5180e76..000000000 --- a/frontend/coverage/src/components/RestoreModal.tsx.html +++ /dev/null @@ -1,1195 +0,0 @@ - - - - - - Code coverage report for src/components/RestoreModal.tsx - - - - - - - - - -
-
-

All files / src/components RestoreModal.tsx

-
- -
- 0% - Statements - 0/284 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/284 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useRef, useEffect } from 'react';
-import { Upload, X, AlertTriangle, CheckCircle, SkipForward, RefreshCw, Loader2, ChevronDown, ChevronUp } from 'lucide-react';
-import { Card, CardContent } from './Card';
-import { Button } from './Button';
-import { Toggle } from './Toggle';
- 
-interface RestoreResult {
-  success: boolean;
-  message: string;
-  restored?: Record<string, number>;
-  skipped?: Record<string, number>;
-  skipped_details?: Record<string, string[]>;
-  files_restored?: number;
-  total_skipped?: number;
-}
- 
-interface RestoreModalProps {
-  onClose: () => void;
-  onRestore: (file: File, overwrite: boolean) => Promise<RestoreResult>;
-  onSuccess: () => void;
-}
- 
-type ModalState = 'options' | 'restoring' | 'result';
- 
-const CATEGORY_LABELS: Record<string, string> = {
-  settings: 'Settings',
-  notification_providers: 'Notification Providers',
-  notification_templates: 'Notification Templates',
-  smart_plugs: 'Smart Plugs',
-  printers: 'Printers',
-  filaments: 'Filaments',
-  maintenance_types: 'Maintenance Types',
-  archives: 'Archives',
-};
- 
-export function RestoreModal({ onClose, onRestore, onSuccess }: RestoreModalProps) {
-  const [state, setState] = useState<ModalState>('options');
-  const [overwrite, setOverwrite] = useState(false);
-  const [selectedFile, setSelectedFile] = useState<File | null>(null);
-  const [result, setResult] = useState<RestoreResult | null>(null);
-  const [expandedCategories, setExpandedCategories] = useState<Set<string>>(new Set());
-  const fileInputRef = useRef<HTMLInputElement>(null);
- 
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape' && state !== 'restoring') onClose();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose, state]);
- 
-  const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {
-    const file = e.target.files?.[0];
-    if (file) {
-      setSelectedFile(file);
-    }
-  };
- 
-  const handleRestore = async () => {
-    if (!selectedFile) return;
- 
-    setState('restoring');
-    try {
-      const restoreResult = await onRestore(selectedFile, overwrite);
-      setResult(restoreResult);
-      setState('result');
-      if (restoreResult.success) {
-        onSuccess();
-      }
-    } catch {
-      setResult({
-        success: false,
-        message: 'Failed to restore backup. Please check the file format.',
-      });
-      setState('result');
-    }
-  };
- 
-  const toggleCategory = (category: string) => {
-    setExpandedCategories(prev => {
-      const next = new Set(prev);
-      if (next.has(category)) {
-        next.delete(category);
-      } else {
-        next.add(category);
-      }
-      return next;
-    });
-  };
- 
-  const totalRestored = result?.restored
-    ? Object.values(result.restored).reduce((a, b) => a + b, 0) + (result.files_restored || 0)
-    : 0;
-  const totalSkipped = result?.total_skipped || 0;
- 
-  return (
-    <div
-      className="fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4"
-      onMouseDown={(e) => {
-        // Only close if clicking directly on the backdrop, not on children
-        if (e.target === e.currentTarget && state !== 'restoring') {
-          onClose();
-        }
-      }}
-    >
-      <Card className="w-full max-w-lg">
-        <CardContent className="p-0">
-          {/* Header */}
-          <div className="flex items-center justify-between p-4 border-b border-bambu-dark-tertiary">
-            <div className="flex items-center gap-3">
-              <div className={`p-2 rounded-full ${
-                state === 'result' && result?.success
-                  ? 'bg-bambu-green/20 text-bambu-green'
-                  : state === 'result' && !result?.success
-                  ? 'bg-red-500/20 text-red-500'
-                  : 'bg-blue-500/20 text-blue-500'
-              }`}>
-                {state === 'result' && result?.success ? (
-                  <CheckCircle className="w-5 h-5" />
-                ) : state === 'result' && !result?.success ? (
-                  <AlertTriangle className="w-5 h-5" />
-                ) : (
-                  <Upload className="w-5 h-5" />
-                )}
-              </div>
-              <div>
-                <h3 className="text-lg font-semibold text-white">
-                  {state === 'options' && 'Restore Backup'}
-                  {state === 'restoring' && 'Restoring...'}
-                  {state === 'result' && (result?.success ? 'Restore Complete' : 'Restore Failed')}
-                </h3>
-                <p className="text-sm text-bambu-gray">
-                  {state === 'options' && 'Import settings from a backup file'}
-                  {state === 'restoring' && 'Please wait while your data is being restored'}
-                  {state === 'result' && result?.message}
-                </p>
-              </div>
-            </div>
-            {state !== 'restoring' && (
-              <button
-                onClick={onClose}
-                className="p-2 hover:bg-bambu-dark-tertiary rounded-lg transition-colors"
-              >
-                <X className="w-5 h-5" />
-              </button>
-            )}
-          </div>
- 
-          {/* Options State */}
-          {state === 'options' && (
-            <>
-              <div className="p-4 space-y-4">
-                {/* File Selection */}
-                <div>
-                  <input
-                    ref={fileInputRef}
-                    type="file"
-                    accept=".json,.zip"
-                    className="hidden"
-                    onChange={handleFileSelect}
-                  />
-                  <button
-                    type="button"
-                    onClick={() => fileInputRef.current?.click()}
-                    className={`w-full p-4 border-2 border-dashed rounded-lg transition-colors ${
-                      selectedFile
-                        ? 'border-bambu-green bg-bambu-green/10'
-                        : 'border-bambu-dark-tertiary hover:border-bambu-gray'
-                    }`}
-                  >
-                    {selectedFile ? (
-                      <div className="flex items-center justify-center gap-2 text-bambu-green">
-                        <CheckCircle className="w-5 h-5" />
-                        <span className="font-medium">{selectedFile.name}</span>
-                      </div>
-                    ) : (
-                      <div className="flex flex-col items-center gap-2 text-bambu-gray">
-                        <Upload className="w-8 h-8" />
-                        <span>Click to select backup file (.json or .zip)</span>
-                      </div>
-                    )}
-                  </button>
-                </div>
- 
-                {/* Info Box */}
-                <div className="p-3 rounded-lg bg-blue-500/10 border border-blue-500/30">
-                  <div className="flex items-start gap-2 text-sm">
-                    <AlertTriangle className="w-4 h-4 text-blue-500 dark:text-blue-400 mt-0.5 flex-shrink-0" />
-                    <div className="text-blue-700 dark:text-blue-200">
-                      <p className="font-medium mb-1">How duplicate handling works:</p>
-                      <ul className="text-blue-600 dark:text-blue-200/80 space-y-1 text-xs">
-                        <li><strong>Printers</strong> - matched by serial number</li>
-                        <li><strong>Smart Plugs</strong> - matched by IP address</li>
-                        <li><strong>Notification Providers</strong> - matched by name</li>
-                        <li><strong>Filaments</strong> - matched by name + type + brand</li>
-                        <li><strong>Archives</strong> - matched by content hash (always skipped)</li>
-                        <li><strong>Settings & Templates</strong> - always overwritten</li>
-                      </ul>
-                    </div>
-                  </div>
-                </div>
- 
-                {/* Overwrite Toggle */}
-                <div className="p-3 rounded-lg bg-bambu-dark border border-bambu-dark-tertiary">
-                  <div className="flex items-center justify-between">
-                    <div>
-                      <p className="text-white font-medium flex items-center gap-2">
-                        {overwrite ? (
-                          <RefreshCw className="w-4 h-4 text-orange-400" />
-                        ) : (
-                          <SkipForward className="w-4 h-4 text-bambu-gray" />
-                        )}
-                        {overwrite ? 'Replace existing data' : 'Keep existing data'}
-                      </p>
-                      <p className="text-sm text-bambu-gray mt-1">
-                        {overwrite
-                          ? 'Overwrite items that already exist with backup data'
-                          : 'Only restore items that don\'t already exist'}
-                      </p>
-                    </div>
-                    <Toggle checked={overwrite} onChange={setOverwrite} />
-                  </div>
-                </div>
- 
-                {overwrite && (
-                  <div className="p-3 rounded-lg bg-orange-500/10 border border-orange-500/30">
-                    <div className="flex items-start gap-2 text-sm">
-                      <AlertTriangle className="w-4 h-4 text-orange-500 dark:text-orange-400 mt-0.5 flex-shrink-0" />
-                      <div className="text-orange-700 dark:text-orange-200">
-                        <span className="font-medium">Caution:</span> Overwriting will replace your current configurations with data from the backup. Printer access codes are never overwritten for security.
-                      </div>
-                    </div>
-                  </div>
-                )}
-              </div>
- 
-              {/* Footer */}
-              <div className="flex items-center justify-end gap-3 p-4 border-t border-bambu-dark-tertiary">
-                <Button type="button" variant="secondary" onClick={onClose}>
-                  Cancel
-                </Button>
-                <Button
-                  type="button"
-                  onClick={handleRestore}
-                  disabled={!selectedFile}
-                  className="bg-bambu-green hover:bg-bambu-green-dark disabled:opacity-50"
-                >
-                  <Upload className="w-4 h-4 mr-2" />
-                  Restore
-                </Button>
-              </div>
-            </>
-          )}
- 
-          {/* Restoring State */}
-          {state === 'restoring' && (
-            <div className="p-8 flex flex-col items-center gap-4">
-              <Loader2 className="w-12 h-12 text-bambu-green animate-spin" />
-              <p className="text-bambu-gray">Processing backup file...</p>
-            </div>
-          )}
- 
-          {/* Result State */}
-          {state === 'result' && result && (
-            <>
-              <div className="p-4 space-y-4 max-h-[400px] overflow-y-auto">
-                {/* Summary */}
-                <div className="grid grid-cols-2 gap-3">
-                  <div className="p-3 rounded-lg bg-bambu-green/10 border border-bambu-green/30">
-                    <div className="text-2xl font-bold text-bambu-green">{totalRestored}</div>
-                    <div className="text-sm text-bambu-gray">Items Restored</div>
-                  </div>
-                  <div className="p-3 rounded-lg bg-yellow-500/10 border border-yellow-500/30">
-                    <div className="text-2xl font-bold text-yellow-500">{totalSkipped}</div>
-                    <div className="text-sm text-bambu-gray">Items Skipped</div>
-                  </div>
-                </div>
- 
-                {/* Restored Details */}
-                {result.restored && Object.entries(result.restored).some(([, count]) => count > 0) && (
-                  <div className="space-y-2">
-                    <h4 className="text-sm font-medium text-bambu-gray flex items-center gap-2">
-                      <CheckCircle className="w-4 h-4 text-bambu-green" />
-                      Restored
-                    </h4>
-                    <div className="space-y-1">
-                      {Object.entries(result.restored)
-                        .filter(([, count]) => count > 0)
-                        .map(([key, count]) => (
-                          <div key={key} className="flex items-center justify-between text-sm p-2 rounded bg-bambu-dark">
-                            <span className="text-white">{CATEGORY_LABELS[key] || key}</span>
-                            <span className="text-bambu-green font-medium">{count}</span>
-                          </div>
-                        ))}
-                      {(result.files_restored || 0) > 0 && (
-                        <div className="flex items-center justify-between text-sm p-2 rounded bg-bambu-dark">
-                          <span className="text-white">Files (3MF, thumbnails, etc.)</span>
-                          <span className="text-bambu-green font-medium">{result.files_restored}</span>
-                        </div>
-                      )}
-                    </div>
-                  </div>
-                )}
- 
-                {/* Skipped Details */}
-                {result.skipped && Object.entries(result.skipped).some(([, count]) => count > 0) && (
-                  <div className="space-y-2">
-                    <h4 className="text-sm font-medium text-bambu-gray flex items-center gap-2">
-                      <SkipForward className="w-4 h-4 text-yellow-500" />
-                      Skipped (already exist)
-                    </h4>
-                    <div className="space-y-1">
-                      {Object.entries(result.skipped)
-                        .filter(([, count]) => count > 0)
-                        .map(([key, count]) => {
-                          const details = result.skipped_details?.[key] || [];
-                          const isExpanded = expandedCategories.has(key);
-                          return (
-                            <div key={key}>
-                              <button
-                                onClick={() => details.length > 0 && toggleCategory(key)}
-                                className={`w-full flex items-center justify-between text-sm p-2 rounded bg-bambu-dark ${
-                                  details.length > 0 ? 'hover:bg-bambu-dark-tertiary cursor-pointer' : ''
-                                }`}
-                              >
-                                <span className="text-white flex items-center gap-2">
-                                  {CATEGORY_LABELS[key] || key}
-                                  {details.length > 0 && (
-                                    isExpanded ? <ChevronUp className="w-3 h-3" /> : <ChevronDown className="w-3 h-3" />
-                                  )}
-                                </span>
-                                <span className="text-yellow-500 font-medium">{count}</span>
-                              </button>
-                              {isExpanded && details.length > 0 && (
-                                <div className="mt-1 ml-4 p-2 rounded bg-bambu-dark-tertiary text-xs text-bambu-gray space-y-1">
-                                  {details.slice(0, 10).map((item, i) => (
-                                    <div key={i}>{item}</div>
-                                  ))}
-                                  {details.length > 10 && (
-                                    <div className="text-bambu-gray/60">...and {details.length - 10} more</div>
-                                  )}
-                                </div>
-                              )}
-                            </div>
-                          );
-                        })}
-                    </div>
-                  </div>
-                )}
- 
-                {totalRestored === 0 && totalSkipped === 0 && (
-                  <div className="p-4 text-center text-bambu-gray">
-                    No data was found to restore in the backup file.
-                  </div>
-                )}
-              </div>
- 
-              {/* Footer */}
-              <div className="flex items-center justify-end gap-3 p-4 border-t border-bambu-dark-tertiary">
-                <Button onClick={onClose}>
-                  Close
-                </Button>
-              </div>
-            </>
-          )}
-        </CardContent>
-      </Card>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/RichTextEditor.tsx.html b/frontend/coverage/src/components/RichTextEditor.tsx.html deleted file mode 100644 index efaeadf40..000000000 --- a/frontend/coverage/src/components/RichTextEditor.tsx.html +++ /dev/null @@ -1,658 +0,0 @@ - - - - - - Code coverage report for src/components/RichTextEditor.tsx - - - - - - - - - -
-
-

All files / src/components RichTextEditor.tsx

-
- -
- 0% - Statements - 0/133 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/133 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useEditor, EditorContent } from '@tiptap/react';
-import StarterKit from '@tiptap/starter-kit';
-import Link from '@tiptap/extension-link';
-import Underline from '@tiptap/extension-underline';
-import TextAlign from '@tiptap/extension-text-align';
-import { TextStyle } from '@tiptap/extension-text-style';
-import Color from '@tiptap/extension-color';
-import Image from '@tiptap/extension-image';
-import {
-  Bold,
-  Italic,
-  Underline as UnderlineIcon,
-  List,
-  ListOrdered,
-  AlignLeft,
-  AlignCenter,
-  AlignRight,
-  Link as LinkIcon,
-  Unlink,
-} from 'lucide-react';
- 
-interface RichTextEditorProps {
-  content: string;
-  onChange: (html: string) => void;
-  placeholder?: string;
-}
- 
-export function RichTextEditor({ content, onChange, placeholder }: RichTextEditorProps) {
-  const editor = useEditor({
-    extensions: [
-      StarterKit.configure({
-        heading: false,
-        codeBlock: false,
-        code: false,
-      }),
-      Underline,
-      Link.configure({
-        openOnClick: false,
-        HTMLAttributes: {
-          target: '_blank',
-          rel: 'noopener noreferrer',
-        },
-      }),
-      TextAlign.configure({
-        types: ['paragraph'],
-      }),
-      TextStyle,
-      Color,
-      Image.configure({
-        HTMLAttributes: {
-          style: 'max-width: 100%; height: auto;',
-        },
-      }),
-    ],
-    content,
-    onUpdate: ({ editor }) => {
-      onChange(editor.getHTML());
-    },
-    editorProps: {
-      attributes: {
-        class: 'prose prose-invert prose-sm max-w-none focus:outline-none min-h-[120px] px-3 py-2',
-        placeholder: placeholder || '',
-      },
-    },
-  });
- 
-  if (!editor) {
-    return null;
-  }
- 
-  const ToolbarButton = ({
-    onClick,
-    isActive = false,
-    children,
-    title,
-  }: {
-    onClick: () => void;
-    isActive?: boolean;
-    children: React.ReactNode;
-    title: string;
-  }) => (
-    <button
-      type="button"
-      onClick={onClick}
-      title={title}
-      className={`p-1.5 rounded hover:bg-bambu-dark-tertiary transition-colors ${
-        isActive ? 'bg-bambu-dark-tertiary text-bambu-green' : 'text-bambu-gray'
-      }`}
-    >
-      {children}
-    </button>
-  );
- 
-  const setLink = () => {
-    const url = window.prompt('Enter URL:');
-    if (url) {
-      editor.chain().focus().setLink({ href: url }).run();
-    }
-  };
- 
-  return (
-    <div className="border border-bambu-dark-tertiary rounded-lg overflow-hidden bg-bambu-dark">
-      {/* Toolbar */}
-      <div className="flex items-center gap-0.5 p-1.5 border-b border-bambu-dark-tertiary bg-bambu-dark-secondary">
-        <ToolbarButton
-          onClick={() => editor.chain().focus().toggleBold().run()}
-          isActive={editor.isActive('bold')}
-          title="Bold"
-        >
-          <Bold className="w-4 h-4" />
-        </ToolbarButton>
-        <ToolbarButton
-          onClick={() => editor.chain().focus().toggleItalic().run()}
-          isActive={editor.isActive('italic')}
-          title="Italic"
-        >
-          <Italic className="w-4 h-4" />
-        </ToolbarButton>
-        <ToolbarButton
-          onClick={() => editor.chain().focus().toggleUnderline().run()}
-          isActive={editor.isActive('underline')}
-          title="Underline"
-        >
-          <UnderlineIcon className="w-4 h-4" />
-        </ToolbarButton>
- 
-        <div className="w-px h-5 bg-bambu-dark-tertiary mx-1" />
- 
-        <ToolbarButton
-          onClick={() => editor.chain().focus().toggleBulletList().run()}
-          isActive={editor.isActive('bulletList')}
-          title="Bullet List"
-        >
-          <List className="w-4 h-4" />
-        </ToolbarButton>
-        <ToolbarButton
-          onClick={() => editor.chain().focus().toggleOrderedList().run()}
-          isActive={editor.isActive('orderedList')}
-          title="Numbered List"
-        >
-          <ListOrdered className="w-4 h-4" />
-        </ToolbarButton>
- 
-        <div className="w-px h-5 bg-bambu-dark-tertiary mx-1" />
- 
-        <ToolbarButton
-          onClick={() => editor.chain().focus().setTextAlign('left').run()}
-          isActive={editor.isActive({ textAlign: 'left' })}
-          title="Align Left"
-        >
-          <AlignLeft className="w-4 h-4" />
-        </ToolbarButton>
-        <ToolbarButton
-          onClick={() => editor.chain().focus().setTextAlign('center').run()}
-          isActive={editor.isActive({ textAlign: 'center' })}
-          title="Align Center"
-        >
-          <AlignCenter className="w-4 h-4" />
-        </ToolbarButton>
-        <ToolbarButton
-          onClick={() => editor.chain().focus().setTextAlign('right').run()}
-          isActive={editor.isActive({ textAlign: 'right' })}
-          title="Align Right"
-        >
-          <AlignRight className="w-4 h-4" />
-        </ToolbarButton>
- 
-        <div className="w-px h-5 bg-bambu-dark-tertiary mx-1" />
- 
-        <ToolbarButton
-          onClick={setLink}
-          isActive={editor.isActive('link')}
-          title="Add Link"
-        >
-          <LinkIcon className="w-4 h-4" />
-        </ToolbarButton>
-        {editor.isActive('link') && (
-          <ToolbarButton
-            onClick={() => editor.chain().focus().unsetLink().run()}
-            title="Remove Link"
-          >
-            <Unlink className="w-4 h-4" />
-          </ToolbarButton>
-        )}
-      </div>
- 
-      {/* Editor */}
-      <EditorContent editor={editor} />
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/SmartPlugCard.tsx.html b/frontend/coverage/src/components/SmartPlugCard.tsx.html deleted file mode 100644 index 1827a6f0a..000000000 --- a/frontend/coverage/src/components/SmartPlugCard.tsx.html +++ /dev/null @@ -1,1147 +0,0 @@ - - - - - - Code coverage report for src/components/SmartPlugCard.tsx - - - - - - - - - -
-
-

All files / src/components SmartPlugCard.tsx

-
- -
- 78.51% - Statements - 212/270 -
- - -
- 67.44% - Branches - 29/43 -
- - -
- 19.23% - Functions - 5/26 -
- - -
- 78.51% - Lines - 212/270 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -3551x -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -27x -27x -27x -27x -27x -  -  -27x -27x -27x -27x -27x -  -  -27x -27x -27x -27x -  -27x -  -  -27x -27x -27x -  -  -27x -  -  -27x -27x -27x -  -  -  -  -  -  -27x -  -  -27x -27x -27x -  -  -27x -  -27x -27x -27x -  -27x -27x -27x -27x -  -27x -27x -27x -27x -27x -27x -27x -27x -27x -27x -  -  -27x -27x -13x -14x -14x -14x -14x -14x -  -  -  -  -  -  -27x -27x -  -  -27x -14x -14x -14x -14x -  -  -  -27x -1x -1x -  -  -  -  -  -1x -1x -1x -1x -1x -  -  -  -1x -  -1x -  -  -  -27x -27x -27x -27x -27x -27x -27x -  -27x -  -27x -27x -27x -27x -27x -27x -27x -  -27x -  -27x -27x -  -  -27x -27x -27x -  -27x -27x -  -27x -27x -27x -  -  -27x -6x -  -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -  -  -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -  -  -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -6x -  -  -6x -4x -4x -4x -4x -4x -4x -4x -4x -4x -  -4x -  -4x -  -4x -4x -4x -4x -4x -  -4x -4x -  -4x -  -4x -4x -4x -  -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -4x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -4x -  -  -  -6x -6x -6x -6x -6x -6x -  -6x -  -6x -6x -6x -6x -6x -6x -  -6x -6x -6x -6x -  -27x -27x -  -  -27x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -27x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -27x -1x -1x -1x -1x -1x -1x -  -  -  -1x -1x -  -27x -  -27x - 
import { useState } from 'react';
-import { useMutation, useQueryClient, useQuery } from '@tanstack/react-query';
-import { Plug, Power, PowerOff, Loader2, Trash2, Settings2, Thermometer, Clock, Wifi, WifiOff, Edit2, Bell, Calendar } from 'lucide-react';
-import { api } from '../api/client';
-import type { SmartPlug, SmartPlugUpdate } from '../api/client';
-import { Card, CardContent } from './Card';
-import { Button } from './Button';
-import { ConfirmModal } from './ConfirmModal';
- 
-interface SmartPlugCardProps {
-  plug: SmartPlug;
-  onEdit: (plug: SmartPlug) => void;
-}
- 
-export function SmartPlugCard({ plug, onEdit }: SmartPlugCardProps) {
-  const queryClient = useQueryClient();
-  const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);
-  const [showPowerOnConfirm, setShowPowerOnConfirm] = useState(false);
-  const [showPowerOffConfirm, setShowPowerOffConfirm] = useState(false);
-  const [isExpanded, setIsExpanded] = useState(false);
- 
-  // Fetch current status
-  const { data: status, isLoading: statusLoading, refetch: refetchStatus } = useQuery({
-    queryKey: ['smart-plug-status', plug.id],
-    queryFn: () => api.getSmartPlugStatus(plug.id),
-    refetchInterval: 30000, // Refresh every 30 seconds
-  });
- 
-  // Fetch printers for linking
-  const { data: printers } = useQuery({
-    queryKey: ['printers'],
-    queryFn: api.getPrinters,
-  });
- 
-  const linkedPrinter = printers?.find(p => p.id === plug.printer_id);
- 
-  // Control mutation
-  const controlMutation = useMutation({
-    mutationFn: (action: 'on' | 'off' | 'toggle') => api.controlSmartPlug(plug.id, action),
-    onSuccess: () => {
-      refetchStatus();
-    },
-  });
- 
-  // Update mutation
-  const updateMutation = useMutation({
-    mutationFn: (data: SmartPlugUpdate) => api.updateSmartPlug(plug.id, data),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['smart-plugs'] });
-      // Also invalidate printer-specific smart plug queries to keep PrintersPage in sync
-      if (plug.printer_id) {
-        queryClient.invalidateQueries({ queryKey: ['smartPlugByPrinter', plug.printer_id] });
-      }
-    },
-  });
- 
-  // Delete mutation
-  const deleteMutation = useMutation({
-    mutationFn: () => api.deleteSmartPlug(plug.id),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['smart-plugs'] });
-    },
-  });
- 
-  const isOn = status?.state === 'ON';
-  const isReachable = status?.reachable ?? false;
-  const isPending = controlMutation.isPending;
- 
-  return (
-    <>
-      <Card className="relative">
-        <CardContent className="p-4">
-          {/* Header Row */}
-          <div className="flex items-start justify-between mb-3">
-            <div className="flex items-center gap-3">
-              <div className={`p-2 rounded-lg ${isReachable ? (isOn ? 'bg-bambu-green/20' : 'bg-bambu-dark') : 'bg-red-500/20'}`}>
-                <Plug className={`w-5 h-5 ${isReachable ? (isOn ? 'text-bambu-green' : 'text-bambu-gray') : 'text-red-400'}`} />
-              </div>
-              <div>
-                <h3 className="font-medium text-white">{plug.name}</h3>
-                <p className="text-sm text-bambu-gray">{plug.ip_address}</p>
-              </div>
-            </div>
- 
-            {/* Status indicator */}
-            <div className="flex items-center gap-2">
-              {statusLoading ? (
-                <Loader2 className="w-4 h-4 text-bambu-gray animate-spin" />
-              ) : isReachable ? (
-                <div className="flex items-center gap-1 text-sm">
-                  <Wifi className="w-4 h-4 text-bambu-green" />
-                  <span className={isOn ? 'text-bambu-green' : 'text-bambu-gray'}>{status?.state || 'Unknown'}</span>
-                </div>
-              ) : (
-                <div className="flex items-center gap-1 text-sm text-red-400">
-                  <WifiOff className="w-4 h-4" />
-                  <span>Offline</span>
-                </div>
-              )}
-            </div>
-          </div>
- 
-          {/* Linked Printer */}
-          {linkedPrinter && (
-            <div className="mb-3 px-2 py-1.5 bg-bambu-dark rounded-lg">
-              <span className="text-xs text-bambu-gray">Linked to: </span>
-              <span className="text-sm text-white">{linkedPrinter.name}</span>
-            </div>
-          )}
- 
-          {/* Feature Badges */}
-          {(plug.power_alert_enabled || plug.schedule_enabled) && (
-            <div className="flex flex-wrap gap-1.5 mb-3">
-              {plug.power_alert_enabled && (
-                <span className="flex items-center gap-1 px-2 py-0.5 bg-yellow-500/20 text-yellow-400 text-xs rounded-full">
-                  <Bell className="w-3 h-3" />
-                  Alerts
-                </span>
-              )}
-              {plug.schedule_enabled && (
-                <span className="flex items-center gap-1 px-2 py-0.5 bg-blue-500/20 text-blue-400 text-xs rounded-full">
-                  <Calendar className="w-3 h-3" />
-                  {plug.schedule_on_time && plug.schedule_off_time
-                    ? `${plug.schedule_on_time} - ${plug.schedule_off_time}`
-                    : plug.schedule_on_time
-                      ? `On ${plug.schedule_on_time}`
-                      : `Off ${plug.schedule_off_time}`}
-                </span>
-              )}
-            </div>
-          )}
- 
-          {/* Quick Controls */}
-          <div className="flex gap-2 mb-3">
-            <Button
-              size="sm"
-              variant={isOn ? 'primary' : 'secondary'}
-              disabled={!isReachable || isPending}
-              onClick={() => setShowPowerOnConfirm(true)}
-              className="flex-1"
-            >
-              {isPending ? <Loader2 className="w-4 h-4 animate-spin" /> : <Power className="w-4 h-4" />}
-              On
-            </Button>
-            <Button
-              size="sm"
-              variant={!isOn ? 'primary' : 'secondary'}
-              disabled={!isReachable || isPending}
-              onClick={() => setShowPowerOffConfirm(true)}
-              className="flex-1"
-            >
-              {isPending ? <Loader2 className="w-4 h-4 animate-spin" /> : <PowerOff className="w-4 h-4" />}
-              Off
-            </Button>
-          </div>
- 
-          {/* Toggle Settings Panel */}
-          <button
-            onClick={() => setIsExpanded(!isExpanded)}
-            className="w-full flex items-center justify-between py-2 text-sm text-bambu-gray hover:text-white transition-colors"
-          >
-            <span className="flex items-center gap-2">
-              <Settings2 className="w-4 h-4" />
-              Automation Settings
-            </span>
-            <span>{isExpanded ? '-' : '+'}</span>
-          </button>
- 
-          {/* Expanded Settings */}
-          {isExpanded && (
-            <div className="pt-3 border-t border-bambu-dark-tertiary space-y-4">
-              {/* Enabled Toggle */}
-              <div className="flex items-center justify-between">
-                <div>
-                  <p className="text-sm text-white">Enabled</p>
-                  <p className="text-xs text-bambu-gray">Enable automation for this plug</p>
-                </div>
-                <label className="relative inline-flex items-center cursor-pointer">
-                  <input
-                    type="checkbox"
-                    checked={plug.enabled}
-                    onChange={(e) => updateMutation.mutate({ enabled: e.target.checked })}
-                    className="sr-only peer"
-                  />
-                  <div className="w-9 h-5 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-bambu-green"></div>
-                </label>
-              </div>
- 
-              {/* Auto On */}
-              <div className="flex items-center justify-between">
-                <div>
-                  <p className="text-sm text-white">Auto On</p>
-                  <p className="text-xs text-bambu-gray">Turn on when print starts</p>
-                </div>
-                <label className="relative inline-flex items-center cursor-pointer">
-                  <input
-                    type="checkbox"
-                    checked={plug.auto_on}
-                    onChange={(e) => updateMutation.mutate({ auto_on: e.target.checked })}
-                    className="sr-only peer"
-                  />
-                  <div className="w-9 h-5 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-bambu-green"></div>
-                </label>
-              </div>
- 
-              {/* Auto Off */}
-              <div className="flex items-center justify-between">
-                <div>
-                  <p className="text-sm text-white">Auto Off</p>
-                  <p className="text-xs text-bambu-gray">Turn off when print completes (one-shot)</p>
-                </div>
-                <label className="relative inline-flex items-center cursor-pointer">
-                  <input
-                    type="checkbox"
-                    checked={plug.auto_off}
-                    onChange={(e) => updateMutation.mutate({ auto_off: e.target.checked })}
-                    className="sr-only peer"
-                  />
-                  <div className="w-9 h-5 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-bambu-green"></div>
-                </label>
-              </div>
- 
-              {/* Delay Mode */}
-              {plug.auto_off && (
-                <div className="space-y-3 pl-4 border-l-2 border-bambu-dark-tertiary">
-                  <div>
-                    <p className="text-sm text-white mb-2">Turn Off Delay Mode</p>
-                    <div className="flex gap-2">
-                      <button
-                        onClick={() => updateMutation.mutate({ off_delay_mode: 'time' })}
-                        className={`flex-1 flex items-center justify-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors ${
-                          plug.off_delay_mode === 'time'
-                            ? 'bg-bambu-green text-white'
-                            : 'bg-bambu-dark text-bambu-gray hover:text-white'
-                        }`}
-                      >
-                        <Clock className="w-4 h-4" />
-                        Time
-                      </button>
-                      <button
-                        onClick={() => updateMutation.mutate({ off_delay_mode: 'temperature' })}
-                        className={`flex-1 flex items-center justify-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors ${
-                          plug.off_delay_mode === 'temperature'
-                            ? 'bg-bambu-green text-white'
-                            : 'bg-bambu-dark text-bambu-gray hover:text-white'
-                        }`}
-                      >
-                        <Thermometer className="w-4 h-4" />
-                        Temp
-                      </button>
-                    </div>
-                  </div>
- 
-                  {plug.off_delay_mode === 'time' ? (
-                    <div>
-                      <label className="block text-xs text-bambu-gray mb-1">Delay (minutes)</label>
-                      <input
-                        type="number"
-                        min="1"
-                        max="60"
-                        value={plug.off_delay_minutes}
-                        onChange={(e) => updateMutation.mutate({ off_delay_minutes: parseInt(e.target.value) || 5 })}
-                        className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none"
-                      />
-                    </div>
-                  ) : (
-                    <div>
-                      <label className="block text-xs text-bambu-gray mb-1">Temperature threshold (C)</label>
-                      <input
-                        type="number"
-                        min="30"
-                        max="100"
-                        value={plug.off_temp_threshold}
-                        onChange={(e) => updateMutation.mutate({ off_temp_threshold: parseInt(e.target.value) || 70 })}
-                        className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none"
-                      />
-                      <p className="text-xs text-bambu-gray mt-1">Turns off when nozzle cools below this temperature</p>
-                    </div>
-                  )}
-                </div>
-              )}
- 
-              {/* Action Buttons */}
-              <div className="flex gap-2 pt-2">
-                <Button
-                  size="sm"
-                  variant="secondary"
-                  onClick={() => onEdit(plug)}
-                  className="flex-1"
-                >
-                  <Edit2 className="w-4 h-4" />
-                  Edit
-                </Button>
-                <Button
-                  size="sm"
-                  variant="secondary"
-                  onClick={() => setShowDeleteConfirm(true)}
-                  className="text-red-400 hover:text-red-300"
-                >
-                  <Trash2 className="w-4 h-4" />
-                </Button>
-              </div>
-            </div>
-          )}
-        </CardContent>
-      </Card>
- 
-      {/* Delete Confirmation */}
-      {showDeleteConfirm && (
-        <ConfirmModal
-          title="Delete Smart Plug"
-          message={`Are you sure you want to delete "${plug.name}"? This cannot be undone.`}
-          confirmText="Delete"
-          variant="danger"
-          onConfirm={() => {
-            deleteMutation.mutate();
-            setShowDeleteConfirm(false);
-          }}
-          onCancel={() => setShowDeleteConfirm(false)}
-        />
-      )}
- 
-      {/* Power On Confirmation */}
-      {showPowerOnConfirm && (
-        <ConfirmModal
-          title="Turn On Smart Plug"
-          message={`Are you sure you want to turn on "${plug.name}"?`}
-          confirmText="Turn On"
-          variant="default"
-          onConfirm={() => {
-            controlMutation.mutate('on');
-            setShowPowerOnConfirm(false);
-          }}
-          onCancel={() => setShowPowerOnConfirm(false)}
-        />
-      )}
- 
-      {/* Power Off Confirmation */}
-      {showPowerOffConfirm && (
-        <ConfirmModal
-          title="Turn Off Smart Plug"
-          message={`Are you sure you want to turn off "${plug.name}"? This will cut power to the connected device.`}
-          confirmText="Turn Off"
-          variant="danger"
-          onConfirm={() => {
-            controlMutation.mutate('off');
-            setShowPowerOffConfirm(false);
-          }}
-          onCancel={() => setShowPowerOffConfirm(false)}
-        />
-      )}
-    </>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/SpoolmanSettings.tsx.html b/frontend/coverage/src/components/SpoolmanSettings.tsx.html deleted file mode 100644 index 8e943e9d9..000000000 --- a/frontend/coverage/src/components/SpoolmanSettings.tsx.html +++ /dev/null @@ -1,1210 +0,0 @@ - - - - - - Code coverage report for src/components/SpoolmanSettings.tsx - - - - - - - - - -
-
-

All files / src/components SpoolmanSettings.tsx

-
- -
- 0% - Statements - 0/282 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/282 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useEffect } from 'react';
-import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
-import { Loader2, Check, X, RefreshCw, Link2, Link2Off, Database, ChevronDown } from 'lucide-react';
-import { api } from '../api/client';
-import type { SpoolmanSyncResult, Printer } from '../api/client';
-import { Card, CardContent, CardHeader } from './Card';
-import { Button } from './Button';
- 
-interface SpoolmanSettingsData {
-  spoolman_enabled: string;
-  spoolman_url: string;
-  spoolman_sync_mode: string;
-}
- 
-async function getSpoolmanSettings(): Promise<SpoolmanSettingsData> {
-  const response = await fetch('/api/v1/settings/spoolman');
-  if (!response.ok) {
-    throw new Error('Failed to load Spoolman settings');
-  }
-  return response.json();
-}
- 
-async function updateSpoolmanSettings(data: Partial<SpoolmanSettingsData>): Promise<SpoolmanSettingsData> {
-  const response = await fetch('/api/v1/settings/spoolman', {
-    method: 'PUT',
-    headers: { 'Content-Type': 'application/json' },
-    body: JSON.stringify(data),
-  });
-  if (!response.ok) {
-    throw new Error('Failed to save Spoolman settings');
-  }
-  return response.json();
-}
- 
-export function SpoolmanSettings() {
-  const queryClient = useQueryClient();
-  const [localEnabled, setLocalEnabled] = useState(false);
-  const [localUrl, setLocalUrl] = useState('');
-  const [localSyncMode, setLocalSyncMode] = useState('auto');
-  const [showSaved, setShowSaved] = useState(false);
-  const [selectedPrinterId, setSelectedPrinterId] = useState<number | 'all'>('all');
-  const [isInitialized, setIsInitialized] = useState(false);
- 
-  // Fetch Spoolman settings
-  const { data: settings, isLoading: settingsLoading } = useQuery({
-    queryKey: ['spoolman-settings'],
-    queryFn: getSpoolmanSettings,
-  });
- 
-  // Fetch Spoolman status
-  const { data: status, isLoading: statusLoading, refetch: refetchStatus } = useQuery({
-    queryKey: ['spoolman-status'],
-    queryFn: api.getSpoolmanStatus,
-    refetchInterval: 30000, // Refresh every 30 seconds
-  });
- 
-  // Fetch printers for the dropdown
-  const { data: printers } = useQuery({
-    queryKey: ['printers'],
-    queryFn: api.getPrinters,
-  });
- 
-  // Initialize local state from settings
-  useEffect(() => {
-    if (settings) {
-      setLocalEnabled(settings.spoolman_enabled === 'true');
-      setLocalUrl(settings.spoolman_url || '');
-      setLocalSyncMode(settings.spoolman_sync_mode || 'auto');
-      setIsInitialized(true);
-    }
-  }, [settings]);
- 
-  // Auto-save when settings change (after initial load)
-  useEffect(() => {
-    if (!isInitialized || !settings) return;
- 
-    const hasChanges =
-      (settings.spoolman_enabled === 'true') !== localEnabled ||
-      (settings.spoolman_url || '') !== localUrl ||
-      (settings.spoolman_sync_mode || 'auto') !== localSyncMode;
- 
-    if (hasChanges) {
-      const timeoutId = setTimeout(() => {
-        saveMutation.mutate();
-      }, 500);
-      return () => clearTimeout(timeoutId);
-    }
-  }, [localEnabled, localUrl, localSyncMode, isInitialized]);
- 
-  // Save mutation
-  const saveMutation = useMutation({
-    mutationFn: () =>
-      updateSpoolmanSettings({
-        spoolman_enabled: localEnabled ? 'true' : 'false',
-        spoolman_url: localUrl,
-        spoolman_sync_mode: localSyncMode,
-      }),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['spoolman-settings'] });
-      queryClient.invalidateQueries({ queryKey: ['spoolman-status'] });
-      setShowSaved(true);
-      setTimeout(() => setShowSaved(false), 2000);
-    },
-  });
- 
-  // Connect mutation
-  const connectMutation = useMutation({
-    mutationFn: api.connectSpoolman,
-    onSuccess: () => {
-      refetchStatus();
-    },
-  });
- 
-  // Disconnect mutation
-  const disconnectMutation = useMutation({
-    mutationFn: api.disconnectSpoolman,
-    onSuccess: () => {
-      refetchStatus();
-    },
-  });
- 
-  // Sync all mutation
-  const syncAllMutation = useMutation({
-    mutationFn: api.syncAllPrintersAms,
-    onSuccess: (data: SpoolmanSyncResult) => {
-      if (data.success) {
-        // Show success message
-      }
-    },
-  });
- 
-  // Sync single printer mutation
-  const syncPrinterMutation = useMutation({
-    mutationFn: (printerId: number) => api.syncPrinterAms(printerId),
-    onSuccess: (data: SpoolmanSyncResult) => {
-      if (data.success) {
-        // Show success message
-      }
-    },
-  });
- 
-  // Helper to handle sync based on selection
-  const handleSync = () => {
-    if (selectedPrinterId === 'all') {
-      syncAllMutation.mutate();
-    } else {
-      syncPrinterMutation.mutate(selectedPrinterId);
-    }
-  };
- 
-  // Combine mutation states
-  const isSyncing = syncAllMutation.isPending || syncPrinterMutation.isPending;
-  const syncResult = selectedPrinterId === 'all' ? syncAllMutation.data : syncPrinterMutation.data;
-  const syncSuccess = selectedPrinterId === 'all' ? syncAllMutation.isSuccess : syncPrinterMutation.isSuccess;
- 
-  if (settingsLoading) {
-    return (
-      <Card>
-        <CardHeader>
-          <div className="flex items-center gap-2">
-            <Database className="w-5 h-5 text-bambu-green" />
-            <h2 className="text-lg font-semibold text-white">Spoolman Integration</h2>
-          </div>
-        </CardHeader>
-        <CardContent>
-          <div className="flex justify-center py-8">
-            <Loader2 className="w-6 h-6 text-bambu-green animate-spin" />
-          </div>
-        </CardContent>
-      </Card>
-    );
-  }
- 
-  return (
-    <Card>
-      <CardHeader>
-        <div className="flex items-center justify-between">
-          <div className="flex items-center gap-2">
-            <Database className="w-5 h-5 text-bambu-green" />
-            <h2 className="text-lg font-semibold text-white">Spoolman Integration</h2>
-          </div>
-          {saveMutation.isPending && (
-            <Loader2 className="w-4 h-4 text-bambu-green animate-spin" />
-          )}
-          {showSaved && (
-            <Check className="w-4 h-4 text-bambu-green" />
-          )}
-        </div>
-      </CardHeader>
-      <CardContent className="space-y-4">
-        <p className="text-sm text-bambu-gray">
-          Connect to Spoolman for filament inventory tracking. AMS data will sync automatically.
-        </p>
- 
-        {/* Enable toggle */}
-        <div className="flex items-center justify-between">
-          <div>
-            <p className="text-white">Enable Spoolman</p>
-            <p className="text-sm text-bambu-gray">
-              Sync filament data with Spoolman server
-            </p>
-          </div>
-          <label className="relative inline-flex items-center cursor-pointer">
-            <input
-              type="checkbox"
-              checked={localEnabled}
-              onChange={(e) => setLocalEnabled(e.target.checked)}
-              className="sr-only peer"
-            />
-            <div className="w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"></div>
-          </label>
-        </div>
- 
-        {/* URL input */}
-        <div>
-          <label className="block text-sm text-bambu-gray mb-1">
-            Spoolman URL
-          </label>
-          <input
-            type="text"
-            placeholder="http://192.168.1.100:7912"
-            value={localUrl}
-            onChange={(e) => setLocalUrl(e.target.value)}
-            disabled={!localEnabled}
-            className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray/50 focus:border-bambu-green focus:outline-none disabled:opacity-50"
-          />
-          <p className="text-xs text-bambu-gray mt-1">
-            URL of your Spoolman server (e.g., http://localhost:7912)
-          </p>
-        </div>
- 
-        {/* Sync mode */}
-        <div>
-          <label className="block text-sm text-bambu-gray mb-1">
-            Sync Mode
-          </label>
-          <select
-            value={localSyncMode}
-            onChange={(e) => setLocalSyncMode(e.target.value)}
-            disabled={!localEnabled}
-            className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none disabled:opacity-50"
-          >
-            <option value="auto">Automatic</option>
-            <option value="manual">Manual Only</option>
-          </select>
-          <p className="text-xs text-bambu-gray mt-1">
-            {localSyncMode === 'auto'
-              ? 'AMS data syncs automatically when changes are detected'
-              : 'Only sync when manually triggered'}
-          </p>
-        </div>
- 
-        {/* Connection status */}
-        {localEnabled && (
-          <div className="pt-2 border-t border-bambu-dark-tertiary">
-            <div className="flex items-center justify-between mb-3">
-              <div className="flex items-center gap-2">
-                <span className="text-sm text-bambu-gray">Status:</span>
-                {statusLoading ? (
-                  <Loader2 className="w-4 h-4 text-bambu-gray animate-spin" />
-                ) : status?.connected ? (
-                  <span className="flex items-center gap-1 text-sm text-green-500">
-                    <Check className="w-4 h-4" />
-                    Connected
-                  </span>
-                ) : (
-                  <span className="flex items-center gap-1 text-sm text-red-500">
-                    <X className="w-4 h-4" />
-                    Disconnected
-                  </span>
-                )}
-              </div>
-              <div className="flex gap-2">
-                {status?.connected ? (
-                  <Button
-                    variant="secondary"
-                    size="sm"
-                    onClick={() => disconnectMutation.mutate()}
-                    disabled={disconnectMutation.isPending}
-                  >
-                    {disconnectMutation.isPending ? (
-                      <Loader2 className="w-4 h-4 animate-spin" />
-                    ) : (
-                      <Link2Off className="w-4 h-4" />
-                    )}
-                    Disconnect
-                  </Button>
-                ) : (
-                  <Button
-                    size="sm"
-                    onClick={() => connectMutation.mutate()}
-                    disabled={connectMutation.isPending || !localUrl}
-                  >
-                    {connectMutation.isPending ? (
-                      <Loader2 className="w-4 h-4 animate-spin" />
-                    ) : (
-                      <Link2 className="w-4 h-4" />
-                    )}
-                    Connect
-                  </Button>
-                )}
-              </div>
-            </div>
- 
-            {/* Error display */}
-            {connectMutation.isError && (
-              <div className="mb-3 p-2 bg-red-500/20 border border-red-500/50 rounded text-sm text-red-400">
-                {(connectMutation.error as Error).message}
-              </div>
-            )}
- 
-            {/* Manual sync section */}
-            {status?.connected && (
-              <div className="space-y-3">
-                <div>
-                  <p className="text-sm text-white">Sync AMS Data</p>
-                  <p className="text-xs text-bambu-gray">
-                    Manually sync printer AMS data to Spoolman
-                  </p>
-                </div>
-                <div className="flex items-center gap-2">
-                  {/* Printer selector */}
-                  <div className="relative flex-1">
-                    <select
-                      value={selectedPrinterId}
-                      onChange={(e) => setSelectedPrinterId(e.target.value === 'all' ? 'all' : Number(e.target.value))}
-                      className="w-full px-3 py-2 pr-8 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none appearance-none cursor-pointer"
-                    >
-                      <option value="all">All Printers</option>
-                      {printers?.map((printer: Printer) => (
-                        <option key={printer.id} value={printer.id}>
-                          {printer.name}
-                        </option>
-                      ))}
-                    </select>
-                    <ChevronDown className="absolute right-2 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray pointer-events-none" />
-                  </div>
-                  {/* Sync button */}
-                  <Button
-                    variant="secondary"
-                    size="sm"
-                    onClick={handleSync}
-                    disabled={isSyncing}
-                  >
-                    {isSyncing ? (
-                      <Loader2 className="w-4 h-4 animate-spin" />
-                    ) : (
-                      <RefreshCw className="w-4 h-4" />
-                    )}
-                    Sync
-                  </Button>
-                </div>
-              </div>
-            )}
- 
-            {/* Sync result */}
-            {syncSuccess && syncResult && (
-              <div
-                className={`mt-2 p-2 rounded text-sm ${
-                  syncResult.success
-                    ? 'bg-green-500/20 border border-green-500/50 text-green-400'
-                    : 'bg-yellow-500/20 border border-yellow-500/50 text-yellow-400'
-                }`}
-              >
-                {syncResult.success
-                  ? `Synced ${syncResult.synced_count} trays successfully`
-                  : `Synced ${syncResult.synced_count} trays with ${syncResult.errors.length} errors`}
-              </div>
-            )}
-          </div>
-        )}
-      </CardContent>
-    </Card>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/ThemeContext.tsx.html b/frontend/coverage/src/components/ThemeContext.tsx.html deleted file mode 100644 index 690a2d423..000000000 --- a/frontend/coverage/src/components/ThemeContext.tsx.html +++ /dev/null @@ -1,241 +0,0 @@ - - - - - - Code coverage report for src/components/ThemeContext.tsx - - - - - - - - - -
-
-

All files / src/components ThemeContext.tsx

-
- -
- 0% - Statements - 0/35 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/35 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { createContext, useContext, useEffect, useState, type ReactNode } from 'react';
- 
-type Theme = 'light' | 'dark';
- 
-interface ThemeContextType {
-  theme: Theme;
-  toggleTheme: () => void;
-  setTheme: (theme: Theme) => void;
-}
- 
-const ThemeContext = createContext<ThemeContextType | undefined>(undefined);
- 
-export function ThemeProvider({ children }: { children: ReactNode }) {
-  const [theme, setThemeState] = useState<Theme>(() => {
-    const stored = localStorage.getItem('theme') as Theme | null;
-    if (stored) return stored;
-    // Default to dark theme
-    return 'dark';
-  });
- 
-  useEffect(() => {
-    const root = document.documentElement;
-    if (theme === 'dark') {
-      root.classList.add('dark');
-    } else {
-      root.classList.remove('dark');
-    }
-    localStorage.setItem('theme', theme);
-  }, [theme]);
- 
-  const toggleTheme = () => {
-    setThemeState((prev) => (prev === 'dark' ? 'light' : 'dark'));
-  };
- 
-  const setTheme = (newTheme: Theme) => {
-    setThemeState(newTheme);
-  };
- 
-  return (
-    <ThemeContext.Provider value={{ theme, toggleTheme, setTheme }}>
-      {children}
-    </ThemeContext.Provider>
-  );
-}
- 
-export function useTheme() {
-  const context = useContext(ThemeContext);
-  if (!context) {
-    throw new Error('useTheme must be used within a ThemeProvider');
-  }
-  return context;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/TimelapseViewer.tsx.html b/frontend/coverage/src/components/TimelapseViewer.tsx.html deleted file mode 100644 index 9be36840a..000000000 --- a/frontend/coverage/src/components/TimelapseViewer.tsx.html +++ /dev/null @@ -1,724 +0,0 @@ - - - - - - Code coverage report for src/components/TimelapseViewer.tsx - - - - - - - - - -
-
-

All files / src/components TimelapseViewer.tsx

-
- -
- 0% - Statements - 0/165 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/165 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useRef, useEffect } from 'react';
-import { X, Download, Film, Play, Pause, SkipBack, SkipForward } from 'lucide-react';
-import { Button } from './Button';
- 
-interface TimelapseViewerProps {
-  src: string;
-  title: string;
-  downloadFilename: string;
-  onClose: () => void;
-}
- 
-const SPEED_OPTIONS = [0.25, 0.5, 0.75, 1, 1.5, 2, 3, 4];
- 
-export function TimelapseViewer({ src, title, downloadFilename, onClose }: TimelapseViewerProps) {
-  const videoRef = useRef<HTMLVideoElement>(null);
-  const [isPlaying, setIsPlaying] = useState(true);
-  const [playbackRate, setPlaybackRate] = useState(0.5); // Default to 0.5x for timelapse
-  const [currentTime, setCurrentTime] = useState(0);
-  const [duration, setDuration] = useState(0);
- 
-  useEffect(() => {
-    const video = videoRef.current;
-    if (video) {
-      video.playbackRate = playbackRate;
-    }
-  }, [playbackRate]);
- 
-  // Close on Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') {
-        onClose();
-      }
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose]);
- 
-  useEffect(() => {
-    const video = videoRef.current;
-    if (!video) return;
- 
-    const handleTimeUpdate = () => setCurrentTime(video.currentTime);
-    const handleDurationChange = () => setDuration(video.duration);
-    const handlePlay = () => setIsPlaying(true);
-    const handlePause = () => setIsPlaying(false);
- 
-    video.addEventListener('timeupdate', handleTimeUpdate);
-    video.addEventListener('durationchange', handleDurationChange);
-    video.addEventListener('play', handlePlay);
-    video.addEventListener('pause', handlePause);
- 
-    return () => {
-      video.removeEventListener('timeupdate', handleTimeUpdate);
-      video.removeEventListener('durationchange', handleDurationChange);
-      video.removeEventListener('play', handlePlay);
-      video.removeEventListener('pause', handlePause);
-    };
-  }, []);
- 
-  const togglePlay = () => {
-    const video = videoRef.current;
-    if (!video) return;
-    if (isPlaying) {
-      video.pause();
-    } else {
-      video.play();
-    }
-  };
- 
-  const handleSeek = (e: React.ChangeEvent<HTMLInputElement>) => {
-    const video = videoRef.current;
-    if (!video) return;
-    video.currentTime = parseFloat(e.target.value);
-  };
- 
-  const skipBackward = () => {
-    const video = videoRef.current;
-    if (!video) return;
-    video.currentTime = Math.max(0, video.currentTime - 5);
-  };
- 
-  const skipForward = () => {
-    const video = videoRef.current;
-    if (!video) return;
-    video.currentTime = Math.min(duration, video.currentTime + 5);
-  };
- 
-  const formatTime = (time: number) => {
-    const minutes = Math.floor(time / 60);
-    const seconds = Math.floor(time % 60);
-    return `${minutes}:${seconds.toString().padStart(2, '0')}`;
-  };
- 
-  const handleDownload = () => {
-    const link = document.createElement('a');
-    link.href = src;
-    link.download = downloadFilename;
-    link.click();
-  };
- 
-  return (
-    <div className="fixed inset-0 z-50 flex items-center justify-center bg-black/80">
-      <div className="relative bg-bambu-dark-secondary rounded-xl max-w-4xl w-full mx-4 overflow-hidden">
-        {/* Header */}
-        <div className="flex items-center justify-between p-4 border-b border-bambu-dark-tertiary">
-          <h3 className="text-lg font-semibold text-white flex items-center gap-2">
-            <Film className="w-5 h-5 text-bambu-green" />
-            {title}
-          </h3>
-          <div className="flex items-center gap-2">
-            <Button variant="secondary" size="sm" onClick={handleDownload}>
-              <Download className="w-4 h-4" />
-              Download
-            </Button>
-            <button
-              onClick={onClose}
-              className="p-1 hover:bg-bambu-dark-tertiary rounded transition-colors"
-            >
-              <X className="w-5 h-5 text-bambu-gray" />
-            </button>
-          </div>
-        </div>
- 
-        {/* Video */}
-        <div className="p-4">
-          <video
-            ref={videoRef}
-            src={src}
-            autoPlay
-            className="w-full rounded-lg"
-            onClick={togglePlay}
-          />
- 
-          {/* Custom Controls */}
-          <div className="mt-4 space-y-3">
-            {/* Progress bar */}
-            <div className="flex items-center gap-3">
-              <span className="text-xs text-bambu-gray w-12 text-right">
-                {formatTime(currentTime)}
-              </span>
-              <input
-                type="range"
-                min={0}
-                max={duration || 100}
-                value={currentTime}
-                onChange={handleSeek}
-                className="flex-1 h-1 bg-bambu-dark-tertiary rounded-lg appearance-none cursor-pointer
-                  [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-3 [&::-webkit-slider-thumb]:h-3
-                  [&::-webkit-slider-thumb]:bg-bambu-green [&::-webkit-slider-thumb]:rounded-full
-                  [&::-webkit-slider-thumb]:cursor-pointer"
-              />
-              <span className="text-xs text-bambu-gray w-12">
-                {formatTime(duration)}
-              </span>
-            </div>
- 
-            {/* Playback controls */}
-            <div className="flex items-center justify-between">
-              {/* Left: Play controls */}
-              <div className="flex items-center gap-2">
-                <button
-                  onClick={skipBackward}
-                  className="p-2 hover:bg-bambu-dark-tertiary rounded-lg transition-colors"
-                  title="Skip back 5s"
-                >
-                  <SkipBack className="w-5 h-5 text-bambu-gray" />
-                </button>
-                <button
-                  onClick={togglePlay}
-                  className="p-2 bg-bambu-green hover:bg-bambu-green-dark rounded-lg transition-colors"
-                >
-                  {isPlaying ? (
-                    <Pause className="w-5 h-5 text-white" />
-                  ) : (
-                    <Play className="w-5 h-5 text-white" />
-                  )}
-                </button>
-                <button
-                  onClick={skipForward}
-                  className="p-2 hover:bg-bambu-dark-tertiary rounded-lg transition-colors"
-                  title="Skip forward 5s"
-                >
-                  <SkipForward className="w-5 h-5 text-bambu-gray" />
-                </button>
-              </div>
- 
-              {/* Right: Speed control */}
-              <div className="flex items-center gap-2">
-                <span className="text-sm text-bambu-gray">Speed:</span>
-                <div className="flex gap-1">
-                  {SPEED_OPTIONS.map((speed) => (
-                    <button
-                      key={speed}
-                      onClick={() => setPlaybackRate(speed)}
-                      className={`px-2 py-1 text-xs rounded transition-colors ${
-                        playbackRate === speed
-                          ? 'bg-bambu-green text-white'
-                          : 'bg-bambu-dark-tertiary text-bambu-gray hover:bg-bambu-dark-tertiary/80'
-                      }`}
-                    >
-                      {speed}x
-                    </button>
-                  ))}
-                </div>
-              </div>
-            </div>
-          </div>
-        </div>
-      </div>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/Toggle.tsx.html b/frontend/coverage/src/components/Toggle.tsx.html deleted file mode 100644 index 4ac5b7433..000000000 --- a/frontend/coverage/src/components/Toggle.tsx.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - Code coverage report for src/components/Toggle.tsx - - - - - - - - - -
-
-

All files / src/components Toggle.tsx

-
- -
- 100% - Statements - 30/30 -
- - -
- 100% - Branches - 8/8 -
- - -
- 100% - Functions - 2/2 -
- - -
- 100% - Lines - 30/30 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -391x -  -  -  -  -  -1x -10x -3x -3x -3x -3x -3x -3x -  -10x -10x -10x -10x -10x -10x -10x -10x -10x -3x -7x -3x -4x -10x -  -10x -10x -10x -10x -10x -10x -  -10x - 
interface ToggleProps {
-  checked: boolean;
-  onChange: (checked: boolean) => void;
-  disabled?: boolean;
-}
- 
-export function Toggle({ checked, onChange, disabled }: ToggleProps) {
-  const handleClick = (e: React.MouseEvent) => {
-    e.preventDefault();
-    e.stopPropagation();
-    if (!disabled) {
-      onChange(!checked);
-    }
-  };
- 
-  return (
-    <button
-      type="button"
-      role="switch"
-      aria-checked={checked}
-      disabled={disabled}
-      onClick={handleClick}
-      className={`relative inline-flex w-11 h-7 md:w-9 md:h-5 rounded-full transition-colors flex-shrink-0 focus:outline-none focus:ring-2 focus:ring-bambu-green focus:ring-offset-2 focus:ring-offset-bambu-dark ${
-        disabled
-          ? 'bg-bambu-dark-tertiary/50 cursor-not-allowed opacity-50'
-          : checked
-          ? 'bg-bambu-green cursor-pointer'
-          : 'bg-bambu-dark-tertiary cursor-pointer hover:bg-bambu-dark-tertiary/80'
-      }`}
-    >
-      <span
-        className={`pointer-events-none absolute top-[3px] md:top-[2px] left-[3px] md:left-[2px] w-5 h-5 md:w-4 md:h-4 bg-white rounded-full shadow transition-transform duration-200 ease-in-out ${
-          checked ? 'translate-x-4' : 'translate-x-0'
-        }`}
-      />
-    </button>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/UploadModal.tsx.html b/frontend/coverage/src/components/UploadModal.tsx.html deleted file mode 100644 index 658b35868..000000000 --- a/frontend/coverage/src/components/UploadModal.tsx.html +++ /dev/null @@ -1,1018 +0,0 @@ - - - - - - Code coverage report for src/components/UploadModal.tsx - - - - - - - - - -
-
-

All files / src/components UploadModal.tsx

-
- -
- 0% - Statements - 0/234 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/234 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useCallback, useRef, useEffect } from 'react';
-import { useMutation, useQueryClient, useQuery } from '@tanstack/react-query';
-import { Upload, X, File, CheckCircle, AlertCircle, Loader2 } from 'lucide-react';
-import { api } from '../api/client';
-import type { BulkUploadResult } from '../api/client';
-import { Card, CardContent } from './Card';
-import { Button } from './Button';
-import { useToast } from '../contexts/ToastContext';
- 
-interface FileWithStatus {
-  file: File;
-  status: 'pending' | 'uploading' | 'success' | 'error';
-  error?: string;
-  archiveId?: number;
-}
- 
-interface UploadModalProps {
-  onClose: () => void;
-  initialFiles?: File[];
-}
- 
-export function UploadModal({ onClose, initialFiles }: UploadModalProps) {
-  const queryClient = useQueryClient();
-  const { showToast } = useToast();
-  const fileInputRef = useRef<HTMLInputElement>(null);
-  const [files, setFiles] = useState<FileWithStatus[]>(() =>
-    initialFiles?.filter(f => f.name.endsWith('.3mf')).map(file => ({ file, status: 'pending' as const })) || []
-  );
-  const [isDragging, setIsDragging] = useState(false);
-  const [selectedPrinter, setSelectedPrinter] = useState<number | undefined>();
-  const [uploadResult, setUploadResult] = useState<BulkUploadResult | null>(null);
- 
-  // Close on Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onClose();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose]);
- 
-  const { data: printers } = useQuery({
-    queryKey: ['printers'],
-    queryFn: api.getPrinters,
-  });
- 
-  const uploadMutation = useMutation({
-    mutationFn: (filesToUpload: File[]) =>
-      api.uploadArchivesBulk(filesToUpload, selectedPrinter),
-    onSuccess: (result) => {
-      setUploadResult(result);
-      queryClient.invalidateQueries({ queryKey: ['archives'] });
-      queryClient.invalidateQueries({ queryKey: ['archiveStats'] });
- 
-      // Update file statuses based on result
-      setFiles((prev) =>
-        prev.map((f) => {
-          const success = result.results.find((r) => r.filename === f.file.name);
-          const error = result.errors.find((e) => e.filename === f.file.name);
-          if (success) {
-            return { ...f, status: 'success', archiveId: success.id };
-          }
-          if (error) {
-            return { ...f, status: 'error', error: error.error };
-          }
-          return f;
-        })
-      );
- 
-      // Show toast
-      if (result.failed === 0) {
-        showToast(`${result.uploaded} file${result.uploaded !== 1 ? 's' : ''} uploaded`);
-      } else if (result.uploaded === 0) {
-        showToast(`Failed to upload ${result.failed} file${result.failed !== 1 ? 's' : ''}`, 'error');
-      } else {
-        showToast(`${result.uploaded} uploaded, ${result.failed} failed`, 'warning');
-      }
-    },
-    onError: () => {
-      setFiles((prev) =>
-        prev.map((f) => ({ ...f, status: 'error', error: 'Upload failed' }))
-      );
-      showToast('Upload failed', 'error');
-    },
-  });
- 
-  const handleDragOver = useCallback((e: React.DragEvent) => {
-    e.preventDefault();
-    setIsDragging(true);
-  }, []);
- 
-  const handleDragLeave = useCallback((e: React.DragEvent) => {
-    e.preventDefault();
-    setIsDragging(false);
-  }, []);
- 
-  const handleDrop = useCallback((e: React.DragEvent) => {
-    e.preventDefault();
-    setIsDragging(false);
- 
-    const droppedFiles = Array.from(e.dataTransfer.files).filter((f) =>
-      f.name.endsWith('.3mf')
-    );
- 
-    if (droppedFiles.length > 0) {
-      setFiles((prev) => [
-        ...prev,
-        ...droppedFiles.map((file) => ({ file, status: 'pending' as const })),
-      ]);
-    }
-  }, []);
- 
-  const handleFileSelect = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
-    const selectedFiles = Array.from(e.target.files || []).filter((f) =>
-      f.name.endsWith('.3mf')
-    );
- 
-    if (selectedFiles.length > 0) {
-      setFiles((prev) => [
-        ...prev,
-        ...selectedFiles.map((file) => ({ file, status: 'pending' as const })),
-      ]);
-    }
- 
-    // Reset input so same file can be selected again
-    if (fileInputRef.current) {
-      fileInputRef.current.value = '';
-    }
-  }, []);
- 
-  const removeFile = useCallback((index: number) => {
-    setFiles((prev) => prev.filter((_, i) => i !== index));
-  }, []);
- 
-  const handleUpload = () => {
-    if (files.length === 0) return;
- 
-    const pendingFiles = files.filter((f) => f.status === 'pending');
-    if (pendingFiles.length === 0) return;
- 
-    setFiles((prev) =>
-      prev.map((f) =>
-        f.status === 'pending' ? { ...f, status: 'uploading' } : f
-      )
-    );
- 
-    uploadMutation.mutate(pendingFiles.map((f) => f.file));
-  };
- 
-  const pendingCount = files.filter((f) => f.status === 'pending').length;
-  const isUploading = uploadMutation.isPending;
- 
-  return (
-    <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4">
-      <Card className="w-full max-w-2xl max-h-[90vh] flex flex-col">
-        <CardContent className="p-0 flex flex-col h-full">
-          {/* Header */}
-          <div className="flex items-center justify-between p-4 border-b border-bambu-dark-tertiary">
-            <h2 className="text-xl font-semibold text-white">Upload 3MF Files</h2>
-            <button
-              onClick={onClose}
-              className="text-bambu-gray hover:text-white transition-colors"
-            >
-              <X className="w-5 h-5" />
-            </button>
-          </div>
- 
-          {/* Drop Zone */}
-          <div className="p-4">
-            <div
-              className={`border-2 border-dashed rounded-lg p-8 text-center transition-colors ${
-                isDragging
-                  ? 'border-bambu-green bg-bambu-green/10'
-                  : 'border-bambu-dark-tertiary hover:border-bambu-gray'
-              }`}
-              onDragOver={handleDragOver}
-              onDragLeave={handleDragLeave}
-              onDrop={handleDrop}
-            >
-              <Upload className="w-12 h-12 mx-auto mb-4 text-bambu-gray" />
-              <p className="text-white mb-2">
-                Drag & drop .3mf files here
-              </p>
-              <p className="text-bambu-gray text-sm mb-4">or</p>
-              <Button
-                variant="secondary"
-                onClick={() => fileInputRef.current?.click()}
-                disabled={isUploading}
-              >
-                Browse Files
-              </Button>
-              <input
-                ref={fileInputRef}
-                type="file"
-                accept=".3mf"
-                multiple
-                className="hidden"
-                onChange={handleFileSelect}
-              />
-            </div>
-          </div>
- 
-          {/* Optional Printer Selection */}
-          <div className="px-4 pb-4">
-            <label className="block text-sm text-bambu-gray mb-2">
-              Associate with printer (optional)
-            </label>
-            <select
-              className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-              value={selectedPrinter || ''}
-              onChange={(e) =>
-                setSelectedPrinter(e.target.value ? Number(e.target.value) : undefined)
-              }
-              disabled={isUploading}
-            >
-              <option value="">No printer</option>
-              {printers?.map((p) => (
-                <option key={p.id} value={p.id}>
-                  {p.name}
-                </option>
-              ))}
-            </select>
-          </div>
- 
-          {/* File List */}
-          {files.length > 0 && (
-            <div className="px-4 pb-4 max-h-60 overflow-y-auto">
-              <div className="space-y-2">
-                {files.map((f, index) => (
-                  <div
-                    key={`${f.file.name}-${index}`}
-                    className="flex items-center gap-3 p-3 bg-bambu-dark rounded-lg"
-                  >
-                    <File className="w-5 h-5 text-bambu-gray flex-shrink-0" />
-                    <span className="flex-1 text-white text-sm truncate">
-                      {f.file.name}
-                    </span>
-                    <span className="text-xs text-bambu-gray">
-                      {(f.file.size / (1024 * 1024)).toFixed(1)} MB
-                    </span>
-                    {f.status === 'pending' && (
-                      <button
-                        onClick={() => removeFile(index)}
-                        className="text-bambu-gray hover:text-red-400 transition-colors"
-                        disabled={isUploading}
-                      >
-                        <X className="w-4 h-4" />
-                      </button>
-                    )}
-                    {f.status === 'uploading' && (
-                      <Loader2 className="w-4 h-4 text-bambu-green animate-spin" />
-                    )}
-                    {f.status === 'success' && (
-                      <CheckCircle className="w-4 h-4 text-bambu-green" />
-                    )}
-                    {f.status === 'error' && (
-                      <div className="flex items-center gap-2">
-                        <span className="text-xs text-red-400">{f.error}</span>
-                        <AlertCircle className="w-4 h-4 text-red-400" />
-                      </div>
-                    )}
-                  </div>
-                ))}
-              </div>
-            </div>
-          )}
- 
-          {/* Upload Result Summary */}
-          {uploadResult && (
-            <div className="px-4 pb-4">
-              <div className="p-3 bg-bambu-dark rounded-lg">
-                <p className="text-sm text-white">
-                  <span className="text-bambu-green">{uploadResult.uploaded}</span> uploaded
-                  {uploadResult.failed > 0 && (
-                    <>, <span className="text-red-400">{uploadResult.failed}</span> failed</>
-                  )}
-                </p>
-              </div>
-            </div>
-          )}
- 
-          {/* Footer */}
-          <div className="flex gap-3 p-4 border-t border-bambu-dark-tertiary">
-            <Button variant="secondary" onClick={onClose} className="flex-1">
-              {uploadResult ? 'Close' : 'Cancel'}
-            </Button>
-            {!uploadResult && (
-              <Button
-                onClick={handleUpload}
-                disabled={pendingCount === 0 || isUploading}
-                className="flex-1"
-              >
-                {isUploading ? (
-                  <>
-                    <Loader2 className="w-4 h-4 animate-spin" />
-                    Uploading...
-                  </>
-                ) : (
-                  <>
-                    <Upload className="w-4 h-4" />
-                    Upload {pendingCount > 0 && `(${pendingCount})`}
-                  </>
-                )}
-              </Button>
-            )}
-          </div>
-        </CardContent>
-      </Card>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/icons/WifiSignal.tsx.html b/frontend/coverage/src/components/icons/WifiSignal.tsx.html deleted file mode 100644 index 7731f4fc8..000000000 --- a/frontend/coverage/src/components/icons/WifiSignal.tsx.html +++ /dev/null @@ -1,277 +0,0 @@ - - - - - - Code coverage report for src/components/icons/WifiSignal.tsx - - - - - - - - - -
-
-

All files / src/components/icons WifiSignal.tsx

-
- -
- 0% - Statements - 0/44 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/44 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
interface WifiSignalProps {
-  signal: number | null | undefined;  // dBm value
-  className?: string;
-}
- 
-/**
- * WiFi signal icon with 4 bars that fill based on signal strength.
- * - 4 bars: >= -50 dBm (excellent)
- * - 3 bars: >= -60 dBm (good)
- * - 2 bars: >= -70 dBm (fair)
- * - 1 bar:  < -70 dBm (weak)
- * - 0 bars: no signal data
- */
-export function WifiSignal({ signal, className = "w-4 h-4" }: WifiSignalProps) {
-  let bars = 0;
-  if (signal != null) {
-    if (signal >= -50) bars = 4;
-    else if (signal >= -60) bars = 3;
-    else if (signal >= -70) bars = 2;
-    else bars = 1;
-  }
- 
-  const activeColor = "#00ae42";  // bambu-green
-  const inactiveColor = "#4a4a4a";  // dark gray
- 
-  return (
-    <svg
-      viewBox="0 0 24 24"
-      fill="none"
-      stroke="currentColor"
-      strokeWidth="2"
-      strokeLinecap="round"
-      strokeLinejoin="round"
-      className={className}
-    >
-      {/* Dot at bottom */}
-      <circle
-        cx="12"
-        cy="20"
-        r="1"
-        fill={bars >= 1 ? activeColor : inactiveColor}
-        stroke={bars >= 1 ? activeColor : inactiveColor}
-      />
-      {/* First arc (smallest) */}
-      <path
-        d="M8.5 16.5a5 5 0 0 1 7 0"
-        stroke={bars >= 2 ? activeColor : inactiveColor}
-        fill="none"
-      />
-      {/* Second arc */}
-      <path
-        d="M5 13a10 10 0 0 1 14 0"
-        stroke={bars >= 3 ? activeColor : inactiveColor}
-        fill="none"
-      />
-      {/* Third arc (largest) */}
-      <path
-        d="M1.5 9.5a15 15 0 0 1 21 0"
-        stroke={bars >= 4 ? activeColor : inactiveColor}
-        fill="none"
-      />
-    </svg>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/icons/index.html b/frontend/coverage/src/components/icons/index.html deleted file mode 100644 index 2831ea356..000000000 --- a/frontend/coverage/src/components/icons/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/components/icons - - - - - - - - - -
-
-

All files src/components/icons

-
- -
- 0% - Statements - 0/44 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/44 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
WifiSignal.tsx -
-
0%0/440%0/10%0/10%0/44
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/index.html b/frontend/coverage/src/components/index.html deleted file mode 100644 index ef50ff836..000000000 --- a/frontend/coverage/src/components/index.html +++ /dev/null @@ -1,776 +0,0 @@ - - - - - - Code coverage report for src/components - - - - - - - - - -
-
-

All files src/components

-
- -
- 3.65% - Statements - 352/9626 -
- - -
- 46% - Branches - 46/100 -
- - -
- 18.66% - Functions - 14/75 -
- - -
- 3.65% - Lines - 352/9626 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
AMSHistoryModal.tsx -
-
0%0/2870%0/10%0/10%0/287
AddExternalLinkModal.tsx -
-
0%0/2250%0/10%0/10%0/225
AddNotificationModal.tsx -
-
0%0/4410%0/10%0/10%0/441
AddSmartPlugModal.tsx -
-
0%0/3320%0/10%0/10%0/332
AddToQueueModal.tsx -
-
0%0/1770%0/10%0/10%0/177
BackupModal.tsx -
-
0%0/2420%0/10%0/10%0/242
BatchTagModal.tsx -
-
0%0/1780%0/10%0/10%0/178
Button.tsx -
-
100%30/30100%1/1100%1/1100%30/30
CalendarView.tsx -
-
0%0/2220%0/10%0/10%0/222
Card.tsx -
-
100%19/19100%3/3100%3/3100%19/19
CompareArchivesModal.tsx -
-
0%0/1490%0/10%0/10%0/149
ConfirmModal.tsx -
-
100%61/61100%5/5100%3/3100%61/61
ContextMenu.tsx -
-
0%0/1330%0/10%0/10%0/133
Dashboard.tsx -
-
0%0/2280%0/10%0/10%0/228
EditArchiveModal.tsx -
-
0%0/3070%0/10%0/10%0/307
EditQueueItemModal.tsx -
-
0%0/1800%0/10%0/10%0/180
ExternalLinksSettings.tsx -
-
0%0/1440%0/10%0/10%0/144
FilamentTrends.tsx -
-
0%0/2610%0/10%0/10%0/261
FileManagerModal.tsx -
-
0%0/2610%0/10%0/10%0/261
GcodeViewer.tsx -
-
0%0/1390%0/10%0/10%0/139
HMSErrorModal.tsx -
-
0%0/1180%0/10%0/10%0/118
IconPicker.tsx -
-
0%0/790%0/10%0/10%0/79
KProfilesView.tsx -
-
0%0/11610%0/10%0/10%0/1161
KeyboardShortcutsModal.tsx -
-
0%0/1090%0/10%0/10%0/109
Layout.tsx -
-
0%0/4390%0/10%0/10%0/439
MQTTDebugModal.tsx -
-
0%0/2560%0/10%0/10%0/256
ModelViewer.tsx -
-
0%0/3670%0/10%0/10%0/367
ModelViewerModal.tsx -
-
0%0/1040%0/10%0/10%0/104
NotificationLogViewer.tsx -
-
0%0/2210%0/10%0/10%0/221
NotificationProviderCard.tsx -
-
0%0/3400%0/10%0/10%0/340
NotificationTemplateEditor.tsx -
-
0%0/2050%0/10%0/10%0/205
PhotoGalleryModal.tsx -
-
0%0/1240%0/10%0/10%0/124
PrintCalendar.tsx -
-
0%0/1050%0/10%0/10%0/105
PrinterQueueWidget.tsx -
-
0%0/510%0/10%0/10%0/51
ProjectPageModal.tsx -
-
0%0/3450%0/10%0/10%0/345
QRCodeModal.tsx -
-
0%0/510%0/10%0/10%0/51
ReprintModal.tsx -
-
0%0/1020%0/10%0/10%0/102
RestoreModal.tsx -
-
0%0/2840%0/10%0/10%0/284
RichTextEditor.tsx -
-
0%0/1330%0/10%0/10%0/133
SmartPlugCard.tsx -
-
78.51%212/27067.44%29/4319.23%5/2678.51%212/270
SpoolmanSettings.tsx -
-
0%0/2820%0/10%0/10%0/282
ThemeContext.tsx -
-
0%0/350%0/10%0/10%0/35
TimelapseViewer.tsx -
-
0%0/1650%0/10%0/10%0/165
Toggle.tsx -
-
100%30/30100%8/8100%2/2100%30/30
UploadModal.tsx -
-
0%0/2340%0/10%0/10%0/234
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/contexts/ThemeContext.tsx.html b/frontend/coverage/src/contexts/ThemeContext.tsx.html deleted file mode 100644 index 037e163d6..000000000 --- a/frontend/coverage/src/contexts/ThemeContext.tsx.html +++ /dev/null @@ -1,241 +0,0 @@ - - - - - - Code coverage report for src/contexts/ThemeContext.tsx - - - - - - - - - -
-
-

All files / src/contexts ThemeContext.tsx

-
- -
- 65.71% - Statements - 23/35 -
- - -
- 60% - Branches - 3/5 -
- - -
- 25% - Functions - 1/4 -
- - -
- 65.71% - Lines - 23/35 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -531x -  -  -  -  -  -  -  -  -  -1x -  -1x -45x -45x -45x -  -45x -45x -  -45x -45x -45x -45x -45x -  -  -45x -45x -  -45x -  -  -  -45x -  -  -  -45x -45x -45x -45x -  -45x -  -1x -  -  -  -  -  -  - 
import { createContext, useContext, useEffect, useState, type ReactNode } from 'react';
- 
-type Theme = 'light' | 'dark';
- 
-interface ThemeContextType {
-  theme: Theme;
-  toggleTheme: () => void;
-  setTheme: (theme: Theme) => void;
-}
- 
-const ThemeContext = createContext<ThemeContextType | undefined>(undefined);
- 
-export function ThemeProvider({ children }: { children: ReactNode }) {
-  const [theme, setThemeState] = useState<Theme>(() => {
-    const stored = localStorage.getItem('theme') as Theme | null;
-    if (stored) return stored;
-    // Default to dark theme
-    return 'dark';
-  });
- 
-  useEffect(() => {
-    const root = document.documentElement;
-    if (theme === 'dark') {
-      root.classList.add('dark');
-    } else {
-      root.classList.remove('dark');
-    }
-    localStorage.setItem('theme', theme);
-  }, [theme]);
- 
-  const toggleTheme = () => {
-    setThemeState((prev) => (prev === 'dark' ? 'light' : 'dark'));
-  };
- 
-  const setTheme = (newTheme: Theme) => {
-    setThemeState(newTheme);
-  };
- 
-  return (
-    <ThemeContext.Provider value={{ theme, toggleTheme, setTheme }}>
-      {children}
-    </ThemeContext.Provider>
-  );
-}
- 
-export function useTheme() {
-  const context = useContext(ThemeContext);
-  if (!context) {
-    throw new Error('useTheme must be used within a ThemeProvider');
-  }
-  return context;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/contexts/ToastContext.tsx.html b/frontend/coverage/src/contexts/ToastContext.tsx.html deleted file mode 100644 index 07a3eabaf..000000000 --- a/frontend/coverage/src/contexts/ToastContext.tsx.html +++ /dev/null @@ -1,328 +0,0 @@ - - - - - - Code coverage report for src/contexts/ToastContext.tsx - - - - - - - - - -
-
-

All files / src/contexts ToastContext.tsx

-
- -
- 56.6% - Statements - 30/53 -
- - -
- 100% - Branches - 1/1 -
- - -
- 50% - Functions - 1/2 -
- - -
- 56.6% - Lines - 30/53 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -821x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -1x -  -  -  -  -  -  -  -1x -1x -1x -1x -1x -1x -  -1x -1x -1x -1x -1x -1x -  -1x -45x -  -45x -  -  -  -  -  -  -  -45x -  -45x -  -45x -  -45x -45x -45x -  -  -45x -45x -  -  -  -  -  -  -  -  -  -  -  -  -  -45x -45x -45x -  -45x - 
import { createContext, useContext, useState, useCallback, type ReactNode } from 'react';
-import { CheckCircle, XCircle, AlertCircle, Info, X } from 'lucide-react';
- 
-type ToastType = 'success' | 'error' | 'warning' | 'info';
- 
-interface Toast {
-  id: string;
-  message: string;
-  type: ToastType;
-}
- 
-interface ToastContextType {
-  showToast: (message: string, type?: ToastType) => void;
-}
- 
-const ToastContext = createContext<ToastContextType | undefined>(undefined);
- 
-export function useToast() {
-  const context = useContext(ToastContext);
-  if (!context) {
-    throw new Error('useToast must be used within a ToastProvider');
-  }
-  return context;
-}
- 
-const icons = {
-  success: <CheckCircle className="w-5 h-5 text-green-400" />,
-  error: <XCircle className="w-5 h-5 text-red-400" />,
-  warning: <AlertCircle className="w-5 h-5 text-yellow-400" />,
-  info: <Info className="w-5 h-5 text-blue-400" />,
-};
- 
-const bgColors = {
-  success: 'bg-green-500/10 border-green-500/30',
-  error: 'bg-red-500/10 border-red-500/30',
-  warning: 'bg-yellow-500/10 border-yellow-500/30',
-  info: 'bg-blue-500/10 border-blue-500/30',
-};
- 
-export function ToastProvider({ children }: { children: ReactNode }) {
-  const [toasts, setToasts] = useState<Toast[]>([]);
- 
-  const showToast = useCallback((message: string, type: ToastType = 'success') => {
-    const id = Math.random().toString(36).substr(2, 9);
-    setToasts((prev) => [...prev, { id, message, type }]);
- 
-    // Auto-dismiss after 3 seconds
-    setTimeout(() => {
-      setToasts((prev) => prev.filter((t) => t.id !== id));
-    }, 3000);
-  }, []);
- 
-  const dismissToast = useCallback((id: string) => {
-    setToasts((prev) => prev.filter((t) => t.id !== id));
-  }, []);
- 
-  return (
-    <ToastContext.Provider value={{ showToast }}>
-      {children}
- 
-      {/* Toast Container */}
-      <div className="fixed bottom-4 right-4 z-50 flex flex-col gap-2">
-        {toasts.map((toast) => (
-          <div
-            key={toast.id}
-            className={`flex items-center gap-3 px-4 py-3 rounded-lg border shadow-lg backdrop-blur-sm animate-slide-in ${bgColors[toast.type]}`}
-          >
-            {icons[toast.type]}
-            <span className="text-white text-sm">{toast.message}</span>
-            <button
-              onClick={() => dismissToast(toast.id)}
-              className="ml-2 text-bambu-gray hover:text-white transition-colors"
-            >
-              <X className="w-4 h-4" />
-            </button>
-          </div>
-        ))}
-      </div>
-    </ToastContext.Provider>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/contexts/index.html b/frontend/coverage/src/contexts/index.html deleted file mode 100644 index 570be244b..000000000 --- a/frontend/coverage/src/contexts/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/contexts - - - - - - - - - -
-
-

All files src/contexts

-
- -
- 60.22% - Statements - 53/88 -
- - -
- 66.66% - Branches - 4/6 -
- - -
- 33.33% - Functions - 2/6 -
- - -
- 60.22% - Lines - 53/88 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
ThemeContext.tsx -
-
65.71%23/3560%3/525%1/465.71%23/35
ToastContext.tsx -
-
56.6%30/53100%1/150%1/256.6%30/53
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/hooks/index.html b/frontend/coverage/src/hooks/index.html deleted file mode 100644 index 20aca43fc..000000000 --- a/frontend/coverage/src/hooks/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src/hooks - - - - - - - - - -
-
-

All files src/hooks

-
- -
- 1.33% - Statements - 2/150 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/3 -
- - -
- 1.33% - Lines - 2/150 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
useIsMobile.ts -
-
0%0/170%0/10%0/10%0/17
useLongPress.ts -
-
0%0/360%0/10%0/10%0/36
useWebSocket.ts -
-
2.06%2/97100%0/00%0/12.06%2/97
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/hooks/useIsMobile.ts.html b/frontend/coverage/src/hooks/useIsMobile.ts.html deleted file mode 100644 index 3525c694c..000000000 --- a/frontend/coverage/src/hooks/useIsMobile.ts.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - Code coverage report for src/hooks/useIsMobile.ts - - - - - - - - - -
-
-

All files / src/hooks useIsMobile.ts

-
- -
- 0% - Statements - 0/17 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/17 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useEffect } from 'react';
- 
-const MOBILE_BREAKPOINT = 768; // md breakpoint
- 
-export function useIsMobile(): boolean {
-  const [isMobile, setIsMobile] = useState(() =>
-    typeof window !== 'undefined' ? window.innerWidth < MOBILE_BREAKPOINT : false
-  );
- 
-  useEffect(() => {
-    const mediaQuery = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
- 
-    const handleChange = (e: MediaQueryListEvent) => {
-      setIsMobile(e.matches);
-    };
- 
-    // Set initial value
-    setIsMobile(mediaQuery.matches);
- 
-    // Modern browsers support addEventListener
-    mediaQuery.addEventListener('change', handleChange);
-    return () => mediaQuery.removeEventListener('change', handleChange);
-  }, []);
- 
-  return isMobile;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/hooks/useLongPress.ts.html b/frontend/coverage/src/hooks/useLongPress.ts.html deleted file mode 100644 index ea0daf643..000000000 --- a/frontend/coverage/src/hooks/useLongPress.ts.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - Code coverage report for src/hooks/useLongPress.ts - - - - - - - - - -
-
-

All files / src/hooks useLongPress.ts

-
- -
- 0% - Statements - 0/36 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/36 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useCallback, useRef } from 'react';
- 
-interface LongPressOptions {
-  onLongPress: (e: React.TouchEvent | React.MouseEvent) => void;
-  onClick?: () => void;
-  delay?: number;
-}
- 
-export function useLongPress({ onLongPress, onClick, delay = 500 }: LongPressOptions) {
-  const timeoutRef = useRef<number | null>(null);
-  const targetRef = useRef<EventTarget | null>(null);
-  const longPressTriggered = useRef(false);
- 
-  const start = useCallback(
-    (e: React.TouchEvent | React.MouseEvent) => {
-      longPressTriggered.current = false;
-      targetRef.current = e.target;
-      timeoutRef.current = window.setTimeout(() => {
-        longPressTriggered.current = true;
-        onLongPress(e);
-      }, delay);
-    },
-    [onLongPress, delay]
-  );
- 
-  const clear = useCallback(
-    (e: React.TouchEvent | React.MouseEvent, shouldTriggerClick = true) => {
-      if (timeoutRef.current) {
-        clearTimeout(timeoutRef.current);
-        timeoutRef.current = null;
-      }
-      if (shouldTriggerClick && !longPressTriggered.current && onClick && targetRef.current === e.target) {
-        onClick();
-      }
-    },
-    [onClick]
-  );
- 
-  return {
-    onMouseDown: start,
-    onMouseUp: (e: React.MouseEvent) => clear(e, true),
-    onMouseLeave: (e: React.MouseEvent) => clear(e, false),
-    onTouchStart: start,
-    onTouchEnd: (e: React.TouchEvent) => clear(e, true),
-  };
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/hooks/useWebSocket.ts.html b/frontend/coverage/src/hooks/useWebSocket.ts.html deleted file mode 100644 index 70b6a42a9..000000000 --- a/frontend/coverage/src/hooks/useWebSocket.ts.html +++ /dev/null @@ -1,478 +0,0 @@ - - - - - - Code coverage report for src/hooks/useWebSocket.ts - - - - - - - - - -
-
-

All files / src/hooks useWebSocket.ts

-
- -
- 2.06% - Statements - 2/97 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 2.06% - Lines - 2/97 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -1321x -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useEffect, useRef, useCallback, useState } from 'react';
-import { useQueryClient } from '@tanstack/react-query';
- 
-interface WebSocketMessage {
-  type: string;
-  printer_id?: number;
-  data?: Record<string, unknown>;
-}
- 
-export function useWebSocket() {
-  const wsRef = useRef<WebSocket | null>(null);
-  const reconnectTimeoutRef = useRef<number | null>(null);
-  const queryClient = useQueryClient();
-  const [isConnected, setIsConnected] = useState(false);
- 
-  const connect = useCallback(() => {
-    if (wsRef.current?.readyState === WebSocket.OPEN) {
-      return;
-    }
- 
-    const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
-    const wsUrl = `${protocol}//${window.location.host}/api/v1/ws`;
- 
-    const ws = new WebSocket(wsUrl);
- 
-    let pingInterval: number | null = null;
- 
-    ws.onopen = () => {
-      console.log('[WebSocket] Connected');
-      setIsConnected(true);
-      // Start ping interval
-      pingInterval = window.setInterval(() => {
-        if (ws.readyState === WebSocket.OPEN) {
-          ws.send(JSON.stringify({ type: 'ping' }));
-        }
-      }, 30000);
-    };
- 
-    ws.onmessage = (event) => {
-      try {
-        const message: WebSocketMessage = JSON.parse(event.data);
-        handleMessage(message);
-      } catch {
-        // Ignore parse errors
-      }
-    };
- 
-    ws.onclose = (event) => {
-      console.log('[WebSocket] Closed', event.code, event.reason);
-      if (pingInterval) {
-        clearInterval(pingInterval);
-        pingInterval = null;
-      }
-      setIsConnected(false);
-      wsRef.current = null;
- 
-      // Reconnect after 3 seconds
-      reconnectTimeoutRef.current = window.setTimeout(() => {
-        connect();
-      }, 3000);
-    };
- 
-    ws.onerror = (error) => {
-      console.error('[WebSocket] Error', error);
-      ws.close();
-    };
- 
-    wsRef.current = ws;
-  }, []);
- 
-  const handleMessage = useCallback((message: WebSocketMessage) => {
-    switch (message.type) {
-      case 'printer_status':
-        // Update the printer status in the query cache
-        if (message.printer_id !== undefined) {
-          queryClient.setQueryData(
-            ['printerStatus', message.printer_id],
-            (old: Record<string, unknown> | undefined) => {
-              const merged = {
-                ...old,
-                ...message.data,
-              };
-              // Preserve last known wifi_signal if new value is null
-              if (merged.wifi_signal == null && old?.wifi_signal != null) {
-                merged.wifi_signal = old.wifi_signal;
-              }
-              return merged;
-            }
-          );
-        }
-        break;
- 
-      case 'print_complete':
-        // Invalidate archives to refresh the list
-        queryClient.invalidateQueries({ queryKey: ['archives'] });
-        queryClient.invalidateQueries({ queryKey: ['archiveStats'] });
-        break;
- 
-      case 'archive_created':
-        // Invalidate archives to show new archive
-        queryClient.invalidateQueries({ queryKey: ['archives'] });
-        queryClient.invalidateQueries({ queryKey: ['archiveStats'] });
-        break;
- 
-      case 'pong':
-        // Keepalive response, ignore
-        break;
-    }
-  }, [queryClient]);
- 
-  useEffect(() => {
-    connect();
- 
-    return () => {
-      if (reconnectTimeoutRef.current) {
-        clearTimeout(reconnectTimeoutRef.current);
-      }
-      if (wsRef.current) {
-        wsRef.current.close();
-      }
-    };
-  }, [connect]);
- 
-  const sendMessage = useCallback((message: Record<string, unknown>) => {
-    if (wsRef.current?.readyState === WebSocket.OPEN) {
-      wsRef.current.send(JSON.stringify(message));
-    }
-  }, []);
- 
-  return { isConnected, sendMessage };
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/i18n/index.html b/frontend/coverage/src/i18n/index.html deleted file mode 100644 index d0bbe065f..000000000 --- a/frontend/coverage/src/i18n/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/i18n - - - - - - - - - -
-
-

All files src/i18n

-
- -
- 0% - Statements - 0/29 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/29 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
index.ts -
-
0%0/290%0/10%0/10%0/29
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/i18n/index.ts.html b/frontend/coverage/src/i18n/index.ts.html deleted file mode 100644 index 269a86c3f..000000000 --- a/frontend/coverage/src/i18n/index.ts.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - Code coverage report for src/i18n/index.ts - - - - - - - - - -
-
-

All files / src/i18n index.ts

-
- -
- 0% - Statements - 0/29 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/29 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import i18n from 'i18next';
-import { initReactI18next } from 'react-i18next';
-import LanguageDetector from 'i18next-browser-languagedetector';
- 
-// Import translations directly for bundling
-import en from './locales/en';
-import de from './locales/de';
- 
-const resources = {
-  en: { translation: en },
-  de: { translation: de },
-};
- 
-i18n
-  .use(LanguageDetector)
-  .use(initReactI18next)
-  .init({
-    resources,
-    fallbackLng: 'en',
-    supportedLngs: ['en', 'de'],
- 
-    detection: {
-      // Order of detection methods
-      order: ['localStorage', 'navigator', 'htmlTag'],
-      // Key to use in localStorage
-      lookupLocalStorage: 'bambutrack_language',
-      // Cache user language
-      caches: ['localStorage'],
-    },
- 
-    interpolation: {
-      escapeValue: false, // React already escapes
-    },
- 
-    react: {
-      useSuspense: false,
-    },
-  });
- 
-export default i18n;
- 
-// Helper to get available languages
-export const availableLanguages = [
-  { code: 'en', name: 'English', nativeName: 'English' },
-  { code: 'de', name: 'German', nativeName: 'Deutsch' },
-];
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/i18n/locales/de.ts.html b/frontend/coverage/src/i18n/locales/de.ts.html deleted file mode 100644 index de4b8c407..000000000 --- a/frontend/coverage/src/i18n/locales/de.ts.html +++ /dev/null @@ -1,1162 +0,0 @@ - - - - - - Code coverage report for src/i18n/locales/de.ts - - - - - - - - - -
-
-

All files / src/i18n/locales de.ts

-
- -
- 0% - Statements - 0/333 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/333 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
export default {
-  // Navigation
-  nav: {
-    printers: 'Drucker',
-    archives: 'Archiv',
-    queue: 'Warteschlange',
-    stats: 'Statistiken',
-    profiles: 'Profile',
-    maintenance: 'Wartung',
-    projects: 'Projekte',
-    settings: 'Einstellungen',
-    collapseSidebar: 'Seitenleiste einklappen',
-    expandSidebar: 'Seitenleiste ausklappen',
-    update: 'Update',
-    updateAvailable: 'Update verfügbar: v{{version}}',
-    viewOnGithub: 'Auf GitHub ansehen',
-    keyboardShortcuts: 'Tastaturkürzel (?)',
-    switchToLight: 'Zum hellen Modus wechseln',
-    switchToDark: 'Zum dunklen Modus wechseln',
-  },
- 
-  // Common
-  common: {
-    save: 'Speichern',
-    cancel: 'Abbrechen',
-    delete: 'Löschen',
-    edit: 'Bearbeiten',
-    add: 'Hinzufügen',
-    close: 'Schließen',
-    confirm: 'Bestätigen',
-    loading: 'Lädt...',
-    error: 'Fehler',
-    success: 'Erfolg',
-    warning: 'Warnung',
-    enabled: 'Aktiviert',
-    disabled: 'Deaktiviert',
-    yes: 'Ja',
-    no: 'Nein',
-    on: 'An',
-    off: 'Aus',
-    all: 'Alle',
-    none: 'Keine',
-    search: 'Suchen',
-    filter: 'Filtern',
-    sort: 'Sortieren',
-    refresh: 'Aktualisieren',
-    download: 'Herunterladen',
-    upload: 'Hochladen',
-    actions: 'Aktionen',
-    status: 'Status',
-    name: 'Name',
-    description: 'Beschreibung',
-    date: 'Datum',
-    time: 'Zeit',
-    hours: 'Stunden',
-    minutes: 'Minuten',
-    seconds: 'Sekunden',
-    noPrinters: 'Keine Drucker konfiguriert',
-    noData: 'Keine Daten verfügbar',
-    required: 'Erforderlich',
-    optional: 'Optional',
-  },
- 
-  // Printers page
-  printers: {
-    title: 'Drucker',
-    addPrinter: 'Drucker hinzufügen',
-    editPrinter: 'Drucker bearbeiten',
-    deletePrinter: 'Drucker löschen',
-    printerName: 'Druckername',
-    serialNumber: 'Seriennummer',
-    ipAddress: 'IP-Adresse',
-    accessCode: 'Zugangscode',
-    model: 'Modell',
-    nozzleCount: 'Düsenanzahl',
-    autoArchive: 'Automatische Archivierung',
-    status: {
-      idle: 'Bereit',
-      printing: 'Druckt',
-      paused: 'Pausiert',
-      offline: 'Offline',
-      error: 'Fehler',
-      finished: 'Fertig',
-      unknown: 'Unbekannt',
-    },
-    temperatures: {
-      nozzle: 'Düse',
-      bed: 'Druckbett',
-      chamber: 'Kammer',
-    },
-    progress: '{{percent}}% abgeschlossen',
-    timeRemaining: 'Noch {{time}}',
-    deleteConfirm: 'Möchten Sie "{{name}}" wirklich löschen?',
-    maintenanceOk: 'Wartung OK',
-    maintenanceWarning: '{{count}} Warnung',
-    maintenanceWarning_plural: '{{count}} Warnungen',
-    maintenanceDue: '{{count}} fällig',
-    maintenanceDue_plural: '{{count}} fällig',
-  },
- 
-  // Archives page
-  archives: {
-    title: 'Druckarchiv',
-    searchPlaceholder: 'Archiv durchsuchen...',
-    filterByPrinter: 'Nach Drucker filtern',
-    filterByStatus: 'Nach Status filtern',
-    sortBy: 'Sortieren nach',
-    sortNewest: 'Neueste zuerst',
-    sortOldest: 'Älteste zuerst',
-    sortName: 'Name',
-    sortDuration: 'Dauer',
-    noArchives: 'Keine Archive gefunden',
-    printTime: 'Druckzeit',
-    filamentUsed: 'Verbrauchtes Filament',
-    cost: 'Kosten',
-    reprint: 'Erneut drucken',
-    preview: 'Vorschau',
-    deleteArchive: 'Archiv löschen',
-    deleteConfirm: 'Möchten Sie dieses Archiv wirklich löschen?',
-    favorite: 'Favorit',
-    unfavorite: 'Aus Favoriten entfernen',
-    viewDetails: 'Details anzeigen',
-    status: {
-      completed: 'Abgeschlossen',
-      failed: 'Fehlgeschlagen',
-      stopped: 'Gestoppt',
-    },
-  },
- 
-  // Queue page
-  queue: {
-    title: 'Druckwarteschlange',
-    addToQueue: 'Zur Warteschlange hinzufügen',
-    clearQueue: 'Warteschlange leeren',
-    emptyQueue: 'Warteschlange ist leer',
-    position: 'Position',
-    scheduledTime: 'Geplante Zeit',
-    moveUp: 'Nach oben',
-    moveDown: 'Nach unten',
-    remove: 'Entfernen',
-    startNow: 'Jetzt starten',
-    status: {
-      pending: 'Ausstehend',
-      printing: 'Druckt',
-      completed: 'Abgeschlossen',
-      failed: 'Fehlgeschlagen',
-      cancelled: 'Abgebrochen',
-    },
-  },
- 
-  // Statistics page
-  stats: {
-    title: 'Statistiken',
-    overview: 'Übersicht',
-    totalPrints: 'Gesamtdrucke',
-    successRate: 'Erfolgsrate',
-    totalPrintTime: 'Gesamtdruckzeit',
-    totalFilament: 'Gesamtverbrauch Filament',
-    totalCost: 'Gesamtkosten',
-    averagePrintTime: 'Durchschnittliche Druckzeit',
-    printsPerDay: 'Drucke pro Tag',
-    byPrinter: 'Nach Drucker',
-    byMaterial: 'Nach Material',
-    byMonth: 'Nach Monat',
-    last7Days: 'Letzte 7 Tage',
-    last30Days: 'Letzte 30 Tage',
-    last90Days: 'Letzte 90 Tage',
-    allTime: 'Gesamt',
-  },
- 
-  // Profiles page
-  profiles: {
-    title: 'Filament-Profile',
-    addProfile: 'Profil hinzufügen',
-    editProfile: 'Profil bearbeiten',
-    deleteProfile: 'Profil löschen',
-    material: 'Material',
-    brand: 'Marke',
-    color: 'Farbe',
-    diameter: 'Durchmesser',
-    density: 'Dichte',
-    costPerKg: 'Kosten pro kg',
-    spoolWeight: 'Spulengewicht',
-    noProfiles: 'Keine Profile konfiguriert',
-    deleteConfirm: 'Möchten Sie dieses Profil wirklich löschen?',
-  },
- 
-  // Maintenance page
-  maintenance: {
-    title: 'Wartung',
-    overview: 'Übersicht',
-    allOk: 'Alle Wartungen aktuell',
-    dueCount: '{{count}} Aufgabe fällig',
-    dueCount_plural: '{{count}} Aufgaben fällig',
-    warningCount: '{{count}} Warnung',
-    warningCount_plural: '{{count}} Warnungen',
-    totalPrintTime: 'Gesamtdruckzeit',
-    nextMaintenance: 'Nächste Wartung',
-    nothingDue: 'Nichts fällig',
-    tasks: 'Aufgaben',
-    lastPerformed: 'Zuletzt durchgeführt',
-    interval: 'Intervall',
-    hoursRemaining: '{{hours}}h verbleibend',
-    hoursOverdue: '{{hours}}h überfällig',
-    markDone: 'Als erledigt markieren',
-    performMaintenance: 'Wartung durchführen',
-    history: 'Verlauf',
-    noHistory: 'Kein Wartungsverlauf',
-    editPrintHours: 'Druckstunden bearbeiten',
-    currentHours: 'Aktuelle Stunden',
-    types: {
-      lubricateRails: 'Linearschienen schmieren',
-      cleanNozzle: 'Düse/Hotend reinigen',
-      checkBelts: 'Riemenspannung prüfen',
-      cleanBuildPlate: 'Druckbett reinigen',
-      checkExtruder: 'Extruderzahnräder prüfen',
-      checkCooling: 'Kühlungslüfter prüfen',
-      generalInspection: 'Allgemeine Inspektion',
-    },
-  },
- 
-  // Settings page
-  settings: {
-    title: 'Einstellungen',
-    general: 'Allgemein',
-    appearance: 'Erscheinungsbild',
-    notifications: 'Benachrichtigungen',
-    smartPlugs: 'Smart Plugs',
-    spoolman: 'Spoolman',
-    updates: 'Updates',
-    language: 'Sprache',
-    languageDescription: 'Wählen Sie Ihre bevorzugte Sprache',
-    theme: 'Design',
-    themeLight: 'Hell',
-    themeDark: 'Dunkel',
-    themeSystem: 'System',
-    defaultView: 'Standardansicht',
-    defaultViewDescription: 'Seite, die beim Öffnen der App angezeigt wird',
-    checkForUpdates: 'Nach Updates suchen',
-    autoUpdate: 'Automatische Updates',
-    currentVersion: 'Aktuelle Version',
-    latestVersion: 'Neueste Version',
-    upToDate: 'Sie sind auf dem neuesten Stand',
-    updateAvailable: 'Update verfügbar',
-    // Notifications
-    notificationLanguage: 'Benachrichtigungssprache',
-    notificationLanguageDescription: 'Sprache für Push-Benachrichtigungen',
-    notificationProviders: 'Benachrichtigungsanbieter',
-    addProvider: 'Anbieter hinzufügen',
-    editProvider: 'Anbieter bearbeiten',
-    providerType: 'Anbietertyp',
-    testNotification: 'Testbenachrichtigung',
-    testSuccess: 'Testbenachrichtigung erfolgreich gesendet',
-    testFailed: 'Testbenachrichtigung konnte nicht gesendet werden',
-    quietHours: 'Ruhezeiten',
-    quietHoursDescription: 'Keine Störungen während dieser Zeiten',
-    quietHoursStart: 'Beginn',
-    quietHoursEnd: 'Ende',
-    events: {
-      title: 'Benachrichtigungsereignisse',
-      printStart: 'Druck gestartet',
-      printComplete: 'Druck abgeschlossen',
-      printFailed: 'Druck fehlgeschlagen',
-      printStopped: 'Druck gestoppt',
-      printProgress: 'Fortschrittsmeldungen',
-      printProgressDescription: 'Bei 25%, 50%, 75% benachrichtigen',
-      printerOffline: 'Drucker offline',
-      printerError: 'Druckerfehler',
-      filamentLow: 'Filament niedrig',
-      maintenanceDue: 'Wartung fällig',
-      maintenanceDueDescription: 'Benachrichtigen, wenn Wartung erforderlich',
-    },
-    // Smart Plugs
-    smartPlug: {
-      title: 'Smart Plugs',
-      add: 'Smart Plug hinzufügen',
-      edit: 'Smart Plug bearbeiten',
-      name: 'Name',
-      ipAddress: 'IP-Adresse',
-      linkedPrinter: 'Verknüpfter Drucker',
-      autoOn: 'Automatisch einschalten',
-      autoOnDescription: 'Einschalten beim Druckstart',
-      autoOff: 'Automatisch ausschalten',
-      autoOffDescription: 'Ausschalten nach Druckende',
-      offDelay: 'Ausschaltverzögerung',
-      offDelayMinutes: 'Minuten nach Druck',
-      offDelayTemp: 'Wenn Düse unter Temperatur',
-      currentState: 'Aktueller Status',
-      turnOn: 'Einschalten',
-      turnOff: 'Ausschalten',
-    },
-    // Spoolman
-    spoolmanEnabled: 'Spoolman-Integration aktivieren',
-    spoolmanUrl: 'Spoolman URL',
-    spoolmanConnected: 'Verbunden',
-    spoolmanDisconnected: 'Nicht verbunden',
-  },
- 
-  // Notifications (for push notifications)
-  notification: {
-    printStarted: {
-      title: 'Druck gestartet',
-      body: '{{printer}}: {{filename}} wird gedruckt',
-    },
-    printCompleted: {
-      title: 'Druck abgeschlossen',
-      body: '{{printer}}: {{filename}} erfolgreich abgeschlossen',
-    },
-    printFailed: {
-      title: 'Druck fehlgeschlagen',
-      body: '{{printer}}: {{filename}} ist fehlgeschlagen',
-    },
-    printStopped: {
-      title: 'Druck gestoppt',
-      body: '{{printer}}: {{filename}} wurde gestoppt',
-    },
-    printProgress: {
-      title: 'Druckfortschritt',
-      body: '{{printer}}: {{filename}} ist zu {{percent}}% abgeschlossen',
-    },
-    printerOffline: {
-      title: 'Drucker offline',
-      body: '{{printer}} ist offline',
-    },
-    printerError: {
-      title: 'Druckerfehler',
-      body: '{{printer}}: {{error}}',
-    },
-    filamentLow: {
-      title: 'Filament niedrig',
-      body: '{{printer}}: Filament geht zur Neige',
-    },
-    maintenanceDue: {
-      title: 'Wartung fällig',
-      body: '{{printer}}: {{items}} benötigen Aufmerksamkeit',
-    },
-  },
- 
-  // Errors
-  errors: {
-    generic: 'Etwas ist schiefgelaufen',
-    networkError: 'Netzwerkfehler. Bitte überprüfen Sie Ihre Verbindung.',
-    notFound: 'Nicht gefunden',
-    unauthorized: 'Nicht autorisiert',
-    serverError: 'Serverfehler',
-    validationError: 'Bitte überprüfen Sie Ihre Eingabe',
-    printerConnectionFailed: 'Verbindung zum Drucker fehlgeschlagen',
-    saveFailed: 'Speichern fehlgeschlagen',
-    deleteFailed: 'Löschen fehlgeschlagen',
-    loadFailed: 'Laden der Daten fehlgeschlagen',
-  },
- 
-  // Confirmations
-  confirm: {
-    delete: 'Möchten Sie dies wirklich löschen?',
-    unsavedChanges: 'Sie haben ungespeicherte Änderungen. Möchten Sie wirklich verlassen?',
-    clearQueue: 'Möchten Sie die Warteschlange wirklich leeren?',
-  },
-};
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/i18n/locales/en.ts.html b/frontend/coverage/src/i18n/locales/en.ts.html deleted file mode 100644 index 6651e00e7..000000000 --- a/frontend/coverage/src/i18n/locales/en.ts.html +++ /dev/null @@ -1,1162 +0,0 @@ - - - - - - Code coverage report for src/i18n/locales/en.ts - - - - - - - - - -
-
-

All files / src/i18n/locales en.ts

-
- -
- 0% - Statements - 0/333 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/333 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
export default {
-  // Navigation
-  nav: {
-    printers: 'Printers',
-    archives: 'Archives',
-    queue: 'Queue',
-    stats: 'Statistics',
-    profiles: 'Profiles',
-    maintenance: 'Maintenance',
-    projects: 'Projects',
-    settings: 'Settings',
-    collapseSidebar: 'Collapse sidebar',
-    expandSidebar: 'Expand sidebar',
-    update: 'Update',
-    updateAvailable: 'Update available: v{{version}}',
-    viewOnGithub: 'View on GitHub',
-    keyboardShortcuts: 'Keyboard shortcuts (?)',
-    switchToLight: 'Switch to light mode',
-    switchToDark: 'Switch to dark mode',
-  },
- 
-  // Common
-  common: {
-    save: 'Save',
-    cancel: 'Cancel',
-    delete: 'Delete',
-    edit: 'Edit',
-    add: 'Add',
-    close: 'Close',
-    confirm: 'Confirm',
-    loading: 'Loading...',
-    error: 'Error',
-    success: 'Success',
-    warning: 'Warning',
-    enabled: 'Enabled',
-    disabled: 'Disabled',
-    yes: 'Yes',
-    no: 'No',
-    on: 'On',
-    off: 'Off',
-    all: 'All',
-    none: 'None',
-    search: 'Search',
-    filter: 'Filter',
-    sort: 'Sort',
-    refresh: 'Refresh',
-    download: 'Download',
-    upload: 'Upload',
-    actions: 'Actions',
-    status: 'Status',
-    name: 'Name',
-    description: 'Description',
-    date: 'Date',
-    time: 'Time',
-    hours: 'hours',
-    minutes: 'minutes',
-    seconds: 'seconds',
-    noPrinters: 'No printers configured',
-    noData: 'No data available',
-    required: 'Required',
-    optional: 'Optional',
-  },
- 
-  // Printers page
-  printers: {
-    title: 'Printers',
-    addPrinter: 'Add Printer',
-    editPrinter: 'Edit Printer',
-    deletePrinter: 'Delete Printer',
-    printerName: 'Printer Name',
-    serialNumber: 'Serial Number',
-    ipAddress: 'IP Address',
-    accessCode: 'Access Code',
-    model: 'Model',
-    nozzleCount: 'Nozzle Count',
-    autoArchive: 'Auto Archive',
-    status: {
-      idle: 'Idle',
-      printing: 'Printing',
-      paused: 'Paused',
-      offline: 'Offline',
-      error: 'Error',
-      finished: 'Finished',
-      unknown: 'Unknown',
-    },
-    temperatures: {
-      nozzle: 'Nozzle',
-      bed: 'Bed',
-      chamber: 'Chamber',
-    },
-    progress: '{{percent}}% complete',
-    timeRemaining: '{{time}} remaining',
-    deleteConfirm: 'Are you sure you want to delete "{{name}}"?',
-    maintenanceOk: 'Maintenance OK',
-    maintenanceWarning: '{{count}} warning',
-    maintenanceWarning_plural: '{{count}} warnings',
-    maintenanceDue: '{{count}} due',
-    maintenanceDue_plural: '{{count}} due',
-  },
- 
-  // Archives page
-  archives: {
-    title: 'Print Archives',
-    searchPlaceholder: 'Search archives...',
-    filterByPrinter: 'Filter by printer',
-    filterByStatus: 'Filter by status',
-    sortBy: 'Sort by',
-    sortNewest: 'Newest first',
-    sortOldest: 'Oldest first',
-    sortName: 'Name',
-    sortDuration: 'Duration',
-    noArchives: 'No archives found',
-    printTime: 'Print Time',
-    filamentUsed: 'Filament Used',
-    cost: 'Cost',
-    reprint: 'Reprint',
-    preview: 'Preview',
-    deleteArchive: 'Delete Archive',
-    deleteConfirm: 'Are you sure you want to delete this archive?',
-    favorite: 'Favorite',
-    unfavorite: 'Remove from favorites',
-    viewDetails: 'View Details',
-    status: {
-      completed: 'Completed',
-      failed: 'Failed',
-      stopped: 'Stopped',
-    },
-  },
- 
-  // Queue page
-  queue: {
-    title: 'Print Queue',
-    addToQueue: 'Add to Queue',
-    clearQueue: 'Clear Queue',
-    emptyQueue: 'Queue is empty',
-    position: 'Position',
-    scheduledTime: 'Scheduled Time',
-    moveUp: 'Move Up',
-    moveDown: 'Move Down',
-    remove: 'Remove',
-    startNow: 'Start Now',
-    status: {
-      pending: 'Pending',
-      printing: 'Printing',
-      completed: 'Completed',
-      failed: 'Failed',
-      cancelled: 'Cancelled',
-    },
-  },
- 
-  // Statistics page
-  stats: {
-    title: 'Statistics',
-    overview: 'Overview',
-    totalPrints: 'Total Prints',
-    successRate: 'Success Rate',
-    totalPrintTime: 'Total Print Time',
-    totalFilament: 'Total Filament Used',
-    totalCost: 'Total Cost',
-    averagePrintTime: 'Average Print Time',
-    printsPerDay: 'Prints per Day',
-    byPrinter: 'By Printer',
-    byMaterial: 'By Material',
-    byMonth: 'By Month',
-    last7Days: 'Last 7 Days',
-    last30Days: 'Last 30 Days',
-    last90Days: 'Last 90 Days',
-    allTime: 'All Time',
-  },
- 
-  // Profiles page
-  profiles: {
-    title: 'Filament Profiles',
-    addProfile: 'Add Profile',
-    editProfile: 'Edit Profile',
-    deleteProfile: 'Delete Profile',
-    material: 'Material',
-    brand: 'Brand',
-    color: 'Color',
-    diameter: 'Diameter',
-    density: 'Density',
-    costPerKg: 'Cost per kg',
-    spoolWeight: 'Spool Weight',
-    noProfiles: 'No profiles configured',
-    deleteConfirm: 'Are you sure you want to delete this profile?',
-  },
- 
-  // Maintenance page
-  maintenance: {
-    title: 'Maintenance',
-    overview: 'Overview',
-    allOk: 'All maintenance up to date',
-    dueCount: '{{count}} item due',
-    dueCount_plural: '{{count}} items due',
-    warningCount: '{{count}} warning',
-    warningCount_plural: '{{count}} warnings',
-    totalPrintTime: 'Total Print Time',
-    nextMaintenance: 'Next Maintenance',
-    nothingDue: 'Nothing due',
-    tasks: 'Tasks',
-    lastPerformed: 'Last performed',
-    interval: 'Interval',
-    hoursRemaining: '{{hours}}h remaining',
-    hoursOverdue: '{{hours}}h overdue',
-    markDone: 'Mark as Done',
-    performMaintenance: 'Perform Maintenance',
-    history: 'History',
-    noHistory: 'No maintenance history',
-    editPrintHours: 'Edit Print Hours',
-    currentHours: 'Current Hours',
-    types: {
-      lubricateRails: 'Lubricate Linear Rails',
-      cleanNozzle: 'Clean Nozzle/Hotend',
-      checkBelts: 'Check Belt Tension',
-      cleanBuildPlate: 'Clean Build Plate',
-      checkExtruder: 'Check Extruder Gears',
-      checkCooling: 'Check Cooling Fans',
-      generalInspection: 'General Inspection',
-    },
-  },
- 
-  // Settings page
-  settings: {
-    title: 'Settings',
-    general: 'General',
-    appearance: 'Appearance',
-    notifications: 'Notifications',
-    smartPlugs: 'Smart Plugs',
-    spoolman: 'Spoolman',
-    updates: 'Updates',
-    language: 'Language',
-    languageDescription: 'Select your preferred language',
-    theme: 'Theme',
-    themeLight: 'Light',
-    themeDark: 'Dark',
-    themeSystem: 'System',
-    defaultView: 'Default View',
-    defaultViewDescription: 'Page to show when opening the app',
-    checkForUpdates: 'Check for Updates',
-    autoUpdate: 'Auto Update',
-    currentVersion: 'Current Version',
-    latestVersion: 'Latest Version',
-    upToDate: 'You are up to date',
-    updateAvailable: 'Update available',
-    // Notifications
-    notificationLanguage: 'Notification Language',
-    notificationLanguageDescription: 'Language for push notifications',
-    notificationProviders: 'Notification Providers',
-    addProvider: 'Add Provider',
-    editProvider: 'Edit Provider',
-    providerType: 'Provider Type',
-    testNotification: 'Test Notification',
-    testSuccess: 'Test notification sent successfully',
-    testFailed: 'Failed to send test notification',
-    quietHours: 'Quiet Hours',
-    quietHoursDescription: 'Do not disturb during these hours',
-    quietHoursStart: 'Start',
-    quietHoursEnd: 'End',
-    events: {
-      title: 'Notification Events',
-      printStart: 'Print Started',
-      printComplete: 'Print Completed',
-      printFailed: 'Print Failed',
-      printStopped: 'Print Stopped',
-      printProgress: 'Progress Milestones',
-      printProgressDescription: 'Notify at 25%, 50%, 75%',
-      printerOffline: 'Printer Offline',
-      printerError: 'Printer Error',
-      filamentLow: 'Low Filament',
-      maintenanceDue: 'Maintenance Due',
-      maintenanceDueDescription: 'Notify when maintenance is needed',
-    },
-    // Smart Plugs
-    smartPlug: {
-      title: 'Smart Plugs',
-      add: 'Add Smart Plug',
-      edit: 'Edit Smart Plug',
-      name: 'Name',
-      ipAddress: 'IP Address',
-      linkedPrinter: 'Linked Printer',
-      autoOn: 'Auto Power On',
-      autoOnDescription: 'Turn on when print starts',
-      autoOff: 'Auto Power Off',
-      autoOffDescription: 'Turn off after print completes',
-      offDelay: 'Off Delay',
-      offDelayMinutes: 'Minutes after print',
-      offDelayTemp: 'When nozzle below temperature',
-      currentState: 'Current State',
-      turnOn: 'Turn On',
-      turnOff: 'Turn Off',
-    },
-    // Spoolman
-    spoolmanEnabled: 'Enable Spoolman Integration',
-    spoolmanUrl: 'Spoolman URL',
-    spoolmanConnected: 'Connected',
-    spoolmanDisconnected: 'Disconnected',
-  },
- 
-  // Notifications (for push notifications)
-  notification: {
-    printStarted: {
-      title: 'Print Started',
-      body: '{{printer}}: {{filename}} has started printing',
-    },
-    printCompleted: {
-      title: 'Print Completed',
-      body: '{{printer}}: {{filename}} completed successfully',
-    },
-    printFailed: {
-      title: 'Print Failed',
-      body: '{{printer}}: {{filename}} has failed',
-    },
-    printStopped: {
-      title: 'Print Stopped',
-      body: '{{printer}}: {{filename}} was stopped',
-    },
-    printProgress: {
-      title: 'Print Progress',
-      body: '{{printer}}: {{filename}} is {{percent}}% complete',
-    },
-    printerOffline: {
-      title: 'Printer Offline',
-      body: '{{printer}} is offline',
-    },
-    printerError: {
-      title: 'Printer Error',
-      body: '{{printer}}: {{error}}',
-    },
-    filamentLow: {
-      title: 'Low Filament',
-      body: '{{printer}}: Filament is running low',
-    },
-    maintenanceDue: {
-      title: 'Maintenance Due',
-      body: '{{printer}}: {{items}} need attention',
-    },
-  },
- 
-  // Errors
-  errors: {
-    generic: 'Something went wrong',
-    networkError: 'Network error. Please check your connection.',
-    notFound: 'Not found',
-    unauthorized: 'Unauthorized',
-    serverError: 'Server error',
-    validationError: 'Please check your input',
-    printerConnectionFailed: 'Failed to connect to printer',
-    saveFailed: 'Failed to save changes',
-    deleteFailed: 'Failed to delete',
-    loadFailed: 'Failed to load data',
-  },
- 
-  // Confirmations
-  confirm: {
-    delete: 'Are you sure you want to delete this?',
-    unsavedChanges: 'You have unsaved changes. Are you sure you want to leave?',
-    clearQueue: 'Are you sure you want to clear the queue?',
-  },
-};
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/i18n/locales/index.html b/frontend/coverage/src/i18n/locales/index.html deleted file mode 100644 index d037e928f..000000000 --- a/frontend/coverage/src/i18n/locales/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/i18n/locales - - - - - - - - - -
-
-

All files src/i18n/locales

-
- -
- 0% - Statements - 0/666 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/666 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
de.ts -
-
0%0/3330%0/10%0/10%0/333
en.ts -
-
0%0/3330%0/10%0/10%0/333
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/index.html b/frontend/coverage/src/index.html deleted file mode 100644 index 95c9ff02b..000000000 --- a/frontend/coverage/src/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src - - - - - - - - - -
-
-

All files src

-
- -
- 0% - Statements - 0/56 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/56 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
App.tsx -
-
0%0/560%0/10%0/10%0/56
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/pages/ArchivesPage.tsx.html b/frontend/coverage/src/pages/ArchivesPage.tsx.html deleted file mode 100644 index 3d5e4e495..000000000 --- a/frontend/coverage/src/pages/ArchivesPage.tsx.html +++ /dev/null @@ -1,5362 +0,0 @@ - - - - - - Code coverage report for src/pages/ArchivesPage.tsx - - - - - - - - - -
-
-

All files / src/pages ArchivesPage.tsx

-
- -
- 0% - Statements - 0/1426 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1426 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -425 -426 -427 -428 -429 -430 -431 -432 -433 -434 -435 -436 -437 -438 -439 -440 -441 -442 -443 -444 -445 -446 -447 -448 -449 -450 -451 -452 -453 -454 -455 -456 -457 -458 -459 -460 -461 -462 -463 -464 -465 -466 -467 -468 -469 -470 -471 -472 -473 -474 -475 -476 -477 -478 -479 -480 -481 -482 -483 -484 -485 -486 -487 -488 -489 -490 -491 -492 -493 -494 -495 -496 -497 -498 -499 -500 -501 -502 -503 -504 -505 -506 -507 -508 -509 -510 -511 -512 -513 -514 -515 -516 -517 -518 -519 -520 -521 -522 -523 -524 -525 -526 -527 -528 -529 -530 -531 -532 -533 -534 -535 -536 -537 -538 -539 -540 -541 -542 -543 -544 -545 -546 -547 -548 -549 -550 -551 -552 -553 -554 -555 -556 -557 -558 -559 -560 -561 -562 -563 -564 -565 -566 -567 -568 -569 -570 -571 -572 -573 -574 -575 -576 -577 -578 -579 -580 -581 -582 -583 -584 -585 -586 -587 -588 -589 -590 -591 -592 -593 -594 -595 -596 -597 -598 -599 -600 -601 -602 -603 -604 -605 -606 -607 -608 -609 -610 -611 -612 -613 -614 -615 -616 -617 -618 -619 -620 -621 -622 -623 -624 -625 -626 -627 -628 -629 -630 -631 -632 -633 -634 -635 -636 -637 -638 -639 -640 -641 -642 -643 -644 -645 -646 -647 -648 -649 -650 -651 -652 -653 -654 -655 -656 -657 -658 -659 -660 -661 -662 -663 -664 -665 -666 -667 -668 -669 -670 -671 -672 -673 -674 -675 -676 -677 -678 -679 -680 -681 -682 -683 -684 -685 -686 -687 -688 -689 -690 -691 -692 -693 -694 -695 -696 -697 -698 -699 -700 -701 -702 -703 -704 -705 -706 -707 -708 -709 -710 -711 -712 -713 -714 -715 -716 -717 -718 -719 -720 -721 -722 -723 -724 -725 -726 -727 -728 -729 -730 -731 -732 -733 -734 -735 -736 -737 -738 -739 -740 -741 -742 -743 -744 -745 -746 -747 -748 -749 -750 -751 -752 -753 -754 -755 -756 -757 -758 -759 -760 -761 -762 -763 -764 -765 -766 -767 -768 -769 -770 -771 -772 -773 -774 -775 -776 -777 -778 -779 -780 -781 -782 -783 -784 -785 -786 -787 -788 -789 -790 -791 -792 -793 -794 -795 -796 -797 -798 -799 -800 -801 -802 -803 -804 -805 -806 -807 -808 -809 -810 -811 -812 -813 -814 -815 -816 -817 -818 -819 -820 -821 -822 -823 -824 -825 -826 -827 -828 -829 -830 -831 -832 -833 -834 -835 -836 -837 -838 -839 -840 -841 -842 -843 -844 -845 -846 -847 -848 -849 -850 -851 -852 -853 -854 -855 -856 -857 -858 -859 -860 -861 -862 -863 -864 -865 -866 -867 -868 -869 -870 -871 -872 -873 -874 -875 -876 -877 -878 -879 -880 -881 -882 -883 -884 -885 -886 -887 -888 -889 -890 -891 -892 -893 -894 -895 -896 -897 -898 -899 -900 -901 -902 -903 -904 -905 -906 -907 -908 -909 -910 -911 -912 -913 -914 -915 -916 -917 -918 -919 -920 -921 -922 -923 -924 -925 -926 -927 -928 -929 -930 -931 -932 -933 -934 -935 -936 -937 -938 -939 -940 -941 -942 -943 -944 -945 -946 -947 -948 -949 -950 -951 -952 -953 -954 -955 -956 -957 -958 -959 -960 -961 -962 -963 -964 -965 -966 -967 -968 -969 -970 -971 -972 -973 -974 -975 -976 -977 -978 -979 -980 -981 -982 -983 -984 -985 -986 -987 -988 -989 -990 -991 -992 -993 -994 -995 -996 -997 -998 -999 -1000 -1001 -1002 -1003 -1004 -1005 -1006 -1007 -1008 -1009 -1010 -1011 -1012 -1013 -1014 -1015 -1016 -1017 -1018 -1019 -1020 -1021 -1022 -1023 -1024 -1025 -1026 -1027 -1028 -1029 -1030 -1031 -1032 -1033 -1034 -1035 -1036 -1037 -1038 -1039 -1040 -1041 -1042 -1043 -1044 -1045 -1046 -1047 -1048 -1049 -1050 -1051 -1052 -1053 -1054 -1055 -1056 -1057 -1058 -1059 -1060 -1061 -1062 -1063 -1064 -1065 -1066 -1067 -1068 -1069 -1070 -1071 -1072 -1073 -1074 -1075 -1076 -1077 -1078 -1079 -1080 -1081 -1082 -1083 -1084 -1085 -1086 -1087 -1088 -1089 -1090 -1091 -1092 -1093 -1094 -1095 -1096 -1097 -1098 -1099 -1100 -1101 -1102 -1103 -1104 -1105 -1106 -1107 -1108 -1109 -1110 -1111 -1112 -1113 -1114 -1115 -1116 -1117 -1118 -1119 -1120 -1121 -1122 -1123 -1124 -1125 -1126 -1127 -1128 -1129 -1130 -1131 -1132 -1133 -1134 -1135 -1136 -1137 -1138 -1139 -1140 -1141 -1142 -1143 -1144 -1145 -1146 -1147 -1148 -1149 -1150 -1151 -1152 -1153 -1154 -1155 -1156 -1157 -1158 -1159 -1160 -1161 -1162 -1163 -1164 -1165 -1166 -1167 -1168 -1169 -1170 -1171 -1172 -1173 -1174 -1175 -1176 -1177 -1178 -1179 -1180 -1181 -1182 -1183 -1184 -1185 -1186 -1187 -1188 -1189 -1190 -1191 -1192 -1193 -1194 -1195 -1196 -1197 -1198 -1199 -1200 -1201 -1202 -1203 -1204 -1205 -1206 -1207 -1208 -1209 -1210 -1211 -1212 -1213 -1214 -1215 -1216 -1217 -1218 -1219 -1220 -1221 -1222 -1223 -1224 -1225 -1226 -1227 -1228 -1229 -1230 -1231 -1232 -1233 -1234 -1235 -1236 -1237 -1238 -1239 -1240 -1241 -1242 -1243 -1244 -1245 -1246 -1247 -1248 -1249 -1250 -1251 -1252 -1253 -1254 -1255 -1256 -1257 -1258 -1259 -1260 -1261 -1262 -1263 -1264 -1265 -1266 -1267 -1268 -1269 -1270 -1271 -1272 -1273 -1274 -1275 -1276 -1277 -1278 -1279 -1280 -1281 -1282 -1283 -1284 -1285 -1286 -1287 -1288 -1289 -1290 -1291 -1292 -1293 -1294 -1295 -1296 -1297 -1298 -1299 -1300 -1301 -1302 -1303 -1304 -1305 -1306 -1307 -1308 -1309 -1310 -1311 -1312 -1313 -1314 -1315 -1316 -1317 -1318 -1319 -1320 -1321 -1322 -1323 -1324 -1325 -1326 -1327 -1328 -1329 -1330 -1331 -1332 -1333 -1334 -1335 -1336 -1337 -1338 -1339 -1340 -1341 -1342 -1343 -1344 -1345 -1346 -1347 -1348 -1349 -1350 -1351 -1352 -1353 -1354 -1355 -1356 -1357 -1358 -1359 -1360 -1361 -1362 -1363 -1364 -1365 -1366 -1367 -1368 -1369 -1370 -1371 -1372 -1373 -1374 -1375 -1376 -1377 -1378 -1379 -1380 -1381 -1382 -1383 -1384 -1385 -1386 -1387 -1388 -1389 -1390 -1391 -1392 -1393 -1394 -1395 -1396 -1397 -1398 -1399 -1400 -1401 -1402 -1403 -1404 -1405 -1406 -1407 -1408 -1409 -1410 -1411 -1412 -1413 -1414 -1415 -1416 -1417 -1418 -1419 -1420 -1421 -1422 -1423 -1424 -1425 -1426 -1427 -1428 -1429 -1430 -1431 -1432 -1433 -1434 -1435 -1436 -1437 -1438 -1439 -1440 -1441 -1442 -1443 -1444 -1445 -1446 -1447 -1448 -1449 -1450 -1451 -1452 -1453 -1454 -1455 -1456 -1457 -1458 -1459 -1460 -1461 -1462 -1463 -1464 -1465 -1466 -1467 -1468 -1469 -1470 -1471 -1472 -1473 -1474 -1475 -1476 -1477 -1478 -1479 -1480 -1481 -1482 -1483 -1484 -1485 -1486 -1487 -1488 -1489 -1490 -1491 -1492 -1493 -1494 -1495 -1496 -1497 -1498 -1499 -1500 -1501 -1502 -1503 -1504 -1505 -1506 -1507 -1508 -1509 -1510 -1511 -1512 -1513 -1514 -1515 -1516 -1517 -1518 -1519 -1520 -1521 -1522 -1523 -1524 -1525 -1526 -1527 -1528 -1529 -1530 -1531 -1532 -1533 -1534 -1535 -1536 -1537 -1538 -1539 -1540 -1541 -1542 -1543 -1544 -1545 -1546 -1547 -1548 -1549 -1550 -1551 -1552 -1553 -1554 -1555 -1556 -1557 -1558 -1559 -1560 -1561 -1562 -1563 -1564 -1565 -1566 -1567 -1568 -1569 -1570 -1571 -1572 -1573 -1574 -1575 -1576 -1577 -1578 -1579 -1580 -1581 -1582 -1583 -1584 -1585 -1586 -1587 -1588 -1589 -1590 -1591 -1592 -1593 -1594 -1595 -1596 -1597 -1598 -1599 -1600 -1601 -1602 -1603 -1604 -1605 -1606 -1607 -1608 -1609 -1610 -1611 -1612 -1613 -1614 -1615 -1616 -1617 -1618 -1619 -1620 -1621 -1622 -1623 -1624 -1625 -1626 -1627 -1628 -1629 -1630 -1631 -1632 -1633 -1634 -1635 -1636 -1637 -1638 -1639 -1640 -1641 -1642 -1643 -1644 -1645 -1646 -1647 -1648 -1649 -1650 -1651 -1652 -1653 -1654 -1655 -1656 -1657 -1658 -1659 -1660 -1661 -1662 -1663 -1664 -1665 -1666 -1667 -1668 -1669 -1670 -1671 -1672 -1673 -1674 -1675 -1676 -1677 -1678 -1679 -1680 -1681 -1682 -1683 -1684 -1685 -1686 -1687 -1688 -1689 -1690 -1691 -1692 -1693 -1694 -1695 -1696 -1697 -1698 -1699 -1700 -1701 -1702 -1703 -1704 -1705 -1706 -1707 -1708 -1709 -1710 -1711 -1712 -1713 -1714 -1715 -1716 -1717 -1718 -1719 -1720 -1721 -1722 -1723 -1724 -1725 -1726 -1727 -1728 -1729 -1730 -1731 -1732 -1733 -1734 -1735 -1736 -1737 -1738 -1739 -1740 -1741 -1742 -1743 -1744 -1745 -1746 -1747 -1748 -1749 -1750 -1751 -1752 -1753 -1754 -1755 -1756 -1757 -1758 -1759 -1760  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useRef, useEffect, useCallback } from 'react';
-import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
-import {
-  Download,
-  Trash2,
-  Clock,
-  Package,
-  Layers,
-  Search,
-  Filter,
-  Image,
-  Box,
-  Printer,
-  Upload,
-  ExternalLink,
-  CheckSquare,
-  Square,
-  X,
-  Globe,
-  Pencil,
-  LayoutGrid,
-  List,
-  CalendarDays,
-  ArrowUpDown,
-  Star,
-  Tag,
-  StickyNote,
-  FolderOpen,
-  Calendar,
-  AlertCircle,
-  Copy,
-  Film,
-  ScanSearch,
-  QrCode,
-  Camera,
-  FileText,
-  FileCode,
-  MoreVertical,
-  FileSpreadsheet,
-  GitCompare,
-  Loader2,
-  FolderKanban,
-} from 'lucide-react';
-import { api } from '../api/client';
-import { useIsMobile } from '../hooks/useIsMobile';
-import type { Archive, ProjectListItem } from '../api/client';
-import { Card, CardContent } from '../components/Card';
-import { Button } from '../components/Button';
-import { ModelViewerModal } from '../components/ModelViewerModal';
-import { ReprintModal } from '../components/ReprintModal';
-import { UploadModal } from '../components/UploadModal';
-import { ConfirmModal } from '../components/ConfirmModal';
-import { EditArchiveModal } from '../components/EditArchiveModal';
-import { ContextMenu, type ContextMenuItem } from '../components/ContextMenu';
-import { BatchTagModal } from '../components/BatchTagModal';
-import { CalendarView } from '../components/CalendarView';
-import { QRCodeModal } from '../components/QRCodeModal';
-import { PhotoGalleryModal } from '../components/PhotoGalleryModal';
-import { ProjectPageModal } from '../components/ProjectPageModal';
-import { TimelapseViewer } from '../components/TimelapseViewer';
-import { AddToQueueModal } from '../components/AddToQueueModal';
-import { CompareArchivesModal } from '../components/CompareArchivesModal';
-import { useToast } from '../contexts/ToastContext';
- 
-function formatFileSize(bytes: number): string {
-  if (bytes < 1024) return `${bytes} B`;
-  if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
-  return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
-}
- 
-function formatDuration(seconds: number): string {
-  const hours = Math.floor(seconds / 3600);
-  const minutes = Math.floor((seconds % 3600) / 60);
-  if (hours > 0) return `${hours}h ${minutes}m`;
-  return `${minutes}m`;
-}
- 
-function formatDate(dateStr: string): string {
-  return new Date(dateStr).toLocaleDateString('en-US', {
-    year: 'numeric',
-    month: 'short',
-    day: 'numeric',
-    hour: '2-digit',
-    minute: '2-digit',
-  });
-}
- 
-function ArchiveCard({
-  archive,
-  printerName,
-  isSelected,
-  onSelect,
-  selectionMode,
-  projects,
-}: {
-  archive: Archive;
-  printerName: string;
-  isSelected: boolean;
-  onSelect: (id: number) => void;
-  selectionMode: boolean;
-  projects: ProjectListItem[] | undefined;
-}) {
-  const queryClient = useQueryClient();
-  const { showToast } = useToast();
-  const isMobile = useIsMobile();
-  const [showViewer, setShowViewer] = useState(false);
-  const [showReprint, setShowReprint] = useState(false);
-  const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);
-  const [showEdit, setShowEdit] = useState(false);
-  const [showTimelapse, setShowTimelapse] = useState(false);
-  const [showTimelapseSelect, setShowTimelapseSelect] = useState(false);
-  const [availableTimelapses, setAvailableTimelapses] = useState<Array<{ name: string; path: string; size: number; mtime: string | null }>>([]);
-  const [showQRCode, setShowQRCode] = useState(false);
-  const [showPhotos, setShowPhotos] = useState(false);
-  const [showProjectPage, setShowProjectPage] = useState(false);
-  const [showSchedule, setShowSchedule] = useState(false);
-  const [showDeleteSource3mfConfirm, setShowDeleteSource3mfConfirm] = useState(false);
-  const [contextMenu, setContextMenu] = useState<{ x: number; y: number } | null>(null);
-  const source3mfInputRef = useRef<HTMLInputElement>(null);
- 
-  const source3mfUploadMutation = useMutation({
-    mutationFn: (file: File) => api.uploadSource3mf(archive.id, file),
-    onSuccess: (data) => {
-      queryClient.invalidateQueries({ queryKey: ['archives'] });
-      showToast(`Source 3MF attached: ${data.filename}`);
-    },
-    onError: (error: Error) => {
-      showToast(error.message || 'Failed to upload source 3MF', 'error');
-    },
-  });
- 
-  const source3mfDeleteMutation = useMutation({
-    mutationFn: () => api.deleteSource3mf(archive.id),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['archives'] });
-      showToast('Source 3MF removed');
-    },
-    onError: (error: Error) => {
-      showToast(error.message || 'Failed to remove source 3MF', 'error');
-    },
-  });
- 
-  const timelapseScanMutation = useMutation({
-    mutationFn: () => api.scanArchiveTimelapse(archive.id),
-    onSuccess: (data) => {
-      if (data.status === 'attached') {
-        queryClient.invalidateQueries({ queryKey: ['archives'] });
-        showToast(`Timelapse attached: ${data.filename}`);
-      } else if (data.status === 'exists') {
-        showToast('Timelapse already attached');
-      } else if (data.status === 'not_found' && data.available_files && data.available_files.length > 0) {
-        // Show selection dialog
-        setAvailableTimelapses(data.available_files);
-        setShowTimelapseSelect(true);
-      } else {
-        showToast(data.message || 'No matching timelapse found', 'warning');
-      }
-    },
-    onError: (error: Error) => {
-      showToast(error.message || 'Failed to scan for timelapse', 'error');
-    },
-  });
- 
-  const timelapseSelectMutation = useMutation({
-    mutationFn: (filename: string) => api.selectArchiveTimelapse(archive.id, filename),
-    onSuccess: (data) => {
-      queryClient.invalidateQueries({ queryKey: ['archives'] });
-      showToast(`Timelapse attached: ${data.filename}`);
-      setShowTimelapseSelect(false);
-      setAvailableTimelapses([]);
-    },
-    onError: (error: Error) => {
-      showToast(error.message || 'Failed to attach timelapse', 'error');
-    },
-  });
- 
-  const deleteMutation = useMutation({
-    mutationFn: () => api.deleteArchive(archive.id),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['archives'] });
-      showToast('Archive deleted');
-    },
-    onError: () => {
-      showToast('Failed to delete archive', 'error');
-    },
-  });
- 
-  const favoriteMutation = useMutation({
-    mutationFn: () => api.toggleFavorite(archive.id),
-    onSuccess: (data) => {
-      queryClient.invalidateQueries({ queryKey: ['archives'] });
-      showToast(data.is_favorite ? 'Added to favorites' : 'Removed from favorites');
-    },
-  });
- 
-  const assignProjectMutation = useMutation({
-    mutationFn: (projectId: number | null) => api.updateArchive(archive.id, { project_id: projectId }),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['archives'] });
-      queryClient.invalidateQueries({ queryKey: ['projects'] });
-      showToast('Project updated');
-    },
-    onError: () => {
-      showToast('Failed to update project', 'error');
-    },
-  });
- 
-  const handleContextMenu = (e: React.MouseEvent) => {
-    e.preventDefault();
-    setContextMenu({ x: e.clientX, y: e.clientY });
-  };
- 
-  const contextMenuItems: ContextMenuItem[] = [
-    {
-      label: 'Print',
-      icon: <Printer className="w-4 h-4" />,
-      onClick: () => setShowReprint(true),
-    },
-    {
-      label: 'Schedule',
-      icon: <Calendar className="w-4 h-4" />,
-      onClick: () => setShowSchedule(true),
-    },
-    {
-      label: 'Open in Bambu Studio',
-      icon: <ExternalLink className="w-4 h-4" />,
-      onClick: () => {
-        const filename = archive.print_name || archive.filename || 'model';
-        const downloadUrl = `${window.location.origin}${api.getArchiveForSlicer(archive.id, filename)}`;
-        window.location.href = `bambustudioopen://${encodeURIComponent(downloadUrl)}`;
-      },
-    },
-    {
-      label: 'View on MakerWorld',
-      icon: <Globe className="w-4 h-4" />,
-      onClick: () => archive.makerworld_url && window.open(archive.makerworld_url, '_blank'),
-      disabled: !archive.makerworld_url,
-    },
-    { label: '', divider: true, onClick: () => {} },
-    {
-      label: '3D Preview',
-      icon: <Box className="w-4 h-4" />,
-      onClick: () => setShowViewer(true),
-    },
-    {
-      label: 'View Timelapse',
-      icon: <Film className="w-4 h-4" />,
-      onClick: () => setShowTimelapse(true),
-      disabled: !archive.timelapse_path,
-    },
-    {
-      label: 'Scan for Timelapse',
-      icon: <ScanSearch className="w-4 h-4" />,
-      onClick: () => timelapseScanMutation.mutate(),
-      disabled: !archive.printer_id || !!archive.timelapse_path || timelapseScanMutation.isPending,
-    },
-    { label: '', divider: true, onClick: () => {} },
-    {
-      label: archive.source_3mf_path ? 'Download Source 3MF' : 'Upload Source 3MF',
-      icon: <FileCode className="w-4 h-4" />,
-      onClick: () => {
-        if (archive.source_3mf_path) {
-          const link = document.createElement('a');
-          link.href = api.getSource3mfDownloadUrl(archive.id);
-          link.download = `${archive.print_name || archive.filename}_source.3mf`;
-          link.click();
-        } else {
-          source3mfInputRef.current?.click();
-        }
-      },
-    },
-    ...(archive.source_3mf_path ? [{
-      label: 'Replace Source 3MF',
-      icon: <Upload className="w-4 h-4" />,
-      onClick: () => source3mfInputRef.current?.click(),
-    },
-    {
-      label: 'Remove Source 3MF',
-      icon: <Trash2 className="w-4 h-4" />,
-      onClick: () => setShowDeleteSource3mfConfirm(true),
-      danger: true,
-    }] : []),
-    { label: '', divider: true, onClick: () => {} },
-    {
-      label: 'Download',
-      icon: <Download className="w-4 h-4" />,
-      onClick: () => {
-        const link = document.createElement('a');
-        link.href = api.getArchiveDownload(archive.id);
-        link.download = `${archive.print_name || archive.filename}.3mf`;
-        link.click();
-      },
-    },
-    {
-      label: 'Copy Download Link',
-      icon: <Copy className="w-4 h-4" />,
-      onClick: () => {
-        const url = `${window.location.origin}${api.getArchiveDownload(archive.id)}`;
-        navigator.clipboard.writeText(url).then(() => {
-          showToast('Link copied to clipboard');
-        }).catch(() => {
-          showToast('Failed to copy link', 'error');
-        });
-      },
-    },
-    {
-      label: 'QR Code',
-      icon: <QrCode className="w-4 h-4" />,
-      onClick: () => setShowQRCode(true),
-    },
-    {
-      label: `View Photos${archive.photos?.length ? ` (${archive.photos.length})` : ''}`,
-      icon: <Camera className="w-4 h-4" />,
-      onClick: () => setShowPhotos(true),
-      disabled: !archive.photos?.length,
-    },
-    {
-      label: 'Project Page',
-      icon: <FileText className="w-4 h-4" />,
-      onClick: () => setShowProjectPage(true),
-    },
-    { label: '', divider: true, onClick: () => {} },
-    {
-      label: archive.is_favorite ? 'Remove from Favorites' : 'Add to Favorites',
-      icon: <Star className={`w-4 h-4 ${archive.is_favorite ? 'fill-yellow-400 text-yellow-400' : ''}`} />,
-      onClick: () => favoriteMutation.mutate(),
-    },
-    {
-      label: 'Edit',
-      icon: <Pencil className="w-4 h-4" />,
-      onClick: () => setShowEdit(true),
-    },
-    ...(archive.project_id && archive.project_name ? [{
-      label: `Go to Project: ${archive.project_name}`,
-      icon: <FolderKanban className="w-4 h-4 text-bambu-green" />,
-      onClick: () => window.location.href = '/projects',
-    }] : []),
-    {
-      label: 'Add to Project',
-      icon: <FolderKanban className="w-4 h-4" />,
-      onClick: () => {},
-      submenu: (() => {
-        const items: ContextMenuItem[] = [];
- 
-        // Add "Remove from Project" if archive is in a project
-        if (archive.project_id) {
-          items.push({
-            label: 'Remove from Project',
-            icon: <X className="w-4 h-4" />,
-            onClick: () => assignProjectMutation.mutate(null),
-          });
-        }
- 
-        // Add project options
-        if (!projects) {
-          items.push({
-            label: 'Loading...',
-            icon: <Loader2 className="w-4 h-4 animate-spin" />,
-            onClick: () => {},
-            disabled: true,
-          });
-        } else {
-          const activeProjects = projects.filter(p => p.status === 'active');
-          if (activeProjects.length === 0) {
-            items.push({
-              label: 'No projects available',
-              icon: <FolderKanban className="w-4 h-4 opacity-50" />,
-              onClick: () => {},
-              disabled: true,
-            });
-          } else {
-            activeProjects.forEach(p => {
-              items.push({
-                label: p.name,
-                icon: <div className="w-3 h-3 rounded-full flex-shrink-0" style={{ backgroundColor: p.color || '#888' }} />,
-                onClick: () => assignProjectMutation.mutate(p.id),
-                disabled: archive.project_id === p.id,
-              });
-            });
-          }
-        }
- 
-        return items;
-      })(),
-    },
-    {
-      label: isSelected ? 'Deselect' : 'Select',
-      icon: isSelected ? <CheckSquare className="w-4 h-4" /> : <Square className="w-4 h-4" />,
-      onClick: () => onSelect(archive.id),
-    },
-    { label: '', divider: true, onClick: () => {} },
-    {
-      label: 'Delete',
-      icon: <Trash2 className="w-4 h-4" />,
-      onClick: () => setShowDeleteConfirm(true),
-      danger: true,
-    },
-  ];
- 
-  return (
-    <Card
-      className={`relative flex flex-col ${isSelected ? 'ring-2 ring-bambu-green' : ''} ${selectionMode ? 'cursor-pointer' : ''}`}
-      onContextMenu={handleContextMenu}
-      onClick={selectionMode ? () => onSelect(archive.id) : undefined}
-    >
-      {/* Selection checkbox */}
-      {selectionMode && (
-        <button
-          className="absolute top-2 left-2 z-10 p-1 rounded bg-black/50 hover:bg-black/70 transition-colors"
-          onClick={(e) => { e.stopPropagation(); onSelect(archive.id); }}
-        >
-          {isSelected ? (
-            <CheckSquare className="w-5 h-5 text-bambu-green" />
-          ) : (
-            <Square className="w-5 h-5 text-white" />
-          )}
-        </button>
-      )}
- 
-      {/* Thumbnail */}
-      <div className="aspect-video bg-bambu-dark relative flex-shrink-0 overflow-hidden rounded-t-xl">
-        {archive.thumbnail_path ? (
-          <img
-            src={api.getArchiveThumbnail(archive.id)}
-            alt={archive.print_name || archive.filename}
-            className="w-full h-full object-cover"
-          />
-        ) : (
-          <div className="w-full h-full flex items-center justify-center">
-            <Image className="w-12 h-12 text-bambu-dark-tertiary" />
-          </div>
-        )}
-        {/* Mobile menu button */}
-        {isMobile && (
-          <button
-            className="absolute top-2 right-10 p-1.5 rounded bg-black/50 hover:bg-black/70 transition-colors"
-            onClick={(e) => {
-              e.stopPropagation();
-              const rect = e.currentTarget.getBoundingClientRect();
-              setContextMenu({ x: rect.left, y: rect.bottom + 4 });
-            }}
-            title="Menu"
-          >
-            <MoreVertical className="w-5 h-5 text-white" />
-          </button>
-        )}
-        {/* Favorite star */}
-        <button
-          className="absolute top-2 right-2 p-1 rounded bg-black/50 hover:bg-black/70 transition-colors"
-          onClick={(e) => {
-            e.stopPropagation();
-            favoriteMutation.mutate();
-          }}
-          title={archive.is_favorite ? 'Remove from favorites' : 'Add to favorites'}
-        >
-          <Star
-            className={`w-5 h-5 ${archive.is_favorite ? 'text-yellow-400 fill-yellow-400' : 'text-white'}`}
-          />
-        </button>
-        {archive.status === 'failed' && (
-          <div className="absolute top-2 left-12 px-2 py-1 rounded text-xs bg-red-500/80 text-white">
-            failed
-          </div>
-        )}
-        {/* Duplicate badge */}
-        {archive.duplicate_count > 0 && (
-          <div
-            className="absolute top-2 right-2 px-2 py-1 rounded text-xs bg-purple-500/80 text-white flex items-center gap-1"
-            title="This model has been printed before"
-          >
-            <Copy className="w-3 h-3" />
-            duplicate
-          </div>
-        )}
-        {/* Source 3MF badge */}
-        {archive.source_3mf_path && (
-          <button
-            className="absolute bottom-2 left-2 p-1.5 rounded bg-black/60 hover:bg-black/80 transition-colors"
-            onClick={(e) => {
-              e.stopPropagation();
-              // Open source 3MF in Bambu Studio - use filename in URL for slicer compatibility
-              const sourceName = (archive.print_name || archive.filename || 'source').replace(/\.gcode\.3mf$/i, '') + '_source';
-              const downloadUrl = `${window.location.origin}${api.getSource3mfForSlicer(archive.id, sourceName)}`;
-              window.location.href = `bambustudioopen://${encodeURIComponent(downloadUrl)}`;
-            }}
-            title="Open source 3MF in Bambu Studio (right-click for more options)"
-          >
-            <FileCode className="w-4 h-4 text-orange-400" />
-          </button>
-        )}
-        {/* Timelapse badge */}
-        {archive.timelapse_path && (
-          <button
-            className="absolute bottom-2 right-2 p-1.5 rounded bg-black/60 hover:bg-black/80 transition-colors"
-            onClick={(e) => {
-              e.stopPropagation();
-              setShowTimelapse(true);
-            }}
-            title="View timelapse"
-          >
-            <Film className="w-4 h-4 text-bambu-green" />
-          </button>
-        )}
-        {/* Photos badge */}
-        {archive.photos && archive.photos.length > 0 && (
-          <button
-            className={`absolute bottom-2 ${archive.timelapse_path ? 'right-12' : 'right-2'} p-1.5 rounded bg-black/60 hover:bg-black/80 transition-colors`}
-            onClick={(e) => {
-              e.stopPropagation();
-              setShowPhotos(true);
-            }}
-            title={`View ${archive.photos.length} photo${archive.photos.length > 1 ? 's' : ''}`}
-          >
-            <Camera className="w-4 h-4 text-blue-400" />
-            {archive.photos.length > 1 && (
-              <span className="absolute -top-1 -right-1 w-4 h-4 bg-blue-500 rounded-full text-[10px] text-white flex items-center justify-center">
-                {archive.photos.length}
-              </span>
-            )}
-          </button>
-        )}
-      </div>
- 
-      <CardContent className="p-4 flex-1 flex flex-col">
-        {/* Title */}
-        <h3 className="font-medium text-white mb-1 truncate">
-          {archive.print_name || archive.filename}
-        </h3>
-        <div className="flex items-center gap-2 mb-3">
-          <p className="text-xs text-bambu-gray">{printerName}</p>
-          {archive.project_name && (
-            <span
-              className="text-xs px-1.5 py-0.5 rounded-full truncate max-w-[120px]"
-              style={{
-                backgroundColor: `${projects?.find(p => p.id === archive.project_id)?.color || '#6b7280'}20`,
-                color: projects?.find(p => p.id === archive.project_id)?.color || '#6b7280'
-              }}
-              title={`Project: ${archive.project_name}`}
-            >
-              {archive.project_name}
-            </span>
-          )}
-        </div>
- 
-        {/* Stats */}
-        <div className="grid grid-cols-2 gap-2 text-xs mb-4 min-h-[48px]">
-          {(archive.print_time_seconds || archive.actual_time_seconds) && (
-            <div className="flex items-center gap-1.5 text-bambu-gray" title={
-              archive.time_accuracy
-                ? `Estimated: ${formatDuration(archive.print_time_seconds || 0)}\nActual: ${formatDuration(archive.actual_time_seconds || 0)}\nAccuracy: ${archive.time_accuracy.toFixed(0)}%`
-                : archive.actual_time_seconds
-                  ? `Actual: ${formatDuration(archive.actual_time_seconds)}`
-                  : `Estimated: ${formatDuration(archive.print_time_seconds || 0)}`
-            }>
-              <Clock className="w-3 h-3" />
-              {formatDuration(archive.actual_time_seconds || archive.print_time_seconds || 0)}
-              {archive.time_accuracy && (
-                <span className={`text-[10px] px-1 rounded ${
-                  archive.time_accuracy >= 95 && archive.time_accuracy <= 105
-                    ? 'bg-bambu-green/20 text-bambu-green'
-                    : archive.time_accuracy > 105
-                      ? 'bg-blue-500/20 text-blue-400'
-                      : 'bg-orange-500/20 text-orange-400'
-                }`}>
-                  {archive.time_accuracy > 100 ? '+' : ''}{(archive.time_accuracy - 100).toFixed(0)}%
-                </span>
-              )}
-            </div>
-          )}
-          {archive.filament_used_grams && (
-            <div className="flex items-center gap-1.5 text-bambu-gray">
-              <Package className="w-3 h-3" />
-              {archive.filament_used_grams.toFixed(1)}g
-            </div>
-          )}
-          {(archive.layer_height || archive.total_layers) && (
-            <div className="flex items-center gap-1.5 text-bambu-gray">
-              <Layers className="w-3 h-3" />
-              {archive.total_layers && <span>{archive.total_layers} layers</span>}
-              {archive.total_layers && archive.layer_height && <span className="text-bambu-gray/50">·</span>}
-              {archive.layer_height && <span>{archive.layer_height}mm</span>}
-            </div>
-          )}
-          {archive.filament_type && (
-            <div className="flex items-center gap-1.5 col-span-2">
-              <span className="text-bambu-gray text-xs">{archive.filament_type}</span>
-              {archive.filament_color && (
-                <div className="flex items-center gap-0.5 flex-wrap">
-                  {archive.filament_color.split(',').map((color, i) => (
-                    <div
-                      key={i}
-                      className="w-3 h-3 rounded-full border border-white/20"
-                      style={{ backgroundColor: color }}
-                      title={color}
-                    />
-                  ))}
-                </div>
-              )}
-            </div>
-          )}
-        </div>
- 
-        {/* Tags & Notes */}
-        {(archive.tags || archive.notes) && (
-          <div className="flex flex-wrap items-center gap-1.5 mb-3">
-            {archive.notes && (
-              <div
-                className="flex items-center gap-1 px-1.5 py-0.5 bg-blue-500/20 text-blue-400 rounded text-xs"
-                title={archive.notes}
-              >
-                <StickyNote className="w-3 h-3" />
-              </div>
-            )}
-            {archive.tags?.split(',').map((tag, i) => (
-              <span
-                key={i}
-                className="px-1.5 py-0.5 bg-bambu-dark-tertiary text-bambu-gray-light rounded text-xs"
-              >
-                {tag.trim()}
-              </span>
-            ))}
-          </div>
-        )}
- 
-        {/* Spacer to push content to bottom */}
-        <div className="flex-1" />
- 
-        {/* Date & Size */}
-        <div className="flex items-center justify-between text-xs text-bambu-gray border-t border-bambu-dark-tertiary pt-3">
-          <span>{formatDate(archive.created_at)}</span>
-          <span>{formatFileSize(archive.file_size)}</span>
-        </div>
- 
-        {/* Actions */}
-        <div className="flex gap-1 mt-3">
-          <Button
-            variant="primary"
-            size="sm"
-            className="flex-1 min-w-0"
-            onClick={() => setShowReprint(true)}
-          >
-            <Printer className="w-3 h-3 flex-shrink-0" />
-            <span className="hidden sm:inline">Print</span>
-          </Button>
-          <Button
-            variant="secondary"
-            size="sm"
-            className="min-w-0 p-1 sm:p-1.5"
-            onClick={() => {
-              // Use bambustudioopen:// protocol like MakerWorld does
-              const filename = archive.print_name || archive.filename || 'model';
-              const downloadUrl = `${window.location.origin}${api.getArchiveForSlicer(archive.id, filename)}`;
-              window.location.href = `bambustudioopen://${encodeURIComponent(downloadUrl)}`;
-            }}
-            title="Open in Bambu Studio"
-          >
-            <ExternalLink className="w-3 h-3 sm:w-4 sm:h-4" />
-          </Button>
-          <Button
-            variant="secondary"
-            size="sm"
-            className="min-w-0 p-1 sm:p-1.5"
-            onClick={() => archive.makerworld_url && window.open(archive.makerworld_url, '_blank')}
-            disabled={!archive.makerworld_url}
-            title={archive.makerworld_url ? `MakerWorld: ${archive.designer || 'View project'}` : 'Not from MakerWorld'}
-          >
-            <Globe className={`w-3 h-3 sm:w-4 sm:h-4 ${!archive.makerworld_url ? 'opacity-20' : ''}`} />
-          </Button>
-          <Button
-            variant="secondary"
-            size="sm"
-            className="min-w-0 p-1 sm:p-1.5"
-            onClick={() => setShowViewer(true)}
-            title="3D Preview"
-          >
-            <Box className="w-3 h-3 sm:w-4 sm:h-4" />
-          </Button>
-          <Button
-            variant="secondary"
-            size="sm"
-            className="min-w-0 p-1 sm:p-1.5"
-            onClick={() => {
-              const link = document.createElement('a');
-              link.href = api.getArchiveDownload(archive.id);
-              link.download = `${archive.print_name || archive.filename}.3mf`;
-              link.click();
-            }}
-            title="Download"
-          >
-            <Download className="w-3 h-3 sm:w-4 sm:h-4" />
-          </Button>
-          <Button
-            variant="ghost"
-            size="sm"
-            className="min-w-0 p-1 sm:p-1.5"
-            onClick={() => setShowEdit(true)}
-            title="Edit"
-          >
-            <Pencil className="w-3 h-3 sm:w-4 sm:h-4" />
-          </Button>
-          <Button
-            variant="ghost"
-            size="sm"
-            className="min-w-0 p-1 sm:p-1.5"
-            onClick={() => setShowDeleteConfirm(true)}
-            title="Delete"
-          >
-            <Trash2 className="w-3 h-3 sm:w-4 sm:h-4 text-red-400" />
-          </Button>
-        </div>
-      </CardContent>
- 
-      {/* Edit Modal */}
-      {showEdit && (
-        <EditArchiveModal
-          archive={archive}
-          onClose={() => setShowEdit(false)}
-        />
-      )}
- 
-      {/* 3D Viewer Modal */}
-      {showViewer && (
-        <ModelViewerModal
-          archiveId={archive.id}
-          title={archive.print_name || archive.filename}
-          onClose={() => setShowViewer(false)}
-        />
-      )}
- 
-      {/* Reprint Modal */}
-      {showReprint && (
-        <ReprintModal
-          archiveId={archive.id}
-          archiveName={archive.print_name || archive.filename}
-          onClose={() => setShowReprint(false)}
-          onSuccess={() => {
-            // Could show a toast notification here
-          }}
-        />
-      )}
- 
-      {/* Delete Confirmation */}
-      {showDeleteConfirm && (
-        <ConfirmModal
-          title="Delete Archive"
-          message={`Are you sure you want to delete "${archive.print_name || archive.filename}"? This action cannot be undone.`}
-          confirmText="Delete"
-          variant="danger"
-          onConfirm={() => {
-            deleteMutation.mutate();
-            setShowDeleteConfirm(false);
-          }}
-          onCancel={() => setShowDeleteConfirm(false)}
-        />
-      )}
- 
-      {/* Delete Source 3MF Confirmation */}
-      {showDeleteSource3mfConfirm && (
-        <ConfirmModal
-          title="Remove Source 3MF"
-          message={`Are you sure you want to remove the source 3MF file from "${archive.print_name || archive.filename}"? This will delete the original slicer project file.`}
-          confirmText="Remove"
-          variant="danger"
-          onConfirm={() => {
-            source3mfDeleteMutation.mutate();
-            setShowDeleteSource3mfConfirm(false);
-          }}
-          onCancel={() => setShowDeleteSource3mfConfirm(false)}
-        />
-      )}
- 
-      {/* Context Menu */}
-      {contextMenu && (
-        <ContextMenu
-          x={contextMenu.x}
-          y={contextMenu.y}
-          items={contextMenuItems}
-          onClose={() => setContextMenu(null)}
-        />
-      )}
- 
-      {/* Timelapse Viewer Modal */}
-      {showTimelapse && archive.timelapse_path && (
-        <TimelapseViewer
-          src={api.getArchiveTimelapse(archive.id)}
-          title={`${archive.print_name || archive.filename} - Timelapse`}
-          downloadFilename={`${archive.print_name || archive.filename}_timelapse.mp4`}
-          onClose={() => setShowTimelapse(false)}
-        />
-      )}
- 
-      {/* Timelapse Selection Modal */}
-      {showTimelapseSelect && availableTimelapses.length > 0 && (
-        <div className="fixed inset-0 bg-black/80 flex items-center justify-center z-50 p-4">
-          <div className="bg-card-dark rounded-lg max-w-lg w-full max-h-[80vh] flex flex-col">
-            <div className="flex items-center justify-between p-4 border-b border-gray-700">
-              <div>
-                <h3 className="text-lg font-semibold text-white">Select Timelapse</h3>
-                <p className="text-sm text-gray-400 mt-1">
-                  No auto-match found. Select the timelapse for this print:
-                </p>
-              </div>
-              <button
-                onClick={() => {
-                  setShowTimelapseSelect(false);
-                  setAvailableTimelapses([]);
-                }}
-                className="text-gray-400 hover:text-white p-1"
-              >
-                <X className="w-5 h-5" />
-              </button>
-            </div>
-            <div className="overflow-y-auto flex-1 p-2">
-              {availableTimelapses.map((file) => (
-                <button
-                  key={file.name}
-                  onClick={() => timelapseSelectMutation.mutate(file.name)}
-                  disabled={timelapseSelectMutation.isPending}
-                  className="w-full text-left p-3 rounded-lg hover:bg-gray-700 transition-colors flex items-center gap-3 disabled:opacity-50"
-                >
-                  <Film className="w-8 h-8 text-bambu-green flex-shrink-0" />
-                  <div className="flex-1 min-w-0">
-                    <p className="text-white font-medium truncate">{file.name}</p>
-                    <p className="text-sm text-gray-400">
-                      {formatFileSize(file.size)}
-                      {file.mtime && ` • ${formatDate(file.mtime)}`}
-                    </p>
-                  </div>
-                </button>
-              ))}
-            </div>
-            <div className="p-4 border-t border-gray-700">
-              <Button
-                variant="secondary"
-                onClick={() => {
-                  setShowTimelapseSelect(false);
-                  setAvailableTimelapses([]);
-                }}
-                className="w-full"
-              >
-                Cancel
-              </Button>
-            </div>
-          </div>
-        </div>
-      )}
- 
-      {/* QR Code Modal */}
-      {showQRCode && (
-        <QRCodeModal
-          archiveId={archive.id}
-          archiveName={archive.print_name || archive.filename}
-          onClose={() => setShowQRCode(false)}
-        />
-      )}
- 
-      {/* Photo Gallery Modal */}
-      {showPhotos && archive.photos && archive.photos.length > 0 && (
-        <PhotoGalleryModal
-          archiveId={archive.id}
-          archiveName={archive.print_name || archive.filename}
-          photos={archive.photos}
-          onClose={() => setShowPhotos(false)}
-          onDelete={async (filename) => {
-            try {
-              await api.deleteArchivePhoto(archive.id, filename);
-              queryClient.invalidateQueries({ queryKey: ['archives'] });
-              showToast('Photo deleted');
-            } catch {
-              showToast('Failed to delete photo', 'error');
-            }
-          }}
-        />
-      )}
- 
-      {/* Project Page Modal */}
-      {showProjectPage && (
-        <ProjectPageModal
-          archiveId={archive.id}
-          archiveName={archive.print_name || archive.filename}
-          onClose={() => setShowProjectPage(false)}
-        />
-      )}
- 
-      {showSchedule && (
-        <AddToQueueModal
-          archiveId={archive.id}
-          archiveName={archive.print_name || archive.filename}
-          onClose={() => setShowSchedule(false)}
-        />
-      )}
- 
-      {/* Hidden file input for source 3MF upload */}
-      <input
-        ref={source3mfInputRef}
-        type="file"
-        accept=".3mf"
-        className="hidden"
-        onChange={(e) => {
-          const file = e.target.files?.[0];
-          if (file) {
-            source3mfUploadMutation.mutate(file);
-          }
-          e.target.value = '';
-        }}
-      />
-    </Card>
-  );
-}
- 
-type SortOption = 'date-desc' | 'date-asc' | 'name-asc' | 'name-desc' | 'size-desc' | 'size-asc';
-type ViewMode = 'grid' | 'list' | 'calendar';
-type Collection = 'all' | 'recent' | 'this-week' | 'this-month' | 'favorites' | 'failed' | 'duplicates';
- 
-const collections: { id: Collection; label: string; icon: React.ReactNode }[] = [
-  { id: 'all', label: 'All Archives', icon: <FolderOpen className="w-4 h-4" /> },
-  { id: 'recent', label: 'Last 24 Hours', icon: <Clock className="w-4 h-4" /> },
-  { id: 'this-week', label: 'This Week', icon: <Calendar className="w-4 h-4" /> },
-  { id: 'this-month', label: 'This Month', icon: <Calendar className="w-4 h-4" /> },
-  { id: 'favorites', label: 'Favorites', icon: <Star className="w-4 h-4" /> },
-  { id: 'failed', label: 'Failed Prints', icon: <AlertCircle className="w-4 h-4" /> },
-  { id: 'duplicates', label: 'Duplicates', icon: <Copy className="w-4 h-4" /> },
-];
- 
-export function ArchivesPage() {
-  const queryClient = useQueryClient();
-  const { showToast } = useToast();
-  const searchInputRef = useRef<HTMLInputElement>(null);
-  const [search, setSearch] = useState('');
-  const [filterPrinter, setFilterPrinter] = useState<number | null>(null);
-  const [filterMaterial, setFilterMaterial] = useState<string | null>(null);
-  const [filterColors, setFilterColors] = useState<Set<string>>(new Set());
-  const [colorFilterMode, setColorFilterMode] = useState<'or' | 'and'>('or');
-  const [filterFavorites, setFilterFavorites] = useState(false);
-  const [filterTag, setFilterTag] = useState<string | null>(null);
-  const [showUpload, setShowUpload] = useState(false);
-  const [uploadFiles, setUploadFiles] = useState<File[]>([]);
-  const [isDraggingOver, setIsDraggingOver] = useState(false);
-  const [selectedIds, setSelectedIds] = useState<Set<number>>(new Set());
-  const [isSelectionMode, setIsSelectionMode] = useState(false);
-  const [showBulkDeleteConfirm, setShowBulkDeleteConfirm] = useState(false);
-  const [showBatchTag, setShowBatchTag] = useState(false);
-  const [viewMode, setViewMode] = useState<ViewMode>('grid');
-  const [sortBy, setSortBy] = useState<SortOption>('date-desc');
-  const [collection, setCollection] = useState<Collection>('all');
-  const [showExportMenu, setShowExportMenu] = useState(false);
-  const [isExporting, setIsExporting] = useState(false);
-  const [showCompareModal, setShowCompareModal] = useState(false);
- 
-  const { data: archives, isLoading } = useQuery({
-    queryKey: ['archives', filterPrinter],
-    queryFn: () => api.getArchives(filterPrinter || undefined),
-  });
- 
-  const { data: printers } = useQuery({
-    queryKey: ['printers'],
-    queryFn: api.getPrinters,
-  });
- 
-  const { data: projects } = useQuery({
-    queryKey: ['projects'],
-    queryFn: () => api.getProjects(),
-  });
- 
-  const bulkDeleteMutation = useMutation({
-    mutationFn: async (ids: number[]) => {
-      await Promise.all(ids.map((id) => api.deleteArchive(id)));
-      return ids.length;
-    },
-    onSuccess: (count) => {
-      queryClient.invalidateQueries({ queryKey: ['archives'] });
-      setSelectedIds(new Set());
-      showToast(`${count} archive${count !== 1 ? 's' : ''} deleted`);
-    },
-    onError: () => {
-      showToast('Failed to delete archives', 'error');
-    },
-  });
- 
-  const printerMap = new Map(printers?.map((p) => [p.id, p.name]) || []);
- 
-  // Extract unique materials and colors from archives
-  const uniqueMaterials = [...new Set(
-    archives?.flatMap(a => a.filament_type?.split(', ') || []).filter(Boolean) || []
-  )].sort();
- 
-  const uniqueColors = [...new Set(
-    archives?.flatMap(a => a.filament_color?.split(',') || []).filter(Boolean) || []
-  )];
- 
-  const uniqueTags = [...new Set(
-    archives?.flatMap(a => a.tags?.split(',').map(t => t.trim()) || []).filter(Boolean) || []
-  )].sort();
- 
-  const filteredArchives = archives
-    ?.filter((a) => {
-      // Collection filter
-      const now = new Date();
-      const archiveDate = new Date(a.created_at);
-      let matchesCollection = true;
- 
-      switch (collection) {
-        case 'recent':
-          matchesCollection = (now.getTime() - archiveDate.getTime()) < 24 * 60 * 60 * 1000;
-          break;
-        case 'this-week':
-          matchesCollection = (now.getTime() - archiveDate.getTime()) < 7 * 24 * 60 * 60 * 1000;
-          break;
-        case 'this-month':
-          matchesCollection = archiveDate.getMonth() === now.getMonth() && archiveDate.getFullYear() === now.getFullYear();
-          break;
-        case 'favorites':
-          matchesCollection = a.is_favorite === true;
-          break;
-        case 'failed':
-          matchesCollection = a.status === 'failed';
-          break;
-        case 'duplicates':
-          matchesCollection = a.duplicate_count > 0;
-          break;
-      }
- 
-      // Search filter
-      const matchesSearch = (a.print_name || a.filename).toLowerCase().includes(search.toLowerCase());
- 
-      // Material filter
-      const matchesMaterial = !filterMaterial ||
-        (a.filament_type?.split(', ').includes(filterMaterial));
- 
-      // Color filter (AND: must have all selected colors, OR: must have any selected color)
-      const archiveColors = a.filament_color?.split(',') || [];
-      const matchesColor = filterColors.size === 0 ||
-        (colorFilterMode === 'or'
-          ? archiveColors.some(c => filterColors.has(c))
-          : [...filterColors].every(c => archiveColors.includes(c)));
- 
-      // Favorites filter (only apply if not using favorites collection)
-      const matchesFavorites = collection === 'favorites' || !filterFavorites || a.is_favorite;
- 
-      // Tag filter
-      const archiveTags = a.tags?.split(',').map(t => t.trim()) || [];
-      const matchesTag = !filterTag || archiveTags.includes(filterTag);
- 
-      return matchesCollection && matchesSearch && matchesMaterial && matchesColor && matchesFavorites && matchesTag;
-    })
-    .sort((a, b) => {
-      switch (sortBy) {
-        case 'date-desc':
-          return new Date(b.created_at).getTime() - new Date(a.created_at).getTime();
-        case 'date-asc':
-          return new Date(a.created_at).getTime() - new Date(b.created_at).getTime();
-        case 'name-asc':
-          return (a.print_name || a.filename).localeCompare(b.print_name || b.filename);
-        case 'name-desc':
-          return (b.print_name || b.filename).localeCompare(a.print_name || a.filename);
-        case 'size-desc':
-          return b.file_size - a.file_size;
-        case 'size-asc':
-          return a.file_size - b.file_size;
-        default:
-          return 0;
-      }
-    });
- 
-  const selectionMode = isSelectionMode || selectedIds.size > 0;
- 
-  const toggleSelect = (id: number) => {
-    setSelectedIds((prev) => {
-      const next = new Set(prev);
-      if (next.has(id)) {
-        next.delete(id);
-      } else {
-        next.add(id);
-      }
-      return next;
-    });
-  };
- 
-  const selectAll = () => {
-    if (filteredArchives) {
-      setSelectedIds(new Set(filteredArchives.map((a) => a.id)));
-    }
-  };
- 
-  const clearSelection = () => {
-    setSelectedIds(new Set());
-    setIsSelectionMode(false);
-  };
- 
-  const toggleColor = (color: string) => {
-    setFilterColors((prev) => {
-      const next = new Set(prev);
-      if (next.has(color)) {
-        next.delete(color);
-      } else {
-        next.add(color);
-      }
-      return next;
-    });
-  };
- 
-  const clearColorFilter = () => {
-    setFilterColors(new Set());
-  };
- 
-  const clearTopFilters = () => {
-    setSearch('');
-    setFilterPrinter(null);
-    setFilterMaterial(null);
-    setFilterFavorites(false);
-    setFilterTag(null);
-  };
- 
-  const hasTopFilters = search || filterPrinter || filterMaterial || filterFavorites || filterTag;
- 
-  // Drag & drop handlers for page-wide upload
-  const handleDragOver = useCallback((e: React.DragEvent) => {
-    e.preventDefault();
-    if (e.dataTransfer.types.includes('Files')) {
-      setIsDraggingOver(true);
-    }
-  }, []);
- 
-  const handleDragLeave = useCallback((e: React.DragEvent) => {
-    e.preventDefault();
-    // Only hide if leaving the page (not entering a child)
-    if (e.currentTarget === e.target) {
-      setIsDraggingOver(false);
-    }
-  }, []);
- 
-  const handleDrop = useCallback((e: React.DragEvent) => {
-    e.preventDefault();
-    setIsDraggingOver(false);
- 
-    const droppedFiles = Array.from(e.dataTransfer.files).filter(f => f.name.endsWith('.3mf'));
-    if (droppedFiles.length > 0) {
-      setUploadFiles(droppedFiles);
-      setShowUpload(true);
-    } else if (e.dataTransfer.files.length > 0) {
-      showToast('Only .3mf files are supported', 'warning');
-    }
-  }, [showToast]);
- 
-  // Keyboard shortcuts
-  const handleKeyDown = useCallback((e: KeyboardEvent) => {
-    const target = e.target as HTMLElement;
-    // Ignore if typing in an input/textarea
-    if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {
-      if (e.key === 'Escape') {
-        target.blur();
-      }
-      return;
-    }
- 
-    switch (e.key) {
-      case '/':
-        e.preventDefault();
-        searchInputRef.current?.focus();
-        break;
-      case 'u':
-      case 'U':
-        if (!e.metaKey && !e.ctrlKey) {
-          e.preventDefault();
-          setShowUpload(true);
-        }
-        break;
-      case 'Escape':
-        if (selectionMode) {
-          clearSelection();
-        }
-        break;
-    }
-  }, [selectionMode]);
- 
-  useEffect(() => {
-    document.addEventListener('keydown', handleKeyDown);
-    return () => document.removeEventListener('keydown', handleKeyDown);
-  }, [handleKeyDown]);
- 
-  return (
-    <div
-      className="p-4 md:p-8 relative min-h-full"
-      onDragOver={handleDragOver}
-      onDragLeave={handleDragLeave}
-      onDrop={handleDrop}
-    >
-      {/* Drag & Drop Overlay */}
-      {isDraggingOver && (
-        <div className="fixed inset-0 z-50 bg-bambu-dark/90 flex items-center justify-center pointer-events-none">
-          <div className="border-4 border-dashed border-bambu-green rounded-xl p-12 text-center">
-            <Upload className="w-16 h-16 mx-auto mb-4 text-bambu-green" />
-            <p className="text-2xl font-semibold text-white mb-2">Drop .3mf files here</p>
-            <p className="text-bambu-gray">Release to upload</p>
-          </div>
-        </div>
-      )}
- 
-      {/* Selection Toolbar */}
-      {selectionMode && (
-        <div className="fixed bottom-6 left-1/2 -translate-x-1/2 z-40 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg shadow-xl px-4 py-3 flex items-center gap-4">
-          <Button variant="secondary" size="sm" onClick={clearSelection}>
-            <X className="w-4 h-4" />
-            Close
-          </Button>
-          <div className="w-px h-6 bg-bambu-dark-tertiary" />
-          <span className="text-white font-medium">
-            {selectedIds.size} selected
-          </span>
-          <div className="w-px h-6 bg-bambu-dark-tertiary" />
-          <Button variant="secondary" size="sm" onClick={selectAll}>
-            Select All
-          </Button>
-          <div className="w-px h-6 bg-bambu-dark-tertiary" />
-          <Button
-            variant="secondary"
-            size="sm"
-            onClick={() => setShowBatchTag(true)}
-          >
-            <Tag className="w-4 h-4" />
-            Tags
-          </Button>
-          <Button
-            variant="secondary"
-            size="sm"
-            onClick={() => {
-              const ids = Array.from(selectedIds);
-              Promise.all(ids.map(id => api.toggleFavorite(id)))
-                .then(() => {
-                  queryClient.invalidateQueries({ queryKey: ['archives'] });
-                  showToast(`Toggled favorites for ${ids.length} archive${ids.length !== 1 ? 's' : ''}`);
-                })
-                .catch(() => {
-                  showToast('Failed to update favorites', 'error');
-                });
-            }}
-          >
-            <Star className="w-4 h-4" />
-            Favorite
-          </Button>
-          <Button
-            size="sm"
-            className="bg-red-500 hover:bg-red-600"
-            onClick={() => setShowBulkDeleteConfirm(true)}
-          >
-            <Trash2 className="w-4 h-4" />
-            Delete
-          </Button>
-        </div>
-      )}
- 
-      <div className="flex items-center justify-between mb-8">
-        <div>
-          <div className="flex items-center gap-3">
-            <h1 className="text-2xl font-bold text-white">Archives</h1>
-            <select
-              className="px-3 py-1.5 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-bambu-gray-light text-sm focus:border-bambu-green focus:outline-none"
-              value={collection}
-              onChange={(e) => setCollection(e.target.value as Collection)}
-            >
-              {collections.map((c) => (
-                <option key={c.id} value={c.id}>
-                  {c.label}
-                </option>
-              ))}
-            </select>
-          </div>
-          <p className="text-bambu-gray">
-            {filteredArchives?.length || 0} of {archives?.length || 0} prints
-          </p>
-        </div>
-        <div className="flex items-center gap-3">
-          {/* Export dropdown */}
-          <div className="relative">
-            <Button
-              variant="secondary"
-              onClick={() => setShowExportMenu(!showExportMenu)}
-              disabled={isExporting}
-            >
-              {isExporting ? (
-                <Loader2 className="w-4 h-4 animate-spin" />
-              ) : (
-                <FileSpreadsheet className="w-4 h-4" />
-              )}
-              Export
-            </Button>
-            {showExportMenu && (
-              <div className="absolute right-0 top-full mt-1 w-48 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg shadow-xl z-20">
-                <button
-                  className="w-full px-4 py-2 text-left text-white hover:bg-bambu-dark-tertiary transition-colors flex items-center gap-2 rounded-t-lg"
-                  onClick={async () => {
-                    setShowExportMenu(false);
-                    setIsExporting(true);
-                    try {
-                      const { blob, filename } = await api.exportArchives({
-                        format: 'csv',
-                        printerId: filterPrinter || undefined,
-                        status: collection === 'failed' ? 'failed' : undefined,
-                        search: search || undefined,
-                      });
-                      const url = URL.createObjectURL(blob);
-                      const a = document.createElement('a');
-                      a.href = url;
-                      a.download = filename;
-                      a.click();
-                      URL.revokeObjectURL(url);
-                      showToast('Export downloaded');
-                    } catch (err) {
-                      showToast('Export failed', 'error');
-                    } finally {
-                      setIsExporting(false);
-                    }
-                  }}
-                >
-                  <FileText className="w-4 h-4" />
-                  Export as CSV
-                </button>
-                <button
-                  className="w-full px-4 py-2 text-left text-white hover:bg-bambu-dark-tertiary transition-colors flex items-center gap-2 rounded-b-lg"
-                  onClick={async () => {
-                    setShowExportMenu(false);
-                    setIsExporting(true);
-                    try {
-                      const { blob, filename } = await api.exportArchives({
-                        format: 'xlsx',
-                        printerId: filterPrinter || undefined,
-                        status: collection === 'failed' ? 'failed' : undefined,
-                        search: search || undefined,
-                      });
-                      const url = URL.createObjectURL(blob);
-                      const a = document.createElement('a');
-                      a.href = url;
-                      a.download = filename;
-                      a.click();
-                      URL.revokeObjectURL(url);
-                      showToast('Export downloaded');
-                    } catch (err) {
-                      showToast('Export failed', 'error');
-                    } finally {
-                      setIsExporting(false);
-                    }
-                  }}
-                >
-                  <FileSpreadsheet className="w-4 h-4" />
-                  Export as Excel
-                </button>
-              </div>
-            )}
-          </div>
-          {/* Compare button (only when 2-5 items selected) */}
-          {selectedIds.size >= 2 && selectedIds.size <= 5 && (
-            <Button
-              variant="secondary"
-              onClick={() => setShowCompareModal(true)}
-            >
-              <GitCompare className="w-4 h-4" />
-              Compare ({selectedIds.size})
-            </Button>
-          )}
-          {!selectionMode && (
-            <Button variant="secondary" onClick={() => setIsSelectionMode(true)}>
-              <CheckSquare className="w-4 h-4" />
-              Select
-            </Button>
-          )}
-          <Button onClick={() => setShowUpload(true)}>
-            <Upload className="w-4 h-4" />
-            Upload 3MF
-          </Button>
-        </div>
-      </div>
- 
-      {/* Filters */}
-      <Card className="mb-6">
-        <CardContent className="py-4">
-          <div className="flex flex-col md:flex-row gap-3 md:gap-4 md:items-center md:flex-wrap">
-            {/* Search - full width on mobile */}
-            <div className="w-full md:flex-1 relative md:min-w-[200px]">
-              <Search className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray" />
-              <input
-                ref={searchInputRef}
-                type="text"
-                placeholder="Search archives..."
-                className="w-full pl-10 pr-4 py-3 md:py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                value={search}
-                onChange={(e) => setSearch(e.target.value)}
-              />
-            </div>
-            {/* Filters - horizontal scroll on mobile */}
-            <div className="flex gap-2 md:gap-4 overflow-x-auto pb-1 md:pb-0 -mx-4 px-4 md:mx-0 md:px-0 md:flex-wrap scrollbar-hide">
-            <div className="flex items-center gap-2 flex-shrink-0">
-              <Filter className="w-4 h-4 text-bambu-gray hidden md:block" />
-              <select
-                className="px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                value={filterPrinter || ''}
-                onChange={(e) =>
-                  setFilterPrinter(e.target.value ? Number(e.target.value) : null)
-                }
-              >
-                <option value="">All Printers</option>
-                {printers?.map((p) => (
-                  <option key={p.id} value={p.id}>
-                    {p.name}
-                  </option>
-                ))}
-              </select>
-            </div>
-            <div className="flex items-center gap-2 flex-shrink-0">
-              <Package className="w-4 h-4 text-bambu-gray hidden md:block" />
-              <select
-                className="px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                value={filterMaterial || ''}
-                onChange={(e) =>
-                  setFilterMaterial(e.target.value || null)
-                }
-              >
-                <option value="">All Materials</option>
-                {uniqueMaterials.map((m) => (
-                  <option key={m} value={m}>
-                    {m}
-                  </option>
-                ))}
-              </select>
-            </div>
-            <button
-              onClick={() => setFilterFavorites(!filterFavorites)}
-              className={`flex items-center gap-2 px-3 py-2 rounded-lg border transition-colors flex-shrink-0 ${
-                filterFavorites
-                  ? 'bg-yellow-500/20 border-yellow-500 text-yellow-400'
-                  : 'bg-bambu-dark border-bambu-dark-tertiary text-bambu-gray hover:text-white'
-              }`}
-              title={filterFavorites ? 'Show all' : 'Show favorites only'}
-            >
-              <Star className={`w-4 h-4 ${filterFavorites ? 'fill-yellow-400' : ''}`} />
-              <span className="text-sm hidden md:inline">Favorites</span>
-            </button>
-            {uniqueTags.length > 0 && (
-              <div className="flex items-center gap-2 flex-shrink-0">
-                <Tag className="w-4 h-4 text-bambu-gray hidden md:block" />
-                <select
-                  className="px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                  value={filterTag || ''}
-                  onChange={(e) => setFilterTag(e.target.value || null)}
-                >
-                  <option value="">All Tags</option>
-                  {uniqueTags.map((t) => (
-                    <option key={t} value={t}>
-                      {t}
-                    </option>
-                  ))}
-                </select>
-              </div>
-            )}
-            <div className="flex items-center gap-2 flex-shrink-0">
-              <ArrowUpDown className="w-4 h-4 text-bambu-gray hidden md:block" />
-              <select
-                className="px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                value={sortBy}
-                onChange={(e) => setSortBy(e.target.value as SortOption)}
-              >
-                <option value="date-desc">Newest first</option>
-                <option value="date-asc">Oldest first</option>
-                <option value="name-asc">Name A-Z</option>
-                <option value="name-desc">Name Z-A</option>
-                <option value="size-desc">Largest first</option>
-                <option value="size-asc">Smallest first</option>
-              </select>
-            </div>
-            <div className="flex items-center border border-bambu-dark-tertiary rounded-lg overflow-hidden flex-shrink-0">
-              <button
-                className={`p-2 ${viewMode === 'grid' ? 'bg-bambu-green text-white' : 'bg-bambu-dark text-bambu-gray hover:text-white'}`}
-                onClick={() => setViewMode('grid')}
-                title="Grid view"
-              >
-                <LayoutGrid className="w-4 h-4" />
-              </button>
-              <button
-                className={`p-2 ${viewMode === 'list' ? 'bg-bambu-green text-white' : 'bg-bambu-dark text-bambu-gray hover:text-white'}`}
-                onClick={() => setViewMode('list')}
-                title="List view"
-              >
-                <List className="w-4 h-4" />
-              </button>
-              <button
-                className={`p-2 ${viewMode === 'calendar' ? 'bg-bambu-green text-white' : 'bg-bambu-dark text-bambu-gray hover:text-white'}`}
-                onClick={() => setViewMode('calendar')}
-                title="Calendar view"
-              >
-                <CalendarDays className="w-4 h-4" />
-              </button>
-            </div>
-            </div>
-            {hasTopFilters && (
-              <Button
-                variant="ghost"
-                size="sm"
-                onClick={clearTopFilters}
-                className="text-bambu-gray hover:text-white"
-              >
-                <X className="w-4 h-4" />
-                Reset
-              </Button>
-            )}
-          </div>
-          {/* Color Filter */}
-          {uniqueColors.length > 0 && (
-            <div className="flex items-center gap-3 mt-4 pt-4 border-t border-bambu-dark-tertiary">
-              <span className="text-xs text-bambu-gray">Colors:</span>
-              {filterColors.size > 1 && (
-                <button
-                  onClick={() => setColorFilterMode(m => m === 'or' ? 'and' : 'or')}
-                  className={`px-2 py-0.5 text-xs rounded transition-colors ${
-                    colorFilterMode === 'and'
-                      ? 'bg-bambu-green text-white'
-                      : 'bg-bambu-dark-tertiary text-bambu-gray hover:text-white'
-                  }`}
-                  title={colorFilterMode === 'or' ? 'Match ANY selected color' : 'Match ALL selected colors'}
-                >
-                  {colorFilterMode.toUpperCase()}
-                </button>
-              )}
-              <div className="flex items-center gap-1.5 flex-wrap">
-                {uniqueColors.map((color) => (
-                  <button
-                    key={color}
-                    onClick={() => toggleColor(color)}
-                    className={`w-6 h-6 rounded-full border-2 transition-all ${
-                      filterColors.has(color)
-                        ? 'border-bambu-green scale-110'
-                        : 'border-white/20 hover:border-white/40'
-                    }`}
-                    style={{ backgroundColor: color }}
-                    title={color}
-                  />
-                ))}
-              </div>
-              {filterColors.size > 0 && (
-                <button
-                  onClick={clearColorFilter}
-                  className="text-xs text-bambu-gray hover:text-white flex items-center gap-1"
-                >
-                  <X className="w-3 h-3" />
-                  Clear
-                </button>
-              )}
-            </div>
-          )}
-        </CardContent>
-      </Card>
- 
-      {/* Archives */}
-      {isLoading ? (
-        <div className="text-center py-12 text-bambu-gray">Loading archives...</div>
-      ) : filteredArchives?.length === 0 ? (
-        <Card>
-          <CardContent className="text-center py-12">
-            <p className="text-bambu-gray">
-              {search ? 'No archives match your search' : 'No archives yet'}
-            </p>
-            <p className="text-sm text-bambu-gray mt-2">
-              Archives are created automatically when prints complete
-            </p>
-          </CardContent>
-        </Card>
-      ) : viewMode === 'calendar' ? (
-        <Card className="p-6">
-          <CalendarView
-            archives={filteredArchives || []}
-            onArchiveClick={(archive) => {
-              // Switch to grid view and search for the archive
-              setSearch(archive.print_name || archive.filename);
-              setViewMode('grid');
-            }}
-          />
-        </Card>
-      ) : viewMode === 'grid' ? (
-        <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6">
-          {filteredArchives?.map((archive) => (
-            <ArchiveCard
-              key={archive.id}
-              archive={archive}
-              printerName={archive.printer_id ? printerMap.get(archive.printer_id) || 'Unknown' : 'No Printer'}
-              isSelected={selectedIds.has(archive.id)}
-              onSelect={toggleSelect}
-              selectionMode={selectionMode}
-              projects={projects}
-            />
-          ))}
-        </div>
-      ) : viewMode === 'list' ? (
-        <Card>
-          <div className="divide-y divide-bambu-dark-tertiary">
-            {/* List Header */}
-            <div className="grid grid-cols-12 gap-4 px-4 py-3 text-xs text-bambu-gray font-medium">
-              <div className="col-span-1"></div>
-              <div className="col-span-4">Name</div>
-              <div className="col-span-2">Printer</div>
-              <div className="col-span-2">Date</div>
-              <div className="col-span-1">Size</div>
-              <div className="col-span-2 text-right">Actions</div>
-            </div>
-            {/* List Items */}
-            {filteredArchives?.map((archive) => (
-              <div
-                key={archive.id}
-                className={`grid grid-cols-12 gap-4 px-4 py-3 items-center hover:bg-bambu-dark-tertiary/30 ${
-                  selectedIds.has(archive.id) ? 'bg-bambu-green/10' : ''
-                }`}
-              >
-                <div className="col-span-1 flex items-center gap-2">
-                  {selectionMode && (
-                    <button onClick={() => toggleSelect(archive.id)}>
-                      {selectedIds.has(archive.id) ? (
-                        <CheckSquare className="w-4 h-4 text-bambu-green" />
-                      ) : (
-                        <Square className="w-4 h-4 text-bambu-gray" />
-                      )}
-                    </button>
-                  )}
-                  {archive.thumbnail_path ? (
-                    <img
-                      src={api.getArchiveThumbnail(archive.id)}
-                      alt=""
-                      className="w-10 h-10 object-cover rounded"
-                    />
-                  ) : (
-                    <div className="w-10 h-10 bg-bambu-dark rounded flex items-center justify-center">
-                      <Image className="w-5 h-5 text-bambu-dark-tertiary" />
-                    </div>
-                  )}
-                </div>
-                <div className="col-span-4">
-                  <div className="flex items-center gap-2">
-                    <p className="text-white text-sm truncate">{archive.print_name || archive.filename}</p>
-                    {archive.timelapse_path && (
-                      <span title="Has timelapse">
-                        <Film className="w-3.5 h-3.5 text-bambu-green flex-shrink-0" />
-                      </span>
-                    )}
-                  </div>
-                  {archive.filament_type && (
-                    <div className="flex items-center gap-1.5 mt-0.5">
-                      <span className="text-xs text-bambu-gray">{archive.filament_type}</span>
-                      {archive.filament_color && (
-                        <div className="flex items-center gap-0.5 flex-wrap">
-                          {archive.filament_color.split(',').map((color, i) => (
-                            <div
-                              key={i}
-                              className="w-2.5 h-2.5 rounded-full border border-white/20"
-                              style={{ backgroundColor: color }}
-                              title={color}
-                            />
-                          ))}
-                        </div>
-                      )}
-                    </div>
-                  )}
-                </div>
-                <div className="col-span-2 text-sm text-bambu-gray truncate">
-                  {archive.printer_id ? printerMap.get(archive.printer_id) || 'Unknown' : 'No Printer'}
-                </div>
-                <div className="col-span-2 text-sm text-bambu-gray">
-                  {new Date(archive.created_at).toLocaleDateString()}
-                </div>
-                <div className="col-span-1 text-sm text-bambu-gray">
-                  {formatFileSize(archive.file_size)}
-                </div>
-                <div className="col-span-2 flex justify-end gap-1">
-                  <Button
-                    variant="ghost"
-                    size="sm"
-                    onClick={() => {
-                      const filename = archive.print_name || archive.filename || 'model';
-                      const downloadUrl = `${window.location.origin}${api.getArchiveForSlicer(archive.id, filename)}`;
-                      window.location.href = `bambustudioopen://${encodeURIComponent(downloadUrl)}`;
-                    }}
-                    title="Open in Slicer"
-                  >
-                    <ExternalLink className="w-4 h-4" />
-                  </Button>
-                  {archive.makerworld_url && (
-                    <Button
-                      variant="ghost"
-                      size="sm"
-                      onClick={() => window.open(archive.makerworld_url!, '_blank')}
-                      title="MakerWorld"
-                    >
-                      <Globe className="w-4 h-4" />
-                    </Button>
-                  )}
-                  <Button
-                    variant="ghost"
-                    size="sm"
-                    onClick={() => {
-                      const link = document.createElement('a');
-                      link.href = api.getArchiveDownload(archive.id);
-                      link.download = `${archive.print_name || archive.filename}.3mf`;
-                      link.click();
-                    }}
-                    title="Download"
-                  >
-                    <Download className="w-4 h-4" />
-                  </Button>
-                </div>
-              </div>
-            ))}
-          </div>
-        </Card>
-      ) : null}
- 
-      {/* Upload Modal */}
-      {showUpload && (
-        <UploadModal
-          onClose={() => {
-            setShowUpload(false);
-            setUploadFiles([]);
-          }}
-          initialFiles={uploadFiles}
-        />
-      )}
- 
-      {/* Bulk Delete Confirmation */}
-      {showBulkDeleteConfirm && (
-        <ConfirmModal
-          title="Delete Archives"
-          message={`Are you sure you want to delete ${selectedIds.size} archive${selectedIds.size > 1 ? 's' : ''}? This action cannot be undone.`}
-          confirmText={`Delete ${selectedIds.size}`}
-          variant="danger"
-          onConfirm={() => {
-            bulkDeleteMutation.mutate(Array.from(selectedIds));
-            setShowBulkDeleteConfirm(false);
-          }}
-          onCancel={() => setShowBulkDeleteConfirm(false)}
-        />
-      )}
- 
-      {/* Batch Tag Modal */}
-      {showBatchTag && (
-        <BatchTagModal
-          selectedIds={Array.from(selectedIds)}
-          existingTags={uniqueTags}
-          onClose={() => setShowBatchTag(false)}
-        />
-      )}
- 
-      {/* Compare Archives Modal */}
-      {showCompareModal && selectedIds.size >= 2 && selectedIds.size <= 5 && (
-        <CompareArchivesModal
-          archiveIds={Array.from(selectedIds)}
-          onClose={() => {
-            setShowCompareModal(false);
-            setSelectedIds(new Set());
-            setIsSelectionMode(false);
-          }}
-        />
-      )}
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/pages/CameraPage.tsx.html b/frontend/coverage/src/pages/CameraPage.tsx.html deleted file mode 100644 index 04a72079d..000000000 --- a/frontend/coverage/src/pages/CameraPage.tsx.html +++ /dev/null @@ -1,784 +0,0 @@ - - - - - - Code coverage report for src/pages/CameraPage.tsx - - - - - - - - - -
-
-

All files / src/pages CameraPage.tsx

-
- -
- 0% - Statements - 0/188 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/188 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useEffect, useRef } from 'react';
-import { useParams } from 'react-router-dom';
-import { useQuery } from '@tanstack/react-query';
-import { RefreshCw, AlertTriangle, Camera, Maximize, Minimize } from 'lucide-react';
-import { api } from '../api/client';
- 
-export function CameraPage() {
-  const { printerId } = useParams<{ printerId: string }>();
-  const id = parseInt(printerId || '0', 10);
- 
-  const [streamMode, setStreamMode] = useState<'stream' | 'snapshot'>('stream');
-  const [streamError, setStreamError] = useState(false);
-  const [streamLoading, setStreamLoading] = useState(true);
-  const [imageKey, setImageKey] = useState(Date.now());
-  const [transitioning, setTransitioning] = useState(false);
-  const [isFullscreen, setIsFullscreen] = useState(false);
-  const imgRef = useRef<HTMLImageElement>(null);
-  const containerRef = useRef<HTMLDivElement>(null);
- 
-  // Fetch printer info for the title
-  const { data: printer } = useQuery({
-    queryKey: ['printer', id],
-    queryFn: () => api.getPrinter(id),
-    enabled: id > 0,
-  });
- 
-  // Update document title
-  useEffect(() => {
-    if (printer) {
-      document.title = `${printer.name} - Camera`;
-    }
-    return () => {
-      document.title = 'Bambuddy';
-    };
-  }, [printer]);
- 
-  // Cleanup on unmount
-  useEffect(() => {
-    return () => {
-      if (imgRef.current) {
-        imgRef.current.src = '';
-      }
-    };
-  }, []);
- 
-  // Auto-hide loading after timeout
-  useEffect(() => {
-    if (streamLoading && !transitioning) {
-      const timeout = streamMode === 'stream' ? 3000 : 20000;
-      const timer = setTimeout(() => {
-        setStreamLoading(false);
-      }, timeout);
-      return () => clearTimeout(timer);
-    }
-  }, [streamMode, streamLoading, imageKey, transitioning]);
- 
-  // Fullscreen change listener
-  useEffect(() => {
-    const handleFullscreenChange = () => {
-      setIsFullscreen(!!document.fullscreenElement);
-    };
-    document.addEventListener('fullscreenchange', handleFullscreenChange);
-    return () => document.removeEventListener('fullscreenchange', handleFullscreenChange);
-  }, []);
- 
-  const handleStreamError = () => {
-    setStreamError(true);
-    setStreamLoading(false);
-  };
- 
-  const handleStreamLoad = () => {
-    setStreamLoading(false);
-    setStreamError(false);
-  };
- 
-  const switchToMode = (newMode: 'stream' | 'snapshot') => {
-    if (streamMode === newMode || transitioning) return;
-    setTransitioning(true);
-    setStreamLoading(true);
-    setStreamError(false);
- 
-    if (imgRef.current) {
-      imgRef.current.src = '';
-    }
- 
-    setTimeout(() => {
-      setStreamMode(newMode);
-      setImageKey(Date.now());
-      setTransitioning(false);
-    }, 100);
-  };
- 
-  const refresh = () => {
-    if (transitioning) return;
-    setTransitioning(true);
-    setStreamLoading(true);
-    setStreamError(false);
- 
-    if (imgRef.current) {
-      imgRef.current.src = '';
-    }
- 
-    setTimeout(() => {
-      setImageKey(Date.now());
-      setTransitioning(false);
-    }, 100);
-  };
- 
-  const toggleFullscreen = () => {
-    if (!containerRef.current) return;
-    if (document.fullscreenElement) {
-      document.exitFullscreen();
-    } else {
-      containerRef.current.requestFullscreen();
-    }
-  };
- 
-  const currentUrl = transitioning
-    ? ''
-    : streamMode === 'stream'
-      ? `/api/v1/printers/${id}/camera/stream?fps=10&t=${imageKey}`
-      : `/api/v1/printers/${id}/camera/snapshot?t=${imageKey}`;
- 
-  const isDisabled = streamLoading || transitioning;
- 
-  if (!id) {
-    return (
-      <div className="min-h-screen bg-black flex items-center justify-center">
-        <p className="text-white">Invalid printer ID</p>
-      </div>
-    );
-  }
- 
-  return (
-    <div ref={containerRef} className="min-h-screen bg-black flex flex-col">
-      {/* Header */}
-      <div className="flex items-center justify-between px-4 py-2 bg-bambu-dark-secondary border-b border-bambu-dark-tertiary">
-        <h1 className="text-sm font-medium text-white flex items-center gap-2">
-          <Camera className="w-4 h-4" />
-          {printer?.name || `Printer ${id}`}
-        </h1>
-        <div className="flex items-center gap-2">
-          {/* Mode toggle */}
-          <div className="flex bg-bambu-dark rounded p-0.5">
-            <button
-              onClick={() => switchToMode('stream')}
-              disabled={isDisabled}
-              className={`px-3 py-1 text-xs rounded transition-colors ${
-                streamMode === 'stream'
-                  ? 'bg-bambu-green text-white'
-                  : 'text-bambu-gray hover:text-white disabled:opacity-50'
-              }`}
-            >
-              Live
-            </button>
-            <button
-              onClick={() => switchToMode('snapshot')}
-              disabled={isDisabled}
-              className={`px-3 py-1 text-xs rounded transition-colors ${
-                streamMode === 'snapshot'
-                  ? 'bg-bambu-green text-white'
-                  : 'text-bambu-gray hover:text-white disabled:opacity-50'
-              }`}
-            >
-              Snapshot
-            </button>
-          </div>
-          <button
-            onClick={refresh}
-            disabled={isDisabled}
-            className="p-1.5 hover:bg-bambu-dark-tertiary rounded disabled:opacity-50"
-            title={streamMode === 'stream' ? 'Restart stream' : 'Refresh snapshot'}
-          >
-            <RefreshCw className={`w-4 h-4 text-bambu-gray ${isDisabled ? 'animate-spin' : ''}`} />
-          </button>
-          <button
-            onClick={toggleFullscreen}
-            className="p-1.5 hover:bg-bambu-dark-tertiary rounded"
-            title={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}
-          >
-            {isFullscreen ? (
-              <Minimize className="w-4 h-4 text-bambu-gray" />
-            ) : (
-              <Maximize className="w-4 h-4 text-bambu-gray" />
-            )}
-          </button>
-        </div>
-      </div>
- 
-      {/* Video area */}
-      <div className="flex-1 flex items-center justify-center p-2">
-        <div className="relative w-full h-full flex items-center justify-center">
-          {(streamLoading || transitioning) && (
-            <div className="absolute inset-0 flex items-center justify-center bg-black/50 z-10">
-              <div className="text-center">
-                <RefreshCw className="w-8 h-8 text-bambu-gray animate-spin mx-auto mb-2" />
-                <p className="text-sm text-bambu-gray">
-                  {streamMode === 'stream' ? 'Connecting to camera...' : 'Capturing snapshot...'}
-                </p>
-              </div>
-            </div>
-          )}
-          {streamError && (
-            <div className="absolute inset-0 flex items-center justify-center bg-black z-10">
-              <div className="text-center p-4">
-                <AlertTriangle className="w-12 h-12 text-orange-400 mx-auto mb-3" />
-                <p className="text-white mb-2">Camera unavailable</p>
-                <p className="text-xs text-bambu-gray mb-4 max-w-md">
-                  Make sure the printer is powered on and connected.
-                </p>
-                <button
-                  onClick={refresh}
-                  className="px-4 py-2 bg-bambu-green text-white rounded hover:bg-bambu-green/80 transition-colors"
-                >
-                  Retry
-                </button>
-              </div>
-            </div>
-          )}
-          <img
-            ref={imgRef}
-            key={imageKey}
-            src={currentUrl}
-            alt="Camera stream"
-            className="max-w-full max-h-full object-contain"
-            onError={currentUrl ? handleStreamError : undefined}
-            onLoad={currentUrl ? handleStreamLoad : undefined}
-          />
-        </div>
-      </div>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/pages/ExternalLinkPage.tsx.html b/frontend/coverage/src/pages/ExternalLinkPage.tsx.html deleted file mode 100644 index aa148e389..000000000 --- a/frontend/coverage/src/pages/ExternalLinkPage.tsx.html +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - Code coverage report for src/pages/ExternalLinkPage.tsx - - - - - - - - - -
-
-

All files / src/pages ExternalLinkPage.tsx

-
- -
- 0% - Statements - 0/31 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/31 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useParams } from 'react-router-dom';
-import { useQuery } from '@tanstack/react-query';
-import { Loader2, AlertTriangle } from 'lucide-react';
-import { api } from '../api/client';
-import { useTheme } from '../contexts/ThemeContext';
- 
-export function ExternalLinkPage() {
-  const { id } = useParams<{ id: string }>();
-  const { theme } = useTheme();
- 
-  const { data: link, isLoading, error } = useQuery({
-    queryKey: ['external-link', id],
-    queryFn: () => api.getExternalLink(Number(id)),
-    enabled: !!id,
-  });
- 
-  if (isLoading) {
-    return (
-      <div className="flex items-center justify-center h-full">
-        <Loader2 className="w-8 h-8 text-bambu-green animate-spin" />
-      </div>
-    );
-  }
- 
-  if (error || !link) {
-    return (
-      <div className="flex flex-col items-center justify-center h-full gap-4 text-bambu-gray">
-        <AlertTriangle className="w-12 h-12" />
-        <p>Link not found</p>
-      </div>
-    );
-  }
- 
-  return (
-    <iframe
-      src={link.url}
-      className="h-full w-full border-0"
-      style={{ colorScheme: theme }}
-      title={link.name}
-      sandbox="allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox"
-    />
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/pages/MaintenancePage.tsx.html b/frontend/coverage/src/pages/MaintenancePage.tsx.html deleted file mode 100644 index d961d099b..000000000 --- a/frontend/coverage/src/pages/MaintenancePage.tsx.html +++ /dev/null @@ -1,3121 +0,0 @@ - - - - - - Code coverage report for src/pages/MaintenancePage.tsx - - - - - - - - - -
-
-

All files / src/pages MaintenancePage.tsx

-
- -
- 0% - Statements - 0/812 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/812 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -425 -426 -427 -428 -429 -430 -431 -432 -433 -434 -435 -436 -437 -438 -439 -440 -441 -442 -443 -444 -445 -446 -447 -448 -449 -450 -451 -452 -453 -454 -455 -456 -457 -458 -459 -460 -461 -462 -463 -464 -465 -466 -467 -468 -469 -470 -471 -472 -473 -474 -475 -476 -477 -478 -479 -480 -481 -482 -483 -484 -485 -486 -487 -488 -489 -490 -491 -492 -493 -494 -495 -496 -497 -498 -499 -500 -501 -502 -503 -504 -505 -506 -507 -508 -509 -510 -511 -512 -513 -514 -515 -516 -517 -518 -519 -520 -521 -522 -523 -524 -525 -526 -527 -528 -529 -530 -531 -532 -533 -534 -535 -536 -537 -538 -539 -540 -541 -542 -543 -544 -545 -546 -547 -548 -549 -550 -551 -552 -553 -554 -555 -556 -557 -558 -559 -560 -561 -562 -563 -564 -565 -566 -567 -568 -569 -570 -571 -572 -573 -574 -575 -576 -577 -578 -579 -580 -581 -582 -583 -584 -585 -586 -587 -588 -589 -590 -591 -592 -593 -594 -595 -596 -597 -598 -599 -600 -601 -602 -603 -604 -605 -606 -607 -608 -609 -610 -611 -612 -613 -614 -615 -616 -617 -618 -619 -620 -621 -622 -623 -624 -625 -626 -627 -628 -629 -630 -631 -632 -633 -634 -635 -636 -637 -638 -639 -640 -641 -642 -643 -644 -645 -646 -647 -648 -649 -650 -651 -652 -653 -654 -655 -656 -657 -658 -659 -660 -661 -662 -663 -664 -665 -666 -667 -668 -669 -670 -671 -672 -673 -674 -675 -676 -677 -678 -679 -680 -681 -682 -683 -684 -685 -686 -687 -688 -689 -690 -691 -692 -693 -694 -695 -696 -697 -698 -699 -700 -701 -702 -703 -704 -705 -706 -707 -708 -709 -710 -711 -712 -713 -714 -715 -716 -717 -718 -719 -720 -721 -722 -723 -724 -725 -726 -727 -728 -729 -730 -731 -732 -733 -734 -735 -736 -737 -738 -739 -740 -741 -742 -743 -744 -745 -746 -747 -748 -749 -750 -751 -752 -753 -754 -755 -756 -757 -758 -759 -760 -761 -762 -763 -764 -765 -766 -767 -768 -769 -770 -771 -772 -773 -774 -775 -776 -777 -778 -779 -780 -781 -782 -783 -784 -785 -786 -787 -788 -789 -790 -791 -792 -793 -794 -795 -796 -797 -798 -799 -800 -801 -802 -803 -804 -805 -806 -807 -808 -809 -810 -811 -812 -813 -814 -815 -816 -817 -818 -819 -820 -821 -822 -823 -824 -825 -826 -827 -828 -829 -830 -831 -832 -833 -834 -835 -836 -837 -838 -839 -840 -841 -842 -843 -844 -845 -846 -847 -848 -849 -850 -851 -852 -853 -854 -855 -856 -857 -858 -859 -860 -861 -862 -863 -864 -865 -866 -867 -868 -869 -870 -871 -872 -873 -874 -875 -876 -877 -878 -879 -880 -881 -882 -883 -884 -885 -886 -887 -888 -889 -890 -891 -892 -893 -894 -895 -896 -897 -898 -899 -900 -901 -902 -903 -904 -905 -906 -907 -908 -909 -910 -911 -912 -913 -914 -915 -916 -917 -918 -919 -920 -921 -922 -923 -924 -925 -926 -927 -928 -929 -930 -931 -932 -933 -934 -935 -936 -937 -938 -939 -940 -941 -942 -943 -944 -945 -946 -947 -948 -949 -950 -951 -952 -953 -954 -955 -956 -957 -958 -959 -960 -961 -962 -963 -964 -965 -966 -967 -968 -969 -970 -971 -972 -973 -974 -975 -976 -977 -978 -979 -980 -981 -982 -983 -984 -985 -986 -987 -988 -989 -990 -991 -992 -993 -994 -995 -996 -997 -998 -999 -1000 -1001 -1002 -1003 -1004 -1005 -1006 -1007 -1008 -1009 -1010 -1011 -1012 -1013  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState } from 'react';
-import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
-import {
-  Wrench,
-  Loader2,
-  Check,
-  AlertTriangle,
-  Clock,
-  Plus,
-  Trash2,
-  ChevronDown,
-  ChevronUp,
-  Droplet,
-  Flame,
-  Ruler,
-  Sparkles,
-  Square,
-  Cable,
-  Edit3,
-  RotateCcw,
-  Calendar,
-  Timer,
-  Cog,
-  Fan,
-  Zap,
-  Wind,
-  Thermometer,
-  Layers,
-  Box,
-  Target,
-  RefreshCw,
-  Settings,
-  Filter,
-  CircleDot,
-} from 'lucide-react';
-import { api } from '../api/client';
-import type { MaintenanceStatus, PrinterMaintenanceOverview, MaintenanceType } from '../api/client';
-import { Card, CardContent } from '../components/Card';
-import { Button } from '../components/Button';
-import { Toggle } from '../components/Toggle';
-import { useToast } from '../contexts/ToastContext';
- 
-// Icon mapping for maintenance types
-const iconMap: Record<string, React.ComponentType<{ className?: string }>> = {
-  Droplet,
-  Flame,
-  Ruler,
-  Sparkles,
-  Square,
-  Cable,
-  Wrench,
-  Calendar,
-  Timer,
-  Cog,
-  Fan,
-  Zap,
-  Wind,
-  Thermometer,
-  Layers,
-  Box,
-  Target,
-  RefreshCw,
-  Settings,
-  Filter,
-  CircleDot,
-};
- 
-function getIcon(iconName: string | null) {
-  if (!iconName) return Wrench;
-  return iconMap[iconName] || Wrench;
-}
- 
-function formatDuration(value: number, type: 'hours' | 'days'): string {
-  if (type === 'days') {
-    if (value < 1) return 'Today';
-    if (value === 1) return '1 day';
-    if (value < 7) return `${Math.round(value)} days`;
-    if (value < 30) return `${Math.round(value / 7)} weeks`;
-    return `${Math.round(value / 30)} months`;
-  } else {
-    if (value < 1) return `${Math.round(value * 60)}m`;
-    if (value < 10) return `${value.toFixed(1)}h`;
-    return `${Math.round(value)}h`;
-  }
-}
- 
-function formatIntervalLabel(value: number, type: 'hours' | 'days'): string {
-  if (type === 'days') {
-    if (value === 1) return '1 day';
-    if (value === 7) return '1 week';
-    if (value === 14) return '2 weeks';
-    if (value === 30) return '1 month';
-    if (value === 60) return '2 months';
-    if (value === 90) return '3 months';
-    if (value === 180) return '6 months';
-    if (value === 365) return '1 year';
-    return `${value} days`;
-  }
-  return `${value}h`;
-}
- 
-// Maintenance item card - cleaner, more visual design
-function MaintenanceCard({
-  item,
-  onPerform,
-  onToggle,
-}: {
-  item: MaintenanceStatus;
-  onPerform: (id: number) => void;
-  onToggle: (id: number, enabled: boolean) => void;
-}) {
-  const Icon = getIcon(item.maintenance_type_icon);
-  const intervalType = item.interval_type || 'hours';
- 
-  // Calculate progress based on interval type
-  const getProgress = () => {
-    if (intervalType === 'days') {
-      const daysSince = item.days_since_maintenance ?? 0;
-      return Math.max(0, Math.min(100, (daysSince / item.interval_hours) * 100));
-    }
-    return Math.max(0, Math.min(100,
-      ((item.interval_hours - item.hours_until_due) / item.interval_hours) * 100
-    ));
-  };
- 
-  const progressPercent = getProgress();
- 
-  const getStatusColor = () => {
-    if (!item.enabled) return 'text-bambu-gray';
-    if (item.is_due) return 'text-red-400';
-    if (item.is_warning) return 'text-amber-400';
-    return 'text-bambu-green';
-  };
- 
-  const getProgressColor = () => {
-    if (!item.enabled) return 'bg-bambu-gray/30';
-    if (item.is_due) return 'bg-red-500';
-    if (item.is_warning) return 'bg-amber-500';
-    return 'bg-bambu-green';
-  };
- 
-  const getBgColor = () => {
-    if (!item.enabled) return 'bg-bambu-dark-secondary/50';
-    if (item.is_due) return 'bg-red-500/5 border-red-500/20';
-    if (item.is_warning) return 'bg-amber-500/5 border-amber-500/20';
-    return 'bg-bambu-dark-secondary border-bambu-dark-tertiary';
-  };
- 
-  const getStatusText = () => {
-    if (!item.enabled) return 'Disabled';
- 
-    if (intervalType === 'days') {
-      const daysUntil = item.days_until_due ?? 0;
-      if (item.is_due) return `Overdue by ${formatDuration(Math.abs(daysUntil), 'days')}`;
-      if (item.is_warning) return `Due in ${formatDuration(daysUntil, 'days')}`;
-      return `${formatDuration(daysUntil, 'days')} left`;
-    } else {
-      if (item.is_due) return `Overdue by ${formatDuration(Math.abs(item.hours_until_due), 'hours')}`;
-      if (item.is_warning) return `Due in ${formatDuration(item.hours_until_due, 'hours')}`;
-      return `${formatDuration(item.hours_until_due, 'hours')} left`;
-    }
-  };
- 
-  return (
-    <div className={`rounded-xl border p-4 transition-all ${getBgColor()}`}>
-      <div className="flex items-start gap-3">
-        {/* Icon with status indicator */}
-        <div className={`relative p-2.5 rounded-lg ${
-          item.is_due ? 'bg-red-500/20' :
-          item.is_warning ? 'bg-amber-500/20' :
-          item.enabled ? 'bg-bambu-dark' : 'bg-bambu-dark/50'
-        }`}>
-          <Icon className={`w-5 h-5 ${getStatusColor()}`} />
-          {item.enabled && (item.is_due || item.is_warning) && (
-            <span className={`absolute -top-1 -right-1 w-2.5 h-2.5 rounded-full ${
-              item.is_due ? 'bg-red-500' : 'bg-amber-500'
-            } animate-pulse`} />
-          )}
-        </div>
- 
-        {/* Content */}
-        <div className="flex-1 min-w-0">
-          <div className="flex items-center gap-2">
-            <h3 className={`font-medium truncate ${item.enabled ? 'text-white' : 'text-bambu-gray'}`}>
-              {item.maintenance_type_name}
-            </h3>
-            {intervalType === 'days' && (
-              <span title="Time-based interval">
-                <Calendar className="w-3.5 h-3.5 text-bambu-gray shrink-0" />
-              </span>
-            )}
-          </div>
- 
-          {/* Progress bar */}
-          <div className="mt-2 mb-1.5">
-            <div className="w-full h-1.5 bg-bambu-dark rounded-full overflow-hidden">
-              <div
-                className={`h-full rounded-full transition-all duration-500 ${getProgressColor()}`}
-                style={{ width: `${progressPercent}%` }}
-              />
-            </div>
-          </div>
- 
-          {/* Status text */}
-          <div className={`text-xs flex items-center gap-1 ${getStatusColor()}`}>
-            {item.is_due && <AlertTriangle className="w-3 h-3" />}
-            {item.is_warning && !item.is_due && <Clock className="w-3 h-3" />}
-            {!item.is_due && !item.is_warning && item.enabled && <Check className="w-3 h-3" />}
-            {getStatusText()}
-          </div>
-        </div>
- 
-        {/* Actions */}
-        <div className="flex items-center gap-2 shrink-0">
-          <Toggle
-            checked={item.enabled}
-            onChange={(checked) => onToggle(item.id, checked)}
-          />
-          <Button
-            size="sm"
-            variant={item.is_due ? 'primary' : 'secondary'}
-            onClick={() => onPerform(item.id)}
-            disabled={!item.enabled}
-            className="!px-3"
-          >
-            <RotateCcw className="w-3.5 h-3.5" />
-            Reset
-          </Button>
-        </div>
-      </div>
-    </div>
-  );
-}
- 
-// Printer section with improved visual hierarchy
-function PrinterSection({
-  overview,
-  onPerform,
-  onToggle,
-  onSetHours,
-}: {
-  overview: PrinterMaintenanceOverview;
-  onPerform: (id: number) => void;
-  onToggle: (id: number, enabled: boolean) => void;
-  onSetHours: (printerId: number, hours: number) => void;
-}) {
-  const [expanded, setExpanded] = useState(true);
-  const [editingHours, setEditingHours] = useState(false);
-  const [hoursInput, setHoursInput] = useState(overview.total_print_hours.toFixed(1));
- 
-  const sortedItems = [...overview.maintenance_items].sort((a, b) => {
-    // Sort by urgency first, then by type
-    if (a.is_due && !b.is_due) return -1;
-    if (!a.is_due && b.is_due) return 1;
-    if (a.is_warning && !b.is_warning) return -1;
-    if (!a.is_warning && b.is_warning) return 1;
-    return a.maintenance_type_id - b.maintenance_type_id;
-  });
- 
-  const nextTask = sortedItems.find(item => item.enabled && (item.is_due || item.is_warning));
- 
-  const handleSaveHours = () => {
-    const hours = parseFloat(hoursInput);
-    if (!isNaN(hours) && hours >= 0) {
-      onSetHours(overview.printer_id, hours);
-      setEditingHours(false);
-    }
-  };
- 
-  return (
-    <Card className="overflow-hidden">
-      {/* Header */}
-      <div className="p-5">
-        <div className="flex items-center justify-between">
-          <div className="flex items-center gap-4">
-            <h2 className="text-xl font-semibold text-white">{overview.printer_name}</h2>
-            <div className="flex items-center gap-2">
-              {overview.due_count > 0 && (
-                <span className="px-2.5 py-1 bg-red-500/20 text-red-400 text-xs font-medium rounded-full flex items-center gap-1.5">
-                  <AlertTriangle className="w-3 h-3" />
-                  {overview.due_count} overdue
-                </span>
-              )}
-              {overview.warning_count > 0 && (
-                <span className="px-2.5 py-1 bg-amber-500/20 text-amber-400 text-xs font-medium rounded-full flex items-center gap-1.5">
-                  <Clock className="w-3 h-3" />
-                  {overview.warning_count} due soon
-                </span>
-              )}
-              {overview.due_count === 0 && overview.warning_count === 0 && (
-                <span className="px-2.5 py-1 bg-bambu-green/20 text-bambu-green text-xs font-medium rounded-full flex items-center gap-1.5">
-                  <Check className="w-3 h-3" />
-                  All good
-                </span>
-              )}
-            </div>
-          </div>
-          <button
-            onClick={() => setExpanded(!expanded)}
-            className="flex items-center gap-1.5 px-3 py-1.5 text-sm text-bambu-gray hover:text-white hover:bg-bambu-dark rounded-lg transition-colors"
-          >
-            {expanded ? <ChevronUp className="w-4 h-4" /> : <ChevronDown className="w-4 h-4" />}
-            {expanded ? 'Collapse' : 'Expand'}
-          </button>
-        </div>
- 
-        {/* Quick stats row */}
-        <div className="flex items-center gap-6 mt-4">
-          {/* Print Hours */}
-          <div className="flex items-center gap-3">
-            <div className="p-2 bg-bambu-dark/50 rounded-lg">
-              <Timer className="w-4 h-4 text-bambu-gray" />
-            </div>
-            {editingHours ? (
-              <div className="flex items-center gap-2">
-                <input
-                  type="number"
-                  value={hoursInput}
-                  onChange={(e) => setHoursInput(e.target.value)}
-                  onKeyDown={(e) => {
-                    if (e.key === 'Enter') handleSaveHours();
-                    if (e.key === 'Escape') setEditingHours(false);
-                  }}
-                  className="w-24 px-2 py-1 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm"
-                  min="0"
-                  step="1"
-                  autoFocus
-                />
-                <span className="text-xs text-bambu-gray">hours</span>
-                <Button size="sm" onClick={handleSaveHours}>Save</Button>
-                <Button size="sm" variant="secondary" onClick={() => setEditingHours(false)}>Cancel</Button>
-              </div>
-            ) : (
-              <button
-                onClick={() => {
-                  setHoursInput(Math.round(overview.total_print_hours).toString());
-                  setEditingHours(true);
-                }}
-                className="group"
-              >
-                <div className="text-sm font-medium text-white group-hover:text-bambu-green transition-colors flex items-center gap-1">
-                  {Math.floor(overview.total_print_hours)} hours
-                  <Edit3 className="w-3 h-3 text-bambu-gray group-hover:text-bambu-green" />
-                </div>
-                <div className="text-xs text-bambu-gray">Total print time</div>
-              </button>
-            )}
-          </div>
- 
-          {/* Divider */}
-          <div className="w-px h-10 bg-bambu-dark-tertiary" />
- 
-          {/* Next Maintenance */}
-          {nextTask && (
-            <div className="flex items-center gap-3">
-              <div className={`p-2 rounded-lg ${
-                nextTask.is_due ? 'bg-red-500/20' : 'bg-amber-500/20'
-              }`}>
-                {(() => {
-                  const Icon = getIcon(nextTask.maintenance_type_icon);
-                  return <Icon className={`w-4 h-4 ${nextTask.is_due ? 'text-red-400' : 'text-amber-400'}`} />;
-                })()}
-              </div>
-              <div>
-                <div className={`text-sm font-medium ${nextTask.is_due ? 'text-red-400' : 'text-amber-400'}`}>
-                  {nextTask.maintenance_type_name}
-                </div>
-                <div className={`text-xs ${nextTask.is_due ? 'text-red-400/70' : 'text-amber-400/70'}`}>
-                  {nextTask.is_due ? 'Overdue' : 'Due soon'}
-                </div>
-              </div>
-            </div>
-          )}
-        </div>
-      </div>
- 
-      {/* Maintenance items */}
-      {expanded && (
-        <CardContent className="pt-0 border-t border-bambu-dark-tertiary">
-          <div className="grid grid-cols-1 lg:grid-cols-2 gap-3 pt-4">
-            {sortedItems.map((item) => (
-              <MaintenanceCard
-                key={item.id}
-                item={item}
-                onPerform={onPerform}
-                onToggle={onToggle}
-              />
-            ))}
-          </div>
-        </CardContent>
-      )}
-    </Card>
-  );
-}
- 
-// Settings section - maintenance types configuration
-function SettingsSection({
-  overview,
-  types,
-  onUpdateInterval,
-  onAddType,
-  onUpdateType,
-  onDeleteType,
-}: {
-  overview: PrinterMaintenanceOverview[] | undefined;
-  types: MaintenanceType[];
-  onUpdateInterval: (id: number, data: { custom_interval_hours?: number | null; custom_interval_type?: 'hours' | 'days' | null }) => void;
-  onAddType: (data: { name: string; description?: string; default_interval_hours: number; interval_type: 'hours' | 'days'; icon?: string }) => void;
-  onUpdateType: (id: number, data: { name?: string; default_interval_hours?: number; interval_type?: 'hours' | 'days'; icon?: string }) => void;
-  onDeleteType: (id: number) => void;
-}) {
-  const [editingInterval, setEditingInterval] = useState<number | null>(null);
-  const [intervalInput, setIntervalInput] = useState('');
-  const [intervalTypeInput, setIntervalTypeInput] = useState<'hours' | 'days'>('hours');
-  const [showAddType, setShowAddType] = useState(false);
-  const [newTypeName, setNewTypeName] = useState('');
-  const [newTypeInterval, setNewTypeInterval] = useState('100');
-  const [newTypeIntervalType, setNewTypeIntervalType] = useState<'hours' | 'days'>('hours');
-  const [newTypeIcon, setNewTypeIcon] = useState('Wrench');
- 
-  // Edit type state
-  const [editingType, setEditingType] = useState<MaintenanceType | null>(null);
-  const [editTypeName, setEditTypeName] = useState('');
-  const [editTypeInterval, setEditTypeInterval] = useState('');
-  const [editTypeIntervalType, setEditTypeIntervalType] = useState<'hours' | 'days'>('hours');
-  const [editTypeIcon, setEditTypeIcon] = useState('Wrench');
- 
-  const startEditType = (type: MaintenanceType) => {
-    setEditingType(type);
-    setEditTypeName(type.name);
-    setEditTypeInterval(type.default_interval_hours.toString());
-    setEditTypeIntervalType(type.interval_type || 'hours');
-    setEditTypeIcon(type.icon || 'Wrench');
-  };
- 
-  const handleSaveEditType = () => {
-    if (editingType && editTypeName.trim() && parseFloat(editTypeInterval) > 0) {
-      onUpdateType(editingType.id, {
-        name: editTypeName.trim(),
-        default_interval_hours: parseFloat(editTypeInterval),
-        interval_type: editTypeIntervalType,
-        icon: editTypeIcon,
-      });
-      setEditingType(null);
-    }
-  };
- 
-  const handleSaveInterval = (itemId: number, defaultInterval: number, defaultIntervalType: 'hours' | 'days') => {
-    const newInterval = parseFloat(intervalInput);
-    if (!isNaN(newInterval) && newInterval > 0) {
-      const customInterval = Math.abs(newInterval - defaultInterval) < 0.01 ? null : newInterval;
-      const customIntervalType = intervalTypeInput !== defaultIntervalType ? intervalTypeInput : null;
-      onUpdateInterval(itemId, {
-        custom_interval_hours: customInterval,
-        custom_interval_type: customIntervalType
-      });
-    }
-    setEditingInterval(null);
-  };
- 
-  const handleAddType = (e: React.FormEvent) => {
-    e.preventDefault();
-    if (newTypeName.trim() && parseFloat(newTypeInterval) > 0) {
-      onAddType({
-        name: newTypeName.trim(),
-        default_interval_hours: parseFloat(newTypeInterval),
-        interval_type: newTypeIntervalType,
-        icon: newTypeIcon,
-      });
-      setNewTypeName('');
-      setNewTypeInterval('100');
-      setNewTypeIntervalType('hours');
-      setShowAddType(false);
-    }
-  };
- 
-  const printerItems = overview?.map(p => ({
-    printerId: p.printer_id,
-    printerName: p.printer_name,
-    items: p.maintenance_items.sort((a, b) => a.maintenance_type_id - b.maintenance_type_id),
-  })).sort((a, b) => a.printerName.localeCompare(b.printerName)) || [];
- 
-  const systemTypes = types.filter(t => t.is_system);
-  const customTypes = types.filter(t => !t.is_system);
- 
-  return (
-    <div className="space-y-8">
-      {/* Maintenance Types */}
-      <div>
-        <div className="flex items-center justify-between mb-4">
-          <div>
-            <h2 className="text-lg font-semibold text-white">Maintenance Types</h2>
-            <p className="text-sm text-bambu-gray mt-1">System types and your custom maintenance tasks</p>
-          </div>
-          <Button onClick={() => setShowAddType(!showAddType)}>
-            <Plus className="w-4 h-4" />
-            Add Custom Type
-          </Button>
-        </div>
- 
-        {/* Add custom type form */}
-        {showAddType && (
-          <Card className="mb-6">
-            <CardContent className="py-4">
-              <form onSubmit={handleAddType}>
-                <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
-                  <div className="lg:col-span-2">
-                    <label className="block text-xs text-bambu-gray mb-1.5">Name</label>
-                    <input
-                      type="text"
-                      value={newTypeName}
-                      onChange={(e) => setNewTypeName(e.target.value)}
-                      className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none"
-                      placeholder="e.g., Replace HEPA Filter"
-                      autoFocus
-                    />
-                  </div>
-                  <div>
-                    <label className="block text-xs text-bambu-gray mb-1.5">Interval Type</label>
-                    <select
-                      value={newTypeIntervalType}
-                      onChange={(e) => {
-                        setNewTypeIntervalType(e.target.value as 'hours' | 'days');
-                        // Set sensible default based on type
-                        if (e.target.value === 'days') {
-                          setNewTypeInterval('30');
-                        } else {
-                          setNewTypeInterval('100');
-                        }
-                      }}
-                      className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none"
-                    >
-                      <option value="hours">Print Hours</option>
-                      <option value="days">Calendar Days</option>
-                    </select>
-                  </div>
-                  <div>
-                    <label className="block text-xs text-bambu-gray mb-1.5">
-                      Interval ({newTypeIntervalType === 'days' ? 'days' : 'hours'})
-                    </label>
-                    <input
-                      type="number"
-                      value={newTypeInterval}
-                      onChange={(e) => setNewTypeInterval(e.target.value)}
-                      className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none"
-                      min="1"
-                    />
-                  </div>
-                </div>
-                <div className="mt-4 flex items-end justify-between">
-                  <div>
-                    <label className="block text-xs text-bambu-gray mb-1.5">Icon</label>
-                    <div className="flex gap-1">
-                      {Object.keys(iconMap).map((iconName) => {
-                        const IconComp = iconMap[iconName];
-                        return (
-                          <button
-                            key={iconName}
-                            type="button"
-                            onClick={() => setNewTypeIcon(iconName)}
-                            className={`p-2 rounded-lg transition-colors ${
-                              newTypeIcon === iconName
-                                ? 'bg-bambu-green text-white'
-                                : 'bg-bambu-dark text-bambu-gray hover:text-white hover:bg-bambu-dark-tertiary'
-                            }`}
-                          >
-                            <IconComp className="w-4 h-4" />
-                          </button>
-                        );
-                      })}
-                    </div>
-                  </div>
-                  <div className="flex gap-2">
-                    <Button type="button" variant="secondary" onClick={() => setShowAddType(false)}>
-                      Cancel
-                    </Button>
-                    <Button type="submit" disabled={!newTypeName.trim()}>
-                      Add Type
-                    </Button>
-                  </div>
-                </div>
-              </form>
-            </CardContent>
-          </Card>
-        )}
- 
-        {/* Types grid */}
-        <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-3">
-          {/* System types */}
-          {systemTypes.map((type) => {
-            const Icon = getIcon(type.icon);
-            const intervalType = type.interval_type || 'hours';
-            return (
-              <div key={type.id} className="bg-bambu-dark-secondary rounded-xl p-4 border border-bambu-dark-tertiary">
-                <div className="flex items-center gap-3">
-                  <div className="p-2.5 bg-bambu-dark rounded-lg">
-                    <Icon className="w-5 h-5 text-bambu-gray" />
-                  </div>
-                  <div className="flex-1 min-w-0">
-                    <div className="text-sm font-medium text-white truncate">{type.name}</div>
-                    <div className="text-xs text-bambu-gray mt-0.5 flex items-center gap-1">
-                      {intervalType === 'days' ? <Calendar className="w-3 h-3" /> : <Timer className="w-3 h-3" />}
-                      {formatIntervalLabel(type.default_interval_hours, intervalType)}
-                    </div>
-                  </div>
-                </div>
-              </div>
-            );
-          })}
-          {/* Custom types */}
-          {customTypes.map((type) => {
-            const Icon = getIcon(type.icon);
-            const intervalType = type.interval_type || 'hours';
-            const isEditing = editingType?.id === type.id;
- 
-            if (isEditing) {
-              return (
-                <div key={type.id} className="bg-bambu-dark-secondary rounded-xl p-4 border border-bambu-green">
-                  <div className="space-y-3">
-                    <input
-                      type="text"
-                      value={editTypeName}
-                      onChange={(e) => setEditTypeName(e.target.value)}
-                      className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none"
-                      placeholder="Name"
-                      autoFocus
-                    />
-                    <div className="flex gap-2">
-                      <select
-                        value={editTypeIntervalType}
-                        onChange={(e) => setEditTypeIntervalType(e.target.value as 'hours' | 'days')}
-                        className="flex-1 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none"
-                      >
-                        <option value="hours">Print Hours</option>
-                        <option value="days">Calendar Days</option>
-                      </select>
-                      <input
-                        type="number"
-                        value={editTypeInterval}
-                        onChange={(e) => setEditTypeInterval(e.target.value)}
-                        className="w-24 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none"
-                        min="1"
-                      />
-                    </div>
-                    <div className="flex flex-wrap gap-1">
-                      {Object.keys(iconMap).map((iconName) => {
-                        const IconComp = iconMap[iconName];
-                        return (
-                          <button
-                            key={iconName}
-                            type="button"
-                            onClick={() => setEditTypeIcon(iconName)}
-                            className={`p-1.5 rounded transition-colors ${
-                              editTypeIcon === iconName
-                                ? 'bg-bambu-green text-white'
-                                : 'bg-bambu-dark text-bambu-gray hover:text-white'
-                            }`}
-                          >
-                            <IconComp className="w-3.5 h-3.5" />
-                          </button>
-                        );
-                      })}
-                    </div>
-                    <div className="flex gap-2">
-                      <Button size="sm" onClick={handleSaveEditType} disabled={!editTypeName.trim()}>
-                        Save
-                      </Button>
-                      <Button size="sm" variant="secondary" onClick={() => setEditingType(null)}>
-                        Cancel
-                      </Button>
-                    </div>
-                  </div>
-                </div>
-              );
-            }
- 
-            return (
-              <div key={type.id} className="bg-bambu-dark-secondary rounded-xl p-4 border border-bambu-green/30">
-                <div className="flex items-center gap-3">
-                  <div className="p-2.5 bg-bambu-green/20 rounded-lg">
-                    <Icon className="w-5 h-5 text-bambu-green" />
-                  </div>
-                  <div className="flex-1 min-w-0">
-                    <div className="flex items-center gap-2">
-                      <span className="text-sm font-medium text-white truncate">{type.name}</span>
-                      <span className="px-1.5 py-0.5 bg-bambu-green/20 text-bambu-green text-[10px] font-medium rounded">
-                        Custom
-                      </span>
-                    </div>
-                    <div className="text-xs text-bambu-gray mt-0.5 flex items-center gap-1">
-                      {intervalType === 'days' ? <Calendar className="w-3 h-3" /> : <Timer className="w-3 h-3" />}
-                      {formatIntervalLabel(type.default_interval_hours, intervalType)}
-                    </div>
-                  </div>
-                  <button
-                    onClick={() => startEditType(type)}
-                    className="p-2 rounded-lg hover:bg-bambu-dark text-bambu-gray hover:text-white transition-colors"
-                  >
-                    <Edit3 className="w-4 h-4" />
-                  </button>
-                  <button
-                    onClick={() => {
-                      if (confirm(`Delete "${type.name}"?`)) {
-                        onDeleteType(type.id);
-                      }
-                    }}
-                    className="p-2 rounded-lg hover:bg-bambu-dark text-bambu-gray hover:text-red-400 transition-colors"
-                  >
-                    <Trash2 className="w-4 h-4" />
-                  </button>
-                </div>
-              </div>
-            );
-          })}
-        </div>
-      </div>
- 
-      {/* Per-printer interval overrides */}
-      {printerItems.length > 0 && (
-        <div>
-          <div className="mb-4">
-            <h2 className="text-lg font-semibold text-white">Interval Overrides</h2>
-            <p className="text-sm text-bambu-gray mt-1">Customize intervals for specific printers</p>
-          </div>
-          <div className="space-y-4">
-            {printerItems.map((printer) => (
-              <Card key={printer.printerId}>
-                <CardContent className="py-4">
-                  <h3 className="text-sm font-medium text-white mb-3">{printer.printerName}</h3>
-                  <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-2">
-                    {printer.items.map((item) => {
-                      const Icon = getIcon(item.maintenance_type_icon);
-                      const typeInfo = types.find(t => t.id === item.maintenance_type_id);
-                      const defaultInterval = typeInfo?.default_interval_hours || item.interval_hours;
-                      const defaultIntervalType = typeInfo?.interval_type || 'hours';
-                      const intervalType = item.interval_type || 'hours';
-                      const isEditing = editingInterval === item.id;
- 
-                      return (
-                        <div key={item.id} className="flex items-center gap-2 p-2.5 bg-bambu-dark rounded-lg">
-                          <Icon className="w-4 h-4 text-bambu-gray shrink-0" />
-                          <span className="text-xs text-bambu-gray flex-1 truncate">{item.maintenance_type_name}</span>
- 
-                          {isEditing ? (
-                            <div className="flex items-center gap-1">
-                              {intervalTypeInput === 'days' ? (
-                                <Calendar className="w-3.5 h-3.5 text-bambu-gray shrink-0" />
-                              ) : (
-                                <Timer className="w-3.5 h-3.5 text-bambu-gray shrink-0" />
-                              )}
-                              <select
-                                value={intervalTypeInput}
-                                onChange={(e) => setIntervalTypeInput(e.target.value as 'hours' | 'days')}
-                                className="px-1.5 py-1 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-xs"
-                              >
-                                <option value="hours">Print Hours</option>
-                                <option value="days">Calendar Days</option>
-                              </select>
-                              <input
-                                type="number"
-                                value={intervalInput}
-                                onChange={(e) => setIntervalInput(e.target.value)}
-                                onKeyDown={(e) => {
-                                  if (e.key === 'Enter') handleSaveInterval(item.id, defaultInterval, defaultIntervalType);
-                                  if (e.key === 'Escape') setEditingInterval(null);
-                                }}
-                                className="w-16 px-2 py-1 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-xs"
-                                min="1"
-                              />
-                              <Button size="sm" onClick={() => handleSaveInterval(item.id, defaultInterval, defaultIntervalType)}>OK</Button>
-                            </div>
-                          ) : (
-                            <button
-                              onClick={() => {
-                                setEditingInterval(item.id);
-                                setIntervalInput(item.interval_hours.toString());
-                                setIntervalTypeInput(intervalType);
-                              }}
-                              className="px-2 py-1 bg-bambu-dark-tertiary hover:bg-bambu-dark-secondary border border-bambu-dark-tertiary hover:border-bambu-green rounded text-xs font-medium text-white transition-colors flex items-center gap-1"
-                            >
-                              {intervalType === 'days' ? <Calendar className="w-3 h-3" /> : <Timer className="w-3 h-3" />}
-                              {formatIntervalLabel(item.interval_hours, intervalType)}
-                              <Edit3 className="w-3 h-3 text-bambu-gray" />
-                            </button>
-                          )}
-                        </div>
-                      );
-                    })}
-                  </div>
-                </CardContent>
-              </Card>
-            ))}
-          </div>
-        </div>
-      )}
- 
-      {printerItems.length === 0 && (
-        <Card>
-          <CardContent className="text-center py-12">
-            <Clock className="w-12 h-12 mx-auto mb-4 text-bambu-gray/30" />
-            <p className="text-bambu-gray">No printers configured</p>
-            <p className="text-sm text-bambu-gray/70 mt-1">
-              Add printers to configure maintenance intervals
-            </p>
-          </CardContent>
-        </Card>
-      )}
-    </div>
-  );
-}
- 
-type TabType = 'status' | 'settings';
- 
-export function MaintenancePage() {
-  const queryClient = useQueryClient();
-  const { showToast } = useToast();
-  const [activeTab, setActiveTab] = useState<TabType>('status');
- 
-  const { data: overview, isLoading } = useQuery({
-    queryKey: ['maintenanceOverview'],
-    queryFn: api.getMaintenanceOverview,
-  });
- 
-  const { data: types } = useQuery({
-    queryKey: ['maintenanceTypes'],
-    queryFn: api.getMaintenanceTypes,
-  });
- 
-  const performMutation = useMutation({
-    mutationFn: ({ id, notes }: { id: number; notes?: string }) =>
-      api.performMaintenance(id, notes),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['maintenanceOverview'] });
-      queryClient.invalidateQueries({ queryKey: ['maintenanceSummary'] });
-      showToast('Maintenance marked as complete');
-    },
-    onError: (error: Error) => {
-      showToast(error.message, 'error');
-    },
-  });
- 
-  const updateMutation = useMutation({
-    mutationFn: ({ id, data }: { id: number; data: { custom_interval_hours?: number | null; custom_interval_type?: 'hours' | 'days' | null; enabled?: boolean } }) =>
-      api.updateMaintenanceItem(id, data),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['maintenanceOverview'] });
-    },
-    onError: (error: Error) => {
-      showToast(error.message, 'error');
-    },
-  });
- 
-  const addTypeMutation = useMutation({
-    mutationFn: api.createMaintenanceType,
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['maintenanceTypes'] });
-      queryClient.invalidateQueries({ queryKey: ['maintenanceOverview'] });
-      showToast('Maintenance type added');
-    },
-    onError: (error: Error) => {
-      showToast(error.message, 'error');
-    },
-  });
- 
-  const updateTypeMutation = useMutation({
-    mutationFn: ({ id, data }: { id: number; data: Partial<{ name: string; default_interval_hours: number; interval_type: 'hours' | 'days'; icon: string }> }) =>
-      api.updateMaintenanceType(id, data),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['maintenanceTypes'] });
-      queryClient.invalidateQueries({ queryKey: ['maintenanceOverview'] });
-      showToast('Maintenance type updated');
-    },
-    onError: (error: Error) => {
-      showToast(error.message, 'error');
-    },
-  });
- 
-  const deleteTypeMutation = useMutation({
-    mutationFn: api.deleteMaintenanceType,
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['maintenanceTypes'] });
-      queryClient.invalidateQueries({ queryKey: ['maintenanceOverview'] });
-      showToast('Maintenance type deleted');
-    },
-    onError: (error: Error) => {
-      showToast(error.message, 'error');
-    },
-  });
- 
-  const setHoursMutation = useMutation({
-    mutationFn: ({ printerId, hours }: { printerId: number; hours: number }) =>
-      api.setPrinterHours(printerId, hours),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['maintenanceOverview'] });
-      queryClient.invalidateQueries({ queryKey: ['maintenanceSummary'] });
-      showToast('Print hours updated');
-    },
-    onError: (error: Error) => {
-      showToast(error.message, 'error');
-    },
-  });
- 
-  const handlePerform = (id: number) => {
-    performMutation.mutate({ id });
-  };
- 
-  const handleToggle = (id: number, enabled: boolean) => {
-    updateMutation.mutate({ id, data: { enabled } });
-  };
- 
-  const handleSetHours = (printerId: number, hours: number) => {
-    setHoursMutation.mutate({ printerId, hours });
-  };
- 
-  if (isLoading) {
-    return (
-      <div className="p-4 md:p-8 flex justify-center">
-        <Loader2 className="w-8 h-8 text-bambu-green animate-spin" />
-      </div>
-    );
-  }
- 
-  const totalDue = overview?.reduce((sum, p) => sum + p.due_count, 0) || 0;
-  const totalWarning = overview?.reduce((sum, p) => sum + p.warning_count, 0) || 0;
- 
-  return (
-    <div className="p-4 md:p-8">
-      {/* Header */}
-      <div className="mb-6">
-        <h1 className="text-2xl font-bold text-white">Maintenance</h1>
-        <p className="text-bambu-gray text-sm mt-1">
-          {activeTab === 'status' ? (
-            <>
-              {totalDue > 0 && <span className="text-red-400">{totalDue} task{totalDue !== 1 ? 's' : ''} overdue</span>}
-              {totalDue > 0 && totalWarning > 0 && ' · '}
-              {totalWarning > 0 && <span className="text-amber-400">{totalWarning} due soon</span>}
-              {totalDue === 0 && totalWarning === 0 && <span className="text-bambu-green">All maintenance up to date</span>}
-            </>
-          ) : (
-            'Configure maintenance types and intervals'
-          )}
-        </p>
-      </div>
- 
-      {/* Tabs */}
-      <div className="flex gap-1 mb-6 border-b border-bambu-dark-tertiary">
-        <button
-          onClick={() => setActiveTab('status')}
-          className={`px-4 py-2 text-sm font-medium border-b-2 -mb-px transition-colors ${
-            activeTab === 'status'
-              ? 'text-bambu-green border-bambu-green'
-              : 'text-bambu-gray border-transparent hover:text-white'
-          }`}
-        >
-          Status
-        </button>
-        <button
-          onClick={() => setActiveTab('settings')}
-          className={`px-4 py-2 text-sm font-medium border-b-2 -mb-px transition-colors ${
-            activeTab === 'settings'
-              ? 'text-bambu-green border-bambu-green'
-              : 'text-bambu-gray border-transparent hover:text-white'
-          }`}
-        >
-          Settings
-        </button>
-      </div>
- 
-      {/* Tab content */}
-      {activeTab === 'status' ? (
-        <div className="space-y-6">
-          {overview && overview.length > 0 ? (
-            [...overview].sort((a, b) => {
-              // Sort printers with issues first
-              const aScore = a.due_count * 10 + a.warning_count;
-              const bScore = b.due_count * 10 + b.warning_count;
-              if (aScore !== bScore) return bScore - aScore;
-              return a.printer_name.localeCompare(b.printer_name);
-            }).map((printerOverview) => (
-              <PrinterSection
-                key={printerOverview.printer_id}
-                overview={printerOverview}
-                onPerform={handlePerform}
-                onToggle={handleToggle}
-                onSetHours={handleSetHours}
-              />
-            ))
-          ) : (
-            <Card>
-              <CardContent className="text-center py-16">
-                <Wrench className="w-16 h-16 mx-auto mb-4 text-bambu-gray/30" />
-                <p className="text-lg font-medium text-white mb-2">No printers configured</p>
-                <p className="text-bambu-gray">Add printers to start tracking maintenance</p>
-              </CardContent>
-            </Card>
-          )}
-        </div>
-      ) : (
-        <SettingsSection
-          overview={overview}
-          types={types || []}
-          onUpdateInterval={(id, data) =>
-            updateMutation.mutate({ id, data })
-          }
-          onAddType={(data) => addTypeMutation.mutate(data)}
-          onUpdateType={(id, data) => updateTypeMutation.mutate({ id, data })}
-          onDeleteType={(id) => deleteTypeMutation.mutate(id)}
-        />
-      )}
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/pages/PrintersPage.tsx.html b/frontend/coverage/src/pages/PrintersPage.tsx.html deleted file mode 100644 index 4f890e970..000000000 --- a/frontend/coverage/src/pages/PrintersPage.tsx.html +++ /dev/null @@ -1,6280 +0,0 @@ - - - - - - Code coverage report for src/pages/PrintersPage.tsx - - - - - - - - - -
-
-

All files / src/pages PrintersPage.tsx

-
- -
- 0% - Statements - 0/1594 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1594 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -425 -426 -427 -428 -429 -430 -431 -432 -433 -434 -435 -436 -437 -438 -439 -440 -441 -442 -443 -444 -445 -446 -447 -448 -449 -450 -451 -452 -453 -454 -455 -456 -457 -458 -459 -460 -461 -462 -463 -464 -465 -466 -467 -468 -469 -470 -471 -472 -473 -474 -475 -476 -477 -478 -479 -480 -481 -482 -483 -484 -485 -486 -487 -488 -489 -490 -491 -492 -493 -494 -495 -496 -497 -498 -499 -500 -501 -502 -503 -504 -505 -506 -507 -508 -509 -510 -511 -512 -513 -514 -515 -516 -517 -518 -519 -520 -521 -522 -523 -524 -525 -526 -527 -528 -529 -530 -531 -532 -533 -534 -535 -536 -537 -538 -539 -540 -541 -542 -543 -544 -545 -546 -547 -548 -549 -550 -551 -552 -553 -554 -555 -556 -557 -558 -559 -560 -561 -562 -563 -564 -565 -566 -567 -568 -569 -570 -571 -572 -573 -574 -575 -576 -577 -578 -579 -580 -581 -582 -583 -584 -585 -586 -587 -588 -589 -590 -591 -592 -593 -594 -595 -596 -597 -598 -599 -600 -601 -602 -603 -604 -605 -606 -607 -608 -609 -610 -611 -612 -613 -614 -615 -616 -617 -618 -619 -620 -621 -622 -623 -624 -625 -626 -627 -628 -629 -630 -631 -632 -633 -634 -635 -636 -637 -638 -639 -640 -641 -642 -643 -644 -645 -646 -647 -648 -649 -650 -651 -652 -653 -654 -655 -656 -657 -658 -659 -660 -661 -662 -663 -664 -665 -666 -667 -668 -669 -670 -671 -672 -673 -674 -675 -676 -677 -678 -679 -680 -681 -682 -683 -684 -685 -686 -687 -688 -689 -690 -691 -692 -693 -694 -695 -696 -697 -698 -699 -700 -701 -702 -703 -704 -705 -706 -707 -708 -709 -710 -711 -712 -713 -714 -715 -716 -717 -718 -719 -720 -721 -722 -723 -724 -725 -726 -727 -728 -729 -730 -731 -732 -733 -734 -735 -736 -737 -738 -739 -740 -741 -742 -743 -744 -745 -746 -747 -748 -749 -750 -751 -752 -753 -754 -755 -756 -757 -758 -759 -760 -761 -762 -763 -764 -765 -766 -767 -768 -769 -770 -771 -772 -773 -774 -775 -776 -777 -778 -779 -780 -781 -782 -783 -784 -785 -786 -787 -788 -789 -790 -791 -792 -793 -794 -795 -796 -797 -798 -799 -800 -801 -802 -803 -804 -805 -806 -807 -808 -809 -810 -811 -812 -813 -814 -815 -816 -817 -818 -819 -820 -821 -822 -823 -824 -825 -826 -827 -828 -829 -830 -831 -832 -833 -834 -835 -836 -837 -838 -839 -840 -841 -842 -843 -844 -845 -846 -847 -848 -849 -850 -851 -852 -853 -854 -855 -856 -857 -858 -859 -860 -861 -862 -863 -864 -865 -866 -867 -868 -869 -870 -871 -872 -873 -874 -875 -876 -877 -878 -879 -880 -881 -882 -883 -884 -885 -886 -887 -888 -889 -890 -891 -892 -893 -894 -895 -896 -897 -898 -899 -900 -901 -902 -903 -904 -905 -906 -907 -908 -909 -910 -911 -912 -913 -914 -915 -916 -917 -918 -919 -920 -921 -922 -923 -924 -925 -926 -927 -928 -929 -930 -931 -932 -933 -934 -935 -936 -937 -938 -939 -940 -941 -942 -943 -944 -945 -946 -947 -948 -949 -950 -951 -952 -953 -954 -955 -956 -957 -958 -959 -960 -961 -962 -963 -964 -965 -966 -967 -968 -969 -970 -971 -972 -973 -974 -975 -976 -977 -978 -979 -980 -981 -982 -983 -984 -985 -986 -987 -988 -989 -990 -991 -992 -993 -994 -995 -996 -997 -998 -999 -1000 -1001 -1002 -1003 -1004 -1005 -1006 -1007 -1008 -1009 -1010 -1011 -1012 -1013 -1014 -1015 -1016 -1017 -1018 -1019 -1020 -1021 -1022 -1023 -1024 -1025 -1026 -1027 -1028 -1029 -1030 -1031 -1032 -1033 -1034 -1035 -1036 -1037 -1038 -1039 -1040 -1041 -1042 -1043 -1044 -1045 -1046 -1047 -1048 -1049 -1050 -1051 -1052 -1053 -1054 -1055 -1056 -1057 -1058 -1059 -1060 -1061 -1062 -1063 -1064 -1065 -1066 -1067 -1068 -1069 -1070 -1071 -1072 -1073 -1074 -1075 -1076 -1077 -1078 -1079 -1080 -1081 -1082 -1083 -1084 -1085 -1086 -1087 -1088 -1089 -1090 -1091 -1092 -1093 -1094 -1095 -1096 -1097 -1098 -1099 -1100 -1101 -1102 -1103 -1104 -1105 -1106 -1107 -1108 -1109 -1110 -1111 -1112 -1113 -1114 -1115 -1116 -1117 -1118 -1119 -1120 -1121 -1122 -1123 -1124 -1125 -1126 -1127 -1128 -1129 -1130 -1131 -1132 -1133 -1134 -1135 -1136 -1137 -1138 -1139 -1140 -1141 -1142 -1143 -1144 -1145 -1146 -1147 -1148 -1149 -1150 -1151 -1152 -1153 -1154 -1155 -1156 -1157 -1158 -1159 -1160 -1161 -1162 -1163 -1164 -1165 -1166 -1167 -1168 -1169 -1170 -1171 -1172 -1173 -1174 -1175 -1176 -1177 -1178 -1179 -1180 -1181 -1182 -1183 -1184 -1185 -1186 -1187 -1188 -1189 -1190 -1191 -1192 -1193 -1194 -1195 -1196 -1197 -1198 -1199 -1200 -1201 -1202 -1203 -1204 -1205 -1206 -1207 -1208 -1209 -1210 -1211 -1212 -1213 -1214 -1215 -1216 -1217 -1218 -1219 -1220 -1221 -1222 -1223 -1224 -1225 -1226 -1227 -1228 -1229 -1230 -1231 -1232 -1233 -1234 -1235 -1236 -1237 -1238 -1239 -1240 -1241 -1242 -1243 -1244 -1245 -1246 -1247 -1248 -1249 -1250 -1251 -1252 -1253 -1254 -1255 -1256 -1257 -1258 -1259 -1260 -1261 -1262 -1263 -1264 -1265 -1266 -1267 -1268 -1269 -1270 -1271 -1272 -1273 -1274 -1275 -1276 -1277 -1278 -1279 -1280 -1281 -1282 -1283 -1284 -1285 -1286 -1287 -1288 -1289 -1290 -1291 -1292 -1293 -1294 -1295 -1296 -1297 -1298 -1299 -1300 -1301 -1302 -1303 -1304 -1305 -1306 -1307 -1308 -1309 -1310 -1311 -1312 -1313 -1314 -1315 -1316 -1317 -1318 -1319 -1320 -1321 -1322 -1323 -1324 -1325 -1326 -1327 -1328 -1329 -1330 -1331 -1332 -1333 -1334 -1335 -1336 -1337 -1338 -1339 -1340 -1341 -1342 -1343 -1344 -1345 -1346 -1347 -1348 -1349 -1350 -1351 -1352 -1353 -1354 -1355 -1356 -1357 -1358 -1359 -1360 -1361 -1362 -1363 -1364 -1365 -1366 -1367 -1368 -1369 -1370 -1371 -1372 -1373 -1374 -1375 -1376 -1377 -1378 -1379 -1380 -1381 -1382 -1383 -1384 -1385 -1386 -1387 -1388 -1389 -1390 -1391 -1392 -1393 -1394 -1395 -1396 -1397 -1398 -1399 -1400 -1401 -1402 -1403 -1404 -1405 -1406 -1407 -1408 -1409 -1410 -1411 -1412 -1413 -1414 -1415 -1416 -1417 -1418 -1419 -1420 -1421 -1422 -1423 -1424 -1425 -1426 -1427 -1428 -1429 -1430 -1431 -1432 -1433 -1434 -1435 -1436 -1437 -1438 -1439 -1440 -1441 -1442 -1443 -1444 -1445 -1446 -1447 -1448 -1449 -1450 -1451 -1452 -1453 -1454 -1455 -1456 -1457 -1458 -1459 -1460 -1461 -1462 -1463 -1464 -1465 -1466 -1467 -1468 -1469 -1470 -1471 -1472 -1473 -1474 -1475 -1476 -1477 -1478 -1479 -1480 -1481 -1482 -1483 -1484 -1485 -1486 -1487 -1488 -1489 -1490 -1491 -1492 -1493 -1494 -1495 -1496 -1497 -1498 -1499 -1500 -1501 -1502 -1503 -1504 -1505 -1506 -1507 -1508 -1509 -1510 -1511 -1512 -1513 -1514 -1515 -1516 -1517 -1518 -1519 -1520 -1521 -1522 -1523 -1524 -1525 -1526 -1527 -1528 -1529 -1530 -1531 -1532 -1533 -1534 -1535 -1536 -1537 -1538 -1539 -1540 -1541 -1542 -1543 -1544 -1545 -1546 -1547 -1548 -1549 -1550 -1551 -1552 -1553 -1554 -1555 -1556 -1557 -1558 -1559 -1560 -1561 -1562 -1563 -1564 -1565 -1566 -1567 -1568 -1569 -1570 -1571 -1572 -1573 -1574 -1575 -1576 -1577 -1578 -1579 -1580 -1581 -1582 -1583 -1584 -1585 -1586 -1587 -1588 -1589 -1590 -1591 -1592 -1593 -1594 -1595 -1596 -1597 -1598 -1599 -1600 -1601 -1602 -1603 -1604 -1605 -1606 -1607 -1608 -1609 -1610 -1611 -1612 -1613 -1614 -1615 -1616 -1617 -1618 -1619 -1620 -1621 -1622 -1623 -1624 -1625 -1626 -1627 -1628 -1629 -1630 -1631 -1632 -1633 -1634 -1635 -1636 -1637 -1638 -1639 -1640 -1641 -1642 -1643 -1644 -1645 -1646 -1647 -1648 -1649 -1650 -1651 -1652 -1653 -1654 -1655 -1656 -1657 -1658 -1659 -1660 -1661 -1662 -1663 -1664 -1665 -1666 -1667 -1668 -1669 -1670 -1671 -1672 -1673 -1674 -1675 -1676 -1677 -1678 -1679 -1680 -1681 -1682 -1683 -1684 -1685 -1686 -1687 -1688 -1689 -1690 -1691 -1692 -1693 -1694 -1695 -1696 -1697 -1698 -1699 -1700 -1701 -1702 -1703 -1704 -1705 -1706 -1707 -1708 -1709 -1710 -1711 -1712 -1713 -1714 -1715 -1716 -1717 -1718 -1719 -1720 -1721 -1722 -1723 -1724 -1725 -1726 -1727 -1728 -1729 -1730 -1731 -1732 -1733 -1734 -1735 -1736 -1737 -1738 -1739 -1740 -1741 -1742 -1743 -1744 -1745 -1746 -1747 -1748 -1749 -1750 -1751 -1752 -1753 -1754 -1755 -1756 -1757 -1758 -1759 -1760 -1761 -1762 -1763 -1764 -1765 -1766 -1767 -1768 -1769 -1770 -1771 -1772 -1773 -1774 -1775 -1776 -1777 -1778 -1779 -1780 -1781 -1782 -1783 -1784 -1785 -1786 -1787 -1788 -1789 -1790 -1791 -1792 -1793 -1794 -1795 -1796 -1797 -1798 -1799 -1800 -1801 -1802 -1803 -1804 -1805 -1806 -1807 -1808 -1809 -1810 -1811 -1812 -1813 -1814 -1815 -1816 -1817 -1818 -1819 -1820 -1821 -1822 -1823 -1824 -1825 -1826 -1827 -1828 -1829 -1830 -1831 -1832 -1833 -1834 -1835 -1836 -1837 -1838 -1839 -1840 -1841 -1842 -1843 -1844 -1845 -1846 -1847 -1848 -1849 -1850 -1851 -1852 -1853 -1854 -1855 -1856 -1857 -1858 -1859 -1860 -1861 -1862 -1863 -1864 -1865 -1866 -1867 -1868 -1869 -1870 -1871 -1872 -1873 -1874 -1875 -1876 -1877 -1878 -1879 -1880 -1881 -1882 -1883 -1884 -1885 -1886 -1887 -1888 -1889 -1890 -1891 -1892 -1893 -1894 -1895 -1896 -1897 -1898 -1899 -1900 -1901 -1902 -1903 -1904 -1905 -1906 -1907 -1908 -1909 -1910 -1911 -1912 -1913 -1914 -1915 -1916 -1917 -1918 -1919 -1920 -1921 -1922 -1923 -1924 -1925 -1926 -1927 -1928 -1929 -1930 -1931 -1932 -1933 -1934 -1935 -1936 -1937 -1938 -1939 -1940 -1941 -1942 -1943 -1944 -1945 -1946 -1947 -1948 -1949 -1950 -1951 -1952 -1953 -1954 -1955 -1956 -1957 -1958 -1959 -1960 -1961 -1962 -1963 -1964 -1965 -1966 -1967 -1968 -1969 -1970 -1971 -1972 -1973 -1974 -1975 -1976 -1977 -1978 -1979 -1980 -1981 -1982 -1983 -1984 -1985 -1986 -1987 -1988 -1989 -1990 -1991 -1992 -1993 -1994 -1995 -1996 -1997 -1998 -1999 -2000 -2001 -2002 -2003 -2004 -2005 -2006 -2007 -2008 -2009 -2010 -2011 -2012 -2013 -2014 -2015 -2016 -2017 -2018 -2019 -2020 -2021 -2022 -2023 -2024 -2025 -2026 -2027 -2028 -2029 -2030 -2031 -2032 -2033 -2034 -2035 -2036 -2037 -2038 -2039 -2040 -2041 -2042 -2043 -2044 -2045 -2046 -2047 -2048 -2049 -2050 -2051 -2052 -2053 -2054 -2055 -2056 -2057 -2058 -2059 -2060 -2061 -2062 -2063 -2064 -2065 -2066  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useEffect, useMemo, useRef } from 'react';
-import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
-import { useTheme } from '../contexts/ThemeContext';
-import {
-  Plus,
-  Link,
-  Unlink,
-  Signal,
-  Thermometer,
-  Clock,
-  MoreVertical,
-  Trash2,
-  RefreshCw,
-  Box,
-  HardDrive,
-  AlertTriangle,
-  Terminal,
-  Power,
-  PowerOff,
-  Zap,
-  Wrench,
-  ChevronDown,
-  Pencil,
-  ArrowUp,
-  ArrowDown,
-  LayoutGrid,
-  LayoutList,
-  Layers,
-  Video,
-} from 'lucide-react';
-import { useNavigate } from 'react-router-dom';
-import { api } from '../api/client';
-import type { Printer, PrinterCreate, AMSUnit } from '../api/client';
-import { Card, CardContent } from '../components/Card';
-import { Button } from '../components/Button';
-import { ConfirmModal } from '../components/ConfirmModal';
-import { FileManagerModal } from '../components/FileManagerModal';
-import { MQTTDebugModal } from '../components/MQTTDebugModal';
-import { HMSErrorModal } from '../components/HMSErrorModal';
-import { PrinterQueueWidget } from '../components/PrinterQueueWidget';
-import { AMSHistoryModal } from '../components/AMSHistoryModal';
- 
-// Nozzle side indicators (Bambu Lab style - square badge with L/R)
-function NozzleBadge({ side }: { side: 'L' | 'R' }) {
-  const { theme } = useTheme();
-  // Light theme: #e7f5e9 (light green), Dark theme: #1a4d2e (dark green)
-  const bgColor = theme === 'dark' ? '#1a4d2e' : '#e7f5e9';
-  return (
-    <span
-      className="inline-flex items-center justify-center w-4 h-4 text-[10px] font-bold rounded"
-      style={{ backgroundColor: bgColor, color: '#00ae42' }}
-    >
-      {side}
-    </span>
-  );
-}
- 
-// AMS 4-tray device icon with fillable colored spool slots (Bambu Studio style)
-interface AMS4TrayIconProps {
-  colors: (string | null)[]; // Array of 4 colors (hex) or null for empty
-  className?: string;
-}
- 
-function AMS4TrayIcon({ colors, className }: AMS4TrayIconProps) {
-  // Spool positions: x start, centered at 12.5, 21.5, 30.5, 39.5
-  // Each spool slot is 6 units wide (from 9.5-15.5, 18.5-24.5, etc.)
-  const spoolSlots = [
-    { x: 9.5, cx: 12.5 },
-    { x: 18.5, cx: 21.5 },
-    { x: 27.5, cx: 30.5 },
-    { x: 36.5, cx: 39.5 },
-  ];
- 
-  return (
-    <svg className={className} width="56" height="34" viewBox="0 0 52 32" fill="none" xmlns="http://www.w3.org/2000/svg">
-      {/* Outer casing with window */}
-      <path
-        fillRule="evenodd"
-        clipRule="evenodd"
-        d="M4 0C1.79086 0 0 1.79086 0 4V28C0 30.2091 1.79086 32 4 32H48C50.2091 32 52 30.2091 52 28V4C52 1.79086 50.2091 0 48 0H4ZM44 8H8V24H44V8Z"
-        fill="#2F2E33"
-      />
-      {/* Spool color fills - rectangles that fill the visible window area */}
-      {spoolSlots.map((slot, i) => (
-        colors[i] ? (
-          <rect key={i} x={slot.x} y="8" width="6" height="16" fill={colors[i]!} />
-        ) : (
-          <g key={i}>
-            <rect x={slot.x} y="8" width="6" height="16" fill="#ffffff" />
-            <line x1={slot.x} y1="8" x2={slot.x + 6} y2="24" stroke="#555555" strokeWidth="1.5" />
-          </g>
-        )
-      ))}
-      {/* Bottom half overlay (spool holders - creates rounded bottom edges) */}
-      <path
-        fillRule="evenodd"
-        clipRule="evenodd"
-        d="M36.5 16H33.5V18.2617C33.5 19.9186 32.1569 21.2617 30.5 21.2617C28.8431 21.2617 27.5 19.9186 27.5 18.2617V16H24.5V18.2617C24.5 19.9186 23.1569 21.2617 21.5 21.2617C19.8431 21.2617 18.5 19.9186 18.5 18.2617V16H15.5V18.2617C15.5 19.9186 14.1569 21.2617 12.5 21.2617C10.8432 21.2617 9.5 19.9186 9.5 18.2617V16H4V28H48V16H42.5V18.2617C42.5 19.9186 41.1569 21.2617 39.5 21.2617C37.8431 21.2617 36.5 19.9186 36.5 18.2617V16Z"
-        fill="#767676"
-      />
-      {/* Top half overlay (spool tops - creates rounded top edges) */}
-      <path
-        fillRule="evenodd"
-        clipRule="evenodd"
-        d="M6 9.18382C6 6.32088 8.32088 4 11.1838 4H40.8162C43.6791 4 46 6.32088 46 9.18382V16H42.5V12.2617C42.5 10.6049 41.1569 9.26172 39.5 9.26172C37.8431 9.26172 36.5 10.6049 36.5 12.2617V16H33.5V12.2617C33.5 10.6049 32.1569 9.26172 30.5 9.26172C28.8431 9.26172 27.5 10.6049 27.5 12.2617V16H24.5V12.2617C24.5 10.6049 23.1569 9.26172 21.5 9.26172C19.8431 9.26172 18.5 10.6049 18.5 12.2617V16H15.5V12.2617C15.5 10.6049 14.1569 9.26172 12.5 9.26172C10.8432 9.26172 9.5 10.6049 9.5 12.2617V16H6V9.18382Z"
-        fill="#BFBFBF"
-      />
-    </svg>
-  );
-}
- 
-// AMS 1-tray device icon (AMS-HT) with fillable colored slot (Bambu Studio style)
-interface AMS1TrayIconProps {
-  color: string | null; // Hex color or null for empty
-  className?: string;
-}
- 
-function AMS1TrayIcon({ color, className }: AMS1TrayIconProps) {
-  return (
-    <svg className={className} width="56" height="56" viewBox="0 0 21 21" fill="none" xmlns="http://www.w3.org/2000/svg">
-      {/* Filament color fill */}
-      {color ? (
-        <rect x="8.3" y="5.2" width="3.8" height="5.1" fill={color} rx="0.3"/>
-      ) : (
-        <g>
-          <rect x="8.3" y="5.2" width="3.8" height="5.1" fill="#ffffff" rx="0.3"/>
-          <line x1="8.3" y1="5.2" x2="12.1" y2="10.3" stroke="#555555" strokeWidth="0.8" />
-        </g>
-      )}
-      {/* Device outline - top housing */}
-      <path d="M5.88312 4.68555C5.88312 4.13326 6.33083 3.68555 6.88312 3.68555H13.5059C14.0582 3.68555 14.5059 4.13326 14.5059 4.68555V10.3887H5.88312V4.68555Z" stroke="#6B6B6B"/>
-      {/* Bottom base */}
-      <rect x="3.8725" y="10.3887" width="12.7037" height="7.55371" rx="1.2" stroke="#6B6B6B"/>
-      {/* Inner tray outline */}
-      <path d="M8.21991 5.65234C8.21991 5.3762 8.44377 5.15234 8.71991 5.15234H11.7288C12.005 5.15234 12.2288 5.3762 12.2288 5.65234V10.3887H8.21991V5.65234Z" stroke="#6B6B6B"/>
-    </svg>
-  );
-}
- 
-// Water drop SVG - empty outline (Bambu Lab style from bambu-humidity)
-function WaterDropEmpty({ className }: { className?: string }) {
-  return (
-    <svg className={className} viewBox="0 0 36 54" fill="none" xmlns="http://www.w3.org/2000/svg">
-      <path d="M17.8131 0.00538C18.4463 -0.15091 20.3648 3.14642 20.8264 3.84781C25.4187 10.816 35.3089 26.9368 35.9383 34.8694C37.4182 53.5822 11.882 61.3357 2.53721 45.3789C-1.73471 38.0791 0.016 32.2049 3.178 25.0232C6.99221 16.3662 12.6411 7.90372 17.8131 0.00538ZM18.3738 7.24807L17.5881 7.48441C14.4452 12.9431 10.917 18.2341 8.19369 23.9368C4.6808 31.29 1.18317 38.5479 7.69403 45.5657C17.3058 55.9228 34.9847 46.8808 31.4604 32.8681C29.2558 24.0969 22.4207 15.2913 18.3776 7.24807H18.3738Z" fill="#C3C2C1"/>
-    </svg>
-  );
-}
- 
-// Water drop SVG - half filled with blue water (Bambu Lab style from bambu-humidity)
-function WaterDropHalf({ className }: { className?: string }) {
-  return (
-    <svg className={className} viewBox="0 0 35 53" fill="none" xmlns="http://www.w3.org/2000/svg">
-      <path d="M17.3165 0.0038C17.932 -0.14959 19.7971 3.08645 20.2458 3.77481C24.7103 10.6135 34.3251 26.4346 34.937 34.2198C36.3757 52.5848 11.5505 60.1942 2.46584 44.534C-1.68714 37.3735 0.0148 31.6085 3.08879 24.5603C6.79681 16.0605 12.2884 7.75907 17.3165 0.0038ZM17.8615 7.11561L17.0977 7.34755C14.0423 12.7048 10.6124 17.8974 7.96483 23.4941C4.54975 30.7107 1.14949 37.8337 7.47908 44.721C16.8233 54.8856 34.01 46.0117 30.5838 32.2595C28.4405 23.6512 21.7957 15.0093 17.8652 7.11561H17.8615Z" fill="#C3C2C1"/>
-      <path d="M5.03547 30.112C9.64453 30.4936 11.632 35.7985 16.4154 35.791C19.6339 35.7873 20.2161 33.2283 22.3853 31.6197C31.6776 24.7286 33.5835 37.4894 27.9881 44.4254C18.1878 56.5653 -1.16063 44.6013 5.03917 30.1158L5.03547 30.112Z" fill="#1F8FEB"/>
-    </svg>
-  );
-}
- 
-// Water drop SVG - fully filled with blue water (Bambu Lab style from bambu-humidity)
-function WaterDropFull({ className }: { className?: string }) {
-  return (
-    <svg className={className} viewBox="0 0 36 54" fill="none" xmlns="http://www.w3.org/2000/svg">
-      <path d="M17.9625 4.48059L4.77216 26.3154L2.08228 40.2175L10.0224 50.8414H23.1594L33.3246 42.1693V30.2455L17.9625 4.48059Z" fill="#1F8FEB"/>
-      <path d="M17.7948 0.00538C18.4273 -0.15091 20.3438 3.14642 20.8048 3.84781C25.3921 10.816 35.2715 26.9368 35.9001 34.8694C37.3784 53.5822 11.8702 61.3357 2.53562 45.3789C-1.73163 38.0829 0.0134 32.2087 3.1757 25.027C6.98574 16.3662 12.6284 7.90372 17.7948 0.00538ZM18.3549 7.24807L17.57 7.48441C14.4306 12.9431 10.9063 18.2341 8.1859 23.9368C4.67686 31.29 1.18305 38.5479 7.68679 45.5657C17.2881 55.9228 34.9476 46.8808 31.4271 32.8681C29.2249 24.0969 22.3974 15.2913 18.3587 7.24807H18.3549Z" fill="#C3C2C1"/>
-    </svg>
-  );
-}
- 
-// Thermometer SVG - empty outline
-function ThermometerEmpty({ className }: { className?: string }) {
-  return (
-    <svg className={className} viewBox="0 0 12 20" fill="none" xmlns="http://www.w3.org/2000/svg">
-      <path d="M6 0.5C4.6 0.5 3.5 1.6 3.5 3V12.1C2.6 12.8 2 13.9 2 15C2 17.2 3.8 19 6 19C8.2 19 10 17.2 10 15C10 13.9 9.4 12.8 8.5 12.1V3C8.5 1.6 7.4 0.5 6 0.5Z" stroke="#C3C2C1" strokeWidth="1" fill="none"/>
-      <circle cx="6" cy="15" r="2.5" stroke="#C3C2C1" strokeWidth="1" fill="none"/>
-    </svg>
-  );
-}
- 
-// Thermometer SVG - half filled (gold - same as humidity fair)
-function ThermometerHalf({ className }: { className?: string }) {
-  return (
-    <svg className={className} viewBox="0 0 12 20" fill="none" xmlns="http://www.w3.org/2000/svg">
-      <rect x="4.5" y="8" width="3" height="4.5" fill="#d4a017" rx="0.5"/>
-      <circle cx="6" cy="15" r="2" fill="#d4a017"/>
-      <path d="M6 0.5C4.6 0.5 3.5 1.6 3.5 3V12.1C2.6 12.8 2 13.9 2 15C2 17.2 3.8 19 6 19C8.2 19 10 17.2 10 15C10 13.9 9.4 12.8 8.5 12.1V3C8.5 1.6 7.4 0.5 6 0.5Z" stroke="#C3C2C1" strokeWidth="1" fill="none"/>
-    </svg>
-  );
-}
- 
-// Thermometer SVG - fully filled (red - same as humidity bad)
-function ThermometerFull({ className }: { className?: string }) {
-  return (
-    <svg className={className} viewBox="0 0 12 20" fill="none" xmlns="http://www.w3.org/2000/svg">
-      <rect x="4.5" y="3" width="3" height="9.5" fill="#c62828" rx="0.5"/>
-      <circle cx="6" cy="15" r="2" fill="#c62828"/>
-      <path d="M6 0.5C4.6 0.5 3.5 1.6 3.5 3V12.1C2.6 12.8 2 13.9 2 15C2 17.2 3.8 19 6 19C8.2 19 10 17.2 10 15C10 13.9 9.4 12.8 8.5 12.1V3C8.5 1.6 7.4 0.5 6 0.5Z" stroke="#C3C2C1" strokeWidth="1" fill="none"/>
-    </svg>
-  );
-}
- 
-// Humidity indicator with water drop that fills based on level (Bambu Lab style)
-// Reference: https://github.com/theicedmango/bambu-humidity
-interface HumidityIndicatorProps {
-  humidity: number | string;
-  goodThreshold?: number;  // <= this is green
-  fairThreshold?: number;  // <= this is orange, > is red
-  onClick?: () => void;
-}
- 
-function HumidityIndicator({ humidity, goodThreshold = 40, fairThreshold = 60, onClick }: HumidityIndicatorProps) {
-  const humidityValue = typeof humidity === 'string' ? parseInt(humidity, 10) : humidity;
-  const good = typeof goodThreshold === 'number' ? goodThreshold : 40;
-  const fair = typeof fairThreshold === 'number' ? fairThreshold : 60;
- 
-  // Status thresholds (configurable via settings)
-  // Good: ≤goodThreshold (green #22a352), Fair: ≤fairThreshold (gold #d4a017), Bad: >fairThreshold (red #c62828)
-  let textColor: string;
-  let statusText: string;
- 
-  if (isNaN(humidityValue)) {
-    textColor = '#C3C2C1';
-    statusText = 'Unknown';
-  } else if (humidityValue <= good) {
-    textColor = '#22a352'; // Green - Good
-    statusText = 'Good';
-  } else if (humidityValue <= fair) {
-    textColor = '#d4a017'; // Gold - Fair
-    statusText = 'Fair';
-  } else {
-    textColor = '#c62828'; // Red - Bad
-    statusText = 'Bad';
-  }
- 
-  // Fill level based on status: Good=Empty (dry), Fair=Half, Bad=Full (wet)
-  let DropComponent: React.FC<{ className?: string }>;
-  if (isNaN(humidityValue)) {
-    DropComponent = WaterDropEmpty;
-  } else if (humidityValue <= good) {
-    DropComponent = WaterDropEmpty; // Good - empty drop (dry)
-  } else if (humidityValue <= fair) {
-    DropComponent = WaterDropHalf; // Fair - half filled
-  } else {
-    DropComponent = WaterDropFull; // Bad - full (too humid)
-  }
- 
-  return (
-    <button
-      type="button"
-      onClick={onClick}
-      className={`flex items-center justify-end gap-1 ${onClick ? 'cursor-pointer hover:opacity-80 transition-opacity' : ''}`}
-      title={`Humidity: ${humidityValue}% - ${statusText}${onClick ? ' (click for history)' : ''}`}
-    >
-      <DropComponent className="w-3 h-4" />
-      <span className="text-xs font-medium tabular-nums w-8 text-right" style={{ color: textColor }}>{humidityValue}%</span>
-    </button>
-  );
-}
- 
-// Temperature indicator with dynamic icon and coloring
-interface TemperatureIndicatorProps {
-  temp: number;
-  goodThreshold?: number;  // <= this is blue
-  fairThreshold?: number;  // <= this is orange, > is red
-  onClick?: () => void;
-}
- 
-function TemperatureIndicator({ temp, goodThreshold = 28, fairThreshold = 35, onClick }: TemperatureIndicatorProps) {
-  // Ensure thresholds are numbers
-  const good = typeof goodThreshold === 'number' ? goodThreshold : 28;
-  const fair = typeof fairThreshold === 'number' ? fairThreshold : 35;
- 
-  let textColor: string;
-  let statusText: string;
-  let ThermoComponent: React.FC<{ className?: string }>;
- 
-  if (temp <= good) {
-    textColor = '#22a352'; // Green - good (same as humidity)
-    statusText = 'Good';
-    ThermoComponent = ThermometerEmpty;
-  } else if (temp <= fair) {
-    textColor = '#d4a017'; // Gold - fair (same as humidity)
-    statusText = 'Fair';
-    ThermoComponent = ThermometerHalf;
-  } else {
-    textColor = '#c62828'; // Red - bad (same as humidity)
-    statusText = 'Bad';
-    ThermoComponent = ThermometerFull;
-  }
- 
-  return (
-    <button
-      type="button"
-      onClick={onClick}
-      className={`flex items-center gap-1 ${onClick ? 'cursor-pointer hover:opacity-80 transition-opacity' : ''}`}
-      title={`Temperature: ${temp}°C - ${statusText}${onClick ? ' (click for history)' : ''}`}
-    >
-      <ThermoComponent className="w-3 h-4" />
-      <span className="tabular-nums w-12 text-right" style={{ color: textColor }}>{temp}°C</span>
-    </button>
-  );
-}
- 
-// Get AMS label: AMS-A/B/C/D for regular AMS, HT-A/B for AMS-HT (single spool)
-// Always use tray count as the source of truth (1 tray = AMS-HT, 4 trays = regular AMS)
-// AMS-HT uses IDs 128+ while regular AMS uses 0-3
-function getAmsLabel(amsId: number | string, trayCount: number): string {
-  // Ensure amsId is a number (backend might send string)
-  const id = typeof amsId === 'string' ? parseInt(amsId, 10) : amsId;
-  const safeId = isNaN(id) ? 0 : id;
-  const isHt = trayCount === 1;
-  // AMS-HT uses IDs starting at 128, regular AMS uses 0-3
-  const normalizedId = safeId >= 128 ? safeId - 128 : safeId;
-  const letter = String.fromCharCode(65 + normalizedId); // 0=A, 1=B, 2=C, 3=D
-  return isHt ? `HT-${letter}` : `AMS-${letter}`;
-}
- 
-function formatTime(seconds: number): string {
-  const hours = Math.floor(seconds / 3600);
-  const minutes = Math.floor((seconds % 3600) / 60);
-  return hours > 0 ? `${hours}h ${minutes}m` : `${minutes}m`;
-}
- 
-function formatETA(remainingMinutes: number): string {
-  const now = new Date();
-  const eta = new Date(now.getTime() + remainingMinutes * 60 * 1000);
-  const today = new Date();
-  today.setHours(0, 0, 0, 0);
-  const etaDay = new Date(eta);
-  etaDay.setHours(0, 0, 0, 0);
- 
-  const timeStr = eta.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
- 
-  // Check if it's tomorrow or later
-  const dayDiff = Math.floor((etaDay.getTime() - today.getTime()) / (1000 * 60 * 60 * 24));
-  if (dayDiff === 0) {
-    return timeStr;
-  } else if (dayDiff === 1) {
-    return `Tomorrow ${timeStr}`;
-  } else {
-    return eta.toLocaleDateString([], { weekday: 'short' }) + ' ' + timeStr;
-  }
-}
- 
-function getPrinterImage(model: string | null | undefined): string {
-  if (!model) return '/img/printers/default.png';
- 
-  const modelLower = model.toLowerCase().replace(/\s+/g, '');
- 
-  // Map model names to image files
-  if (modelLower.includes('x1e')) return '/img/printers/x1e.png';
-  if (modelLower.includes('x1c') || modelLower.includes('x1carbon')) return '/img/printers/x1c.png';
-  if (modelLower.includes('x1')) return '/img/printers/x1c.png';
-  if (modelLower.includes('h2d')) return '/img/printers/h2d.png';
-  if (modelLower.includes('h2c') || modelLower.includes('h2s')) return '/img/printers/h2d.png';
-  if (modelLower.includes('p2s')) return '/img/printers/p1s.png';
-  if (modelLower.includes('p1s')) return '/img/printers/p1s.png';
-  if (modelLower.includes('p1p')) return '/img/printers/p1p.png';
-  if (modelLower.includes('a1mini')) return '/img/printers/a1mini.png';
-  if (modelLower.includes('a1')) return '/img/printers/a1.png';
- 
-  return '/img/printers/default.png';
-}
- 
-function getWifiStrength(rssi: number | null | undefined): { label: string; color: string; bars: number } {
-  if (rssi == null) return { label: '', color: 'text-bambu-gray', bars: 0 };
-  if (rssi >= -50) return { label: 'Excellent', color: 'text-bambu-green', bars: 4 };
-  if (rssi >= -60) return { label: 'Good', color: 'text-bambu-green', bars: 3 };
-  if (rssi >= -70) return { label: 'Fair', color: 'text-yellow-400', bars: 2 };
-  if (rssi >= -80) return { label: 'Weak', color: 'text-orange-400', bars: 1 };
-  return { label: 'Very weak', color: 'text-red-400', bars: 1 };
-}
- 
-function CoverImage({ url, printName }: { url: string | null; printName?: string }) {
-  const [loaded, setLoaded] = useState(false);
-  const [error, setError] = useState(false);
-  const [showOverlay, setShowOverlay] = useState(false);
- 
-  return (
-    <>
-      <div
-        className={`w-20 h-20 flex-shrink-0 rounded-lg overflow-hidden bg-bambu-dark-tertiary flex items-center justify-center ${url && loaded ? 'cursor-pointer' : ''}`}
-        onClick={() => url && loaded && setShowOverlay(true)}
-      >
-        {url && !error ? (
-          <>
-            <img
-              src={url}
-              alt="Print preview"
-              className={`w-full h-full object-cover ${loaded ? 'block' : 'hidden'}`}
-              onLoad={() => setLoaded(true)}
-              onError={() => setError(true)}
-            />
-            {!loaded && <Box className="w-8 h-8 text-bambu-gray" />}
-          </>
-        ) : (
-          <Box className="w-8 h-8 text-bambu-gray" />
-        )}
-      </div>
- 
-      {/* Cover Image Overlay */}
-      {showOverlay && url && (
-        <div
-          className="fixed inset-0 bg-black/80 flex items-center justify-center z-50 p-8"
-          onClick={() => setShowOverlay(false)}
-        >
-          <div className="relative max-w-2xl max-h-full">
-            <img
-              src={url}
-              alt="Print preview"
-              className="max-w-full max-h-[80vh] rounded-lg shadow-2xl"
-            />
-            {printName && (
-              <p className="text-white text-center mt-4 text-lg">{printName}</p>
-            )}
-          </div>
-        </div>
-      )}
-    </>
-  );
-}
- 
-interface PrinterMaintenanceInfo {
-  due_count: number;
-  warning_count: number;
-  total_print_hours: number;
-}
- 
-// Status summary bar component - uses queryClient to read cached statuses
-function StatusSummaryBar({ printers }: { printers: Printer[] | undefined }) {
-  const queryClient = useQueryClient();
- 
-  const counts = useMemo(() => {
-    let printing = 0;
-    let idle = 0;
-    let offline = 0;
-    let loading = 0;
- 
-    printers?.forEach((printer) => {
-      const status = queryClient.getQueryData<{ connected: boolean; state: string | null }>(['printerStatus', printer.id]);
-      if (status === undefined) {
-        // Status not yet loaded - don't count as offline yet
-        loading++;
-      } else if (!status.connected) {
-        offline++;
-      } else if (status.state === 'RUNNING') {
-        printing++;
-      } else {
-        idle++;
-      }
-    });
- 
-    return { printing, idle, offline, loading, total: (printers?.length || 0) };
-  }, [printers, queryClient]);
- 
-  // Subscribe to query cache changes to re-render when status updates
-  const [, setTick] = useState(0);
-  useEffect(() => {
-    const unsubscribe = queryClient.getQueryCache().subscribe(() => {
-      setTick(t => t + 1);
-    });
-    return () => unsubscribe();
-  }, [queryClient]);
- 
-  if (!printers?.length) return null;
- 
-  return (
-    <div className="flex items-center gap-4 text-sm">
-      {counts.printing > 0 && (
-        <div className="flex items-center gap-1.5">
-          <div className="w-2 h-2 rounded-full bg-bambu-green animate-pulse" />
-          <span className="text-bambu-gray">
-            <span className="text-white font-medium">{counts.printing}</span> printing
-          </span>
-        </div>
-      )}
-      {counts.idle > 0 && (
-        <div className="flex items-center gap-1.5">
-          <div className="w-2 h-2 rounded-full bg-blue-400" />
-          <span className="text-bambu-gray">
-            <span className="text-white font-medium">{counts.idle}</span> idle
-          </span>
-        </div>
-      )}
-      {counts.offline > 0 && (
-        <div className="flex items-center gap-1.5">
-          <div className="w-2 h-2 rounded-full bg-gray-400" />
-          <span className="text-bambu-gray">
-            <span className="text-white font-medium">{counts.offline}</span> offline
-          </span>
-        </div>
-      )}
-    </div>
-  );
-}
- 
-type SortOption = 'name' | 'status' | 'model' | 'location';
-type ViewMode = 'expanded' | 'compact';
- 
-function PrinterCard({
-  printer,
-  hideIfDisconnected,
-  maintenanceInfo,
-  viewMode = 'expanded',
-  amsThresholds,
-}: {
-  printer: Printer;
-  hideIfDisconnected?: boolean;
-  maintenanceInfo?: PrinterMaintenanceInfo;
-  viewMode?: ViewMode;
-  amsThresholds?: {
-    humidityGood: number;
-    humidityFair: number;
-    tempGood: number;
-    tempFair: number;
-  };
-}) {
-  const queryClient = useQueryClient();
-  const navigate = useNavigate();
-  const [showMenu, setShowMenu] = useState(false);
-  const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);
-  const [showEditModal, setShowEditModal] = useState(false);
-  const [showFileManager, setShowFileManager] = useState(false);
-  const [showMQTTDebug, setShowMQTTDebug] = useState(false);
-  const [showPowerOnConfirm, setShowPowerOnConfirm] = useState(false);
-  const [showPowerOffConfirm, setShowPowerOffConfirm] = useState(false);
-  const [showHMSModal, setShowHMSModal] = useState(false);
-  const [amsHistoryModal, setAmsHistoryModal] = useState<{
-    amsId: number;
-    amsLabel: string;
-    mode: 'humidity' | 'temperature';
-  } | null>(null);
- 
-  const { data: status } = useQuery({
-    queryKey: ['printerStatus', printer.id],
-    queryFn: () => api.getPrinterStatus(printer.id),
-    refetchInterval: 30000, // Fallback polling, WebSocket handles real-time
-  });
- 
-  // Cache WiFi signal to prevent it disappearing on updates
-  const [cachedWifiSignal, setCachedWifiSignal] = useState<number | null>(null);
-  useEffect(() => {
-    if (status?.wifi_signal != null) {
-      setCachedWifiSignal(status.wifi_signal);
-    }
-  }, [status?.wifi_signal]);
-  const wifiSignal = status?.wifi_signal ?? cachedWifiSignal;
- 
-  // Cache ams_extruder_map to prevent L/R indicators bouncing on updates
-  const cachedAmsExtruderMap = useRef<Record<string, number>>({});
-  useEffect(() => {
-    if (status?.ams_extruder_map && Object.keys(status.ams_extruder_map).length > 0) {
-      cachedAmsExtruderMap.current = status.ams_extruder_map;
-    }
-  }, [status?.ams_extruder_map]);
-  const amsExtruderMap = (status?.ams_extruder_map && Object.keys(status.ams_extruder_map).length > 0)
-    ? status.ams_extruder_map
-    : cachedAmsExtruderMap.current;
- 
-  // Cache AMS data to prevent it disappearing on idle/offline printers
-  const cachedAmsData = useRef<AMSUnit[]>([]);
-  useEffect(() => {
-    if (status?.ams && status.ams.length > 0) {
-      cachedAmsData.current = status.ams;
-    }
-  }, [status?.ams]);
-  const amsData = (status?.ams && status.ams.length > 0) ? status.ams : cachedAmsData.current;
- 
-  // Fetch smart plug for this printer
-  const { data: smartPlug } = useQuery({
-    queryKey: ['smartPlugByPrinter', printer.id],
-    queryFn: () => api.getSmartPlugByPrinter(printer.id),
-  });
- 
-  // Fetch smart plug status if plug exists (faster refresh for energy monitoring)
-  const { data: plugStatus } = useQuery({
-    queryKey: ['smartPlugStatus', smartPlug?.id],
-    queryFn: () => smartPlug ? api.getSmartPlugStatus(smartPlug.id) : null,
-    enabled: !!smartPlug,
-    refetchInterval: 10000, // 10 seconds for real-time power display
-  });
- 
-  // Fetch queue count for this printer
-  const { data: queueItems } = useQuery({
-    queryKey: ['queue', printer.id, 'pending'],
-    queryFn: () => api.getQueue(printer.id, 'pending'),
-  });
-  const queueCount = queueItems?.length || 0;
- 
-  // Fetch last completed print for this printer
-  const { data: lastPrints } = useQuery({
-    queryKey: ['archives', printer.id, 'last'],
-    queryFn: () => api.getArchives(printer.id, 1, 0),
-    enabled: status?.connected && status?.state !== 'RUNNING',
-  });
-  const lastPrint = lastPrints?.[0];
- 
-  // Determine if this card should be hidden
-  const shouldHide = hideIfDisconnected && status && !status.connected;
- 
-  const deleteMutation = useMutation({
-    mutationFn: () => api.deletePrinter(printer.id),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['printers'] });
-    },
-  });
- 
-  const connectMutation = useMutation({
-    mutationFn: () => api.connectPrinter(printer.id),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['printerStatus', printer.id] });
-    },
-  });
- 
-  // Smart plug control mutations
-  const powerControlMutation = useMutation({
-    mutationFn: (action: 'on' | 'off') =>
-      smartPlug ? api.controlSmartPlug(smartPlug.id, action) : Promise.reject('No plug'),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['smartPlugStatus', smartPlug?.id] });
-    },
-  });
- 
-  const toggleAutoOffMutation = useMutation({
-    mutationFn: (enabled: boolean) =>
-      smartPlug ? api.updateSmartPlug(smartPlug.id, { auto_off: enabled }) : Promise.reject('No plug'),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['smartPlugByPrinter', printer.id] });
-      // Also invalidate the smart-plugs list to keep Settings page in sync
-      queryClient.invalidateQueries({ queryKey: ['smart-plugs'] });
-    },
-  });
- 
-  if (shouldHide) {
-    return null;
-  }
- 
-  return (
-    <Card className="relative">
-      <CardContent>
-        {/* Header */}
-        <div className={viewMode === 'compact' ? 'mb-2' : 'mb-4'}>
-          {/* Top row: Image, Name, Menu */}
-          <div className="flex items-start justify-between gap-2">
-            <div className="flex items-center gap-3 min-w-0 flex-1">
-              {/* Printer Model Image */}
-              <img
-                src={getPrinterImage(printer.model)}
-                alt={printer.model || 'Printer'}
-                className={`object-contain rounded-lg bg-bambu-dark flex-shrink-0 ${viewMode === 'compact' ? 'w-10 h-10' : 'w-14 h-14'}`}
-              />
-              <div className="min-w-0 flex-1">
-                <div className="flex items-center gap-2">
-                  <h3 className={`font-semibold text-white ${viewMode === 'compact' ? 'text-base truncate' : 'text-lg'}`}>{printer.name}</h3>
-                  {/* Connection indicator dot for compact mode */}
-                  {viewMode === 'compact' && (
-                    <div
-                      className={`w-2 h-2 rounded-full flex-shrink-0 ${
-                        status?.connected ? 'bg-bambu-green' : 'bg-red-500'
-                      }`}
-                      title={status?.connected ? 'Connected' : 'Offline'}
-                    />
-                  )}
-                </div>
-                <p className="text-sm text-bambu-gray">
-                  {printer.model || 'Unknown Model'}
-                  {/* Nozzle Info - only in expanded */}
-                  {viewMode === 'expanded' && status?.nozzles && status.nozzles[0]?.nozzle_diameter && (
-                    <span className="ml-1.5 text-bambu-gray" title={status.nozzles[0].nozzle_type || 'Nozzle'}>
-                      • {status.nozzles[0].nozzle_diameter}mm
-                    </span>
-                  )}
-                  {viewMode === 'expanded' && maintenanceInfo && maintenanceInfo.total_print_hours > 0 && (
-                    <span className="ml-2 text-bambu-gray">
-                      <Clock className="w-3 h-3 inline-block mr-1" />
-                      {Math.round(maintenanceInfo.total_print_hours)}h
-                    </span>
-                  )}
-                </p>
-              </div>
-            </div>
-            {/* Menu button */}
-            <div className="relative flex-shrink-0">
-              <Button
-                variant="ghost"
-                size="sm"
-                onClick={() => setShowMenu(!showMenu)}
-              >
-                <MoreVertical className="w-4 h-4" />
-              </Button>
-              {showMenu && (
-                <div className="absolute right-0 mt-2 w-48 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg shadow-lg z-10">
-                  <button
-                    className="w-full px-4 py-2 text-left text-sm hover:bg-bambu-dark-tertiary flex items-center gap-2"
-                    onClick={() => {
-                      setShowEditModal(true);
-                      setShowMenu(false);
-                    }}
-                  >
-                    <Pencil className="w-4 h-4" />
-                    Edit
-                  </button>
-                  <button
-                    className="w-full px-4 py-2 text-left text-sm hover:bg-bambu-dark-tertiary flex items-center gap-2"
-                    onClick={() => {
-                      connectMutation.mutate();
-                      setShowMenu(false);
-                    }}
-                  >
-                    <RefreshCw className="w-4 h-4" />
-                    Reconnect
-                  </button>
-                  <button
-                    className="w-full px-4 py-2 text-left text-sm hover:bg-bambu-dark-tertiary flex items-center gap-2"
-                    onClick={() => {
-                      setShowMQTTDebug(true);
-                      setShowMenu(false);
-                    }}
-                  >
-                    <Terminal className="w-4 h-4" />
-                    MQTT Debug
-                  </button>
-                  <button
-                    className="w-full px-4 py-2 text-left text-sm text-red-400 hover:bg-bambu-dark-tertiary flex items-center gap-2"
-                    onClick={() => {
-                      setShowDeleteConfirm(true);
-                      setShowMenu(false);
-                    }}
-                  >
-                    <Trash2 className="w-4 h-4" />
-                    Delete
-                  </button>
-                </div>
-              )}
-            </div>
-          </div>
- 
-          {/* Badges row - only in expanded mode */}
-          {viewMode === 'expanded' && (
-            <div className="flex flex-wrap items-center gap-2 mt-2">
-              {/* Connection status badge */}
-              <span
-                className={`flex items-center gap-1.5 px-2 py-1 rounded-full text-xs ${
-                  status?.connected
-                    ? 'bg-bambu-green/20 text-bambu-green'
-                    : 'bg-red-500/20 text-red-400'
-                }`}
-              >
-                {status?.connected ? (
-                  <Link className="w-3 h-3" />
-                ) : (
-                  <Unlink className="w-3 h-3" />
-                )}
-                {status?.connected ? 'Connected' : 'Offline'}
-              </span>
-              {/* WiFi signal strength indicator */}
-              {status?.connected && wifiSignal != null && (
-                <span
-                  className={`flex items-center gap-1 px-2 py-1 rounded-full text-xs ${
-                    wifiSignal >= -50
-                      ? 'bg-bambu-green/20 text-bambu-green'
-                      : wifiSignal >= -60
-                      ? 'bg-bambu-green/20 text-bambu-green'
-                      : wifiSignal >= -70
-                      ? 'bg-amber-500/20 text-amber-600'
-                      : wifiSignal >= -80
-                      ? 'bg-orange-500/20 text-orange-600'
-                      : 'bg-red-500/20 text-red-600'
-                  }`}
-                  title={`WiFi: ${wifiSignal} dBm - ${getWifiStrength(wifiSignal).label}`}
-                >
-                  <Signal className="w-3 h-3" />
-                  {wifiSignal}dBm
-                </span>
-              )}
-              {/* HMS Status Indicator */}
-              {status?.connected && (
-                <button
-                  onClick={() => setShowHMSModal(true)}
-                  className={`flex items-center gap-1 px-2 py-1 rounded-full text-xs cursor-pointer hover:opacity-80 transition-opacity ${
-                    status.hms_errors && status.hms_errors.length > 0
-                      ? status.hms_errors.some(e => e.severity <= 2)
-                        ? 'bg-red-500/20 text-red-400'
-                        : 'bg-orange-500/20 text-orange-400'
-                      : 'bg-bambu-green/20 text-bambu-green'
-                  }`}
-                  title="Click to view HMS errors"
-                >
-                  <AlertTriangle className="w-3 h-3" />
-                  {status.hms_errors && status.hms_errors.length > 0
-                    ? status.hms_errors.length
-                    : 'OK'}
-                </button>
-              )}
-              {/* Maintenance Status Indicator */}
-              {maintenanceInfo && (
-                <button
-                  onClick={() => navigate('/maintenance')}
-                  className={`flex items-center gap-1 px-2 py-1 rounded-full text-xs cursor-pointer hover:opacity-80 transition-opacity ${
-                    maintenanceInfo.due_count > 0
-                      ? 'bg-red-500/20 text-red-400'
-                      : maintenanceInfo.warning_count > 0
-                      ? 'bg-orange-500/20 text-orange-400'
-                      : 'bg-bambu-green/20 text-bambu-green'
-                  }`}
-                  title={
-                    maintenanceInfo.due_count > 0 || maintenanceInfo.warning_count > 0
-                      ? `${maintenanceInfo.due_count > 0 ? `${maintenanceInfo.due_count} maintenance due` : ''}${maintenanceInfo.due_count > 0 && maintenanceInfo.warning_count > 0 ? ', ' : ''}${maintenanceInfo.warning_count > 0 ? `${maintenanceInfo.warning_count} due soon` : ''} - Click to view`
-                      : 'All maintenance up to date - Click to view'
-                  }
-                >
-                  <Wrench className="w-3 h-3" />
-                  {maintenanceInfo.due_count > 0 || maintenanceInfo.warning_count > 0
-                    ? maintenanceInfo.due_count + maintenanceInfo.warning_count
-                    : 'OK'}
-                </button>
-              )}
-              {/* Queue Count Badge */}
-              {queueCount > 0 && (
-                <button
-                  onClick={() => navigate('/queue')}
-                  className="flex items-center gap-1 px-2 py-1 rounded-full text-xs bg-purple-500/20 text-purple-400 hover:opacity-80 transition-opacity"
-                  title={`${queueCount} print${queueCount > 1 ? 's' : ''} in queue`}
-                >
-                  <Layers className="w-3 h-3" />
-                  {queueCount}
-                </button>
-              )}
-            </div>
-          )}
-        </div>
- 
-        {/* Delete Confirmation */}
-        {showDeleteConfirm && (
-          <ConfirmModal
-            title="Delete Printer"
-            message={`Are you sure you want to delete "${printer.name}"? This will also remove all connection settings.`}
-            confirmText="Delete"
-            variant="danger"
-            onConfirm={() => {
-              deleteMutation.mutate();
-              setShowDeleteConfirm(false);
-            }}
-            onCancel={() => setShowDeleteConfirm(false)}
-          />
-        )}
- 
-        {/* Status */}
-        {status?.connected && (
-          <>
-            {/* Compact: Simple status bar */}
-            {viewMode === 'compact' ? (
-              <div className="mt-2">
-                {status.state === 'RUNNING' ? (
-                  <div className="flex items-center gap-2">
-                    <div className="flex-1 bg-bambu-dark-tertiary rounded-full h-1.5">
-                      <div
-                        className="bg-bambu-green h-1.5 rounded-full transition-all"
-                        style={{ width: `${status.progress || 0}%` }}
-                      />
-                    </div>
-                    <span className="text-xs text-white">{Math.round(status.progress || 0)}%</span>
-                  </div>
-                ) : (
-                  <p className="text-xs text-bambu-gray capitalize">{status.state?.toLowerCase() || 'Idle'}</p>
-                )}
-              </div>
-            ) : (
-              /* Expanded: Full status section */
-              <>
-                {/* Current Print or Idle Placeholder */}
-                <div className="mb-4 p-3 bg-bambu-dark rounded-lg">
-                  <div className="flex gap-3">
-                    {/* Cover Image */}
-                    <CoverImage
-                      url={status.state === 'RUNNING' ? status.cover_url : null}
-                      printName={status.state === 'RUNNING' ? (status.subtask_name || status.current_print || undefined) : undefined}
-                    />
-                    {/* Print Info */}
-                    <div className="flex-1 min-w-0">
-                      {status.current_print && status.state === 'RUNNING' ? (
-                        <>
-                          <p className="text-sm text-bambu-gray mb-1">Printing</p>
-                          <p className="text-white text-sm mb-2 truncate">
-                            {status.subtask_name || status.current_print}
-                          </p>
-                          <div className="flex items-center justify-between text-sm">
-                            <div className="flex-1 bg-bambu-dark-tertiary rounded-full h-2 mr-3">
-                              <div
-                                className="bg-bambu-green h-2 rounded-full transition-all"
-                                style={{ width: `${status.progress || 0}%` }}
-                              />
-                            </div>
-                            <span className="text-white">{Math.round(status.progress || 0)}%</span>
-                          </div>
-                          <div className="flex items-center gap-3 mt-2 text-xs text-bambu-gray">
-                            {status.remaining_time != null && status.remaining_time > 0 && (
-                              <>
-                                <span className="flex items-center gap-1">
-                                  <Clock className="w-3 h-3" />
-                                  {formatTime(status.remaining_time * 60)}
-                                </span>
-                                <span className="text-bambu-green font-medium" title="Estimated completion time">
-                                  ETA {formatETA(status.remaining_time)}
-                                </span>
-                              </>
-                            )}
-                            {status.layer_num != null && status.total_layers != null && status.total_layers > 0 && (
-                              <span className="flex items-center gap-1">
-                                <Layers className="w-3 h-3" />
-                                {status.layer_num}/{status.total_layers}
-                              </span>
-                            )}
-                          </div>
-                        </>
-                      ) : (
-                        <>
-                          <p className="text-sm text-bambu-gray mb-1">Status</p>
-                          <p className="text-white text-sm mb-2 capitalize">
-                            {status.state?.toLowerCase() || 'Idle'}
-                          </p>
-                          <div className="flex items-center justify-between text-sm">
-                            <div className="flex-1 bg-bambu-dark-tertiary rounded-full h-2 mr-3">
-                              <div className="bg-bambu-dark-tertiary h-2 rounded-full" />
-                            </div>
-                            <span className="text-bambu-gray">—</span>
-                          </div>
-                          {lastPrint ? (
-                            <p className="text-xs text-bambu-gray mt-2 truncate" title={lastPrint.print_name || lastPrint.filename}>
-                              Last: {lastPrint.print_name || lastPrint.filename}
-                              {lastPrint.completed_at && (
-                                <span className="ml-1 text-bambu-gray/60">
-                                  • {new Date(lastPrint.completed_at).toLocaleDateString([], { month: 'short', day: 'numeric' })}
-                                </span>
-                              )}
-                            </p>
-                          ) : (
-                            <p className="text-xs text-bambu-gray mt-2">Ready to print</p>
-                          )}
-                        </>
-                      )}
-                    </div>
-                  </div>
-                </div>
- 
-                {/* Queue Widget - shows next scheduled print */}
-                {status.state !== 'RUNNING' && (
-                  <PrinterQueueWidget printerId={printer.id} />
-                )}
-              </>
-            )}
- 
-            {/* Temperatures */}
-            {status.temperatures && viewMode === 'expanded' && (
-              <div className="grid grid-cols-3 gap-3">
-                {/* Nozzle temp - combined for dual nozzle */}
-                <div className="text-center p-2 bg-bambu-dark rounded-lg">
-                  <Thermometer className="w-4 h-4 mx-auto mb-1 text-orange-400" />
-                  {status.temperatures.nozzle_2 !== undefined ? (
-                    <>
-                      <p className="text-xs text-bambu-gray">Left / Right</p>
-                      <p className="text-sm text-white">
-                        {Math.round(status.temperatures.nozzle || 0)}°C / {Math.round(status.temperatures.nozzle_2 || 0)}°C
-                      </p>
-                    </>
-                  ) : (
-                    <>
-                      <p className="text-xs text-bambu-gray">Nozzle</p>
-                      <p className="text-sm text-white">
-                        {Math.round(status.temperatures.nozzle || 0)}°C
-                      </p>
-                    </>
-                  )}
-                </div>
-                <div className="text-center p-2 bg-bambu-dark rounded-lg">
-                  <Thermometer className="w-4 h-4 mx-auto mb-1 text-blue-400" />
-                  <p className="text-xs text-bambu-gray">Bed</p>
-                  <p className="text-sm text-white">
-                    {Math.round(status.temperatures.bed || 0)}°C
-                  </p>
-                </div>
-                {status.temperatures.chamber !== undefined && (
-                  <div className="text-center p-2 bg-bambu-dark rounded-lg">
-                    <Thermometer className="w-4 h-4 mx-auto mb-1 text-green-400" />
-                    <p className="text-xs text-bambu-gray">Chamber</p>
-                    <p className="text-sm text-white">
-                      {Math.round(status.temperatures.chamber || 0)}°C
-                    </p>
-                  </div>
-                )}
-              </div>
-            )}
- 
-            {/* AMS Units with Device Icons, Humidity & Temperature */}
-            {amsData && amsData.length > 0 && viewMode === 'expanded' && (
-              <div className="mt-3 space-y-2">
-                {amsData.map((ams) => {
-                  // For dual nozzle printers, determine which nozzle this AMS is connected to
-                  // Use actual ams.id for map lookup (map uses real IDs: 0-3 for AMS, 128+ for AMS-HT)
-                  const mappedExtruderId = amsExtruderMap[String(ams.id)];
-                  // Fallback: normalize ID for conventional mapping (0=R, 1=L)
-                  const normalizedId = ams.id >= 128 ? ams.id - 128 : ams.id;
-                  const extruderId = mappedExtruderId !== undefined
-                    ? mappedExtruderId
-                    : normalizedId; // Fallback: AMS 0 → extruder 0 (R), AMS 1 → extruder 1 (L)
-                  // Use printer.nozzle_count as primary source (stable), fallback to nozzle_2 temp
-                  const isDualNozzle = printer.nozzle_count === 2 || status?.temperatures?.nozzle_2 !== undefined;
-                  // extruder 0 = Right, extruder 1 = Left
-                  const isLeftNozzle = extruderId === 1;
-                  const isRightNozzle = extruderId === 0;
- 
-                  // Get colors for the AMS icon (null for empty slots)
-                  const slotColors = ams.tray.map(tray =>
-                    tray.tray_color ? `#${tray.tray_color}` : (tray.tray_type ? '#333' : null)
-                  );
-                  const isHtAms = ams.tray.length === 1;
- 
-                  return (
-                    <div key={ams.id} className="p-2 bg-bambu-dark rounded-lg">
-                      <div className="flex items-center gap-3">
-                        {/* Nozzle badge + AMS device icon */}
-                        <div className="flex items-center gap-1">
-                          {isDualNozzle && (isLeftNozzle || isRightNozzle) && (
-                            <NozzleBadge side={isLeftNozzle ? 'L' : 'R'} />
-                          )}
-                          {isHtAms ? (
-                            <AMS1TrayIcon
-                              color={slotColors[0]}
-                              className="flex-shrink-0"
-                            />
-                          ) : (
-                            <AMS4TrayIcon
-                              colors={slotColors as (string | null)[]}
-                              className="flex-shrink-0"
-                            />
-                          )}
-                        </div>
- 
-                        {/* Label and filament info */}
-                        <div className="flex-1 min-w-0">
-                          <span className="text-xs text-bambu-gray font-medium">
-                            {getAmsLabel(ams.id, ams.tray.length)}
-                          </span>
-                          {/* Filament types and fill levels */}
-                          <div className="mt-0.5 text-[10px] flex items-start">
-                            {ams.tray.map((tray, i) => (
-                              <div key={i} className="flex items-start">
-                                <div className="flex flex-col">
-                                  <span className="text-bambu-gray/70 truncate">
-                                    {tray.tray_type ? (tray.tray_sub_brands || tray.tray_type) : '—'}
-                                  </span>
-                                  <span className="text-bambu-gray/50 truncate">
-                                    {tray.tray_type && tray.remain >= 0 ? `${tray.remain}%` : '—'}
-                                  </span>
-                                </div>
-                                {i < ams.tray.length - 1 && (
-                                  <span className="text-bambu-gray/50 mx-1 flex flex-col">
-                                    <span>·</span>
-                                    <span>·</span>
-                                  </span>
-                                )}
-                              </div>
-                            ))}
-                          </div>
-                        </div>
-                        {/* Humidity/temp - vertically centered */}
-                        {(ams.humidity != null || ams.temp != null) && (
-                          <div className="flex items-center gap-2 text-xs flex-shrink-0">
-                            {ams.humidity != null && (
-                              <HumidityIndicator
-                                humidity={ams.humidity}
-                                goodThreshold={amsThresholds?.humidityGood}
-                                fairThreshold={amsThresholds?.humidityFair}
-                                onClick={() => setAmsHistoryModal({
-                                  amsId: ams.id,
-                                  amsLabel: getAmsLabel(ams.id, ams.tray.length),
-                                  mode: 'humidity',
-                                })}
-                              />
-                            )}
-                            {ams.temp != null && (
-                              <TemperatureIndicator
-                                temp={ams.temp}
-                                goodThreshold={amsThresholds?.tempGood}
-                                fairThreshold={amsThresholds?.tempFair}
-                                onClick={() => setAmsHistoryModal({
-                                  amsId: ams.id,
-                                  amsLabel: getAmsLabel(ams.id, ams.tray.length),
-                                  mode: 'temperature',
-                                })}
-                              />
-                            )}
-                          </div>
-                        )}
-                      </div>
-                    </div>
-                  );
-                })}
-                {/* External spool indicator */}
-                {status.vt_tray && status.vt_tray.tray_type && (
-                  <div className="p-2 bg-bambu-dark rounded-lg">
-                    <div className="flex items-center gap-3">
-                      <div
-                        className="w-10 h-10 rounded-full border-2 border-white/20 flex-shrink-0"
-                        style={{
-                          backgroundColor: status.vt_tray.tray_color ? `#${status.vt_tray.tray_color}` : '#333',
-                        }}
-                      />
-                      <div>
-                        <span className="text-xs text-bambu-gray font-medium">External</span>
-                        <p className="text-[10px] text-bambu-gray/70">
-                          {status.vt_tray.tray_sub_brands || status.vt_tray.tray_type || 'Spool'}
-                        </p>
-                      </div>
-                    </div>
-                  </div>
-                )}
-              </div>
-            )}
-          </>
-        )}
- 
-        {/* Smart Plug Controls - hidden in compact mode */}
-        {smartPlug && viewMode === 'expanded' && (
-          <div className="mt-4 pt-4 border-t border-bambu-dark-tertiary">
-            <div className="flex items-center gap-3">
-              {/* Plug name and status */}
-              <div className="flex items-center gap-2 min-w-0">
-                <Zap className="w-4 h-4 text-bambu-gray flex-shrink-0" />
-                <span className="text-sm text-white truncate">{smartPlug.name}</span>
-                {plugStatus && (
-                  <span
-                    className={`text-xs px-1.5 py-0.5 rounded flex-shrink-0 ${
-                      plugStatus.state === 'ON'
-                        ? 'bg-bambu-green/20 text-bambu-green'
-                        : plugStatus.state === 'OFF'
-                        ? 'bg-red-500/20 text-red-400'
-                        : 'bg-bambu-gray/20 text-bambu-gray'
-                    }`}
-                  >
-                    {plugStatus.state || '?'}
-                  </span>
-                )}
-                {/* Power consumption display */}
-                {plugStatus?.energy?.power != null && plugStatus.state === 'ON' && (
-                  <span className="text-xs text-yellow-400 font-medium flex-shrink-0">
-                    {plugStatus.energy.power}W
-                  </span>
-                )}
-              </div>
- 
-              {/* Spacer */}
-              <div className="flex-1" />
- 
-              {/* Power buttons */}
-              <div className="flex items-center gap-1">
-                <button
-                  onClick={() => setShowPowerOnConfirm(true)}
-                  disabled={powerControlMutation.isPending || plugStatus?.state === 'ON'}
-                  className={`px-2 py-1 text-xs rounded transition-colors flex items-center gap-1 ${
-                    plugStatus?.state === 'ON'
-                      ? 'bg-bambu-green text-white'
-                      : 'bg-bambu-dark text-bambu-gray hover:text-white hover:bg-bambu-dark-tertiary'
-                  }`}
-                >
-                  <Power className="w-3 h-3" />
-                  On
-                </button>
-                <button
-                  onClick={() => setShowPowerOffConfirm(true)}
-                  disabled={powerControlMutation.isPending || plugStatus?.state === 'OFF'}
-                  className={`px-2 py-1 text-xs rounded transition-colors flex items-center gap-1 ${
-                    plugStatus?.state === 'OFF'
-                      ? 'bg-red-500/30 text-red-400'
-                      : 'bg-bambu-dark text-bambu-gray hover:text-white hover:bg-bambu-dark-tertiary'
-                  }`}
-                >
-                  <PowerOff className="w-3 h-3" />
-                  Off
-                </button>
-              </div>
- 
-              {/* Auto-off toggle */}
-              <div className="flex items-center gap-2 flex-shrink-0">
-                <span className={`text-xs hidden sm:inline ${smartPlug.auto_off_executed ? 'text-bambu-green' : 'text-bambu-gray'}`}>
-                  {smartPlug.auto_off_executed ? 'Auto-off done' : 'Auto-off'}
-                </span>
-                <button
-                  onClick={() => toggleAutoOffMutation.mutate(!smartPlug.auto_off)}
-                  disabled={toggleAutoOffMutation.isPending || smartPlug.auto_off_executed}
-                  title={smartPlug.auto_off_executed ? 'Auto-off was executed - turn printer on to reset' : 'Auto power-off after print'}
-                  className={`relative w-9 h-5 rounded-full transition-colors flex-shrink-0 ${
-                    smartPlug.auto_off_executed
-                      ? 'bg-bambu-green/50 cursor-not-allowed'
-                      : smartPlug.auto_off ? 'bg-bambu-green' : 'bg-bambu-dark-tertiary'
-                  }`}
-                >
-                  <span
-                    className={`absolute top-[2px] left-[2px] w-4 h-4 bg-white rounded-full transition-transform ${
-                      smartPlug.auto_off || smartPlug.auto_off_executed ? 'translate-x-4' : 'translate-x-0'
-                    }`}
-                  />
-                </button>
-              </div>
-            </div>
-          </div>
-        )}
- 
-        {/* Connection Info & Actions - hidden in compact mode */}
-        {viewMode === 'expanded' && (
-          <div className="mt-4 pt-4 border-t border-bambu-dark-tertiary flex items-center justify-between">
-            <div className="text-xs text-bambu-gray">
-              <p>{printer.ip_address}</p>
-              <p className="truncate">{printer.serial_number}</p>
-            </div>
-            <div className="flex items-center gap-2">
-              <Button
-                variant="secondary"
-                size="sm"
-                onClick={() => {
-                  window.open(
-                    `/camera/${printer.id}`,
-                    `camera-${printer.id}`,
-                    'width=640,height=400,menubar=no,toolbar=no,location=no,status=no'
-                  );
-                }}
-                disabled={!status?.connected}
-                title="Open camera in new window"
-              >
-                <Video className="w-4 h-4" />
-              </Button>
-              <Button
-                variant="secondary"
-                size="sm"
-                onClick={() => setShowFileManager(true)}
-                title="Browse printer files"
-              >
-                <HardDrive className="w-4 h-4" />
-                Files
-              </Button>
-            </div>
-          </div>
-        )}
-      </CardContent>
- 
-      {/* File Manager Modal */}
-      {showFileManager && (
-        <FileManagerModal
-          printerId={printer.id}
-          printerName={printer.name}
-          onClose={() => setShowFileManager(false)}
-        />
-      )}
- 
-      {/* MQTT Debug Modal */}
-      {showMQTTDebug && (
-        <MQTTDebugModal
-          printerId={printer.id}
-          printerName={printer.name}
-          onClose={() => setShowMQTTDebug(false)}
-        />
-      )}
- 
-      {/* Power On Confirmation */}
-      {showPowerOnConfirm && smartPlug && (
-        <ConfirmModal
-          title="Power On Printer"
-          message={`Are you sure you want to turn ON the power for "${printer.name}"?`}
-          confirmText="Power On"
-          variant="default"
-          onConfirm={() => {
-            powerControlMutation.mutate('on');
-            setShowPowerOnConfirm(false);
-          }}
-          onCancel={() => setShowPowerOnConfirm(false)}
-        />
-      )}
- 
-      {/* Power Off Confirmation */}
-      {showPowerOffConfirm && smartPlug && (
-        <ConfirmModal
-          title="Power Off Printer"
-          message={
-            status?.state === 'RUNNING'
-              ? `WARNING: "${printer.name}" is currently printing! Are you sure you want to turn OFF the power? This will interrupt the print and may damage the printer.`
-              : `Are you sure you want to turn OFF the power for "${printer.name}"?`
-          }
-          confirmText="Power Off"
-          variant="danger"
-          onConfirm={() => {
-            powerControlMutation.mutate('off');
-            setShowPowerOffConfirm(false);
-          }}
-          onCancel={() => setShowPowerOffConfirm(false)}
-        />
-      )}
- 
-      {/* HMS Error Modal */}
-      {showHMSModal && (
-        <HMSErrorModal
-          printerName={printer.name}
-          errors={status?.hms_errors || []}
-          onClose={() => setShowHMSModal(false)}
-        />
-      )}
- 
-      {/* AMS History Modal */}
-      {amsHistoryModal && (
-        <AMSHistoryModal
-          isOpen={!!amsHistoryModal}
-          onClose={() => setAmsHistoryModal(null)}
-          printerId={printer.id}
-          printerName={printer.name}
-          amsId={amsHistoryModal.amsId}
-          amsLabel={amsHistoryModal.amsLabel}
-          initialMode={amsHistoryModal.mode}
-          thresholds={amsThresholds}
-        />
-      )}
- 
-      {/* Edit Printer Modal */}
-      {showEditModal && (
-        <EditPrinterModal
-          printer={printer}
-          onClose={() => setShowEditModal(false)}
-        />
-      )}
-    </Card>
-  );
-}
- 
-function AddPrinterModal({
-  onClose,
-  onAdd,
-}: {
-  onClose: () => void;
-  onAdd: (data: PrinterCreate) => void;
-}) {
-  const [form, setForm] = useState<PrinterCreate>({
-    name: '',
-    serial_number: '',
-    ip_address: '',
-    access_code: '',
-    model: '',
-    auto_archive: true,
-  });
- 
-  // Close on Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onClose();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose]);
- 
-  return (
-    <div
-      className="fixed inset-0 bg-black/50 flex items-center justify-center z-50"
-      onClick={onClose}
-    >
-      <Card className="w-full max-w-md" onClick={(e: React.MouseEvent) => e.stopPropagation()}>
-        <CardContent>
-          <h2 className="text-xl font-semibold mb-4">Add Printer</h2>
-          <form
-            onSubmit={(e) => {
-              e.preventDefault();
-              onAdd(form);
-            }}
-            className="space-y-4"
-          >
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">Name</label>
-              <input
-                type="text"
-                required
-                className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                value={form.name}
-                onChange={(e) => setForm({ ...form, name: e.target.value })}
-                placeholder="My Printer"
-              />
-            </div>
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">IP Address</label>
-              <input
-                type="text"
-                required
-                pattern="\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
-                className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                value={form.ip_address}
-                onChange={(e) => setForm({ ...form, ip_address: e.target.value })}
-                placeholder="192.168.1.100"
-              />
-            </div>
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">Serial Number</label>
-              <input
-                type="text"
-                required
-                className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                value={form.serial_number}
-                onChange={(e) => setForm({ ...form, serial_number: e.target.value })}
-                placeholder="01P00A000000000"
-              />
-            </div>
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">Access Code</label>
-              <input
-                type="password"
-                required
-                className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                value={form.access_code}
-                onChange={(e) => setForm({ ...form, access_code: e.target.value })}
-                placeholder="From printer settings"
-              />
-            </div>
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">Model (optional)</label>
-              <select
-                className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                value={form.model || ''}
-                onChange={(e) => setForm({ ...form, model: e.target.value })}
-              >
-                <option value="">Select model...</option>
-                <optgroup label="H2 Series">
-                  <option value="H2C">H2C</option>
-                  <option value="H2D">H2D</option>
-                  <option value="H2S">H2S</option>
-                </optgroup>
-                <optgroup label="X1 Series">
-                  <option value="X1E">X1E</option>
-                  <option value="X1C">X1 Carbon</option>
-                  <option value="X1">X1</option>
-                </optgroup>
-                <optgroup label="P Series">
-                  <option value="P2S">P2S</option>
-                  <option value="P1S">P1S</option>
-                  <option value="P1P">P1P</option>
-                </optgroup>
-                <optgroup label="A1 Series">
-                  <option value="A1">A1</option>
-                  <option value="A1 Mini">A1 Mini</option>
-                </optgroup>
-              </select>
-            </div>
-            <div className="flex items-center gap-2">
-              <input
-                type="checkbox"
-                id="auto_archive"
-                checked={form.auto_archive}
-                onChange={(e) => setForm({ ...form, auto_archive: e.target.checked })}
-                className="rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green"
-              />
-              <label htmlFor="auto_archive" className="text-sm text-bambu-gray">
-                Auto-archive completed prints
-              </label>
-            </div>
-            <div className="flex gap-3 pt-4">
-              <Button type="button" variant="secondary" onClick={onClose} className="flex-1">
-                Cancel
-              </Button>
-              <Button type="submit" className="flex-1">
-                Add Printer
-              </Button>
-            </div>
-          </form>
-        </CardContent>
-      </Card>
-    </div>
-  );
-}
- 
-function EditPrinterModal({
-  printer,
-  onClose,
-}: {
-  printer: Printer;
-  onClose: () => void;
-}) {
-  const queryClient = useQueryClient();
-  const [form, setForm] = useState({
-    name: printer.name,
-    ip_address: printer.ip_address,
-    access_code: '',
-    model: printer.model || '',
-    location: printer.location || '',
-    auto_archive: printer.auto_archive,
-  });
- 
-  const updateMutation = useMutation({
-    mutationFn: (data: Partial<PrinterCreate>) => api.updatePrinter(printer.id, data),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['printers'] });
-      queryClient.invalidateQueries({ queryKey: ['printerStatus', printer.id] });
-      onClose();
-    },
-  });
- 
-  // Close on Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onClose();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose]);
- 
-  const handleSubmit = (e: React.FormEvent) => {
-    e.preventDefault();
-    const data: Partial<PrinterCreate> = {
-      name: form.name,
-      ip_address: form.ip_address,
-      model: form.model || undefined,
-      location: form.location || undefined,
-      auto_archive: form.auto_archive,
-    };
-    // Only include access_code if it was changed
-    if (form.access_code) {
-      data.access_code = form.access_code;
-    }
-    updateMutation.mutate(data);
-  };
- 
-  return (
-    <div
-      className="fixed inset-0 bg-black/50 flex items-center justify-center z-50"
-      onClick={onClose}
-    >
-      <Card className="w-full max-w-md" onClick={(e: React.MouseEvent) => e.stopPropagation()}>
-        <CardContent>
-          <h2 className="text-xl font-semibold mb-4">Edit Printer</h2>
-          <form onSubmit={handleSubmit} className="space-y-4">
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">Name</label>
-              <input
-                type="text"
-                required
-                className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                value={form.name}
-                onChange={(e) => setForm({ ...form, name: e.target.value })}
-                placeholder="My Printer"
-              />
-            </div>
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">IP Address</label>
-              <input
-                type="text"
-                required
-                pattern="\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
-                className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                value={form.ip_address}
-                onChange={(e) => setForm({ ...form, ip_address: e.target.value })}
-                placeholder="192.168.1.100"
-              />
-            </div>
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">Serial Number</label>
-              <input
-                type="text"
-                disabled
-                className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-bambu-gray cursor-not-allowed"
-                value={printer.serial_number}
-              />
-              <p className="text-xs text-bambu-gray mt-1">Serial number cannot be changed</p>
-            </div>
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">Access Code</label>
-              <input
-                type="password"
-                className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                value={form.access_code}
-                onChange={(e) => setForm({ ...form, access_code: e.target.value })}
-                placeholder="Leave empty to keep current"
-              />
-            </div>
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">Model</label>
-              <select
-                className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                value={form.model}
-                onChange={(e) => setForm({ ...form, model: e.target.value })}
-              >
-                <option value="">Select model...</option>
-                <optgroup label="H2 Series">
-                  <option value="H2C">H2C</option>
-                  <option value="H2D">H2D</option>
-                  <option value="H2S">H2S</option>
-                </optgroup>
-                <optgroup label="X1 Series">
-                  <option value="X1E">X1E</option>
-                  <option value="X1C">X1 Carbon</option>
-                  <option value="X1">X1</option>
-                </optgroup>
-                <optgroup label="P Series">
-                  <option value="P2S">P2S</option>
-                  <option value="P1S">P1S</option>
-                  <option value="P1P">P1P</option>
-                </optgroup>
-                <optgroup label="A1 Series">
-                  <option value="A1">A1</option>
-                  <option value="A1 Mini">A1 Mini</option>
-                </optgroup>
-              </select>
-            </div>
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">Location / Group</label>
-              <input
-                type="text"
-                className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                value={form.location}
-                onChange={(e) => setForm({ ...form, location: e.target.value })}
-                placeholder="e.g., Workshop, Office, Basement"
-              />
-              <p className="text-xs text-bambu-gray mt-1">Used to group printers on the dashboard</p>
-            </div>
-            <div className="flex items-center gap-2">
-              <input
-                type="checkbox"
-                id="edit_auto_archive"
-                checked={form.auto_archive}
-                onChange={(e) => setForm({ ...form, auto_archive: e.target.checked })}
-                className="rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green"
-              />
-              <label htmlFor="edit_auto_archive" className="text-sm text-bambu-gray">
-                Auto-archive completed prints
-              </label>
-            </div>
-            <div className="flex gap-3 pt-4">
-              <Button type="button" variant="secondary" onClick={onClose} className="flex-1">
-                Cancel
-              </Button>
-              <Button type="submit" className="flex-1" disabled={updateMutation.isPending}>
-                {updateMutation.isPending ? 'Saving...' : 'Save Changes'}
-              </Button>
-            </div>
-          </form>
-        </CardContent>
-      </Card>
-    </div>
-  );
-}
- 
-// Component to check if a printer is offline (for power dropdown)
-function usePrinterOfflineStatus(printerId: number) {
-  const { data: status } = useQuery({
-    queryKey: ['printerStatus', printerId],
-    queryFn: () => api.getPrinterStatus(printerId),
-    refetchInterval: 30000,
-  });
-  return !status?.connected;
-}
- 
-// Power dropdown item for an offline printer
-function PowerDropdownItem({
-  printer,
-  plug,
-  onPowerOn,
-  isPowering,
-}: {
-  printer: Printer;
-  plug: { id: number; name: string };
-  onPowerOn: (plugId: number) => void;
-  isPowering: boolean;
-}) {
-  const isOffline = usePrinterOfflineStatus(printer.id);
- 
-  // Fetch plug status
-  const { data: plugStatus } = useQuery({
-    queryKey: ['smartPlugStatus', plug.id],
-    queryFn: () => api.getSmartPlugStatus(plug.id),
-    refetchInterval: 10000,
-  });
- 
-  // Only show if printer is offline
-  if (!isOffline) {
-    return null;
-  }
- 
-  return (
-    <div className="flex items-center justify-between px-3 py-2 hover:bg-gray-100 dark:hover:bg-bambu-dark-tertiary">
-      <div className="flex items-center gap-2 min-w-0">
-        <span className="text-sm text-gray-900 dark:text-white truncate">{printer.name}</span>
-        {plugStatus && (
-          <span
-            className={`text-xs px-1.5 py-0.5 rounded ${
-              plugStatus.state === 'ON'
-                ? 'bg-bambu-green/20 text-bambu-green'
-                : 'bg-red-500/20 text-red-400'
-            }`}
-          >
-            {plugStatus.state || '?'}
-          </span>
-        )}
-      </div>
-      <button
-        onClick={() => onPowerOn(plug.id)}
-        disabled={isPowering || plugStatus?.state === 'ON'}
-        className={`px-2 py-1 text-xs rounded transition-colors flex items-center gap-1 ${
-          plugStatus?.state === 'ON'
-            ? 'bg-bambu-green/20 text-bambu-green cursor-default'
-            : 'bg-bambu-green/20 text-bambu-green hover:bg-bambu-green hover:text-white'
-        }`}
-      >
-        <Power className="w-3 h-3" />
-        {isPowering ? '...' : 'On'}
-      </button>
-    </div>
-  );
-}
- 
-export function PrintersPage() {
-  const [showAddModal, setShowAddModal] = useState(false);
-  const [hideDisconnected, setHideDisconnected] = useState(() => {
-    return localStorage.getItem('hideDisconnectedPrinters') === 'true';
-  });
-  const [showPowerDropdown, setShowPowerDropdown] = useState(false);
-  const [poweringOn, setPoweringOn] = useState<number | null>(null);
-  const [sortBy, setSortBy] = useState<SortOption>(() => {
-    return (localStorage.getItem('printerSortBy') as SortOption) || 'name';
-  });
-  const [sortAsc, setSortAsc] = useState<boolean>(() => {
-    return localStorage.getItem('printerSortAsc') !== 'false';
-  });
-  const [viewMode, setViewMode] = useState<ViewMode>(() => {
-    return (localStorage.getItem('printerViewMode') as ViewMode) || 'expanded';
-  });
-  const queryClient = useQueryClient();
- 
-  const { data: printers, isLoading } = useQuery({
-    queryKey: ['printers'],
-    queryFn: api.getPrinters,
-  });
- 
-  // Fetch app settings for AMS thresholds
-  const { data: settings } = useQuery({
-    queryKey: ['settings'],
-    queryFn: api.getSettings,
-  });
- 
-  // Fetch all smart plugs to know which printers have them
-  const { data: smartPlugs } = useQuery({
-    queryKey: ['smart-plugs'],
-    queryFn: api.getSmartPlugs,
-  });
- 
-  // Fetch maintenance overview for all printers to show badges
-  const { data: maintenanceOverview } = useQuery({
-    queryKey: ['maintenanceOverview'],
-    queryFn: api.getMaintenanceOverview,
-    staleTime: 60 * 1000, // 1 minute
-  });
- 
-  // Create a map of printer_id -> maintenance info for quick lookup
-  const maintenanceByPrinter = maintenanceOverview?.reduce(
-    (acc, overview) => {
-      acc[overview.printer_id] = {
-        due_count: overview.due_count,
-        warning_count: overview.warning_count,
-        total_print_hours: overview.total_print_hours,
-      };
-      return acc;
-    },
-    {} as Record<number, PrinterMaintenanceInfo>
-  ) || {};
- 
-  // Create a map of printer_id -> smart plug
-  const smartPlugByPrinter = smartPlugs?.reduce(
-    (acc, plug) => {
-      if (plug.printer_id) {
-        acc[plug.printer_id] = plug;
-      }
-      return acc;
-    },
-    {} as Record<number, typeof smartPlugs[0]>
-  ) || {};
- 
-  const addMutation = useMutation({
-    mutationFn: api.createPrinter,
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['printers'] });
-      setShowAddModal(false);
-    },
-  });
- 
-  const powerOnMutation = useMutation({
-    mutationFn: (plugId: number) => api.controlSmartPlug(plugId, 'on'),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['smart-plugs'] });
-      setPoweringOn(null);
-    },
-    onError: () => {
-      setPoweringOn(null);
-    },
-  });
- 
-  const toggleHideDisconnected = () => {
-    const newValue = !hideDisconnected;
-    setHideDisconnected(newValue);
-    localStorage.setItem('hideDisconnectedPrinters', String(newValue));
-  };
- 
-  const handleSortChange = (newSort: SortOption) => {
-    setSortBy(newSort);
-    localStorage.setItem('printerSortBy', newSort);
-  };
- 
-  const toggleSortDirection = () => {
-    const newAsc = !sortAsc;
-    setSortAsc(newAsc);
-    localStorage.setItem('printerSortAsc', String(newAsc));
-  };
- 
-  const toggleViewMode = () => {
-    const newMode = viewMode === 'expanded' ? 'compact' : 'expanded';
-    setViewMode(newMode);
-    localStorage.setItem('printerViewMode', newMode);
-  };
- 
-  // Sort printers based on selected option
-  const sortedPrinters = useMemo(() => {
-    if (!printers) return [];
-    const sorted = [...printers];
- 
-    switch (sortBy) {
-      case 'name':
-        sorted.sort((a, b) => a.name.localeCompare(b.name));
-        break;
-      case 'model':
-        sorted.sort((a, b) => (a.model || '').localeCompare(b.model || ''));
-        break;
-      case 'location':
-        // Sort by location, with ungrouped printers last
-        sorted.sort((a, b) => {
-          const locA = a.location || '';
-          const locB = b.location || '';
-          if (!locA && locB) return 1;
-          if (locA && !locB) return -1;
-          return locA.localeCompare(locB) || a.name.localeCompare(b.name);
-        });
-        break;
-      case 'status':
-        // Sort by status: printing > idle > offline
-        sorted.sort((a, b) => {
-          const statusA = queryClient.getQueryData<{ connected: boolean; state: string | null }>(['printerStatus', a.id]);
-          const statusB = queryClient.getQueryData<{ connected: boolean; state: string | null }>(['printerStatus', b.id]);
- 
-          const getPriority = (s: typeof statusA) => {
-            if (!s?.connected) return 2; // offline
-            if (s.state === 'RUNNING') return 0; // printing
-            return 1; // idle
-          };
- 
-          return getPriority(statusA) - getPriority(statusB);
-        });
-        break;
-    }
- 
-    // Apply ascending/descending
-    if (!sortAsc) {
-      sorted.reverse();
-    }
- 
-    return sorted;
-  }, [printers, sortBy, sortAsc, queryClient]);
- 
-  // Group printers by location when sorted by location
-  const groupedPrinters = useMemo(() => {
-    if (sortBy !== 'location') return null;
- 
-    const groups: Record<string, typeof sortedPrinters> = {};
-    sortedPrinters.forEach(printer => {
-      const location = printer.location || 'Ungrouped';
-      if (!groups[location]) groups[location] = [];
-      groups[location].push(printer);
-    });
-    return groups;
-  }, [sortBy, sortedPrinters]);
- 
-  return (
-    <div className="p-4 md:p-8">
-      <div className="flex items-center justify-between mb-6">
-        <div>
-          <h1 className="text-2xl font-bold text-white">Printers</h1>
-          <StatusSummaryBar printers={printers} />
-        </div>
-        <div className="flex items-center gap-3">
-          {/* Sort dropdown */}
-          <div className="flex items-center gap-1">
-            <select
-              value={sortBy}
-              onChange={(e) => handleSortChange(e.target.value as SortOption)}
-              className="text-sm bg-bambu-dark border border-bambu-dark-tertiary rounded-lg px-2 py-1.5 text-white focus:border-bambu-green focus:outline-none"
-            >
-              <option value="name">Name</option>
-              <option value="status">Status</option>
-              <option value="model">Model</option>
-              <option value="location">Location</option>
-            </select>
-            <button
-              onClick={toggleSortDirection}
-              className="p-1.5 rounded-lg hover:bg-bambu-dark-tertiary transition-colors"
-              title={sortAsc ? 'Sort descending' : 'Sort ascending'}
-            >
-              {sortAsc ? (
-                <ArrowUp className="w-4 h-4 text-bambu-gray" />
-              ) : (
-                <ArrowDown className="w-4 h-4 text-bambu-gray" />
-              )}
-            </button>
-          </div>
- 
-          {/* View mode toggle */}
-          <button
-            onClick={toggleViewMode}
-            className="p-1.5 rounded-lg hover:bg-bambu-dark-tertiary transition-colors"
-            title={viewMode === 'expanded' ? 'Switch to compact view' : 'Switch to expanded view'}
-          >
-            {viewMode === 'expanded' ? (
-              <LayoutList className="w-5 h-5 text-bambu-gray" />
-            ) : (
-              <LayoutGrid className="w-5 h-5 text-bambu-gray" />
-            )}
-          </button>
- 
-          <div className="w-px h-6 bg-bambu-dark-tertiary" />
- 
-          <label className="flex items-center gap-2 text-sm text-bambu-gray cursor-pointer">
-            <input
-              type="checkbox"
-              checked={hideDisconnected}
-              onChange={toggleHideDisconnected}
-              className="rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green"
-            />
-            Hide offline
-          </label>
-          {/* Power dropdown for offline printers with smart plugs */}
-          {hideDisconnected && Object.keys(smartPlugByPrinter).length > 0 && (
-            <div className="relative">
-              <button
-                onClick={() => setShowPowerDropdown(!showPowerDropdown)}
-                className="flex items-center gap-1.5 px-3 py-1.5 text-sm bg-white dark:bg-bambu-dark-secondary border border-gray-200 dark:border-bambu-dark-tertiary rounded-lg text-gray-600 dark:text-bambu-gray hover:text-gray-900 dark:hover:text-white hover:border-bambu-green transition-colors"
-              >
-                <Power className="w-4 h-4" />
-                Power On
-                <ChevronDown className={`w-3 h-3 transition-transform ${showPowerDropdown ? 'rotate-180' : ''}`} />
-              </button>
-              {showPowerDropdown && (
-                <>
-                  {/* Backdrop to close dropdown */}
-                  <div
-                    className="fixed inset-0 z-10"
-                    onClick={() => setShowPowerDropdown(false)}
-                  />
-                  <div className="absolute right-0 mt-2 w-56 bg-white dark:bg-bambu-dark-secondary border border-gray-200 dark:border-bambu-dark-tertiary rounded-lg shadow-lg z-20 py-1">
-                    <div className="px-3 py-2 text-xs text-gray-500 dark:text-bambu-gray border-b border-gray-200 dark:border-bambu-dark-tertiary">
-                      Offline printers with smart plugs
-                    </div>
-                    {printers?.filter(p => smartPlugByPrinter[p.id]).map(printer => (
-                      <PowerDropdownItem
-                        key={printer.id}
-                        printer={printer}
-                        plug={smartPlugByPrinter[printer.id]}
-                        onPowerOn={(plugId) => {
-                          setPoweringOn(plugId);
-                          powerOnMutation.mutate(plugId);
-                        }}
-                        isPowering={poweringOn === smartPlugByPrinter[printer.id]?.id}
-                      />
-                    ))}
-                    {printers?.filter(p => smartPlugByPrinter[p.id]).length === 0 && (
-                      <div className="px-3 py-2 text-sm text-bambu-gray">
-                        No printers with smart plugs
-                      </div>
-                    )}
-                  </div>
-                </>
-              )}
-            </div>
-          )}
-          <Button onClick={() => setShowAddModal(true)}>
-            <Plus className="w-4 h-4" />
-            Add Printer
-          </Button>
-        </div>
-      </div>
- 
-      {isLoading ? (
-        <div className="text-center py-12 text-bambu-gray">Loading printers...</div>
-      ) : printers?.length === 0 ? (
-        <Card>
-          <CardContent className="text-center py-12">
-            <p className="text-bambu-gray mb-4">No printers configured yet</p>
-            <Button onClick={() => setShowAddModal(true)}>
-              <Plus className="w-4 h-4" />
-              Add Your First Printer
-            </Button>
-          </CardContent>
-        </Card>
-      ) : groupedPrinters ? (
-        /* Grouped by location view */
-        <div className="space-y-6">
-          {Object.entries(groupedPrinters).map(([location, locationPrinters]) => (
-            <div key={location}>
-              <h2 className="text-lg font-semibold text-white mb-3 flex items-center gap-2">
-                <span className="w-2 h-2 rounded-full bg-bambu-green" />
-                {location}
-                <span className="text-sm font-normal text-bambu-gray">({locationPrinters.length})</span>
-              </h2>
-              <div className={`grid gap-4 ${
-                viewMode === 'compact'
-                  ? 'grid-cols-1 md:grid-cols-2 lg:grid-cols-4'
-                  : 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6'
-              }`}>
-                {locationPrinters.map((printer) => (
-                  <PrinterCard
-                    key={printer.id}
-                    printer={printer}
-                    hideIfDisconnected={hideDisconnected}
-                    maintenanceInfo={maintenanceByPrinter[printer.id]}
-                    viewMode={viewMode}
-                    amsThresholds={settings ? {
-                      humidityGood: Number(settings.ams_humidity_good) || 40,
-                      humidityFair: Number(settings.ams_humidity_fair) || 60,
-                      tempGood: Number(settings.ams_temp_good) || 28,
-                      tempFair: Number(settings.ams_temp_fair) || 35,
-                    } : undefined}
-                  />
-                ))}
-              </div>
-            </div>
-          ))}
-        </div>
-      ) : (
-        /* Regular grid view */
-        <div className={`grid gap-4 ${
-          viewMode === 'compact'
-            ? 'grid-cols-1 md:grid-cols-2 lg:grid-cols-4'
-            : 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6'
-        }`}>
-          {sortedPrinters.map((printer) => (
-            <PrinterCard
-              key={printer.id}
-              printer={printer}
-              hideIfDisconnected={hideDisconnected}
-              maintenanceInfo={maintenanceByPrinter[printer.id]}
-              viewMode={viewMode}
-              amsThresholds={settings ? {
-                humidityGood: Number(settings.ams_humidity_good) || 40,
-                humidityFair: Number(settings.ams_humidity_fair) || 60,
-                tempGood: Number(settings.ams_temp_good) || 28,
-                tempFair: Number(settings.ams_temp_fair) || 35,
-              } : undefined}
-            />
-          ))}
-        </div>
-      )}
- 
-      {showAddModal && (
-        <AddPrinterModal
-          onClose={() => setShowAddModal(false)}
-          onAdd={(data) => addMutation.mutate(data)}
-        />
-      )}
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/pages/ProfilesPage.tsx.html b/frontend/coverage/src/pages/ProfilesPage.tsx.html deleted file mode 100644 index d733a4154..000000000 --- a/frontend/coverage/src/pages/ProfilesPage.tsx.html +++ /dev/null @@ -1,8740 +0,0 @@ - - - - - - Code coverage report for src/pages/ProfilesPage.tsx - - - - - - - - - -
-
-

All files / src/pages ProfilesPage.tsx

-
- -
- 0% - Statements - 0/2235 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/2235 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -425 -426 -427 -428 -429 -430 -431 -432 -433 -434 -435 -436 -437 -438 -439 -440 -441 -442 -443 -444 -445 -446 -447 -448 -449 -450 -451 -452 -453 -454 -455 -456 -457 -458 -459 -460 -461 -462 -463 -464 -465 -466 -467 -468 -469 -470 -471 -472 -473 -474 -475 -476 -477 -478 -479 -480 -481 -482 -483 -484 -485 -486 -487 -488 -489 -490 -491 -492 -493 -494 -495 -496 -497 -498 -499 -500 -501 -502 -503 -504 -505 -506 -507 -508 -509 -510 -511 -512 -513 -514 -515 -516 -517 -518 -519 -520 -521 -522 -523 -524 -525 -526 -527 -528 -529 -530 -531 -532 -533 -534 -535 -536 -537 -538 -539 -540 -541 -542 -543 -544 -545 -546 -547 -548 -549 -550 -551 -552 -553 -554 -555 -556 -557 -558 -559 -560 -561 -562 -563 -564 -565 -566 -567 -568 -569 -570 -571 -572 -573 -574 -575 -576 -577 -578 -579 -580 -581 -582 -583 -584 -585 -586 -587 -588 -589 -590 -591 -592 -593 -594 -595 -596 -597 -598 -599 -600 -601 -602 -603 -604 -605 -606 -607 -608 -609 -610 -611 -612 -613 -614 -615 -616 -617 -618 -619 -620 -621 -622 -623 -624 -625 -626 -627 -628 -629 -630 -631 -632 -633 -634 -635 -636 -637 -638 -639 -640 -641 -642 -643 -644 -645 -646 -647 -648 -649 -650 -651 -652 -653 -654 -655 -656 -657 -658 -659 -660 -661 -662 -663 -664 -665 -666 -667 -668 -669 -670 -671 -672 -673 -674 -675 -676 -677 -678 -679 -680 -681 -682 -683 -684 -685 -686 -687 -688 -689 -690 -691 -692 -693 -694 -695 -696 -697 -698 -699 -700 -701 -702 -703 -704 -705 -706 -707 -708 -709 -710 -711 -712 -713 -714 -715 -716 -717 -718 -719 -720 -721 -722 -723 -724 -725 -726 -727 -728 -729 -730 -731 -732 -733 -734 -735 -736 -737 -738 -739 -740 -741 -742 -743 -744 -745 -746 -747 -748 -749 -750 -751 -752 -753 -754 -755 -756 -757 -758 -759 -760 -761 -762 -763 -764 -765 -766 -767 -768 -769 -770 -771 -772 -773 -774 -775 -776 -777 -778 -779 -780 -781 -782 -783 -784 -785 -786 -787 -788 -789 -790 -791 -792 -793 -794 -795 -796 -797 -798 -799 -800 -801 -802 -803 -804 -805 -806 -807 -808 -809 -810 -811 -812 -813 -814 -815 -816 -817 -818 -819 -820 -821 -822 -823 -824 -825 -826 -827 -828 -829 -830 -831 -832 -833 -834 -835 -836 -837 -838 -839 -840 -841 -842 -843 -844 -845 -846 -847 -848 -849 -850 -851 -852 -853 -854 -855 -856 -857 -858 -859 -860 -861 -862 -863 -864 -865 -866 -867 -868 -869 -870 -871 -872 -873 -874 -875 -876 -877 -878 -879 -880 -881 -882 -883 -884 -885 -886 -887 -888 -889 -890 -891 -892 -893 -894 -895 -896 -897 -898 -899 -900 -901 -902 -903 -904 -905 -906 -907 -908 -909 -910 -911 -912 -913 -914 -915 -916 -917 -918 -919 -920 -921 -922 -923 -924 -925 -926 -927 -928 -929 -930 -931 -932 -933 -934 -935 -936 -937 -938 -939 -940 -941 -942 -943 -944 -945 -946 -947 -948 -949 -950 -951 -952 -953 -954 -955 -956 -957 -958 -959 -960 -961 -962 -963 -964 -965 -966 -967 -968 -969 -970 -971 -972 -973 -974 -975 -976 -977 -978 -979 -980 -981 -982 -983 -984 -985 -986 -987 -988 -989 -990 -991 -992 -993 -994 -995 -996 -997 -998 -999 -1000 -1001 -1002 -1003 -1004 -1005 -1006 -1007 -1008 -1009 -1010 -1011 -1012 -1013 -1014 -1015 -1016 -1017 -1018 -1019 -1020 -1021 -1022 -1023 -1024 -1025 -1026 -1027 -1028 -1029 -1030 -1031 -1032 -1033 -1034 -1035 -1036 -1037 -1038 -1039 -1040 -1041 -1042 -1043 -1044 -1045 -1046 -1047 -1048 -1049 -1050 -1051 -1052 -1053 -1054 -1055 -1056 -1057 -1058 -1059 -1060 -1061 -1062 -1063 -1064 -1065 -1066 -1067 -1068 -1069 -1070 -1071 -1072 -1073 -1074 -1075 -1076 -1077 -1078 -1079 -1080 -1081 -1082 -1083 -1084 -1085 -1086 -1087 -1088 -1089 -1090 -1091 -1092 -1093 -1094 -1095 -1096 -1097 -1098 -1099 -1100 -1101 -1102 -1103 -1104 -1105 -1106 -1107 -1108 -1109 -1110 -1111 -1112 -1113 -1114 -1115 -1116 -1117 -1118 -1119 -1120 -1121 -1122 -1123 -1124 -1125 -1126 -1127 -1128 -1129 -1130 -1131 -1132 -1133 -1134 -1135 -1136 -1137 -1138 -1139 -1140 -1141 -1142 -1143 -1144 -1145 -1146 -1147 -1148 -1149 -1150 -1151 -1152 -1153 -1154 -1155 -1156 -1157 -1158 -1159 -1160 -1161 -1162 -1163 -1164 -1165 -1166 -1167 -1168 -1169 -1170 -1171 -1172 -1173 -1174 -1175 -1176 -1177 -1178 -1179 -1180 -1181 -1182 -1183 -1184 -1185 -1186 -1187 -1188 -1189 -1190 -1191 -1192 -1193 -1194 -1195 -1196 -1197 -1198 -1199 -1200 -1201 -1202 -1203 -1204 -1205 -1206 -1207 -1208 -1209 -1210 -1211 -1212 -1213 -1214 -1215 -1216 -1217 -1218 -1219 -1220 -1221 -1222 -1223 -1224 -1225 -1226 -1227 -1228 -1229 -1230 -1231 -1232 -1233 -1234 -1235 -1236 -1237 -1238 -1239 -1240 -1241 -1242 -1243 -1244 -1245 -1246 -1247 -1248 -1249 -1250 -1251 -1252 -1253 -1254 -1255 -1256 -1257 -1258 -1259 -1260 -1261 -1262 -1263 -1264 -1265 -1266 -1267 -1268 -1269 -1270 -1271 -1272 -1273 -1274 -1275 -1276 -1277 -1278 -1279 -1280 -1281 -1282 -1283 -1284 -1285 -1286 -1287 -1288 -1289 -1290 -1291 -1292 -1293 -1294 -1295 -1296 -1297 -1298 -1299 -1300 -1301 -1302 -1303 -1304 -1305 -1306 -1307 -1308 -1309 -1310 -1311 -1312 -1313 -1314 -1315 -1316 -1317 -1318 -1319 -1320 -1321 -1322 -1323 -1324 -1325 -1326 -1327 -1328 -1329 -1330 -1331 -1332 -1333 -1334 -1335 -1336 -1337 -1338 -1339 -1340 -1341 -1342 -1343 -1344 -1345 -1346 -1347 -1348 -1349 -1350 -1351 -1352 -1353 -1354 -1355 -1356 -1357 -1358 -1359 -1360 -1361 -1362 -1363 -1364 -1365 -1366 -1367 -1368 -1369 -1370 -1371 -1372 -1373 -1374 -1375 -1376 -1377 -1378 -1379 -1380 -1381 -1382 -1383 -1384 -1385 -1386 -1387 -1388 -1389 -1390 -1391 -1392 -1393 -1394 -1395 -1396 -1397 -1398 -1399 -1400 -1401 -1402 -1403 -1404 -1405 -1406 -1407 -1408 -1409 -1410 -1411 -1412 -1413 -1414 -1415 -1416 -1417 -1418 -1419 -1420 -1421 -1422 -1423 -1424 -1425 -1426 -1427 -1428 -1429 -1430 -1431 -1432 -1433 -1434 -1435 -1436 -1437 -1438 -1439 -1440 -1441 -1442 -1443 -1444 -1445 -1446 -1447 -1448 -1449 -1450 -1451 -1452 -1453 -1454 -1455 -1456 -1457 -1458 -1459 -1460 -1461 -1462 -1463 -1464 -1465 -1466 -1467 -1468 -1469 -1470 -1471 -1472 -1473 -1474 -1475 -1476 -1477 -1478 -1479 -1480 -1481 -1482 -1483 -1484 -1485 -1486 -1487 -1488 -1489 -1490 -1491 -1492 -1493 -1494 -1495 -1496 -1497 -1498 -1499 -1500 -1501 -1502 -1503 -1504 -1505 -1506 -1507 -1508 -1509 -1510 -1511 -1512 -1513 -1514 -1515 -1516 -1517 -1518 -1519 -1520 -1521 -1522 -1523 -1524 -1525 -1526 -1527 -1528 -1529 -1530 -1531 -1532 -1533 -1534 -1535 -1536 -1537 -1538 -1539 -1540 -1541 -1542 -1543 -1544 -1545 -1546 -1547 -1548 -1549 -1550 -1551 -1552 -1553 -1554 -1555 -1556 -1557 -1558 -1559 -1560 -1561 -1562 -1563 -1564 -1565 -1566 -1567 -1568 -1569 -1570 -1571 -1572 -1573 -1574 -1575 -1576 -1577 -1578 -1579 -1580 -1581 -1582 -1583 -1584 -1585 -1586 -1587 -1588 -1589 -1590 -1591 -1592 -1593 -1594 -1595 -1596 -1597 -1598 -1599 -1600 -1601 -1602 -1603 -1604 -1605 -1606 -1607 -1608 -1609 -1610 -1611 -1612 -1613 -1614 -1615 -1616 -1617 -1618 -1619 -1620 -1621 -1622 -1623 -1624 -1625 -1626 -1627 -1628 -1629 -1630 -1631 -1632 -1633 -1634 -1635 -1636 -1637 -1638 -1639 -1640 -1641 -1642 -1643 -1644 -1645 -1646 -1647 -1648 -1649 -1650 -1651 -1652 -1653 -1654 -1655 -1656 -1657 -1658 -1659 -1660 -1661 -1662 -1663 -1664 -1665 -1666 -1667 -1668 -1669 -1670 -1671 -1672 -1673 -1674 -1675 -1676 -1677 -1678 -1679 -1680 -1681 -1682 -1683 -1684 -1685 -1686 -1687 -1688 -1689 -1690 -1691 -1692 -1693 -1694 -1695 -1696 -1697 -1698 -1699 -1700 -1701 -1702 -1703 -1704 -1705 -1706 -1707 -1708 -1709 -1710 -1711 -1712 -1713 -1714 -1715 -1716 -1717 -1718 -1719 -1720 -1721 -1722 -1723 -1724 -1725 -1726 -1727 -1728 -1729 -1730 -1731 -1732 -1733 -1734 -1735 -1736 -1737 -1738 -1739 -1740 -1741 -1742 -1743 -1744 -1745 -1746 -1747 -1748 -1749 -1750 -1751 -1752 -1753 -1754 -1755 -1756 -1757 -1758 -1759 -1760 -1761 -1762 -1763 -1764 -1765 -1766 -1767 -1768 -1769 -1770 -1771 -1772 -1773 -1774 -1775 -1776 -1777 -1778 -1779 -1780 -1781 -1782 -1783 -1784 -1785 -1786 -1787 -1788 -1789 -1790 -1791 -1792 -1793 -1794 -1795 -1796 -1797 -1798 -1799 -1800 -1801 -1802 -1803 -1804 -1805 -1806 -1807 -1808 -1809 -1810 -1811 -1812 -1813 -1814 -1815 -1816 -1817 -1818 -1819 -1820 -1821 -1822 -1823 -1824 -1825 -1826 -1827 -1828 -1829 -1830 -1831 -1832 -1833 -1834 -1835 -1836 -1837 -1838 -1839 -1840 -1841 -1842 -1843 -1844 -1845 -1846 -1847 -1848 -1849 -1850 -1851 -1852 -1853 -1854 -1855 -1856 -1857 -1858 -1859 -1860 -1861 -1862 -1863 -1864 -1865 -1866 -1867 -1868 -1869 -1870 -1871 -1872 -1873 -1874 -1875 -1876 -1877 -1878 -1879 -1880 -1881 -1882 -1883 -1884 -1885 -1886 -1887 -1888 -1889 -1890 -1891 -1892 -1893 -1894 -1895 -1896 -1897 -1898 -1899 -1900 -1901 -1902 -1903 -1904 -1905 -1906 -1907 -1908 -1909 -1910 -1911 -1912 -1913 -1914 -1915 -1916 -1917 -1918 -1919 -1920 -1921 -1922 -1923 -1924 -1925 -1926 -1927 -1928 -1929 -1930 -1931 -1932 -1933 -1934 -1935 -1936 -1937 -1938 -1939 -1940 -1941 -1942 -1943 -1944 -1945 -1946 -1947 -1948 -1949 -1950 -1951 -1952 -1953 -1954 -1955 -1956 -1957 -1958 -1959 -1960 -1961 -1962 -1963 -1964 -1965 -1966 -1967 -1968 -1969 -1970 -1971 -1972 -1973 -1974 -1975 -1976 -1977 -1978 -1979 -1980 -1981 -1982 -1983 -1984 -1985 -1986 -1987 -1988 -1989 -1990 -1991 -1992 -1993 -1994 -1995 -1996 -1997 -1998 -1999 -2000 -2001 -2002 -2003 -2004 -2005 -2006 -2007 -2008 -2009 -2010 -2011 -2012 -2013 -2014 -2015 -2016 -2017 -2018 -2019 -2020 -2021 -2022 -2023 -2024 -2025 -2026 -2027 -2028 -2029 -2030 -2031 -2032 -2033 -2034 -2035 -2036 -2037 -2038 -2039 -2040 -2041 -2042 -2043 -2044 -2045 -2046 -2047 -2048 -2049 -2050 -2051 -2052 -2053 -2054 -2055 -2056 -2057 -2058 -2059 -2060 -2061 -2062 -2063 -2064 -2065 -2066 -2067 -2068 -2069 -2070 -2071 -2072 -2073 -2074 -2075 -2076 -2077 -2078 -2079 -2080 -2081 -2082 -2083 -2084 -2085 -2086 -2087 -2088 -2089 -2090 -2091 -2092 -2093 -2094 -2095 -2096 -2097 -2098 -2099 -2100 -2101 -2102 -2103 -2104 -2105 -2106 -2107 -2108 -2109 -2110 -2111 -2112 -2113 -2114 -2115 -2116 -2117 -2118 -2119 -2120 -2121 -2122 -2123 -2124 -2125 -2126 -2127 -2128 -2129 -2130 -2131 -2132 -2133 -2134 -2135 -2136 -2137 -2138 -2139 -2140 -2141 -2142 -2143 -2144 -2145 -2146 -2147 -2148 -2149 -2150 -2151 -2152 -2153 -2154 -2155 -2156 -2157 -2158 -2159 -2160 -2161 -2162 -2163 -2164 -2165 -2166 -2167 -2168 -2169 -2170 -2171 -2172 -2173 -2174 -2175 -2176 -2177 -2178 -2179 -2180 -2181 -2182 -2183 -2184 -2185 -2186 -2187 -2188 -2189 -2190 -2191 -2192 -2193 -2194 -2195 -2196 -2197 -2198 -2199 -2200 -2201 -2202 -2203 -2204 -2205 -2206 -2207 -2208 -2209 -2210 -2211 -2212 -2213 -2214 -2215 -2216 -2217 -2218 -2219 -2220 -2221 -2222 -2223 -2224 -2225 -2226 -2227 -2228 -2229 -2230 -2231 -2232 -2233 -2234 -2235 -2236 -2237 -2238 -2239 -2240 -2241 -2242 -2243 -2244 -2245 -2246 -2247 -2248 -2249 -2250 -2251 -2252 -2253 -2254 -2255 -2256 -2257 -2258 -2259 -2260 -2261 -2262 -2263 -2264 -2265 -2266 -2267 -2268 -2269 -2270 -2271 -2272 -2273 -2274 -2275 -2276 -2277 -2278 -2279 -2280 -2281 -2282 -2283 -2284 -2285 -2286 -2287 -2288 -2289 -2290 -2291 -2292 -2293 -2294 -2295 -2296 -2297 -2298 -2299 -2300 -2301 -2302 -2303 -2304 -2305 -2306 -2307 -2308 -2309 -2310 -2311 -2312 -2313 -2314 -2315 -2316 -2317 -2318 -2319 -2320 -2321 -2322 -2323 -2324 -2325 -2326 -2327 -2328 -2329 -2330 -2331 -2332 -2333 -2334 -2335 -2336 -2337 -2338 -2339 -2340 -2341 -2342 -2343 -2344 -2345 -2346 -2347 -2348 -2349 -2350 -2351 -2352 -2353 -2354 -2355 -2356 -2357 -2358 -2359 -2360 -2361 -2362 -2363 -2364 -2365 -2366 -2367 -2368 -2369 -2370 -2371 -2372 -2373 -2374 -2375 -2376 -2377 -2378 -2379 -2380 -2381 -2382 -2383 -2384 -2385 -2386 -2387 -2388 -2389 -2390 -2391 -2392 -2393 -2394 -2395 -2396 -2397 -2398 -2399 -2400 -2401 -2402 -2403 -2404 -2405 -2406 -2407 -2408 -2409 -2410 -2411 -2412 -2413 -2414 -2415 -2416 -2417 -2418 -2419 -2420 -2421 -2422 -2423 -2424 -2425 -2426 -2427 -2428 -2429 -2430 -2431 -2432 -2433 -2434 -2435 -2436 -2437 -2438 -2439 -2440 -2441 -2442 -2443 -2444 -2445 -2446 -2447 -2448 -2449 -2450 -2451 -2452 -2453 -2454 -2455 -2456 -2457 -2458 -2459 -2460 -2461 -2462 -2463 -2464 -2465 -2466 -2467 -2468 -2469 -2470 -2471 -2472 -2473 -2474 -2475 -2476 -2477 -2478 -2479 -2480 -2481 -2482 -2483 -2484 -2485 -2486 -2487 -2488 -2489 -2490 -2491 -2492 -2493 -2494 -2495 -2496 -2497 -2498 -2499 -2500 -2501 -2502 -2503 -2504 -2505 -2506 -2507 -2508 -2509 -2510 -2511 -2512 -2513 -2514 -2515 -2516 -2517 -2518 -2519 -2520 -2521 -2522 -2523 -2524 -2525 -2526 -2527 -2528 -2529 -2530 -2531 -2532 -2533 -2534 -2535 -2536 -2537 -2538 -2539 -2540 -2541 -2542 -2543 -2544 -2545 -2546 -2547 -2548 -2549 -2550 -2551 -2552 -2553 -2554 -2555 -2556 -2557 -2558 -2559 -2560 -2561 -2562 -2563 -2564 -2565 -2566 -2567 -2568 -2569 -2570 -2571 -2572 -2573 -2574 -2575 -2576 -2577 -2578 -2579 -2580 -2581 -2582 -2583 -2584 -2585 -2586 -2587 -2588 -2589 -2590 -2591 -2592 -2593 -2594 -2595 -2596 -2597 -2598 -2599 -2600 -2601 -2602 -2603 -2604 -2605 -2606 -2607 -2608 -2609 -2610 -2611 -2612 -2613 -2614 -2615 -2616 -2617 -2618 -2619 -2620 -2621 -2622 -2623 -2624 -2625 -2626 -2627 -2628 -2629 -2630 -2631 -2632 -2633 -2634 -2635 -2636 -2637 -2638 -2639 -2640 -2641 -2642 -2643 -2644 -2645 -2646 -2647 -2648 -2649 -2650 -2651 -2652 -2653 -2654 -2655 -2656 -2657 -2658 -2659 -2660 -2661 -2662 -2663 -2664 -2665 -2666 -2667 -2668 -2669 -2670 -2671 -2672 -2673 -2674 -2675 -2676 -2677 -2678 -2679 -2680 -2681 -2682 -2683 -2684 -2685 -2686 -2687 -2688 -2689 -2690 -2691 -2692 -2693 -2694 -2695 -2696 -2697 -2698 -2699 -2700 -2701 -2702 -2703 -2704 -2705 -2706 -2707 -2708 -2709 -2710 -2711 -2712 -2713 -2714 -2715 -2716 -2717 -2718 -2719 -2720 -2721 -2722 -2723 -2724 -2725 -2726 -2727 -2728 -2729 -2730 -2731 -2732 -2733 -2734 -2735 -2736 -2737 -2738 -2739 -2740 -2741 -2742 -2743 -2744 -2745 -2746 -2747 -2748 -2749 -2750 -2751 -2752 -2753 -2754 -2755 -2756 -2757 -2758 -2759 -2760 -2761 -2762 -2763 -2764 -2765 -2766 -2767 -2768 -2769 -2770 -2771 -2772 -2773 -2774 -2775 -2776 -2777 -2778 -2779 -2780 -2781 -2782 -2783 -2784 -2785 -2786 -2787 -2788 -2789 -2790 -2791 -2792 -2793 -2794 -2795 -2796 -2797 -2798 -2799 -2800 -2801 -2802 -2803 -2804 -2805 -2806 -2807 -2808 -2809 -2810 -2811 -2812 -2813 -2814 -2815 -2816 -2817 -2818 -2819 -2820 -2821 -2822 -2823 -2824 -2825 -2826 -2827 -2828 -2829 -2830 -2831 -2832 -2833 -2834 -2835 -2836 -2837 -2838 -2839 -2840 -2841 -2842 -2843 -2844 -2845 -2846 -2847 -2848 -2849 -2850 -2851 -2852 -2853 -2854 -2855 -2856 -2857 -2858 -2859 -2860 -2861 -2862 -2863 -2864 -2865 -2866 -2867 -2868 -2869 -2870 -2871 -2872 -2873 -2874 -2875 -2876 -2877 -2878 -2879 -2880 -2881 -2882 -2883 -2884 -2885 -2886  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useEffect, useMemo } from 'react';
-import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
-import {
-  Cloud,
-  LogIn,
-  LogOut,
-  Loader2,
-  Settings2,
-  Printer as PrinterIcon,
-  Droplet,
-  X,
-  Key,
-  RefreshCw,
-  Gauge,
-  Pencil,
-  Trash2,
-  Save,
-  AlertTriangle,
-  Search,
-  Plus,
-  Copy,
-  Clock,
-  Layers,
-  Filter,
-  ChevronDown,
-  ArrowUp,
-  Upload,
-  Download,
-  Sparkles,
-  Check,
-  AlertCircle,
-  Code,
-  Sliders,
-  List,
-  Eye,
-  EyeOff,
-  GitCompare,
-  ArrowRight,
-  Equal,
-  Minus as MinusIcon,
-  Plus as PlusIcon,
-} from 'lucide-react';
-import { api } from '../api/client';
-import type { SlicerSetting, SlicerSettingsResponse, SlicerSettingDetail, SlicerSettingCreate, Printer, FieldDefinition } from '../api/client';
-import { Card, CardContent } from '../components/Card';
-import { Button } from '../components/Button';
-import { useToast } from '../contexts/ToastContext';
-import { KProfilesView } from '../components/KProfilesView';
- 
-type ProfileTab = 'cloud' | 'kprofiles';
-type LoginStep = 'email' | 'code' | 'token';
-type PresetType = 'all' | 'filament' | 'printer' | 'process';
- 
-// Extract metadata from preset name or inherits field
-function extractMetadata(name: string, inherits?: string): {
-  printer: string | null;
-  nozzle: string | null;
-  layerHeight: string | null;
-  filamentType: string | null;
-} {
-  const searchIn = `${name} ${inherits || ''}`;
- 
-  // Extract printer (e.g., "X1C", "P1S", "A1", "H2D")
-  const printerMatch = searchIn.match(/@?\s*(?:BBL\s+)?(?:Bambu\s+Lab\s+)?([XPAH][1-9][A-Z]?(?:\s*(?:Carbon|mini))?|H2D)/i);
-  const printer = printerMatch ? printerMatch[1].trim() : null;
- 
-  // Extract nozzle size (e.g., "0.4 nozzle", "0.6mm")
-  const nozzleMatch = searchIn.match(/(\d+\.?\d*)\s*(?:mm\s*)?nozzle|nozzle\s*(\d+\.?\d*)/i);
-  const nozzle = nozzleMatch ? (nozzleMatch[1] || nozzleMatch[2]) + 'mm' : null;
- 
-  // Extract layer height (e.g., "0.20mm", "0.08mm Extra Fine")
-  const layerMatch = searchIn.match(/(\d+\.?\d*)mm\s*(?:Standard|Fine|Extra Fine|Draft|Quality)?/i);
-  const layerHeight = layerMatch ? layerMatch[1] + 'mm' : null;
- 
-  // Extract filament type (e.g., "PLA", "PETG", "ABS", "TPU")
-  const filamentMatch = searchIn.match(/\b(PLA|PETG|ABS|ASA|TPU|PC|PA|PVA|HIPS|PP|PET(?:-?CF)?|PA(?:-?CF)?|PLA(?:-?CF)?)\b/i);
-  const filamentType = filamentMatch ? filamentMatch[1].toUpperCase() : null;
- 
-  return { printer, nozzle, layerHeight, filamentType };
-}
- 
-// Check if preset is user-created (editable)
-function isUserPreset(settingId: string): boolean {
-  return /^(P[FPM]US|PF\d|PP\d)/.test(settingId);
-}
- 
-// Format relative time
-function formatRelativeTime(dateStr: string): string {
-  const date = new Date(dateStr);
-  const now = new Date();
-  const diffMs = now.getTime() - date.getTime();
-  const diffMins = Math.floor(diffMs / 60000);
-  const diffHours = Math.floor(diffMs / 3600000);
-  const diffDays = Math.floor(diffMs / 86400000);
- 
-  if (diffMins < 1) return 'Just now';
-  if (diffMins < 60) return `${diffMins}m ago`;
-  if (diffHours < 24) return `${diffHours}h ago`;
-  if (diffDays < 7) return `${diffDays}d ago`;
-  return date.toLocaleDateString();
-}
- 
-// ============================================================================
-// LOGIN FORM
-// ============================================================================
- 
-function LoginForm({ onSuccess }: { onSuccess: () => void }) {
-  const { showToast } = useToast();
-  const [step, setStep] = useState<LoginStep>('email');
-  const [email, setEmail] = useState('');
-  const [password, setPassword] = useState('');
-  const [code, setCode] = useState('');
-  const [token, setToken] = useState('');
-  const [region, setRegion] = useState('global');
- 
-  const loginMutation = useMutation({
-    mutationFn: () => api.cloudLogin(email, password, region),
-    onSuccess: (result) => {
-      if (result.success) {
-        showToast('Logged in successfully');
-        onSuccess();
-      } else if (result.needs_verification) {
-        showToast('Verification code sent to your email');
-        setStep('code');
-      } else {
-        showToast(result.message, 'error');
-      }
-    },
-    onError: (error: Error) => showToast(error.message, 'error'),
-  });
- 
-  const verifyMutation = useMutation({
-    mutationFn: () => api.cloudVerify(email, code),
-    onSuccess: (result) => {
-      if (result.success) {
-        showToast('Logged in successfully');
-        onSuccess();
-      } else {
-        showToast(result.message, 'error');
-      }
-    },
-    onError: (error: Error) => showToast(error.message, 'error'),
-  });
- 
-  const tokenMutation = useMutation({
-    mutationFn: () => api.cloudSetToken(token),
-    onSuccess: () => {
-      showToast('Token set successfully');
-      onSuccess();
-    },
-    onError: (error: Error) => showToast(error.message, 'error'),
-  });
- 
-  const handleSubmit = (e: React.FormEvent) => {
-    e.preventDefault();
-    if (step === 'email') loginMutation.mutate();
-    else if (step === 'code') verifyMutation.mutate();
-    else if (step === 'token') tokenMutation.mutate();
-  };
- 
-  const isPending = loginMutation.isPending || verifyMutation.isPending || tokenMutation.isPending;
- 
-  return (
-    <Card className="max-w-md mx-auto">
-      <CardContent>
-        <div className="text-center mb-6">
-          <div className="inline-flex items-center justify-center w-12 h-12 rounded-xl bg-bambu-green/20 mb-3">
-            <Cloud className="w-6 h-6 text-bambu-green" />
-          </div>
-          <h2 className="text-xl font-semibold text-white">Connect to Bambu Cloud</h2>
-          <p className="text-sm text-bambu-gray mt-1">Sync your slicer presets across devices</p>
-        </div>
- 
-        <form onSubmit={handleSubmit} className="space-y-4">
-          {step === 'email' && (
-            <>
-              <div>
-                <label className="block text-sm text-bambu-gray mb-1">Email</label>
-                <input
-                  type="email"
-                  value={email}
-                  onChange={(e) => setEmail(e.target.value)}
-                  className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray-dark focus:border-bambu-green focus:outline-none"
-                  placeholder="your@email.com"
-                  required
-                />
-              </div>
-              <div>
-                <label className="block text-sm text-bambu-gray mb-1">Password</label>
-                <input
-                  type="password"
-                  value={password}
-                  onChange={(e) => setPassword(e.target.value)}
-                  className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray-dark focus:border-bambu-green focus:outline-none"
-                  placeholder="••••••••"
-                  required
-                />
-              </div>
-              <div>
-                <label className="block text-sm text-bambu-gray mb-1">Region</label>
-                <select
-                  value={region}
-                  onChange={(e) => setRegion(e.target.value)}
-                  className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                >
-                  <option value="global">Global</option>
-                  <option value="china">China</option>
-                </select>
-              </div>
-            </>
-          )}
- 
-          {step === 'code' && (
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">Verification Code</label>
-              <p className="text-xs text-bambu-gray mb-2">Check your email ({email}) for a 6-digit code</p>
-              <input
-                type="text"
-                value={code}
-                onChange={(e) => setCode(e.target.value.replace(/\D/g, '').slice(0, 6))}
-                className="w-full px-3 py-3 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-center text-2xl tracking-widest font-mono focus:border-bambu-green focus:outline-none"
-                placeholder="000000"
-                maxLength={6}
-                required
-              />
-            </div>
-          )}
- 
-          {step === 'token' && (
-            <div>
-              <label className="block text-sm text-bambu-gray mb-1">Access Token</label>
-              <p className="text-xs text-bambu-gray mb-2">Paste your Bambu Lab access token (from Bambu Studio)</p>
-              <textarea
-                value={token}
-                onChange={(e) => setToken(e.target.value)}
-                className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-xs font-mono placeholder-bambu-gray-dark focus:border-bambu-green focus:outline-none resize-none"
-                placeholder="eyJ..."
-                rows={4}
-                required
-              />
-            </div>
-          )}
- 
-          <div className="flex gap-2">
-            {step === 'code' && (
-              <Button type="button" variant="secondary" onClick={() => setStep('email')} className="flex-1">
-                Back
-              </Button>
-            )}
-            <Button type="submit" disabled={isPending} className="flex-1">
-              {isPending ? <Loader2 className="w-4 h-4 animate-spin" /> : <LogIn className="w-4 h-4" />}
-              {step === 'email' ? 'Login' : step === 'code' ? 'Verify' : 'Set Token'}
-            </Button>
-          </div>
- 
-          {step === 'email' && (
-            <div className="pt-4 border-t border-bambu-dark-tertiary">
-              <button
-                type="button"
-                onClick={() => setStep('token')}
-                className="text-sm text-bambu-gray hover:text-white flex items-center gap-2 transition-colors"
-              >
-                <Key className="w-4 h-4" />
-                Use access token instead
-              </button>
-            </div>
-          )}
- 
-          {step === 'token' && (
-            <div className="pt-4 border-t border-bambu-dark-tertiary">
-              <button
-                type="button"
-                onClick={() => setStep('email')}
-                className="text-sm text-bambu-gray hover:text-white flex items-center gap-2 transition-colors"
-              >
-                <LogIn className="w-4 h-4" />
-                Login with email instead
-              </button>
-            </div>
-          )}
-        </form>
-      </CardContent>
-    </Card>
-  );
-}
- 
-// ============================================================================
-// FILTER DROPDOWN
-// ============================================================================
- 
-function FilterDropdown({
-  label,
-  value,
-  options,
-  onChange,
-}: {
-  label: string;
-  value: string;
-  options: { value: string; label: string; count?: number }[];
-  onChange: (value: string) => void;
-}) {
-  const [isOpen, setIsOpen] = useState(false);
-  const selectedOption = options.find(o => o.value === value);
- 
-  return (
-    <div className="relative">
-      <button
-        onClick={() => setIsOpen(!isOpen)}
-        className="flex items-center gap-2 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-sm text-white hover:border-bambu-gray-dark transition-colors"
-      >
-        <span className="text-bambu-gray">{label}:</span>
-        <span>{selectedOption?.label || 'All'}</span>
-        <ChevronDown className={`w-4 h-4 text-bambu-gray transition-transform ${isOpen ? 'rotate-180' : ''}`} />
-      </button>
- 
-      {isOpen && (
-        <>
-          <div className="fixed inset-0 z-10" onClick={() => setIsOpen(false)} />
-          <div className="absolute top-full left-0 mt-1 min-w-[160px] bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg shadow-xl z-20 py-1 max-h-60 overflow-y-auto">
-            {options.map((option) => (
-              <button
-                key={option.value}
-                onClick={() => { onChange(option.value); setIsOpen(false); }}
-                className={`w-full px-3 py-2 text-left text-sm flex items-center justify-between hover:bg-bambu-dark-tertiary transition-colors ${
-                  value === option.value ? 'text-bambu-green' : 'text-white'
-                }`}
-              >
-                <span>{option.label}</span>
-                {option.count !== undefined && (
-                  <span className="text-bambu-gray text-xs">{option.count}</span>
-                )}
-              </button>
-            ))}
-          </div>
-        </>
-      )}
-    </div>
-  );
-}
- 
-// ============================================================================
-// SCROLL TO TOP BUTTON
-// ============================================================================
- 
-function ScrollToTop() {
-  const [isVisible, setIsVisible] = useState(false);
- 
-  useEffect(() => {
-    const toggleVisibility = () => {
-      setIsVisible(window.scrollY > 300);
-    };
- 
-    window.addEventListener('scroll', toggleVisibility);
-    return () => window.removeEventListener('scroll', toggleVisibility);
-  }, []);
- 
-  const scrollToTop = () => {
-    window.scrollTo({ top: 0, behavior: 'smooth' });
-  };
- 
-  if (!isVisible) return null;
- 
-  return (
-    <button
-      onClick={scrollToTop}
-      className="fixed bottom-6 right-6 p-3 bg-bambu-green hover:bg-bambu-green-light text-white rounded-full shadow-lg shadow-bambu-green/25 transition-all z-40"
-      aria-label="Scroll to top"
-    >
-      <ArrowUp className="w-5 h-5" />
-    </button>
-  );
-}
- 
-// ============================================================================
-// PRESET LIST ITEM (compact row style like K-Profiles)
-// ============================================================================
- 
-function PresetListItem({
-  setting,
-  onClick,
-  onDuplicate,
-  compareMode,
-  isCompareSelected,
-  compareIndex,
-  compareDisabled,
-}: {
-  setting: SlicerSetting;
-  onClick: () => void;
-  onDuplicate: () => void;
-  compareMode?: boolean;
-  isCompareSelected?: boolean;
-  compareIndex?: number;
-  compareDisabled?: boolean;
-}) {
-  const metadata = extractMetadata(setting.name);
-  const isEditable = isUserPreset(setting.setting_id);
- 
-  return (
-    <div className="flex items-center gap-2 group">
-      <button
-        onClick={onClick}
-        disabled={compareDisabled}
-        className={`flex-1 text-left px-3 py-2 rounded transition-colors ${
-          isCompareSelected
-            ? 'bg-blue-500/20 border border-blue-500/50'
-            : compareDisabled
-              ? 'bg-bambu-dark/50 opacity-40 cursor-not-allowed'
-              : 'bg-bambu-dark hover:bg-bambu-dark-tertiary'
-        } ${compareMode && !compareDisabled ? 'cursor-pointer' : ''}`}
-      >
-        <div className="flex items-center gap-2">
-          {isCompareSelected && compareIndex !== undefined && (
-            <span className="flex-shrink-0 w-5 h-5 rounded-full bg-blue-500 text-white text-xs flex items-center justify-center font-medium">
-              {compareIndex + 1}
-            </span>
-          )}
-          {!isCompareSelected && isEditable && (
-            <span className="flex-shrink-0 w-1.5 h-1.5 rounded-full bg-bambu-green" title="My preset (editable)" />
-          )}
-          <span className="text-white text-sm truncate flex-1" title={setting.name}>
-            {setting.name}
-          </span>
-          {/* Show relevant metadata tag */}
-          {metadata.filamentType && setting.type === 'filament' && (
-            <span className="text-xs text-bambu-gray whitespace-nowrap">
-              {metadata.filamentType}
-            </span>
-          )}
-          {metadata.layerHeight && setting.type === 'process' && (
-            <span className="text-xs text-bambu-gray whitespace-nowrap">
-              {metadata.layerHeight}
-            </span>
-          )}
-          {metadata.printer && (
-            <span className="text-xs text-bambu-gray whitespace-nowrap">
-              {metadata.printer}
-            </span>
-          )}
-        </div>
-      </button>
-      <button
-        onClick={(e) => { e.stopPropagation(); onDuplicate(); }}
-        className="opacity-0 group-hover:opacity-100 text-bambu-gray hover:text-white transition-all p-1"
-        title="Duplicate"
-      >
-        <Copy className="w-4 h-4" />
-      </button>
-    </div>
-  );
-}
- 
-// ============================================================================
-// PRESET DETAIL MODAL
-// ============================================================================
- 
-// Format JSON for display, converting escaped newlines to real newlines in string values
-function formatJsonForDisplay(obj: unknown, indent = 0): string {
-  const spaces = '  '.repeat(indent);
- 
-  if (obj === null) return 'null';
-  if (obj === undefined) return 'undefined';
- 
-  if (typeof obj === 'string') {
-    // Convert escaped newlines to actual newlines for readability
-    if (obj.includes('\\n') || obj.includes('\n')) {
-      const formatted = obj
-        .replace(/\\n/g, '\n')
-        .replace(/\\"/g, '"')
-        .replace(/\\t/g, '\t');
-      // For multi-line strings, show them nicely indented
-      const lines = formatted.split('\n');
-      if (lines.length > 1) {
-        return '"""\n' + lines.map(l => spaces + '  ' + l).join('\n') + '\n' + spaces + '"""';
-      }
-    }
-    return JSON.stringify(obj);
-  }
- 
-  if (typeof obj === 'number' || typeof obj === 'boolean') {
-    return String(obj);
-  }
- 
-  if (Array.isArray(obj)) {
-    if (obj.length === 0) return '[]';
-    const items = obj.map(item => spaces + '  ' + formatJsonForDisplay(item, indent + 1));
-    return '[\n' + items.join(',\n') + '\n' + spaces + ']';
-  }
- 
-  if (typeof obj === 'object') {
-    const entries = Object.entries(obj);
-    if (entries.length === 0) return '{}';
-    const items = entries.map(([key, val]) =>
-      spaces + '  ' + JSON.stringify(key) + ': ' + formatJsonForDisplay(val, indent + 1)
-    );
-    return '{\n' + items.join(',\n') + '\n' + spaces + '}';
-  }
- 
-  return String(obj);
-}
- 
-function PresetDetailModal({
-  setting,
-  onClose,
-  onDeleted,
-  onDuplicate,
-  onEdit,
-}: {
-  setting: SlicerSetting;
-  onClose: () => void;
-  onDeleted: () => void;
-  onDuplicate: () => void;
-  onEdit: () => void;
-}) {
-  const { showToast } = useToast();
-  const queryClient = useQueryClient();
-  const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);
- 
-  const { data: detail, isLoading } = useQuery<SlicerSettingDetail>({
-    queryKey: ['cloudSettingDetail', setting.setting_id],
-    queryFn: () => api.getCloudSettingDetail(setting.setting_id),
-  });
- 
-  const deleteMutation = useMutation({
-    mutationFn: () => api.deleteCloudSetting(setting.setting_id),
-    onSuccess: () => {
-      showToast('Preset deleted');
-      queryClient.invalidateQueries({ queryKey: ['cloudSettings'] });
-      onDeleted();
-    },
-    onError: (error: Error) => showToast(error.message, 'error'),
-  });
- 
-  const isEditable = isUserPreset(setting.setting_id);
-  const metadata = extractMetadata(setting.name, detail?.setting?.inherits as string);
- 
-  return (
-    <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4">
-      <Card className="w-full max-w-3xl max-h-[90vh] flex flex-col overflow-hidden">
-        <CardContent className="p-0 flex flex-col min-h-0 flex-1">
-          {/* Header */}
-          <div className="flex-shrink-0 flex items-center justify-between p-4 border-b border-bambu-dark-tertiary">
-            <div className="flex-1 min-w-0">
-              <div className="flex items-center gap-2">
-                <h2 className="text-xl font-semibold text-white truncate">{setting.name}</h2>
-                {isEditable && (
-                  <span className="px-2 py-0.5 text-xs font-medium bg-bambu-green/20 text-bambu-green rounded-full">
-                    Editable
-                  </span>
-                )}
-              </div>
-              <div className="flex items-center gap-2 mt-1 text-sm text-bambu-gray">
-                <span className="capitalize">{setting.type} preset</span>
-                {metadata.printer && <><span>•</span><span>{metadata.printer}</span></>}
-              </div>
-            </div>
-            <button onClick={onClose} className="p-2 text-bambu-gray hover:text-white hover:bg-bambu-dark-tertiary rounded-lg transition-colors">
-              <X className="w-5 h-5" />
-            </button>
-          </div>
- 
-          {/* Content */}
-          <div className="flex-1 min-h-0 overflow-y-auto p-4">
-            {isLoading ? (
-              <div className="flex items-center justify-center py-16">
-                <Loader2 className="w-8 h-8 text-bambu-green animate-spin" />
-              </div>
-            ) : detail ? (
-              <pre className="text-xs text-bambu-gray font-mono whitespace-pre-wrap break-all bg-bambu-dark p-4 rounded-lg border border-bambu-dark-tertiary overflow-x-auto max-w-full">
-                {formatJsonForDisplay(detail)}
-              </pre>
-            ) : (
-              <div className="text-center py-16 text-bambu-gray">Failed to load preset details</div>
-            )}
-          </div>
- 
-          {/* Footer */}
-          {showDeleteConfirm ? (
-            <div className="flex-shrink-0 p-4 border-t border-bambu-dark-tertiary bg-red-500/5">
-              <div className="flex items-center gap-2 mb-3 text-red-400">
-                <AlertTriangle className="w-5 h-5" />
-                <span className="font-medium">Delete this preset?</span>
-              </div>
-              <p className="text-sm text-bambu-gray mb-4">
-                This will permanently delete "{setting.name}" from Bambu Cloud. This cannot be undone.
-              </p>
-              <div className="flex gap-2">
-                <Button variant="secondary" onClick={() => setShowDeleteConfirm(false)} disabled={deleteMutation.isPending} className="flex-1">
-                  Cancel
-                </Button>
-                <Button variant="danger" onClick={() => deleteMutation.mutate()} disabled={deleteMutation.isPending} className="flex-1">
-                  {deleteMutation.isPending ? <Loader2 className="w-4 h-4 animate-spin" /> : <Trash2 className="w-4 h-4" />}
-                  Delete
-                </Button>
-              </div>
-            </div>
-          ) : (
-            <div className="flex-shrink-0 p-4 border-t border-bambu-dark-tertiary">
-              <div className="flex gap-2">
-                <Button variant="secondary" onClick={onClose} className="flex-1">Close</Button>
-                <Button variant="secondary" onClick={onDuplicate}>
-                  <Copy className="w-4 h-4" />
-                  Duplicate
-                </Button>
-                {isEditable && (
-                  <>
-                    <Button variant="secondary" onClick={onEdit} disabled={isLoading || !detail}>
-                      <Pencil className="w-4 h-4" />
-                      Edit
-                    </Button>
-                    <Button variant="danger" onClick={() => setShowDeleteConfirm(true)}>
-                      <Trash2 className="w-4 h-4" />
-                    </Button>
-                  </>
-                )}
-              </div>
-            </div>
-          )}
-        </CardContent>
-      </Card>
-    </div>
-  );
-}
- 
-// ============================================================================
-// TEMPLATES
-// ============================================================================
- 
-type EditorTab = 'common' | 'fields' | 'json';
- 
-interface CustomTemplate {
-  id: string;
-  name: string;
-  description: string;
-  type: 'filament' | 'print' | 'printer';
-  settings: Record<string, unknown>;
-  showInModal?: boolean; // If true, show in add/edit preset modals
-}
- 
-// Load custom templates from localStorage
-function loadCustomTemplates(): CustomTemplate[] {
-  try {
-    const stored = localStorage.getItem('bambusy_preset_templates');
-    return stored ? JSON.parse(stored) : [];
-  } catch {
-    return [];
-  }
-}
- 
-// Save custom templates to localStorage
-function saveCustomTemplates(templates: CustomTemplate[]) {
-  localStorage.setItem('bambusy_preset_templates', JSON.stringify(templates));
-}
- 
-// ============================================================================
-// TEMPLATES MODAL (manage templates from main page)
-// ============================================================================
- 
-function TemplatesModal({
-  onClose,
-  onApply,
-}: {
-  onClose: () => void;
-  onApply: (template: CustomTemplate) => void;
-}) {
-  const { showToast } = useToast();
-  const [templates, setTemplates] = useState<CustomTemplate[]>(loadCustomTemplates);
-  const [filterType, setFilterType] = useState<'all' | 'filament' | 'print' | 'printer'>('all');
-  const [editingId, setEditingId] = useState<string | null>(null);
-  const [editName, setEditName] = useState('');
-  const [editDesc, setEditDesc] = useState('');
-  const [editSettings, setEditSettings] = useState('{}');
-  const [editSettingsError, setEditSettingsError] = useState<string | null>(null);
-  const [deleteConfirmId, setDeleteConfirmId] = useState<string | null>(null);
- 
-  const filteredTemplates = filterType === 'all'
-    ? templates
-    : templates.filter(t => t.type === filterType);
- 
-  const saveTemplates = (updated: CustomTemplate[]) => {
-    setTemplates(updated);
-    saveCustomTemplates(updated);
-  };
- 
-  const handleDelete = (id: string) => {
-    const updated = templates.filter(t => t.id !== id);
-    saveTemplates(updated);
-    setDeleteConfirmId(null);
-    showToast('Template deleted');
-  };
- 
-  const handleEdit = (template: CustomTemplate) => {
-    setEditingId(template.id);
-    setEditName(template.name);
-    setEditDesc(template.description);
-    setEditSettings(JSON.stringify(template.settings, null, 2));
-    setEditSettingsError(null);
-  };
- 
-  const handleSaveEdit = () => {
-    if (!editingId || !editName.trim()) return;
-    try {
-      const settings = JSON.parse(editSettings);
-      const updated = templates.map(t =>
-        t.id === editingId
-          ? { ...t, name: editName.trim(), description: editDesc.trim(), settings }
-          : t
-      );
-      saveTemplates(updated);
-      setEditingId(null);
-      showToast('Template updated');
-    } catch (e) {
-      setEditSettingsError((e as Error).message);
-    }
-  };
- 
-  const handleCancelEdit = () => {
-    setEditingId(null);
-    setEditName('');
-    setEditDesc('');
-    setEditSettings('{}');
-    setEditSettingsError(null);
-  };
- 
-  const toggleShowInModal = (id: string) => {
-    const updated = templates.map(t =>
-      t.id === id ? { ...t, showInModal: !t.showInModal } : t
-    );
-    saveTemplates(updated);
-  };
- 
-  const typeLabels = {
-    filament: { label: 'Filament', icon: Droplet, color: 'text-amber-400' },
-    print: { label: 'Process', icon: Settings2, color: 'text-blue-400' },
-    printer: { label: 'Printer', icon: PrinterIcon, color: 'text-purple-400' },
-  };
- 
-  const templateToDelete = deleteConfirmId ? templates.find(t => t.id === deleteConfirmId) : null;
- 
-  // Handle Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') {
-        if (deleteConfirmId) {
-          setDeleteConfirmId(null);
-        } else if (editingId) {
-          handleCancelEdit();
-        } else {
-          onClose();
-        }
-      }
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [deleteConfirmId, editingId, onClose]);
- 
-  return (
-    <div className="fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4">
-      {/* Delete confirmation modal */}
-      {templateToDelete && (
-        <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-60">
-          <Card className="w-full max-w-md">
-            <CardContent className="p-6">
-              <div className="flex items-center gap-3 mb-4">
-                <div className="p-2 bg-red-500/20 rounded-lg">
-                  <AlertTriangle className="w-6 h-6 text-red-400" />
-                </div>
-                <div>
-                  <h3 className="text-lg font-semibold text-white">Delete Template</h3>
-                  <p className="text-sm text-bambu-gray">This action cannot be undone</p>
-                </div>
-              </div>
-              <p className="text-white mb-6">
-                Are you sure you want to delete "<span className="font-medium">{templateToDelete.name}</span>"?
-              </p>
-              <div className="flex gap-2">
-                <Button variant="secondary" onClick={() => setDeleteConfirmId(null)} className="flex-1">
-                  Cancel
-                </Button>
-                <Button onClick={() => handleDelete(deleteConfirmId!)} className="flex-1 bg-red-500 hover:bg-red-600">
-                  <Trash2 className="w-4 h-4" />
-                  Delete
-                </Button>
-              </div>
-            </CardContent>
-          </Card>
-        </div>
-      )}
- 
-      <Card className="w-full max-w-2xl max-h-[80vh] flex flex-col">
-        <CardContent className="p-0 flex flex-col h-full">
-          {/* Header */}
-          <div className="flex items-center justify-between p-4 border-b border-bambu-dark-tertiary">
-            <h2 className="text-lg font-semibold text-white flex items-center gap-2">
-              <Sparkles className="w-5 h-5 text-amber-400" />
-              Quick Templates
-            </h2>
-            <button onClick={onClose} className="text-bambu-gray hover:text-white">
-              <X className="w-5 h-5" />
-            </button>
-          </div>
- 
-          {/* Filter row */}
-          <div className="flex items-center gap-2 p-4 border-b border-bambu-dark-tertiary">
-            <span className="text-sm text-bambu-gray">Type:</span>
-            {(['all', 'filament', 'print', 'printer'] as const).map((type) => (
-              <button
-                key={type}
-                onClick={() => setFilterType(type)}
-                className={`px-3 py-1 text-sm rounded-lg transition-colors ${
-                  filterType === type
-                    ? 'bg-bambu-green text-white'
-                    : 'bg-bambu-dark text-bambu-gray hover:text-white'
-                }`}
-              >
-                {type === 'all' ? 'All' : typeLabels[type].label}
-              </button>
-            ))}
-          </div>
- 
-          {/* Templates list */}
-          <div className="flex-1 overflow-y-auto p-4">
-            {filteredTemplates.length === 0 ? (
-              <div className="text-center py-12 text-bambu-gray">
-                <Sparkles className="w-12 h-12 mx-auto mb-4 opacity-30" />
-                <p>No templates yet</p>
-                <p className="text-sm mt-1">Create templates from the preset editor</p>
-              </div>
-            ) : (
-              <div className="space-y-2">
-                {filteredTemplates.map((template) => {
-                  const typeInfo = typeLabels[template.type];
-                  const TypeIcon = typeInfo.icon;
- 
-                  if (editingId === template.id) {
-                    return (
-                      <div
-                        key={template.id}
-                        className="p-4 bg-bambu-dark rounded-lg border border-bambu-green"
-                      >
-                        <div className="grid grid-cols-2 gap-3 mb-3">
-                          <input
-                            type="text"
-                            value={editName}
-                            onChange={(e) => setEditName(e.target.value)}
-                            placeholder="Template name"
-                            className="px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none"
-                            autoFocus
-                          />
-                          <input
-                            type="text"
-                            value={editDesc}
-                            onChange={(e) => setEditDesc(e.target.value)}
-                            placeholder="Description"
-                            className="px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none"
-                          />
-                        </div>
-                        <div className="mb-3">
-                          <label className="text-xs text-bambu-gray mb-1 block">Settings (JSON)</label>
-                          <textarea
-                            value={editSettings}
-                            onChange={(e) => {
-                              setEditSettings(e.target.value);
-                              setEditSettingsError(null);
-                            }}
-                            rows={6}
-                            className={`w-full px-3 py-2 bg-bambu-dark-secondary border rounded text-white text-sm font-mono focus:outline-none ${
-                              editSettingsError ? 'border-red-500' : 'border-bambu-dark-tertiary focus:border-bambu-green'
-                            }`}
-                          />
-                          {editSettingsError && (
-                            <p className="text-xs text-red-400 mt-1">{editSettingsError}</p>
-                          )}
-                        </div>
-                        <div className="flex gap-2">
-                          <Button size="sm" onClick={handleSaveEdit} disabled={!editName.trim()}>
-                            <Save className="w-4 h-4" />
-                            Save
-                          </Button>
-                          <Button size="sm" variant="secondary" onClick={handleCancelEdit}>
-                            Cancel
-                          </Button>
-                        </div>
-                      </div>
-                    );
-                  }
- 
-                  return (
-                    <div
-                      key={template.id}
-                      className="flex items-center gap-3 p-3 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary hover:border-bambu-gray-dark transition-colors"
-                    >
-                      <TypeIcon className={`w-5 h-5 ${typeInfo.color} flex-shrink-0`} />
-                      <div className="flex-1 min-w-0">
-                        <p className="text-sm font-medium text-white">{template.name}</p>
-                        <p className="text-xs text-bambu-gray truncate">{template.description}</p>
-                      </div>
-                      <span className="text-xs text-bambu-gray-dark px-2 py-1 bg-bambu-dark-secondary rounded">
-                        {Object.keys(template.settings).length} fields
-                      </span>
-                      <button
-                        onClick={() => toggleShowInModal(template.id)}
-                        className={`p-1 transition-colors ${
-                          template.showInModal
-                            ? 'text-bambu-green hover:text-bambu-green/70'
-                            : 'text-bambu-gray hover:text-white'
-                        }`}
-                        title={template.showInModal ? 'Shown in modals' : 'Hidden in modals'}
-                      >
-                        {template.showInModal ? <Eye className="w-4 h-4" /> : <EyeOff className="w-4 h-4" />}
-                      </button>
-                      <button
-                        onClick={() => onApply(template)}
-                        className="px-3 py-1 text-xs bg-bambu-green/20 text-bambu-green rounded hover:bg-bambu-green/30 transition-colors"
-                      >
-                        Apply
-                      </button>
-                      <button
-                        onClick={() => handleEdit(template)}
-                        className="p-1 text-bambu-gray hover:text-white"
-                        title="Edit"
-                      >
-                        <Pencil className="w-4 h-4" />
-                      </button>
-                      <button
-                        onClick={() => setDeleteConfirmId(template.id)}
-                        className="p-1 text-bambu-gray hover:text-red-400"
-                        title="Delete"
-                      >
-                        <Trash2 className="w-4 h-4" />
-                      </button>
-                    </div>
-                  );
-                })}
-              </div>
-            )}
-          </div>
-        </CardContent>
-      </Card>
-    </div>
-  );
-}
- 
-// ============================================================================
-// DIFF MODAL - Compare two presets or preset vs base
-// ============================================================================
- 
-type DiffEntry = {
-  key: string;
-  left: unknown;
-  right: unknown;
-  status: 'added' | 'removed' | 'changed' | 'same';
-};
- 
-function DiffModal({
-  onClose,
-  leftPreset,
-  rightPreset,
-  leftLabel,
-  rightLabel,
-}: {
-  onClose: () => void;
-  leftPreset: Record<string, unknown>;
-  rightPreset: Record<string, unknown>;
-  leftLabel: string;
-  rightLabel: string;
-}) {
-  const [filterMode, setFilterMode] = useState<'changes' | 'all'>('changes');
-  const [searchQuery, setSearchQuery] = useState('');
- 
-  // Calculate diff
-  const diffEntries = useMemo(() => {
-    const allKeys = new Set([...Object.keys(leftPreset), ...Object.keys(rightPreset)]);
-    const entries: DiffEntry[] = [];
- 
-    for (const key of allKeys) {
-      // Skip internal fields
-      if (key === 'inherits' || key === 'version') continue;
- 
-      const leftVal = leftPreset[key];
-      const rightVal = rightPreset[key];
-      const leftExists = key in leftPreset;
-      const rightExists = key in rightPreset;
- 
-      let status: DiffEntry['status'];
-      if (!leftExists && rightExists) {
-        status = 'added';
-      } else if (leftExists && !rightExists) {
-        status = 'removed';
-      } else if (JSON.stringify(leftVal) !== JSON.stringify(rightVal)) {
-        status = 'changed';
-      } else {
-        status = 'same';
-      }
- 
-      entries.push({ key, left: leftVal, right: rightVal, status });
-    }
- 
-    return entries.sort((a, b) => {
-      // Sort by status (changed first, then added, removed, same)
-      const statusOrder = { changed: 0, added: 1, removed: 2, same: 3 };
-      if (statusOrder[a.status] !== statusOrder[b.status]) {
-        return statusOrder[a.status] - statusOrder[b.status];
-      }
-      return a.key.localeCompare(b.key);
-    });
-  }, [leftPreset, rightPreset]);
- 
-  // Filter entries
-  const filteredEntries = useMemo(() => {
-    let entries = [...diffEntries];
-    if (filterMode === 'changes') {
-      entries = entries.filter(e => e.status !== 'same');
-    }
-    if (searchQuery) {
-      const q = searchQuery.toLowerCase();
-      entries = entries.filter(e =>
-        e.key.toLowerCase().includes(q) ||
-        String(e.left).toLowerCase().includes(q) ||
-        String(e.right).toLowerCase().includes(q)
-      );
-    }
-    return entries;
-  }, [diffEntries, filterMode, searchQuery]);
- 
-  // Stats
-  const stats = useMemo(() => {
-    return {
-      added: diffEntries.filter(e => e.status === 'added').length,
-      removed: diffEntries.filter(e => e.status === 'removed').length,
-      changed: diffEntries.filter(e => e.status === 'changed').length,
-      same: diffEntries.filter(e => e.status === 'same').length,
-    };
-  }, [diffEntries]);
- 
-  const formatValue = (val: unknown): string => {
-    if (val === undefined) return '—';
-    if (val === null) return 'null';
-    if (Array.isArray(val)) {
-      // Show arrays more cleanly
-      if (val.length === 0) return '[]';
-      if (val.length === 1) return String(val[0]);
-      return val.join(', ');
-    }
-    if (typeof val === 'object') return JSON.stringify(val);
-    // Handle strings - truncate long ones and clean up escaped chars
-    const str = String(val);
-    // Check if it looks like G-code or multi-line content
-    if (str.includes('\\n') || str.length > 100) {
-      // Count lines and show summary
-      const lines = str.split('\\n').length;
-      if (lines > 1) {
-        return `[${lines} lines of G-code/script]`;
-      }
-      if (str.length > 100) {
-        return str.substring(0, 100) + '…';
-      }
-    }
-    return str;
-  };
- 
-  // Handle Escape key
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      if (e.key === 'Escape') onClose();
-    };
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-  }, [onClose]);
- 
-  return (
-    <div className="fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4">
-      <Card className="w-full max-w-4xl max-h-[85vh] flex flex-col overflow-hidden">
-        <CardContent className="p-0 flex flex-col min-h-0 flex-1">
-          {/* Header */}
-          <div className="flex-shrink-0 flex items-center justify-between p-4 border-b border-bambu-dark-tertiary">
-            <h2 className="text-lg font-semibold text-white flex items-center gap-2">
-              <GitCompare className="w-5 h-5 text-blue-400" />
-              Compare Presets
-            </h2>
-            <button onClick={onClose} className="text-bambu-gray hover:text-white">
-              <X className="w-5 h-5" />
-            </button>
-          </div>
- 
-          {/* Preset labels */}
-          <div className="flex-shrink-0 grid grid-cols-2 gap-4 p-4 border-b border-bambu-dark-tertiary bg-bambu-dark">
-            <div className="text-center">
-              <span className="text-sm text-bambu-gray">Left:</span>
-              <p className="text-white font-medium truncate">{leftLabel}</p>
-            </div>
-            <div className="text-center">
-              <span className="text-sm text-bambu-gray">Right:</span>
-              <p className="text-white font-medium truncate">{rightLabel}</p>
-            </div>
-          </div>
- 
-          {/* Stats and filters */}
-          <div className="flex-shrink-0 flex items-center justify-between p-4 border-b border-bambu-dark-tertiary">
-            <div className="flex items-center gap-4 text-sm">
-              <span className="flex items-center gap-1 text-green-400">
-                <PlusIcon className="w-3.5 h-3.5" />
-                {stats.added} added
-              </span>
-              <span className="flex items-center gap-1 text-red-400">
-                <MinusIcon className="w-3.5 h-3.5" />
-                {stats.removed} removed
-              </span>
-              <span className="flex items-center gap-1 text-amber-400">
-                <ArrowRight className="w-3.5 h-3.5" />
-                {stats.changed} changed
-              </span>
-              <span className="flex items-center gap-1 text-bambu-gray">
-                <Equal className="w-3.5 h-3.5" />
-                {stats.same} same
-              </span>
-            </div>
-            <div className="flex items-center gap-3">
-              <div className="relative">
-                <Search className="absolute left-2 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray" />
-                <input
-                  type="text"
-                  value={searchQuery}
-                  onChange={(e) => setSearchQuery(e.target.value)}
-                  placeholder="Search fields..."
-                  className="pl-8 pr-3 py-1.5 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none w-48"
-                />
-              </div>
-              {stats.same > 0 && (
-                <div className="flex rounded overflow-hidden border border-bambu-dark-tertiary">
-                  <button
-                    onClick={() => setFilterMode('changes')}
-                    className={`px-3 py-1.5 text-sm transition-colors ${
-                      filterMode === 'changes'
-                        ? 'bg-bambu-green text-white'
-                        : 'bg-bambu-dark text-bambu-gray hover:text-white'
-                    }`}
-                  >
-                    Changes
-                  </button>
-                  <button
-                    onClick={() => setFilterMode('all')}
-                    className={`px-3 py-1.5 text-sm transition-colors ${
-                      filterMode === 'all'
-                        ? 'bg-bambu-green text-white'
-                        : 'bg-bambu-dark text-bambu-gray hover:text-white'
-                    }`}
-                  >
-                    All
-                  </button>
-                </div>
-              )}
-            </div>
-          </div>
- 
-          {/* Diff table */}
-          <div className="flex-1 min-h-0 overflow-y-auto">
-            {filteredEntries.length === 0 ? (
-              <div className="text-center py-12 text-bambu-gray">
-                <Equal className="w-12 h-12 mx-auto mb-4 opacity-30" />
-                <p>{filterMode === 'changes' ? 'No differences found' : 'No fields match the search'}</p>
-              </div>
-            ) : (
-              <table className="w-full">
-                <thead className="sticky top-0 bg-bambu-dark-secondary">
-                  <tr className="text-sm text-bambu-gray border-b border-bambu-dark-tertiary">
-                    <th className="text-left p-3 w-1/3">Field</th>
-                    <th className="text-left p-3 w-1/3">{leftLabel}</th>
-                    <th className="text-left p-3 w-1/3">{rightLabel}</th>
-                  </tr>
-                </thead>
-                <tbody>
-                  {filteredEntries.map((entry) => {
-                    const bgClass = {
-                      added: 'bg-green-500/10',
-                      removed: 'bg-red-500/10',
-                      changed: 'bg-amber-500/10',
-                      same: '',
-                    }[entry.status];
- 
-                    const statusIcon = {
-                      added: <PlusIcon className="w-3.5 h-3.5 text-green-400" />,
-                      removed: <MinusIcon className="w-3.5 h-3.5 text-red-400" />,
-                      changed: <ArrowRight className="w-3.5 h-3.5 text-amber-400" />,
-                      same: <Equal className="w-3.5 h-3.5 text-bambu-gray-dark" />,
-                    }[entry.status];
- 
-                    return (
-                      <tr key={entry.key} className={`border-b border-bambu-dark-tertiary ${bgClass}`}>
-                        <td className="p-3">
-                          <div className="flex items-center gap-2">
-                            {statusIcon}
-                            <span className="text-sm text-white font-mono">{entry.key}</span>
-                          </div>
-                        </td>
-                        <td className="p-3">
-                          <span className={`text-sm font-mono break-all ${
-                            entry.status === 'removed' ? 'text-red-300' :
-                            entry.status === 'changed' ? 'text-white' : 'text-bambu-gray'
-                          }`}>
-                            {formatValue(entry.left)}
-                          </span>
-                        </td>
-                        <td className="p-3">
-                          <span className={`text-sm font-mono break-all ${
-                            entry.status === 'added' ? 'text-green-300' :
-                            entry.status === 'changed' ? 'text-white' : 'text-bambu-gray'
-                          }`}>
-                            {formatValue(entry.right)}
-                          </span>
-                        </td>
-                      </tr>
-                    );
-                  })}
-                </tbody>
-              </table>
-            )}
-          </div>
-        </CardContent>
-      </Card>
-    </div>
-  );
-}
- 
-// ============================================================================
-// CREATE PRESET MODAL
-// ============================================================================
- 
-function CreatePresetModal({
-  onClose,
-  initialData,
-  allPresets,
-}: {
-  onClose: () => void;
-  initialData?: { type: string; name: string; base_id: string; setting: Record<string, unknown>; setting_id?: string };
-  allPresets: SlicerSettingsResponse;
-}) {
-  const { showToast } = useToast();
-  const queryClient = useQueryClient();
- 
-  // Editing mode if initialData has setting_id
-  const isEditMode = !!initialData?.setting_id;
- 
-  const [activeTab, setActiveTab] = useState<EditorTab>('common');
-  const [presetType, setPresetType] = useState<'filament' | 'print' | 'printer'>(
-    (initialData?.type as 'filament' | 'print' | 'printer') || 'filament'
-  );
-  const [name, setName] = useState(
-    initialData?.name
-      ? (isEditMode ? initialData.name : `${initialData.name} (Copy)`)
-      : ''
-  );
-  const [baseId, setBaseId] = useState(initialData?.base_id || '');
-  const [baseName, setBaseName] = useState('');
-  const [settingsObj, setSettingsObj] = useState<Record<string, unknown>>(
-    initialData?.setting || { inherits: '' }
-  );
-  const [jsonText, setJsonText] = useState(JSON.stringify(initialData?.setting || { inherits: '' }, null, 2));
-  const [jsonError, setJsonError] = useState<string | null>(null);
-  const [fieldSearch, setFieldSearch] = useState('');
-  const [isDragging, setIsDragging] = useState(false);
-  const [customFieldKey, setCustomFieldKey] = useState('');
-  const [showCustomFieldInput, setShowCustomFieldInput] = useState(false);
-  const [customTemplates, setCustomTemplates] = useState<CustomTemplate[]>(loadCustomTemplates);
-  const [showSaveTemplate, setShowSaveTemplate] = useState(false);
-  const [newTemplateName, setNewTemplateName] = useState('');
-  const [newTemplateDesc, setNewTemplateDesc] = useState('');
-  const [newTemplateShowInModal, setNewTemplateShowInModal] = useState(true);
-  const [appliedTemplateName, setAppliedTemplateName] = useState<string | null>(null);
-  const [showDiffModal, setShowDiffModal] = useState(false);
- 
-  // Fetch ALL preset details for the current type to discover all available fields
-  const presetsOfType = useMemo(() => {
-    const typeMap: Record<string, SlicerSetting[]> = {
-      filament: allPresets.filament,
-      print: allPresets.process,
-      printer: allPresets.printer,
-    };
-    return typeMap[presetType] || [];
-  }, [allPresets, presetType]);
- 
-  // Only fetch details for USER presets (not Bambu's built-in ones which return 500)
-  const userPresetsOfType = useMemo(() => {
-    return presetsOfType.filter(p => isUserPreset(p.setting_id));
-  }, [presetsOfType]);
- 
-  // Fetch field definitions from API (cached, only loaded once per type)
-  const { data: fieldDefinitions } = useQuery({
-    queryKey: ['cloudFields', presetType],
-    queryFn: () => api.getCloudFields(presetType === 'print' ? 'process' : presetType),
-    staleTime: 1000 * 60 * 60, // Cache for 1 hour
-  });
- 
-  // Fetch details for user presets of this type (for field discovery)
-  const { data: allPresetDetails } = useQuery({
-    queryKey: ['allPresetDetails', presetType, userPresetsOfType.map(p => p.setting_id).join(',')],
-    queryFn: async () => {
-      // Fetch all preset details in parallel (limit concurrency to avoid overwhelming API)
-      const results: Record<string, SlicerSettingDetail> = {};
-      const batchSize = 5;
-      for (let i = 0; i < userPresetsOfType.length; i += batchSize) {
-        const batch = userPresetsOfType.slice(i, i + batchSize);
-        const batchResults = await Promise.all(
-          batch.map(async (preset) => {
-            try {
-              const detail = await api.getCloudSettingDetail(preset.setting_id);
-              return { id: preset.setting_id, detail };
-            } catch {
-              return null;
-            }
-          })
-        );
-        batchResults.forEach(r => {
-          if (r) results[r.id] = r.detail;
-        });
-      }
-      return results;
-    },
-    enabled: userPresetsOfType.length > 0,
-    staleTime: 1000 * 60 * 10, // Cache for 10 minutes
-  });
- 
-  // Fetch base preset details (works for both user presets and built-in presets with new API version)
-  const { data: basePresetDetail, isLoading: isLoadingBasePreset } = useQuery<SlicerSettingDetail>({
-    queryKey: ['cloudSettingDetail', baseId],
-    queryFn: () => api.getCloudSettingDetail(baseId),
-    enabled: !!baseId,
-  });
- 
-  // Sync JSON text with settings object
-  useEffect(() => {
-    if (activeTab !== 'json') {
-      setJsonText(JSON.stringify(settingsObj, null, 2));
-    }
-  }, [settingsObj, activeTab]);
- 
-  // Get presets filtered by selected type - only built-in presets allowed as base
-  // (Bambu Cloud only allows custom presets to inherit from built-in presets)
-  const availableBasePresets = useMemo(() => {
-    const typeMap: Record<string, SlicerSetting[]> = {
-      filament: allPresets.filament,
-      print: allPresets.process,
-      printer: allPresets.printer,
-    };
-    return (typeMap[presetType] || [])
-      .filter(p => !isUserPreset(p.setting_id)) // Only built-in presets
-      .sort((a, b) => a.name.localeCompare(b.name));
-  }, [allPresets, presetType]);
- 
-  // Set inherits field when base preset changes (don't pre-fill all values - they show as placeholders)
-  // In edit mode, don't reset settingsObj - keep the saved values
-  useEffect(() => {
-    if (!baseId) return;
- 
-    const preset = availableBasePresets.find(p => p.setting_id === baseId);
-    if (preset) {
-      setBaseName(preset.name);
-      // Don't reset settings in edit mode - keep saved values
-      if (!isEditMode) {
-        setSettingsObj({ inherits: preset.name });
-        setJsonText(JSON.stringify({ inherits: preset.name }, null, 2));
-      }
-    }
-  }, [baseId, availableBasePresets, isEditMode]);
- 
-  // Build dynamic fields list: merge API definitions with discovered fields from user presets
-  const dynamicFields = useMemo(() => {
-    // Use API field definitions if available
-    const knownFields: FieldDefinition[] = fieldDefinitions?.fields || [];
-    const knownKeySet = new Set(knownFields.map(f => f.key));
- 
-    // Collect all unique field keys from ALL user presets of this type
-    const discoveredKeys = new Set<string>();
-    const excludeKeys = new Set(['inherits', 'updated_time', 'compatible_printers', 'compatible_prints']);
- 
-    // From all preset details
-    if (allPresetDetails) {
-      Object.values(allPresetDetails).forEach(detail => {
-        if (detail?.setting) {
-          Object.keys(detail.setting).forEach(key => {
-            if (!knownKeySet.has(key) && !excludeKeys.has(key)) {
-              discoveredKeys.add(key);
-            }
-          });
-        }
-      });
-    }
- 
-    // From current settings (in case user added custom fields)
-    Object.keys(settingsObj).forEach(key => {
-      if (!knownKeySet.has(key) && !excludeKeys.has(key)) {
-        discoveredKeys.add(key);
-      }
-    });
- 
-    // Create field definitions for discovered keys (generic text inputs)
-    const discoveredFields: FieldDefinition[] = Array.from(discoveredKeys)
-      .sort()
-      .map(key => ({
-        key,
-        label: key.replace(/_/g, ' ').replace(/\b\w/g, c => c.toUpperCase()),
-        type: 'text' as const,
-        category: 'discovered',
-        description: 'Discovered from presets',
-      }));
- 
-    return [...knownFields, ...discoveredFields];
-  }, [fieldDefinitions, allPresetDetails, settingsObj]);
- 
-  // Filter fields for search
-  const filteredFields = dynamicFields.filter(f =>
-    f.label.toLowerCase().includes(fieldSearch.toLowerCase()) ||
-    f.key.toLowerCase().includes(fieldSearch.toLowerCase())
-  );
- 
-  // Add a custom field
-  const addCustomField = () => {
-    if (customFieldKey.trim()) {
-      const key = customFieldKey.trim().toLowerCase().replace(/\s+/g, '_');
-      updateField(key, '');
-      setCustomFieldKey('');
-      setShowCustomFieldInput(false);
-      showToast(`Field "${key}" added`);
-    }
-  };
- 
-  // Update a single field
-  const updateField = (key: string, value: unknown) => {
-    setSettingsObj(prev => {
-      const newObj = { ...prev };
-      if (value === '' || value === undefined) {
-        delete newObj[key];
-      } else {
-        newObj[key] = value;
-      }
-      return newObj;
-    });
-  };
- 
-  // Apply a template
-  const applyTemplate = (template: { name: string; settings: Record<string, unknown> }) => {
-    setSettingsObj(prev => ({ ...prev, ...template.settings }));
-    setAppliedTemplateName(template.name);
-    showToast('Template applied');
-  };
- 
-  // Save current settings as a template
-  const saveAsTemplate = () => {
-    if (!newTemplateName.trim()) return;
-    const overrides = { ...settingsObj };
-    delete overrides.inherits;
-    if (Object.keys(overrides).length === 0) {
-      showToast('No overrides to save', 'error');
-      return;
-    }
-    const newTemplate: CustomTemplate = {
-      id: Date.now().toString(),
-      name: newTemplateName.trim(),
-      description: newTemplateDesc.trim() || 'Custom template',
-      type: presetType,
-      settings: overrides,
-      showInModal: newTemplateShowInModal,
-    };
-    const updated = [...customTemplates, newTemplate];
-    setCustomTemplates(updated);
-    saveCustomTemplates(updated);
-    setShowSaveTemplate(false);
-    setNewTemplateName('');
-    setNewTemplateDesc('');
-    setNewTemplateShowInModal(true);
-    showToast('Template saved');
-  };
- 
-  // Get templates for current type (only those marked to show in modals)
-  const templatesForType = useMemo(() => {
-    return customTemplates.filter(t => t.type === presetType && t.showInModal);
-  }, [presetType, customTemplates]);
- 
-  // Handle JSON edit
-  const handleJsonChange = (text: string) => {
-    setJsonText(text);
-    try {
-      const parsed = JSON.parse(text);
-      setSettingsObj(parsed);
-      setJsonError(null);
-    } catch (e) {
-      setJsonError((e as Error).message);
-    }
-  };
- 
-  // Handle file drop
-  const handleFileDrop = (e: React.DragEvent) => {
-    e.preventDefault();
-    setIsDragging(false);
-    const file = e.dataTransfer.files[0];
-    if (file && file.name.endsWith('.json')) {
-      const reader = new FileReader();
-      reader.onload = (event) => {
-        try {
-          const content = event.target?.result as string;
-          const parsed = JSON.parse(content);
-          // Handle both full preset format and settings-only format
-          const settings = parsed.setting || parsed;
-          setSettingsObj(prev => ({ ...prev, ...settings }));
-          setJsonText(JSON.stringify({ ...settingsObj, ...settings }, null, 2));
-          showToast('File imported successfully');
-        } catch {
-          showToast('Invalid JSON file', 'error');
-        }
-      };
-      reader.readAsText(file);
-    }
-  };
- 
-  const createMutation = useMutation({
-    mutationFn: () => {
-      const finalSettings = { ...settingsObj };
-      const settingsIdKey = presetType === 'filament' ? 'filament_settings_id'
-        : presetType === 'print' ? 'print_settings_id' : 'printer_settings_id';
-      finalSettings[settingsIdKey] = `"${name}"`;
- 
-      const data: SlicerSettingCreate = { type: presetType, name, base_id: baseId, setting: finalSettings };
-      return api.createCloudSetting(data);
-    },
-    onSuccess: async () => {
-      showToast('Preset created successfully');
-      // Force immediate refetch of the settings list
-      await queryClient.refetchQueries({ queryKey: ['cloudSettings'] });
-      onClose();
-    },
-    onError: (error: Error) => showToast(error.message, 'error'),
-  });
- 
-  const updateMutation = useMutation({
-    mutationFn: () => {
-      if (!initialData?.setting_id) throw new Error('No setting ID for update');
-      return api.updateCloudSetting(initialData.setting_id, { name, setting: settingsObj });
-    },
-    onSuccess: async () => {
-      showToast('Preset updated successfully');
-      // Clear all detail caches to ensure fresh data
-      queryClient.removeQueries({ queryKey: ['cloudSettingDetail'] });
-      // Force immediate refetch of the settings list
-      await queryClient.refetchQueries({ queryKey: ['cloudSettings'] });
-      onClose();
-    },
-    onError: (error: Error) => showToast(error.message, 'error'),
-  });
- 
-  const saveMutation = isEditMode ? updateMutation : createMutation;
- 
-  // Check if base preset inherits from another preset (for user presets that only store overrides)
-  const inheritedPresetName = basePresetDetail?.setting?.inherits as string | undefined;
-  const inheritedPreset = inheritedPresetName
-    ? availableBasePresets.find(p => p.name === inheritedPresetName)
-    : undefined;
- 
-  // Fetch the inherited preset's full values (if applicable)
-  const { data: inheritedPresetDetail } = useQuery<SlicerSettingDetail>({
-    queryKey: ['cloudSettingDetail', inheritedPreset?.setting_id],
-    queryFn: () => api.getCloudSettingDetail(inheritedPreset!.setting_id),
-    enabled: !!inheritedPreset?.setting_id,
-  });
- 
-  // Get base preset values - merge inherited values with overrides
-  const basePresetValues = useMemo(() => {
-    // Start with inherited preset's values (full base)
-    const inheritedValues = inheritedPresetDetail?.setting as Record<string, unknown> || {};
- 
-    // Get the selected preset's values (could be overrides only)
-    const selectedValues = basePresetDetail?.setting as Record<string, unknown> || {};
- 
-    // Fallback to allPresetDetails if no dedicated query result
-    const fallbackValues = baseId && allPresetDetails?.[baseId]?.setting
-      ? allPresetDetails[baseId].setting as Record<string, unknown>
-      : {};
- 
-    // Merge: inherited base values + selected preset overrides
-    // Selected values take precedence
-    return {
-      ...inheritedValues,
-      ...selectedValues,
-      ...fallbackValues,
-    };
-  }, [baseId, basePresetDetail, inheritedPresetDetail, allPresetDetails]);
- 
-  // Format a value for display (handles arrays, objects, etc.)
-  const formatValue = (val: unknown): string => {
-    if (val === undefined || val === null) return '';
-    if (Array.isArray(val)) {
-      // For arrays, join with comma or take first value if all same
-      const unique = [...new Set(val.map(v => String(v)))];
-      return unique.length === 1 ? unique[0] : val.join(', ');
-    }
-    return String(val);
-  };
- 
-  // Render a field input
-  const renderFieldInput = (field: FieldDefinition) => {
-    const value = settingsObj[field.key] as string | number | boolean | undefined;
-    const baseValue = basePresetValues[field.key];
-    const formattedBaseValue = formatValue(baseValue);
-    // Always show base value as placeholder when available
-    const placeholder = isLoadingBasePreset
-      ? 'Loading...'
-      : (formattedBaseValue || '');
-    const baseClass = "w-full px-3 py-1.5 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none";
- 
-    if (field.type === 'boolean') {
-      const isOn = value === '1' || (value === undefined && baseValue === '1');
-      return (
-        <button
-          type="button"
-          onClick={() => updateField(field.key, value === '1' ? '0' : '1')}
-          className={`w-8 h-5 rounded-full transition-colors ${isOn ? 'bg-bambu-green' : 'bg-bambu-dark-tertiary'}`}
-        >
-          <div className={`w-4 h-4 rounded-full bg-white shadow transition-transform ${isOn ? 'translate-x-3.5' : 'translate-x-0.5'}`} />
-        </button>
-      );
-    }
- 
-    if (field.type === 'select') {
-      return (
-        <select
-          value={(value as string) || ''}
-          onChange={(e) => updateField(field.key, e.target.value)}
-          className={baseClass}
-        >
-          <option value="">{placeholder}</option>
-          {field.options?.map(opt => (
-            <option key={opt.value} value={opt.value}>{opt.label}</option>
-          ))}
-        </select>
-      );
-    }
- 
-    return (
-      <div className="flex items-center gap-2">
-        <input
-          type={field.type === 'number' ? 'number' : 'text'}
-          value={value !== undefined ? String(value) : ''}
-          onChange={(e) => updateField(field.key, e.target.value)}
-          step={field.step}
-          min={field.min}
-          max={field.max}
-          placeholder={placeholder}
-          className={baseClass}
-        />
-        {field.unit && <span className="text-xs text-bambu-gray whitespace-nowrap">{field.unit}</span>}
-      </div>
-    );
-  };
- 
-  // Get base preset settings for diff comparison
-  const basePresetSettings = useMemo(() => {
-    if (!basePresetDetail?.setting) return {};
-    return basePresetDetail.setting as Record<string, unknown>;
-  }, [basePresetDetail]);
- 
-  return (
-    <div
-      className="fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4"
-      onDragOver={(e) => { e.preventDefault(); setIsDragging(true); }}
-      onDragLeave={() => setIsDragging(false)}
-      onDrop={handleFileDrop}
-    >
-      {/* Diff Modal */}
-      {showDiffModal && baseId && (
-        <DiffModal
-          onClose={() => setShowDiffModal(false)}
-          leftPreset={basePresetSettings}
-          rightPreset={settingsObj}
-          leftLabel={`Base: ${baseName || baseId}`}
-          rightLabel={`Current: ${name || 'New Preset'}`}
-        />
-      )}
- 
-      <Card className="w-full max-w-6xl max-h-[90vh] flex flex-col">
-        <CardContent className="p-0 flex flex-col h-full">
-          {/* Header */}
-          <div className="flex items-center justify-between p-4 border-b border-bambu-dark-tertiary">
-            <div>
-              <h2 className="text-xl font-semibold text-white">
-                {isEditMode ? 'Edit Preset' : (initialData ? 'Duplicate Preset' : 'Create New Preset')}
-              </h2>
-              <p className="text-sm text-bambu-gray mt-1">
-                Customize settings for your new preset
-              </p>
-            </div>
-            <div className="flex items-center gap-2">
-              {baseId && (
-                <button
-                  onClick={() => setShowDiffModal(true)}
-                  className="flex items-center gap-2 px-3 py-2 text-sm text-bambu-gray hover:text-white hover:bg-bambu-dark-tertiary rounded-lg transition-colors"
-                  title="Compare with base preset"
-                >
-                  <GitCompare className="w-4 h-4" />
-                  Compare
-                </button>
-              )}
-              <button onClick={onClose} className="p-2 text-bambu-gray hover:text-white hover:bg-bambu-dark-tertiary rounded-lg transition-colors">
-                <X className="w-5 h-5" />
-              </button>
-            </div>
-          </div>
- 
-          {/* Drag overlay */}
-          {isDragging && (
-            <div className="absolute inset-0 bg-bambu-green/10 border-2 border-dashed border-bambu-green rounded-lg flex items-center justify-center z-10">
-              <div className="text-center">
-                <Upload className="w-12 h-12 text-bambu-green mx-auto mb-2" />
-                <p className="text-bambu-green font-medium">Drop JSON file to import</p>
-              </div>
-            </div>
-          )}
- 
-          {/* Basic Info */}
-          <div className="p-4 border-b border-bambu-dark-tertiary space-y-3">
-            <div className="grid grid-cols-3 gap-4">
-              <div>
-                <label className="block text-sm text-bambu-gray mb-1">Type</label>
-                <select
-                  value={presetType}
-                  onChange={(e) => { setPresetType(e.target.value as 'filament' | 'print' | 'printer'); setBaseId(''); }}
-                  className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                >
-                  <option value="filament">Filament</option>
-                  <option value="print">Process</option>
-                  <option value="printer">Printer</option>
-                </select>
-              </div>
-              <div>
-                <label className="block text-sm text-bambu-gray mb-1">Base Preset</label>
-                <select
-                  value={baseId}
-                  onChange={(e) => setBaseId(e.target.value)}
-                  className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none"
-                >
-                  <option value="">Select base preset...</option>
-                  {availableBasePresets.map((preset) => (
-                    <option key={preset.setting_id} value={preset.setting_id}>{preset.name}</option>
-                  ))}
-                </select>
-              </div>
-              <div>
-                <label className="block text-sm text-bambu-gray mb-1">Preset Name</label>
-                <input
-                  type="text"
-                  value={name}
-                  onChange={(e) => setName(e.target.value)}
-                  className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                  placeholder="My Custom Preset"
-                />
-              </div>
-            </div>
-            {baseName && (
-              <div className="text-xs text-bambu-gray">
-                <p className="flex items-center gap-1">
-                  <Check className="w-3 h-3 text-bambu-green" />
-                  Inherits from: <span className="text-white">{baseName}</span>
-                  {isLoadingBasePreset && (
-                    <Loader2 className="w-3 h-3 animate-spin ml-1" />
-                  )}
-                </p>
-              </div>
-            )}
-          </div>
- 
-          {/* Tabs */}
-          <div className="flex border-b border-bambu-dark-tertiary">
-            <button
-              onClick={() => setActiveTab('common')}
-              className={`flex items-center gap-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 -mb-px ${
-                activeTab === 'common' ? 'text-bambu-green border-bambu-green' : 'text-bambu-gray hover:text-white border-transparent'
-              }`}
-            >
-              <Sliders className="w-4 h-4" />
-              Common
-            </button>
-            <button
-              onClick={() => setActiveTab('fields')}
-              className={`flex items-center gap-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 -mb-px ${
-                activeTab === 'fields' ? 'text-bambu-green border-bambu-green' : 'text-bambu-gray hover:text-white border-transparent'
-              }`}
-            >
-              <List className="w-4 h-4" />
-              All Fields
-            </button>
-            <button
-              onClick={() => setActiveTab('json')}
-              className={`flex items-center gap-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 -mb-px ${
-                activeTab === 'json' ? 'text-bambu-green border-bambu-green' : 'text-bambu-gray hover:text-white border-transparent'
-              }`}
-            >
-              <Code className="w-4 h-4" />
-              JSON
-              {jsonError && <AlertCircle className="w-3 h-3 text-red-400" />}
-            </button>
-            <div className="flex-1" />
-            <button
-              onClick={() => {
-                const exportData = {
-                  name,
-                  type: presetType,
-                  base_id: baseId,
-                  setting: settingsObj,
-                };
-                const blob = new Blob([JSON.stringify(exportData, null, 2)], { type: 'application/json' });
-                const url = URL.createObjectURL(blob);
-                const a = document.createElement('a');
-                a.href = url;
-                a.download = `${name || 'preset'}.json`;
-                document.body.appendChild(a);
-                a.click();
-                document.body.removeChild(a);
-                URL.revokeObjectURL(url);
-                showToast('Preset exported');
-              }}
-              className="flex items-center gap-2 px-4 py-3 text-sm text-bambu-gray hover:text-white transition-colors"
-              title="Export current settings to JSON file"
-            >
-              <Download className="w-4 h-4" />
-              Export
-            </button>
-            <button
-              onClick={() => document.getElementById('file-import')?.click()}
-              className="flex items-center gap-2 px-4 py-3 text-sm text-bambu-gray hover:text-white transition-colors"
-              title="Import settings from JSON file"
-            >
-              <Upload className="w-4 h-4" />
-              Import
-            </button>
-            <input
-              id="file-import"
-              type="file"
-              accept=".json"
-              className="hidden"
-              onChange={(e) => {
-                const file = e.target.files?.[0];
-                if (file) {
-                  const reader = new FileReader();
-                  reader.onload = (event) => {
-                    try {
-                      const parsed = JSON.parse(event.target?.result as string);
-                      const settings = parsed.setting || parsed;
-                      setSettingsObj(prev => ({ ...prev, ...settings }));
-                      showToast('File imported');
-                    } catch {
-                      showToast('Invalid JSON', 'error');
-                    }
-                  };
-                  reader.readAsText(file);
-                }
-              }}
-            />
-          </div>
- 
-          {/* Tab Content */}
-          <div className="flex-1 overflow-y-auto p-4">
-            {activeTab === 'common' && (
-              <div className="space-y-6">
-                {/* Templates */}
-                <div>
-                  <div className="flex items-center justify-between mb-3">
-                    <h3 className="text-sm font-medium text-white flex items-center gap-2">
-                      <Sparkles className="w-4 h-4 text-amber-400" />
-                      Quick Templates
-                    </h3>
-                    {Object.keys(settingsObj).filter(k => k !== 'inherits').length > 0 && (
-                      <button
-                        onClick={() => setShowSaveTemplate(!showSaveTemplate)}
-                        className="text-xs text-bambu-gray hover:text-white flex items-center gap-1 transition-colors"
-                      >
-                        <Save className="w-3 h-3" />
-                        Save as template
-                      </button>
-                    )}
-                  </div>
- 
-                  {showSaveTemplate && (
-                    <div className="mb-3 p-3 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary">
-                      <div className="grid grid-cols-2 gap-2 mb-2">
-                        <input
-                          type="text"
-                          value={newTemplateName}
-                          onChange={(e) => setNewTemplateName(e.target.value)}
-                          placeholder="Template name"
-                          className="px-3 py-1.5 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none"
-                          autoFocus
-                        />
-                        <input
-                          type="text"
-                          value={newTemplateDesc}
-                          onChange={(e) => setNewTemplateDesc(e.target.value)}
-                          placeholder="Description (optional)"
-                          className="px-3 py-1.5 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none"
-                        />
-                      </div>
-                      <div className="flex items-center justify-between">
-                        <div className="flex gap-2">
-                          <Button size="sm" onClick={saveAsTemplate} disabled={!newTemplateName.trim()}>
-                            <Save className="w-3 h-3" />
-                            Save
-                          </Button>
-                          <Button size="sm" variant="secondary" onClick={() => setShowSaveTemplate(false)}>
-                            Cancel
-                          </Button>
-                        </div>
-                        <button
-                          onClick={() => setNewTemplateShowInModal(!newTemplateShowInModal)}
-                          className={`flex items-center gap-1.5 text-xs transition-colors ${
-                            newTemplateShowInModal ? 'text-bambu-green' : 'text-bambu-gray hover:text-white'
-                          }`}
-                        >
-                          {newTemplateShowInModal ? <Eye className="w-3.5 h-3.5" /> : <EyeOff className="w-3.5 h-3.5" />}
-                          {newTemplateShowInModal ? 'Show in modals' : 'Hidden in modals'}
-                        </button>
-                      </div>
-                    </div>
-                  )}
- 
-                  {/* Applied template indicator */}
-                  {appliedTemplateName && (
-                    <div className="mb-3 px-3 py-2 bg-bambu-green/10 border border-bambu-green/30 rounded-lg flex items-center gap-2">
-                      <Check className="w-4 h-4 text-bambu-green" />
-                      <span className="text-sm text-bambu-green">Template applied: <span className="font-medium">{appliedTemplateName}</span></span>
-                      <button
-                        onClick={() => setAppliedTemplateName(null)}
-                        className="ml-auto text-bambu-green/70 hover:text-bambu-green"
-                      >
-                        <X className="w-4 h-4" />
-                      </button>
-                    </div>
-                  )}
- 
-                  <div className="grid grid-cols-3 gap-2">
-                    {templatesForType.map((template) => (
-                      <button
-                        key={template.id}
-                        onClick={() => applyTemplate(template)}
-                        className="p-3 text-left bg-bambu-dark border border-bambu-dark-tertiary rounded-lg hover:border-bambu-gray-dark transition-colors"
-                      >
-                        <p className="text-sm font-medium text-white">{template.name}</p>
-                        <p className="text-xs text-bambu-gray mt-1">{template.description}</p>
-                      </button>
-                    ))}
-                    {templatesForType.length === 0 && (
-                      <p className="col-span-3 text-center text-bambu-gray text-sm py-4">
-                        No templates selected. Use the Templates button to enable templates for quick access.
-                      </p>
-                    )}
-                  </div>
- 
-                  {/* Note about template management */}
-                  <p className="text-xs text-bambu-gray-dark mt-2 text-center">
-                    Manage templates via the Templates button on the main page
-                  </p>
-                </div>
- 
-                {/* Common Fields */}
-                <div>
-                  <h3 className="text-sm font-medium text-white mb-3">Common Settings</h3>
-                  <div className="grid grid-cols-2 gap-x-6 gap-y-3">
-                    {dynamicFields.slice(0, 10).map(field => (
-                      <div key={field.key} className="flex items-center justify-between gap-4">
-                        <label className="text-sm text-bambu-gray flex-shrink-0">{field.label}</label>
-                        <div className="w-48">{renderFieldInput(field)}</div>
-                      </div>
-                    ))}
-                  </div>
-                </div>
- 
-                {/* Current overrides */}
-                {Object.keys(settingsObj).length > 1 && (
-                  <div>
-                    <h3 className="text-sm font-medium text-white mb-3">Current Overrides</h3>
-                    <div className="flex flex-wrap gap-2">
-                      {Object.entries(settingsObj)
-                        .filter(([k]) => k !== 'inherits')
-                        .map(([key, value]) => (
-                          <span key={key} className="inline-flex items-center gap-1 px-2 py-1 bg-bambu-green/10 text-bambu-green text-xs rounded">
-                            {key}: {String(value).slice(0, 20)}
-                            <button onClick={() => updateField(key, undefined)} className="hover:text-white">
-                              <X className="w-3 h-3" />
-                            </button>
-                          </span>
-                        ))}
-                    </div>
-                  </div>
-                )}
-              </div>
-            )}
- 
-            {activeTab === 'fields' && (
-              <div className="grid grid-cols-2 gap-6" style={{ height: '400px' }}>
-                {/* Left: Available Fields */}
-                <div className="flex flex-col h-full overflow-hidden">
-                  <div className="flex items-center justify-between mb-3 flex-shrink-0">
-                    <h3 className="text-sm font-medium text-white">Available Fields</h3>
-                    <span className="text-xs text-bambu-gray">
-                      {allPresetDetails
-                        ? `${dynamicFields.length} fields`
-                        : 'Loading...'}
-                    </span>
-                  </div>
- 
-                  <div className="relative mb-3 flex-shrink-0">
-                    <Search className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray" />
-                    <input
-                      type="text"
-                      value={fieldSearch}
-                      onChange={(e) => setFieldSearch(e.target.value)}
-                      placeholder="Search fields..."
-                      className="w-full pl-10 pr-4 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm placeholder-bambu-gray-dark focus:border-bambu-green focus:outline-none"
-                    />
-                  </div>
- 
-                  <div className="flex-1 overflow-y-auto space-y-1 pr-2 min-h-0">
-                    {filteredFields
-                      .filter(f => !(f.key in settingsObj))
-                      .map(field => {
-                        const baseVal = basePresetValues[field.key];
-                        const formattedVal = formatValue(baseVal);
-                        return (
-                          <div
-                            key={field.key}
-                            onClick={() => {
-                              // Add field directly (don't use updateField which deletes on empty)
-                              setSettingsObj(prev => ({ ...prev, [field.key]: formattedVal || '' }));
-                            }}
-                            className="flex items-center justify-between gap-2 p-2 rounded-lg hover:bg-bambu-dark-tertiary transition-colors cursor-pointer group"
-                          >
-                            <div className="min-w-0 flex-1">
-                              <p className="text-sm text-white truncate">{field.label}</p>
-                              <p className="text-xs text-bambu-gray-dark truncate">{field.key}</p>
-                            </div>
-                            <div className="flex items-center gap-2 flex-shrink-0">
-                              {formattedVal && (
-                                <span className="text-xs text-bambu-gray bg-bambu-dark px-2 py-0.5 rounded max-w-32 truncate" title={formattedVal}>
-                                  {formattedVal.slice(0, 20)}{formattedVal.length > 20 ? '...' : ''}
-                                </span>
-                              )}
-                              <div className="w-6 h-6 flex items-center justify-center rounded bg-bambu-dark-tertiary group-hover:bg-bambu-green/20 transition-colors">
-                                <Plus className="w-4 h-4 text-bambu-gray group-hover:text-bambu-green transition-colors" />
-                              </div>
-                            </div>
-                          </div>
-                        );
-                      })}
- 
-                    {filteredFields.filter(f => !(f.key in settingsObj)).length === 0 && (
-                      <p className="text-center text-bambu-gray py-4 text-sm">
-                        {fieldSearch ? 'No matching fields' : 'All fields added'}
-                      </p>
-                    )}
-                  </div>
- 
-                  {/* Custom field input */}
-                  <div className="pt-3 mt-3 border-t border-bambu-dark-tertiary flex-shrink-0">
-                    {showCustomFieldInput ? (
-                      <div className="flex gap-2">
-                        <input
-                          type="text"
-                          value={customFieldKey}
-                          onChange={(e) => setCustomFieldKey(e.target.value)}
-                          onKeyDown={(e) => e.key === 'Enter' && addCustomField()}
-                          placeholder="custom_field_name"
-                          className="flex-1 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white font-mono text-sm placeholder-bambu-gray-dark focus:border-bambu-green focus:outline-none"
-                          autoFocus
-                        />
-                        <Button size="sm" onClick={addCustomField} disabled={!customFieldKey.trim()}>
-                          <Plus className="w-4 h-4" />
-                        </Button>
-                        <Button size="sm" variant="secondary" onClick={() => { setShowCustomFieldInput(false); setCustomFieldKey(''); }}>
-                          <X className="w-4 h-4" />
-                        </Button>
-                      </div>
-                    ) : (
-                      <button
-                        onClick={() => setShowCustomFieldInput(true)}
-                        className="w-full flex items-center justify-center gap-2 p-2 text-sm text-bambu-gray hover:text-white border border-dashed border-bambu-dark-tertiary hover:border-bambu-gray-dark rounded-lg transition-colors"
-                      >
-                        <Plus className="w-4 h-4" />
-                        Add custom field
-                      </button>
-                    )}
-                  </div>
-                </div>
- 
-                {/* Right: Added Fields */}
-                <div className="flex flex-col h-full overflow-hidden">
-                  <div className="flex items-center justify-between mb-3 flex-shrink-0">
-                    <h3 className="text-sm font-medium text-white">Your Overrides</h3>
-                    <span className="text-xs text-bambu-gray">
-                      {Object.keys(settingsObj).filter(k => k !== 'inherits').length} fields
-                    </span>
-                  </div>
- 
-                  <div className="flex-1 overflow-y-auto space-y-2 pr-2 min-h-0">
-                    {Object.entries(settingsObj)
-                      .filter(([key]) => key !== 'inherits')
-                      .map(([key, value]) => {
-                        const fieldDef = dynamicFields.find(f => f.key === key);
-                        return (
-                          <div key={key} className="p-3 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary">
-                            <div className="flex items-center justify-between mb-2">
-                              <div>
-                                <p className="text-sm font-medium text-white">{fieldDef?.label || key}</p>
-                                <p className="text-xs text-bambu-gray-dark">{key}</p>
-                              </div>
-                              <button
-                                onClick={() => updateField(key, undefined)}
-                                className="p-1 text-bambu-gray hover:text-red-400 transition-colors"
-                              >
-                                <X className="w-4 h-4" />
-                              </button>
-                            </div>
-                            {fieldDef ? (
-                              renderFieldInput(fieldDef)
-                            ) : (
-                              <input
-                                type="text"
-                                value={String(value)}
-                                onChange={(e) => updateField(key, e.target.value)}
-                                className="w-full px-3 py-1.5 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none"
-                              />
-                            )}
-                          </div>
-                        );
-                      })}
- 
-                    {Object.keys(settingsObj).filter(k => k !== 'inherits').length === 0 && (
-                      <div className="text-center py-8 text-bambu-gray">
-                        <Sliders className="w-8 h-8 mx-auto mb-2 opacity-50" />
-                        <p className="text-sm">No overrides yet</p>
-                        <p className="text-xs mt-1">Click fields on the left to add them</p>
-                      </div>
-                    )}
-                  </div>
- 
-                  {/* Save as template button */}
-                  {Object.keys(settingsObj).filter(k => k !== 'inherits').length > 0 && (
-                    <div className="pt-3 mt-3 border-t border-bambu-dark-tertiary flex-shrink-0">
-                      <button
-                        onClick={() => { setShowSaveTemplate(true); setActiveTab('common'); }}
-                        className="w-full flex items-center justify-center gap-2 p-2 text-sm text-bambu-gray hover:text-white border border-dashed border-bambu-dark-tertiary hover:border-bambu-gray-dark rounded-lg transition-colors"
-                      >
-                        <Save className="w-4 h-4" />
-                        Save as template
-                      </button>
-                    </div>
-                  )}
-                </div>
-              </div>
-            )}
- 
-            {activeTab === 'json' && (
-              <div className="space-y-2">
-                {jsonError && (
-                  <div className="flex items-center gap-2 text-red-400 text-sm">
-                    <AlertCircle className="w-4 h-4" />
-                    {jsonError}
-                  </div>
-                )}
-                <textarea
-                  value={jsonText}
-                  onChange={(e) => handleJsonChange(e.target.value)}
-                  className={`w-full h-80 px-3 py-2 bg-bambu-dark border rounded-lg text-white text-xs font-mono focus:outline-none resize-none ${
-                    jsonError ? 'border-red-500 focus:border-red-500' : 'border-bambu-dark-tertiary focus:border-bambu-green'
-                  }`}
-                  spellCheck={false}
-                />
-                <p className="text-xs text-bambu-gray">
-                  Tip: Drag & drop a .json file anywhere on this modal to import settings
-                </p>
-              </div>
-            )}
-          </div>
- 
-          {/* Footer */}
-          <div className="p-4 border-t border-bambu-dark-tertiary flex gap-2">
-            <Button variant="secondary" onClick={onClose} className="flex-1">Cancel</Button>
-            <Button
-              onClick={() => saveMutation.mutate()}
-              disabled={saveMutation.isPending || !name.trim() || (!isEditMode && !baseId) || !!jsonError}
-              className="flex-1"
-            >
-              {saveMutation.isPending ? <Loader2 className="w-4 h-4 animate-spin" /> : (isEditMode ? <Save className="w-4 h-4" /> : <Plus className="w-4 h-4" />)}
-              {isEditMode ? 'Save' : (initialData ? 'Duplicate' : 'Create')}
-            </Button>
-          </div>
-        </CardContent>
-      </Card>
-    </div>
-  );
-}
- 
-// ============================================================================
-// CLOUD PROFILES VIEW
-// ============================================================================
- 
-function CloudProfilesView({
-  settings,
-  lastSyncTime,
-  onRefresh,
-  isRefreshing,
-  printers,
-}: {
-  settings: SlicerSettingsResponse;
-  lastSyncTime?: Date;
-  onRefresh: () => void;
-  isRefreshing: boolean;
-  printers: Printer[];
-}) {
-  const [searchQuery, setSearchQuery] = useState('');
-  const [filterType, setFilterType] = useState<PresetType>('all');
-  const [filterOwner, setFilterOwner] = useState<'all' | 'custom' | 'builtin'>('all');
-  const [filterPrinter, setFilterPrinter] = useState('all');
-  const [filterNozzle, setFilterNozzle] = useState('all');
-  const [filterFilament, setFilterFilament] = useState('all');
-  const [filterLayerHeight, setFilterLayerHeight] = useState('all');
-  const [selectedSetting, setSelectedSetting] = useState<SlicerSetting | null>(null);
-  const [showCreateModal, setShowCreateModal] = useState(false);
-  const [showTemplatesModal, setShowTemplatesModal] = useState(false);
-  const [duplicateData, setDuplicateData] = useState<{ type: string; name: string; base_id: string; setting: Record<string, unknown> } | null>(null);
-  const [editData, setEditData] = useState<{ type: string; name: string; base_id: string; setting: Record<string, unknown>; setting_id: string } | null>(null);
-  const [templateData, setTemplateData] = useState<{ type: string; setting: Record<string, unknown> } | null>(null);
-  // Compare mode state
-  const [compareMode, setCompareMode] = useState(false);
-  const [compareSelection, setCompareSelection] = useState<[SlicerSetting | null, SlicerSetting | null]>([null, null]);
-  const [showCompareModal, setShowCompareModal] = useState(false);
-  const [comparePresets, setComparePresets] = useState<[Record<string, unknown>, Record<string, unknown>] | null>(null);
- 
-  const queryClient = useQueryClient();
- 
-  // Combine all presets with metadata
-  const allPresetsWithMeta = useMemo(() => {
-    const combined = [
-      ...settings.filament.map(s => ({ ...s, type: 'filament' as const })),
-      ...settings.printer.map(s => ({ ...s, type: 'printer' as const })),
-      ...settings.process.map(s => ({ ...s, type: 'process' as const })),
-    ];
-    return combined.map(s => ({ ...s, meta: extractMetadata(s.name) }));
-  }, [settings]);
- 
-  // Extract unique filter values (use configured printers from API)
-  const filterOptions = useMemo(() => {
-    const nozzles = new Set<string>();
-    const filaments = new Set<string>();
-    const layerHeights = new Set<string>();
- 
-    allPresetsWithMeta.forEach(p => {
-      if (p.meta.nozzle) nozzles.add(p.meta.nozzle);
-      if (p.meta.filamentType) filaments.add(p.meta.filamentType);
-      if (p.meta.layerHeight) layerHeights.add(p.meta.layerHeight);
-    });
- 
-    return {
-      printers: printers.map(p => ({ id: p.id.toString(), name: p.name })),
-      nozzles: Array.from(nozzles).sort((a, b) => parseFloat(a) - parseFloat(b)),
-      filaments: Array.from(filaments).sort(),
-      layerHeights: Array.from(layerHeights).sort((a, b) => parseFloat(a) - parseFloat(b)),
-    };
-  }, [allPresetsWithMeta, printers]);
- 
-  // Get selected printer's model for filtering
-  const selectedPrinterModel = useMemo(() => {
-    if (filterPrinter === 'all') return null;
-    const printer = printers.find(p => p.id.toString() === filterPrinter);
-    return printer?.model || null;
-  }, [filterPrinter, printers]);
- 
-  // Apply filters
-  const filteredPresets = useMemo(() => {
-    return allPresetsWithMeta
-      .filter(s => filterType === 'all' || s.type === filterType)
-      .filter(s => {
-        if (filterOwner === 'all') return true;
-        const isCustom = isUserPreset(s.setting_id);
-        return filterOwner === 'custom' ? isCustom : !isCustom;
-      })
-      .filter(s => {
-        if (filterPrinter === 'all' || !selectedPrinterModel) return true;
-        // Match preset's printer model to configured printer's model
-        const presetPrinter = s.meta.printer?.toLowerCase() || '';
-        const configuredModel = selectedPrinterModel.toLowerCase();
-        return presetPrinter.includes(configuredModel) || configuredModel.includes(presetPrinter);
-      })
-      .filter(s => filterNozzle === 'all' || s.meta.nozzle === filterNozzle)
-      .filter(s => filterFilament === 'all' || s.meta.filamentType === filterFilament)
-      .filter(s => filterLayerHeight === 'all' || s.meta.layerHeight === filterLayerHeight)
-      .filter(s => searchQuery === '' || s.name.toLowerCase().includes(searchQuery.toLowerCase()))
-      .sort((a, b) => a.name.localeCompare(b.name));
-  }, [allPresetsWithMeta, filterType, filterOwner, filterPrinter, selectedPrinterModel, filterNozzle, filterFilament, filterLayerHeight, searchQuery]);
- 
-  // Handle click on preset in compare mode
-  const handlePresetClick = (preset: SlicerSetting) => {
-    if (compareMode) {
-      // In compare mode, toggle selection
-      const isFirst = compareSelection[0]?.setting_id === preset.setting_id;
-      const isSecond = compareSelection[1]?.setting_id === preset.setting_id;
- 
-      if (isFirst) {
-        // Deselect first
-        setCompareSelection([compareSelection[1], null]);
-      } else if (isSecond) {
-        // Deselect second
-        setCompareSelection([compareSelection[0], null]);
-      } else if (!compareSelection[0]) {
-        // Select as first
-        setCompareSelection([preset, null]);
-      } else if (!compareSelection[1]) {
-        // Check type match - only allow same type
-        if (compareSelection[0].type !== preset.type) {
-          return; // Don't allow selecting different types
-        }
-        // Select as second
-        setCompareSelection([compareSelection[0], preset]);
-      } else {
-        // Both selected, replace second (must match first's type)
-        if (compareSelection[0].type !== preset.type) {
-          return;
-        }
-        setCompareSelection([compareSelection[0], preset]);
-      }
-    } else {
-      // Normal mode, open detail
-      setSelectedSetting(preset);
-    }
-  };
- 
-  // Check if preset is selected for comparison
-  const getCompareIndex = (preset: SlicerSetting): number | undefined => {
-    if (compareSelection[0]?.setting_id === preset.setting_id) return 0;
-    if (compareSelection[1]?.setting_id === preset.setting_id) return 1;
-    return undefined;
-  };
- 
-  const handleDuplicate = async (setting: SlicerSetting) => {
-    try {
-      // Always fetch fresh data (bypass cache)
-      const detail = await api.getCloudSettingDetail(setting.setting_id);
- 
-      const apiType = setting.type === 'process' ? 'print' : setting.type;
-      setDuplicateData({
-        type: apiType,
-        name: setting.name,
-        base_id: detail.base_id || 'GFSA00',
-        setting: detail.setting || {},
-      });
-      setSelectedSetting(null);
-    } catch (error) {
-      console.error('Failed to fetch preset details for duplication:', error);
-    }
-  };
- 
-  const handleEdit = async (setting: SlicerSetting) => {
-    try {
-      // Clear any cached data first
-      queryClient.removeQueries({ queryKey: ['cloudSettingDetail', setting.setting_id] });
- 
-      // Always fetch fresh data (bypass cache)
-      const detail = await api.getCloudSettingDetail(setting.setting_id);
- 
-      const apiType = setting.type === 'process' ? 'print' : setting.type;
-      setEditData({
-        type: apiType,
-        name: setting.name,
-        base_id: detail.base_id || 'GFSA00',
-        setting: detail.setting || {},
-        setting_id: setting.setting_id,
-      });
-      setSelectedSetting(null);
-    } catch (error) {
-      console.error('Failed to fetch preset details for editing:', error);
-    }
-  };
- 
-  const clearFilters = () => {
-    setFilterType('all');
-    setFilterOwner('all');
-    setFilterPrinter('all');
-    setFilterNozzle('all');
-    setFilterFilament('all');
-    setFilterLayerHeight('all');
-    setSearchQuery('');
-  };
- 
-  const hasActiveFilters = filterType !== 'all' || filterOwner !== 'all' || filterPrinter !== 'all' || filterNozzle !== 'all' ||
-    filterFilament !== 'all' || filterLayerHeight !== 'all' || searchQuery !== '';
- 
-  const totalCount = settings.filament.length + settings.printer.length + settings.process.length;
- 
-  return (
-    <>
-      {/* Search and Filters */}
-      <div className="space-y-4 mb-6">
-        {/* Search row */}
-        <div className="flex flex-col sm:flex-row gap-3">
-          <div className="relative flex-1">
-            <Search className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray" />
-            <input
-              type="text"
-              value={searchQuery}
-              onChange={(e) => setSearchQuery(e.target.value)}
-              placeholder="Search presets..."
-              className="w-full pl-10 pr-4 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray-dark focus:border-bambu-green focus:outline-none"
-            />
-          </div>
- 
-          <div className="flex gap-2">
-            <Button
-              variant={compareMode ? 'primary' : 'secondary'}
-              onClick={() => {
-                if (compareMode) {
-                  setCompareMode(false);
-                  setCompareSelection([null, null]);
-                } else {
-                  setCompareMode(true);
-                }
-              }}
-            >
-              <GitCompare className="w-4 h-4" />
-              {compareMode ? 'Cancel' : 'Compare'}
-            </Button>
-            <Button variant="secondary" onClick={() => setShowTemplatesModal(true)}>
-              <Sparkles className="w-4 h-4" />
-              Templates
-            </Button>
-            <Button variant="secondary" onClick={onRefresh} disabled={isRefreshing}>
-              <RefreshCw className={`w-4 h-4 ${isRefreshing ? 'animate-spin' : ''}`} />
-              Refresh
-            </Button>
-            <Button onClick={() => setShowCreateModal(true)}>
-              <Plus className="w-4 h-4" />
-              New Preset
-            </Button>
-          </div>
-        </div>
- 
-        {/* Filter row */}
-        <div className="flex flex-wrap items-center gap-2">
-          <Filter className="w-4 h-4 text-bambu-gray" />
- 
-          <FilterDropdown
-            label="Type"
-            value={filterType}
-            options={[
-              { value: 'all', label: 'All', count: totalCount },
-              { value: 'filament', label: 'Filament', count: settings.filament.length },
-              { value: 'printer', label: 'Printer', count: settings.printer.length },
-              { value: 'process', label: 'Process', count: settings.process.length },
-            ]}
-            onChange={(v) => setFilterType(v as PresetType)}
-          />
- 
-          <FilterDropdown
-            label="Owner"
-            value={filterOwner}
-            options={[
-              { value: 'all', label: 'All' },
-              { value: 'custom', label: 'My Presets' },
-              { value: 'builtin', label: 'Built-in' },
-            ]}
-            onChange={(v) => setFilterOwner(v as 'all' | 'custom' | 'builtin')}
-          />
- 
-          {filterOptions.printers.length > 0 && (
-            <FilterDropdown
-              label="Printer"
-              value={filterPrinter}
-              options={[
-                { value: 'all', label: 'All' },
-                ...filterOptions.printers.map(p => ({ value: p.id, label: p.name })),
-              ]}
-              onChange={setFilterPrinter}
-            />
-          )}
- 
-          {filterOptions.nozzles.length > 0 && (
-            <FilterDropdown
-              label="Nozzle"
-              value={filterNozzle}
-              options={[
-                { value: 'all', label: 'All' },
-                ...filterOptions.nozzles.map(n => ({ value: n, label: n })),
-              ]}
-              onChange={setFilterNozzle}
-            />
-          )}
- 
-          {filterOptions.filaments.length > 0 && (filterType === 'all' || filterType === 'filament') && (
-            <FilterDropdown
-              label="Filament"
-              value={filterFilament}
-              options={[
-                { value: 'all', label: 'All' },
-                ...filterOptions.filaments.map(f => ({ value: f, label: f })),
-              ]}
-              onChange={setFilterFilament}
-            />
-          )}
- 
-          {filterOptions.layerHeights.length > 0 && (filterType === 'all' || filterType === 'process') && (
-            <FilterDropdown
-              label="Layer"
-              value={filterLayerHeight}
-              options={[
-                { value: 'all', label: 'All' },
-                ...filterOptions.layerHeights.map(l => ({ value: l, label: l })),
-              ]}
-              onChange={setFilterLayerHeight}
-            />
-          )}
- 
-          {hasActiveFilters && (
-            <button
-              onClick={clearFilters}
-              className="px-3 py-2 text-sm text-bambu-gray hover:text-white transition-colors"
-            >
-              Clear filters
-            </button>
-          )}
-        </div>
-      </div>
- 
-      {/* Compare mode bar */}
-      {compareMode && (
-        <div className="mb-4 p-3 bg-blue-500/10 border border-blue-500/30 rounded-lg">
-          <div className="flex items-center justify-between">
-            <div className="flex items-center gap-4">
-              <GitCompare className="w-5 h-5 text-blue-400" />
-              <span className="text-white font-medium">Compare Mode</span>
-              <span className="text-bambu-gray">
-                {compareSelection[0]
-                  ? `Select another ${compareSelection[0].type} preset`
-                  : 'Click two presets of the same type to compare'}
-              </span>
-            </div>
-            <div className="flex items-center gap-3">
-              <div className="flex items-center gap-2">
-                <span className={`px-2 py-1 text-sm rounded truncate max-w-[200px] ${compareSelection[0] ? 'bg-blue-500/30 text-blue-700 dark:text-blue-300' : 'bg-bambu-dark text-bambu-gray'}`}>
-                  {compareSelection[0] ? compareSelection[0].name : '1. Select first'}
-                </span>
-                <ArrowRight className="w-4 h-4 text-bambu-gray" />
-                <span className={`px-2 py-1 text-sm rounded truncate max-w-[200px] ${compareSelection[1] ? 'bg-blue-500/30 text-blue-700 dark:text-blue-300' : 'bg-bambu-dark text-bambu-gray'}`}>
-                  {compareSelection[1] ? compareSelection[1].name : '2. Select second'}
-                </span>
-              </div>
-              {compareSelection[0] && compareSelection[1] && (
-                <Button
-                  size="sm"
-                  onClick={async () => {
-                    try {
-                      const [left, right] = await Promise.all([
-                        api.getCloudSettingDetail(compareSelection[0]!.setting_id),
-                        api.getCloudSettingDetail(compareSelection[1]!.setting_id),
-                      ]);
-                      setComparePresets([
-                        (left.setting || {}) as Record<string, unknown>,
-                        (right.setting || {}) as Record<string, unknown>,
-                      ]);
-                      setShowCompareModal(true);
-                    } catch {
-                      // Handle error silently
-                    }
-                  }}
-                >
-                  <GitCompare className="w-4 h-4" />
-                  Compare Now
-                </Button>
-              )}
-            </div>
-          </div>
-        </div>
-      )}
- 
-      {/* Status row: sync time, count, and legend */}
-      <div className="flex flex-wrap items-center gap-4 mb-4 text-sm text-bambu-gray">
-        {lastSyncTime && (
-          <div className="flex items-center gap-1">
-            <Clock className="w-3 h-3" />
-            Last synced: {formatRelativeTime(lastSyncTime.toISOString())}
-          </div>
-        )}
-        <span>Showing {filteredPresets.length} of {totalCount} presets</span>
-        <div className="flex items-center gap-1">
-          <span className="w-1.5 h-1.5 rounded-full bg-bambu-green" />
-          <span>= My preset (editable)</span>
-        </div>
-      </div>
- 
-      {/* 3-Column Presets List */}
-      {filteredPresets.length === 0 ? (
-        <div className="text-center py-16">
-          <Layers className="w-12 h-12 text-bambu-gray-dark mx-auto mb-4" />
-          <p className="text-bambu-gray">No presets found</p>
-          {hasActiveFilters && (
-            <button onClick={clearFilters} className="mt-2 text-sm text-bambu-green hover:text-bambu-green-light">
-              Clear filters
-            </button>
-          )}
-        </div>
-      ) : (
-        <div className="grid grid-cols-1 md:grid-cols-3 gap-6">
-          {/* Filament Column */}
-          <div>
-            <div className="flex items-center gap-2 mb-3 px-1">
-              <Droplet className="w-4 h-4 text-amber-400" />
-              <h3 className="text-sm font-medium text-bambu-gray">Filament</h3>
-              <span className="text-xs text-bambu-gray-dark">
-                ({filteredPresets.filter(p => p.type === 'filament').length})
-              </span>
-            </div>
-            <div className="space-y-1 max-h-[calc(100vh-320px)] overflow-y-auto pr-1">
-              {filteredPresets
-                .filter(p => p.type === 'filament')
-                .map((preset) => (
-                  <PresetListItem
-                    key={preset.setting_id}
-                    setting={preset}
-                    onClick={() => handlePresetClick(preset)}
-                    onDuplicate={() => handleDuplicate(preset)}
-                    compareMode={compareMode}
-                    isCompareSelected={getCompareIndex(preset) !== undefined}
-                    compareIndex={getCompareIndex(preset)}
-                    compareDisabled={compareMode && !!compareSelection[0] && compareSelection[0].type !== preset.type}
-                  />
-                ))}
-              {filteredPresets.filter(p => p.type === 'filament').length === 0 && (
-                <p className="text-xs text-bambu-gray-dark px-3 py-2">No filament presets</p>
-              )}
-            </div>
-          </div>
- 
-          {/* Process Column */}
-          <div>
-            <div className="flex items-center gap-2 mb-3 px-1">
-              <Settings2 className="w-4 h-4 text-blue-400" />
-              <h3 className="text-sm font-medium text-bambu-gray">Process</h3>
-              <span className="text-xs text-bambu-gray-dark">
-                ({filteredPresets.filter(p => p.type === 'process').length})
-              </span>
-            </div>
-            <div className="space-y-1 max-h-[calc(100vh-320px)] overflow-y-auto pr-1">
-              {filteredPresets
-                .filter(p => p.type === 'process')
-                .map((preset) => (
-                  <PresetListItem
-                    key={preset.setting_id}
-                    setting={preset}
-                    onClick={() => handlePresetClick(preset)}
-                    onDuplicate={() => handleDuplicate(preset)}
-                    compareMode={compareMode}
-                    isCompareSelected={getCompareIndex(preset) !== undefined}
-                    compareIndex={getCompareIndex(preset)}
-                    compareDisabled={compareMode && !!compareSelection[0] && compareSelection[0].type !== preset.type}
-                  />
-                ))}
-              {filteredPresets.filter(p => p.type === 'process').length === 0 && (
-                <p className="text-xs text-bambu-gray-dark px-3 py-2">No process presets</p>
-              )}
-            </div>
-          </div>
- 
-          {/* Printer Column */}
-          <div>
-            <div className="flex items-center gap-2 mb-3 px-1">
-              <PrinterIcon className="w-4 h-4 text-purple-400" />
-              <h3 className="text-sm font-medium text-bambu-gray">Printer</h3>
-              <span className="text-xs text-bambu-gray-dark">
-                ({filteredPresets.filter(p => p.type === 'printer').length})
-              </span>
-            </div>
-            <div className="space-y-1 max-h-[calc(100vh-320px)] overflow-y-auto pr-1">
-              {filteredPresets
-                .filter(p => p.type === 'printer')
-                .map((preset) => (
-                  <PresetListItem
-                    key={preset.setting_id}
-                    setting={preset}
-                    onClick={() => handlePresetClick(preset)}
-                    onDuplicate={() => handleDuplicate(preset)}
-                    compareMode={compareMode}
-                    isCompareSelected={getCompareIndex(preset) !== undefined}
-                    compareIndex={getCompareIndex(preset)}
-                    compareDisabled={compareMode && !!compareSelection[0] && compareSelection[0].type !== preset.type}
-                  />
-                ))}
-              {filteredPresets.filter(p => p.type === 'printer').length === 0 && (
-                <p className="text-xs text-bambu-gray-dark px-3 py-2">No printer presets</p>
-              )}
-            </div>
-          </div>
-        </div>
-      )}
- 
-      {/* Modals */}
-      {selectedSetting && (
-        <PresetDetailModal
-          setting={selectedSetting}
-          onClose={() => setSelectedSetting(null)}
-          onDeleted={() => setSelectedSetting(null)}
-          onDuplicate={() => handleDuplicate(selectedSetting)}
-          onEdit={() => handleEdit(selectedSetting)}
-        />
-      )}
- 
-      {(showCreateModal || duplicateData || editData || templateData) && (
-        <CreatePresetModal
-          onClose={() => { setShowCreateModal(false); setDuplicateData(null); setEditData(null); setTemplateData(null); }}
-          initialData={editData || duplicateData || (templateData ? { type: templateData.type, name: '', base_id: '', setting: templateData.setting } : undefined)}
-          allPresets={settings}
-        />
-      )}
- 
-      {showTemplatesModal && (
-        <TemplatesModal
-          onClose={() => setShowTemplatesModal(false)}
-          onApply={(template) => {
-            setTemplateData({ type: template.type, setting: template.settings });
-            setShowTemplatesModal(false);
-          }}
-        />
-      )}
- 
-      {showCompareModal && comparePresets && compareSelection[0] && compareSelection[1] && (
-        <DiffModal
-          onClose={() => {
-            setShowCompareModal(false);
-            setComparePresets(null);
-          }}
-          leftPreset={comparePresets[0]}
-          rightPreset={comparePresets[1]}
-          leftLabel={compareSelection[0].name}
-          rightLabel={compareSelection[1].name}
-        />
-      )}
-    </>
-  );
-}
- 
-// ============================================================================
-// MAIN PAGE
-// ============================================================================
- 
-export function ProfilesPage() {
-  const queryClient = useQueryClient();
-  const { showToast } = useToast();
-  const [activeTab, setActiveTab] = useState<ProfileTab>('cloud');
-  const [lastSyncTime, setLastSyncTime] = useState<Date>();
- 
-  const { data: status, isLoading: statusLoading } = useQuery({
-    queryKey: ['cloudStatus'],
-    queryFn: api.getCloudStatus,
-  });
- 
-  const { data: printers = [] } = useQuery({
-    queryKey: ['printers'],
-    queryFn: api.getPrinters,
-  });
- 
-  const { data: settings, isLoading: settingsLoading, refetch: refetchSettings, dataUpdatedAt } = useQuery({
-    queryKey: ['cloudSettings'],
-    queryFn: () => api.getCloudSettings(),
-    enabled: !!status?.is_authenticated,
-    retry: false,
-    staleTime: 1000 * 60 * 5,
-  });
- 
-  useEffect(() => {
-    if (dataUpdatedAt) {
-      setLastSyncTime(new Date(dataUpdatedAt));
-    }
-  }, [dataUpdatedAt]);
- 
-  const logoutMutation = useMutation({
-    mutationFn: api.cloudLogout,
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['cloudStatus'] });
-      queryClient.removeQueries({ queryKey: ['cloudSettings'] });
-      showToast('Logged out');
-    },
-  });
- 
-  const handleLoginSuccess = () => {
-    queryClient.invalidateQueries({ queryKey: ['cloudStatus'] });
-  };
- 
-  if (statusLoading) {
-    return (
-      <div className="p-4 md:p-8 flex items-center justify-center min-h-[400px]">
-        <Loader2 className="w-8 h-8 text-bambu-green animate-spin" />
-      </div>
-    );
-  }
- 
-  return (
-    <div className="p-6 lg:p-8">
-      {/* Page Header */}
-      <div className="mb-6">
-        <h1 className="text-2xl font-bold text-white">Profiles</h1>
-        <p className="text-bambu-gray">Manage your slicer presets and pressure advance calibrations</p>
-      </div>
- 
-      {/* Tab Navigation */}
-      <div className="flex border-b border-bambu-dark-tertiary mb-6">
-        <button
-          onClick={() => setActiveTab('cloud')}
-          className={`flex items-center gap-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 -mb-px ${
-            activeTab === 'cloud'
-              ? 'text-bambu-green border-bambu-green'
-              : 'text-bambu-gray hover:text-white border-transparent'
-          }`}
-        >
-          <Cloud className="w-4 h-4" />
-          Cloud Profiles
-        </button>
-        <button
-          onClick={() => setActiveTab('kprofiles')}
-          className={`flex items-center gap-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 -mb-px ${
-            activeTab === 'kprofiles'
-              ? 'text-bambu-green border-bambu-green'
-              : 'text-bambu-gray hover:text-white border-transparent'
-          }`}
-        >
-          <Gauge className="w-4 h-4" />
-          K-Profiles
-        </button>
-      </div>
- 
-      {/* Cloud Profiles Tab */}
-      {activeTab === 'cloud' && (
-        <>
-          {/* Connection Status Bar */}
-          {status?.is_authenticated && (
-            <div className="flex items-center justify-between p-3 mb-6 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary">
-              <div className="flex items-center gap-3">
-                <div className="w-2 h-2 rounded-full bg-bambu-green animate-pulse" />
-                <span className="text-sm text-bambu-gray">
-                  Connected as <span className="text-white">{status.email}</span>
-                </span>
-              </div>
-              <Button
-                variant="secondary"
-                size="sm"
-                onClick={() => logoutMutation.mutate()}
-                disabled={logoutMutation.isPending}
-              >
-                <LogOut className="w-4 h-4" />
-                Logout
-              </Button>
-            </div>
-          )}
- 
-          {!status?.is_authenticated ? (
-            <LoginForm onSuccess={handleLoginSuccess} />
-          ) : settingsLoading ? (
-            <div className="flex items-center justify-center py-16">
-              <Loader2 className="w-8 h-8 text-bambu-green animate-spin" />
-            </div>
-          ) : settings ? (
-            <CloudProfilesView
-              settings={settings}
-              lastSyncTime={lastSyncTime}
-              onRefresh={() => refetchSettings()}
-              isRefreshing={settingsLoading}
-              printers={printers}
-            />
-          ) : (
-            <div className="text-center py-16">
-              <p className="text-bambu-gray mb-4">Failed to load profiles</p>
-              <Button onClick={() => refetchSettings()}>Retry</Button>
-            </div>
-          )}
-        </>
-      )}
- 
-      {/* K-Profiles Tab */}
-      {activeTab === 'kprofiles' && <KProfilesView />}
- 
-      {/* Scroll to Top Button */}
-      <ScrollToTop />
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/pages/ProjectsPage.tsx.html b/frontend/coverage/src/pages/ProjectsPage.tsx.html deleted file mode 100644 index b8b5dcdb9..000000000 --- a/frontend/coverage/src/pages/ProjectsPage.tsx.html +++ /dev/null @@ -1,1444 +0,0 @@ - - - - - - Code coverage report for src/pages/ProjectsPage.tsx - - - - - - - - - -
-
-

All files / src/pages ProjectsPage.tsx

-
- -
- 0% - Statements - 0/351 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/351 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -425 -426 -427 -428 -429 -430 -431 -432 -433 -434 -435 -436 -437 -438 -439 -440 -441 -442 -443 -444 -445 -446 -447 -448 -449 -450 -451 -452 -453 -454  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState } from 'react';
-import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
-import {
-  FolderKanban,
-  Loader2,
-  Plus,
-  Trash2,
-  Edit3,
-  Archive,
-  ListTodo,
-  Package,
-} from 'lucide-react';
-import { api } from '../api/client';
-import type { ProjectListItem, ProjectCreate, ProjectUpdate } from '../api/client';
-import { Card, CardContent } from '../components/Card';
-import { Button } from '../components/Button';
-import { ConfirmModal } from '../components/ConfirmModal';
-import { useToast } from '../contexts/ToastContext';
- 
-const PROJECT_COLORS = [
-  '#ef4444', // red
-  '#f97316', // orange
-  '#eab308', // yellow
-  '#22c55e', // green
-  '#06b6d4', // cyan
-  '#3b82f6', // blue
-  '#8b5cf6', // violet
-  '#ec4899', // pink
-  '#6b7280', // gray
-];
- 
-interface ProjectModalProps {
-  project?: ProjectListItem;
-  onClose: () => void;
-  onSave: (data: ProjectCreate | ProjectUpdate) => void;
-  isLoading: boolean;
-}
- 
-function ProjectModal({ project, onClose, onSave, isLoading }: ProjectModalProps) {
-  const [name, setName] = useState(project?.name || '');
-  const [description, setDescription] = useState(project?.description || '');
-  const [color, setColor] = useState(project?.color || PROJECT_COLORS[0]);
-  const [targetCount, setTargetCount] = useState(project?.target_count?.toString() || '');
-  const [status, setStatus] = useState(project?.status || 'active');
- 
-  const handleSubmit = (e: React.FormEvent) => {
-    e.preventDefault();
-    onSave({
-      name: name.trim(),
-      description: description.trim() || undefined,
-      color,
-      target_count: targetCount ? parseInt(targetCount, 10) : undefined,
-      ...(project && { status }),
-    });
-  };
- 
-  return (
-    <div className="fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4">
-      <div className="bg-bambu-dark-secondary rounded-lg w-full max-w-md border border-bambu-dark-tertiary">
-        <div className="p-4 border-b border-bambu-dark-tertiary">
-          <h2 className="text-lg font-semibold text-white">
-            {project ? 'Edit Project' : 'New Project'}
-          </h2>
-        </div>
- 
-        <form onSubmit={handleSubmit} className="p-4 space-y-4">
-          <div>
-            <label className="block text-sm font-medium text-white mb-1">
-              Name
-            </label>
-            <input
-              type="text"
-              value={name}
-              onChange={(e) => setName(e.target.value)}
-              className="w-full bg-bambu-dark border border-bambu-dark-tertiary rounded px-3 py-2 text-white placeholder-bambu-gray focus:outline-none focus:border-bambu-green"
-              placeholder="e.g., Voron 2.4 Build"
-              required
-            />
-          </div>
- 
-          <div>
-            <label className="block text-sm font-medium text-white mb-1">
-              Description
-            </label>
-            <textarea
-              value={description}
-              onChange={(e) => setDescription(e.target.value)}
-              className="w-full bg-bambu-dark border border-bambu-dark-tertiary rounded px-3 py-2 text-white placeholder-bambu-gray focus:outline-none focus:border-bambu-green resize-none"
-              placeholder="Optional description..."
-              rows={2}
-            />
-          </div>
- 
-          <div>
-            <label className="block text-sm font-medium text-white mb-1">
-              Color
-            </label>
-            <div className="flex gap-2 flex-wrap">
-              {PROJECT_COLORS.map((c) => (
-                <button
-                  key={c}
-                  type="button"
-                  onClick={() => setColor(c)}
-                  className={`w-8 h-8 rounded-full transition-transform ${
-                    color === c ? 'ring-2 ring-white ring-offset-2 ring-offset-bambu-dark-secondary scale-110' : ''
-                  }`}
-                  style={{ backgroundColor: c }}
-                />
-              ))}
-            </div>
-          </div>
- 
-          <div>
-            <label className="block text-sm font-medium text-white mb-1">
-              Target Print Count (optional)
-            </label>
-            <input
-              type="number"
-              value={targetCount}
-              onChange={(e) => setTargetCount(e.target.value)}
-              className="w-full bg-bambu-dark border border-bambu-dark-tertiary rounded px-3 py-2 text-white placeholder-bambu-gray focus:outline-none focus:border-bambu-green"
-              placeholder="e.g., 50 parts to print"
-              min="1"
-            />
-          </div>
- 
-          {project && (
-            <div>
-              <label className="block text-sm font-medium text-white mb-1">
-                Status
-              </label>
-              <select
-                value={status}
-                onChange={(e) => setStatus(e.target.value)}
-                className="w-full bg-bambu-dark border border-bambu-dark-tertiary rounded px-3 py-2 text-white focus:outline-none focus:border-bambu-green"
-              >
-                <option value="active">Active</option>
-                <option value="completed">Completed</option>
-                <option value="archived">Archived</option>
-              </select>
-            </div>
-          )}
- 
-          <div className="flex justify-end gap-2 pt-2">
-            <Button type="button" variant="secondary" onClick={onClose}>
-              Cancel
-            </Button>
-            <Button type="submit" disabled={!name.trim() || isLoading}>
-              {isLoading ? (
-                <Loader2 className="w-4 h-4 animate-spin" />
-              ) : project ? (
-                'Save'
-              ) : (
-                'Create'
-              )}
-            </Button>
-          </div>
-        </form>
-      </div>
-    </div>
-  );
-}
- 
-interface ProjectCardProps {
-  project: ProjectListItem;
-  onClick: () => void;
-  onEdit: () => void;
-  onDelete: () => void;
-}
- 
-function ProjectCard({ project, onClick, onEdit, onDelete }: ProjectCardProps) {
-  const progressPercent = project.progress_percent ?? 0;
-  const isCompleted = project.status === 'completed';
-  const isArchived = project.status === 'archived';
- 
-  return (
-    <Card className="hover:border-bambu-gray/30 transition-colors cursor-pointer" onClick={onClick}>
-      <CardContent className="p-4">
-        <div className="flex items-start justify-between mb-3">
-          <div className="flex items-center gap-3">
-            <div
-              className="w-3 h-3 rounded-full flex-shrink-0"
-              style={{ backgroundColor: project.color || '#6b7280' }}
-            />
-            <div>
-              <h3 className="font-medium text-white">{project.name}</h3>
-              {project.description && (
-                <p className="text-sm text-bambu-gray/70 mt-0.5 line-clamp-1">
-                  {project.description}
-                </p>
-              )}
-            </div>
-          </div>
-          <div className="flex items-center gap-1" onClick={(e) => e.stopPropagation()}>
-            {isCompleted && (
-              <span className="text-xs bg-bambu-green/20 text-bambu-green px-2 py-0.5 rounded">
-                Completed
-              </span>
-            )}
-            {isArchived && (
-              <span className="text-xs bg-bambu-gray/20 text-bambu-gray px-2 py-0.5 rounded">
-                Archived
-              </span>
-            )}
-            <Button variant="ghost" size="sm" onClick={onEdit} className="p-1">
-              <Edit3 className="w-4 h-4" />
-            </Button>
-            <Button variant="ghost" size="sm" onClick={onDelete} className="p-1 text-red-400 hover:text-red-300">
-              <Trash2 className="w-4 h-4" />
-            </Button>
-          </div>
-        </div>
- 
-        {/* Progress bar */}
-        {project.target_count && (
-          <div className="mb-3">
-            <div className="flex justify-between text-xs text-bambu-gray mb-1">
-              <span>{project.archive_count} / {project.target_count} prints</span>
-              <span>{progressPercent.toFixed(0)}%</span>
-            </div>
-            <div className="h-2 bg-bambu-dark rounded-full overflow-hidden">
-              <div
-                className="h-full transition-all duration-300"
-                style={{
-                  width: `${Math.min(progressPercent, 100)}%`,
-                  backgroundColor: progressPercent >= 100 ? '#22c55e' : project.color || '#6b7280',
-                }}
-              />
-            </div>
-          </div>
-        )}
- 
-        {/* Archive thumbnails */}
-        {project.archives && project.archives.length > 0 && (
-          <div className="mb-3">
-            <div className="flex gap-2">
-              {project.archives.slice(0, 5).map((archive) => (
-                <a
-                  key={archive.id}
-                  href={`/archives?search=${encodeURIComponent(archive.print_name || '')}`}
-                  onClick={(e) => e.stopPropagation()}
-                  className="relative w-14 h-14 rounded-lg bg-bambu-dark flex-shrink-0 overflow-hidden border border-bambu-dark-tertiary hover:border-bambu-green transition-colors"
-                  title={archive.print_name || 'Unknown'}
-                >
-                  {archive.thumbnail_path ? (
-                    <img
-                      src={`/api/v1/archives/${archive.id}/thumbnail`}
-                      alt={archive.print_name || ''}
-                      className="w-full h-full object-cover"
-                    />
-                  ) : (
-                    <div className="w-full h-full flex items-center justify-center text-bambu-gray">
-                      <Package className="w-6 h-6" />
-                    </div>
-                  )}
-                  {archive.status === 'failed' && (
-                    <div className="absolute inset-0 bg-red-500/40 flex items-center justify-center">
-                      <span className="text-white text-xs font-bold">✗</span>
-                    </div>
-                  )}
-                </a>
-              ))}
-              {project.archive_count > 5 && (
-                <div className="w-14 h-14 rounded-lg bg-bambu-dark flex-shrink-0 flex items-center justify-center text-sm text-bambu-gray border border-bambu-dark-tertiary">
-                  +{project.archive_count - 5}
-                </div>
-              )}
-            </div>
-          </div>
-        )}
- 
-        {/* Stats */}
-        <div className="flex items-center gap-4 text-sm text-bambu-gray">
-          <div className="flex items-center gap-1" title="Archives">
-            <Archive className="w-4 h-4" />
-            <span>{project.archive_count}</span>
-          </div>
-          <div className="flex items-center gap-1" title="Queued">
-            <ListTodo className="w-4 h-4" />
-            <span>{project.queue_count}</span>
-          </div>
-        </div>
-      </CardContent>
-    </Card>
-  );
-}
- 
-export function ProjectsPage() {
-  const queryClient = useQueryClient();
-  const { showToast } = useToast();
-  const [showModal, setShowModal] = useState(false);
-  const [editingProject, setEditingProject] = useState<ProjectListItem | undefined>();
-  const [statusFilter, setStatusFilter] = useState<string>('active');
-  const [deleteConfirm, setDeleteConfirm] = useState<number | null>(null);
- 
-  const { data: projects, isLoading } = useQuery({
-    queryKey: ['projects', statusFilter === 'all' ? undefined : statusFilter],
-    queryFn: () => api.getProjects(statusFilter === 'all' ? undefined : statusFilter),
-  });
- 
-  const createMutation = useMutation({
-    mutationFn: (data: ProjectCreate) => api.createProject(data),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['projects'] });
-      setShowModal(false);
-      showToast('Project created', 'success');
-    },
-    onError: (error: Error) => {
-      showToast(error.message, 'error');
-    },
-  });
- 
-  const updateMutation = useMutation({
-    mutationFn: ({ id, data }: { id: number; data: ProjectUpdate }) =>
-      api.updateProject(id, data),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['projects'] });
-      setShowModal(false);
-      setEditingProject(undefined);
-      showToast('Project updated', 'success');
-    },
-    onError: (error: Error) => {
-      showToast(error.message, 'error');
-    },
-  });
- 
-  const deleteMutation = useMutation({
-    mutationFn: (id: number) => api.deleteProject(id),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['projects'] });
-      setDeleteConfirm(null);
-      showToast('Project deleted', 'success');
-    },
-    onError: (error: Error) => {
-      showToast(error.message, 'error');
-    },
-  });
- 
-  const handleSave = (data: ProjectCreate | ProjectUpdate) => {
-    if (editingProject) {
-      updateMutation.mutate({ id: editingProject.id, data });
-    } else {
-      createMutation.mutate(data as ProjectCreate);
-    }
-  };
- 
-  const handleEdit = (project: ProjectListItem) => {
-    setEditingProject(project);
-    setShowModal(true);
-  };
- 
-  const handleClick = (project: ProjectListItem) => {
-    // Open edit modal when clicking on card
-    handleEdit(project);
-  };
- 
-  const handleDeleteClick = (id: number) => {
-    setDeleteConfirm(id);
-  };
- 
-  const handleDeleteConfirm = () => {
-    if (deleteConfirm !== null) {
-      deleteMutation.mutate(deleteConfirm);
-    }
-  };
- 
-  return (
-    <div className="space-y-6">
-      {/* Header */}
-      <div className="flex items-center justify-between">
-        <div className="flex items-center gap-3">
-          <FolderKanban className="w-6 h-6 text-bambu-green" />
-          <h1 className="text-2xl font-bold text-white">Projects</h1>
-        </div>
-        <Button onClick={() => setShowModal(true)}>
-          <Plus className="w-4 h-4 mr-2" />
-          New Project
-        </Button>
-      </div>
- 
-      {/* Filters */}
-      <div className="flex gap-2">
-        {['active', 'completed', 'archived', 'all'].map((status) => (
-          <button
-            key={status}
-            onClick={() => setStatusFilter(status)}
-            className={`px-3 py-1.5 text-sm rounded-lg transition-colors ${
-              statusFilter === status
-                ? 'bg-bambu-green text-white'
-                : 'bg-bambu-card text-bambu-gray hover:bg-bambu-gray/20'
-            }`}
-          >
-            {status.charAt(0).toUpperCase() + status.slice(1)}
-          </button>
-        ))}
-      </div>
- 
-      {/* Content */}
-      {isLoading ? (
-        <div className="flex items-center justify-center py-12">
-          <Loader2 className="w-8 h-8 animate-spin text-bambu-green" />
-        </div>
-      ) : projects?.length === 0 ? (
-        <Card>
-          <CardContent className="py-12 text-center">
-            <FolderKanban className="w-12 h-12 text-bambu-gray/50 mx-auto mb-4" />
-            <p className="text-bambu-gray">No projects found</p>
-            <p className="text-bambu-gray/70 text-sm mt-1">
-              Create a project to group related prints together
-            </p>
-          </CardContent>
-        </Card>
-      ) : (
-        <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
-          {projects?.map((project) => (
-            <ProjectCard
-              key={project.id}
-              project={project}
-              onClick={() => handleClick(project)}
-              onEdit={() => handleEdit(project)}
-              onDelete={() => handleDeleteClick(project.id)}
-            />
-          ))}
-        </div>
-      )}
- 
-      {/* Delete Confirmation Modal */}
-      {deleteConfirm !== null && (
-        <ConfirmModal
-          title="Delete Project"
-          message="Are you sure you want to delete this project? Archives and queue items will be unlinked but not deleted."
-          confirmText="Delete Project"
-          variant="danger"
-          onConfirm={handleDeleteConfirm}
-          onCancel={() => setDeleteConfirm(null)}
-        />
-      )}
- 
-      {/* Modal */}
-      {showModal && (
-        <ProjectModal
-          project={editingProject}
-          onClose={() => {
-            setShowModal(false);
-            setEditingProject(undefined);
-          }}
-          onSave={handleSave}
-          isLoading={createMutation.isPending || updateMutation.isPending}
-        />
-      )}
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/pages/QueuePage.tsx.html b/frontend/coverage/src/pages/QueuePage.tsx.html deleted file mode 100644 index 42a1fa6c2..000000000 --- a/frontend/coverage/src/pages/QueuePage.tsx.html +++ /dev/null @@ -1,2575 +0,0 @@ - - - - - - Code coverage report for src/pages/QueuePage.tsx - - - - - - - - - -
-
-

All files / src/pages QueuePage.tsx

-
- -
- 0% - Statements - 0/634 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/634 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -425 -426 -427 -428 -429 -430 -431 -432 -433 -434 -435 -436 -437 -438 -439 -440 -441 -442 -443 -444 -445 -446 -447 -448 -449 -450 -451 -452 -453 -454 -455 -456 -457 -458 -459 -460 -461 -462 -463 -464 -465 -466 -467 -468 -469 -470 -471 -472 -473 -474 -475 -476 -477 -478 -479 -480 -481 -482 -483 -484 -485 -486 -487 -488 -489 -490 -491 -492 -493 -494 -495 -496 -497 -498 -499 -500 -501 -502 -503 -504 -505 -506 -507 -508 -509 -510 -511 -512 -513 -514 -515 -516 -517 -518 -519 -520 -521 -522 -523 -524 -525 -526 -527 -528 -529 -530 -531 -532 -533 -534 -535 -536 -537 -538 -539 -540 -541 -542 -543 -544 -545 -546 -547 -548 -549 -550 -551 -552 -553 -554 -555 -556 -557 -558 -559 -560 -561 -562 -563 -564 -565 -566 -567 -568 -569 -570 -571 -572 -573 -574 -575 -576 -577 -578 -579 -580 -581 -582 -583 -584 -585 -586 -587 -588 -589 -590 -591 -592 -593 -594 -595 -596 -597 -598 -599 -600 -601 -602 -603 -604 -605 -606 -607 -608 -609 -610 -611 -612 -613 -614 -615 -616 -617 -618 -619 -620 -621 -622 -623 -624 -625 -626 -627 -628 -629 -630 -631 -632 -633 -634 -635 -636 -637 -638 -639 -640 -641 -642 -643 -644 -645 -646 -647 -648 -649 -650 -651 -652 -653 -654 -655 -656 -657 -658 -659 -660 -661 -662 -663 -664 -665 -666 -667 -668 -669 -670 -671 -672 -673 -674 -675 -676 -677 -678 -679 -680 -681 -682 -683 -684 -685 -686 -687 -688 -689 -690 -691 -692 -693 -694 -695 -696 -697 -698 -699 -700 -701 -702 -703 -704 -705 -706 -707 -708 -709 -710 -711 -712 -713 -714 -715 -716 -717 -718 -719 -720 -721 -722 -723 -724 -725 -726 -727 -728 -729 -730 -731 -732 -733 -734 -735 -736 -737 -738 -739 -740 -741 -742 -743 -744 -745 -746 -747 -748 -749 -750 -751 -752 -753 -754 -755 -756 -757 -758 -759 -760 -761 -762 -763 -764 -765 -766 -767 -768 -769 -770 -771 -772 -773 -774 -775 -776 -777 -778 -779 -780 -781 -782 -783 -784 -785 -786 -787 -788 -789 -790 -791 -792 -793 -794 -795 -796 -797 -798 -799 -800 -801 -802 -803 -804 -805 -806 -807 -808 -809 -810 -811 -812 -813 -814 -815 -816 -817 -818 -819 -820 -821 -822 -823 -824 -825 -826 -827 -828 -829 -830 -831  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useMemo, useEffect } from 'react';
-import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
-import { Link } from 'react-router-dom';
-import {
-  DndContext,
-  closestCenter,
-  KeyboardSensor,
-  PointerSensor,
-  useSensor,
-  useSensors,
-} from '@dnd-kit/core';
-import type { DragEndEvent } from '@dnd-kit/core';
-import {
-  arrayMove,
-  SortableContext,
-  sortableKeyboardCoordinates,
-  useSortable,
-  verticalListSortingStrategy,
-} from '@dnd-kit/sortable';
-import { CSS } from '@dnd-kit/utilities';
-import {
-  Clock,
-  Trash2,
-  Play,
-  X,
-  CheckCircle,
-  XCircle,
-  AlertCircle,
-  Calendar,
-  Printer,
-  GripVertical,
-  SkipForward,
-  ExternalLink,
-  Power,
-  StopCircle,
-  Pencil,
-  RefreshCw,
-  Timer,
-  ListOrdered,
-  Layers,
-  ArrowUp,
-  ArrowDown,
-} from 'lucide-react';
-import { api } from '../api/client';
-import type { PrintQueueItem } from '../api/client';
-import { Card, CardContent } from '../components/Card';
-import { Button } from '../components/Button';
-import { ConfirmModal } from '../components/ConfirmModal';
-import { EditQueueItemModal } from '../components/EditQueueItemModal';
-import { useToast } from '../contexts/ToastContext';
- 
-function formatDuration(seconds: number | null | undefined): string {
-  if (!seconds) return '--';
-  const hours = Math.floor(seconds / 3600);
-  const minutes = Math.floor((seconds % 3600) / 60);
-  if (hours > 0) return `${hours}h ${minutes}m`;
-  return `${minutes}m`;
-}
- 
-function formatRelativeTime(dateString: string | null): string {
-  if (!dateString) return 'ASAP';
-  const date = new Date(dateString);
-  const now = new Date();
-  const diff = date.getTime() - now.getTime();
- 
-  if (diff < -60000) return 'Overdue';
-  if (diff < 0) return 'Now';
-  if (diff < 60000) return 'In less than a minute';
-  if (diff < 3600000) return `In ${Math.round(diff / 60000)} min`;
-  if (diff < 86400000) return `In ${Math.round(diff / 3600000)} hours`;
-  return date.toLocaleString();
-}
- 
-function StatusBadge({ status }: { status: PrintQueueItem['status'] }) {
-  const config = {
-    pending: { icon: Clock, color: 'text-yellow-400 bg-yellow-400/10 border-yellow-400/20', label: 'Pending' },
-    printing: { icon: Play, color: 'text-blue-400 bg-blue-400/10 border-blue-400/20', label: 'Printing' },
-    completed: { icon: CheckCircle, color: 'text-green-400 bg-green-400/10 border-green-400/20', label: 'Completed' },
-    failed: { icon: XCircle, color: 'text-red-400 bg-red-400/10 border-red-400/20', label: 'Failed' },
-    skipped: { icon: SkipForward, color: 'text-orange-400 bg-orange-400/10 border-orange-400/20', label: 'Skipped' },
-    cancelled: { icon: X, color: 'text-gray-400 bg-gray-400/10 border-gray-400/20', label: 'Cancelled' },
-  };
- 
-  const { icon: Icon, color, label } = config[status];
- 
-  return (
-    <span className={`inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium border ${color}`}>
-      <Icon className="w-3.5 h-3.5" />
-      {label}
-    </span>
-  );
-}
- 
-// Sortable queue item for drag and drop
-function SortableQueueItem({
-  item,
-  position,
-  onEdit,
-  onCancel,
-  onRemove,
-  onStop,
-  onRequeue,
-}: {
-  item: PrintQueueItem;
-  position?: number;
-  onEdit: () => void;
-  onCancel: () => void;
-  onRemove: () => void;
-  onStop: () => void;
-  onRequeue: () => void;
-}) {
-  const {
-    attributes,
-    listeners,
-    setNodeRef,
-    transform,
-    transition,
-    isDragging,
-  } = useSortable({ id: item.id, disabled: item.status !== 'pending' });
- 
-  const style = {
-    transform: CSS.Transform.toString(transform),
-    transition,
-  };
- 
-  const isPrinting = item.status === 'printing';
-  const isPending = item.status === 'pending';
-  const isHistory = ['completed', 'failed', 'skipped', 'cancelled'].includes(item.status);
- 
-  return (
-    <div
-      ref={setNodeRef}
-      style={style}
-      className={`
-        group relative bg-bambu-dark-secondary rounded-xl border border-bambu-dark-tertiary
-        transition-all duration-200 hover:border-bambu-dark-tertiary/80
-        ${isDragging ? 'opacity-50 scale-[1.02] shadow-xl z-50' : ''}
-        ${isPrinting ? 'border-blue-500/30 bg-gradient-to-r from-blue-500/5 to-transparent' : ''}
-      `}
-    >
-      <div className="flex items-center gap-4 p-4">
-        {/* Drag handle or position number */}
-        {isPending ? (
-          <div
-            {...attributes}
-            {...listeners}
-            className="flex items-center justify-center w-10 h-10 md:w-8 md:h-8 rounded-lg bg-bambu-dark cursor-grab active:cursor-grabbing hover:bg-bambu-dark-tertiary transition-colors touch-manipulation"
-          >
-            <GripVertical className="w-6 h-6 md:w-4 md:h-4 text-bambu-gray" />
-          </div>
-        ) : position !== undefined ? (
-          <div className="flex items-center justify-center w-8 h-8 rounded-lg bg-bambu-dark text-bambu-gray text-sm font-medium">
-            #{position}
-          </div>
-        ) : (
-          <div className="w-8" />
-        )}
- 
-        {/* Thumbnail */}
-        <div className="w-14 h-14 flex-shrink-0 bg-bambu-dark rounded-lg overflow-hidden">
-          {item.archive_thumbnail ? (
-            <img
-              src={api.getArchiveThumbnail(item.archive_id)}
-              alt=""
-              className="w-full h-full object-cover"
-            />
-          ) : (
-            <div className="w-full h-full flex items-center justify-center text-bambu-gray">
-              <Layers className="w-6 h-6" />
-            </div>
-          )}
-        </div>
- 
-        {/* Info */}
-        <div className="flex-1 min-w-0">
-          <div className="flex items-center gap-2 mb-1">
-            <p className="text-white font-medium truncate">
-              {item.archive_name || `Archive #${item.archive_id}`}
-            </p>
-            <Link
-              to={`/archives?highlight=${item.archive_id}`}
-              className="text-bambu-gray hover:text-bambu-green transition-colors flex-shrink-0"
-              title="View archive"
-            >
-              <ExternalLink className="w-3.5 h-3.5" />
-            </Link>
-          </div>
- 
-          <div className="flex items-center gap-3 text-sm text-bambu-gray">
-            <span className="flex items-center gap-1.5">
-              <Printer className="w-3.5 h-3.5" />
-              {item.printer_name || `Printer #${item.printer_id}`}
-            </span>
-            {item.print_time_seconds && (
-              <span className="flex items-center gap-1.5">
-                <Timer className="w-3.5 h-3.5" />
-                {formatDuration(item.print_time_seconds)}
-              </span>
-            )}
-            {isPending && (
-              <span className="flex items-center gap-1.5">
-                <Clock className="w-3.5 h-3.5" />
-                {formatRelativeTime(item.scheduled_time)}
-              </span>
-            )}
-          </div>
- 
-          {/* Options badges */}
-          <div className="flex items-center gap-2 mt-2">
-            {item.require_previous_success && (
-              <span className="text-xs px-2 py-0.5 bg-orange-500/10 text-orange-400 rounded-full border border-orange-500/20">
-                Requires previous success
-              </span>
-            )}
-            {item.auto_off_after && (
-              <span className="text-xs px-2 py-0.5 bg-blue-500/10 text-blue-400 rounded-full border border-blue-500/20 flex items-center gap-1">
-                <Power className="w-3 h-3" />
-                Auto power off
-              </span>
-            )}
-          </div>
- 
-          {/* Progress bar for printing items - TODO: integrate with WebSocket */}
-          {isPrinting && (
-            <div className="mt-3">
-              <div className="h-2 bg-bambu-dark rounded-full overflow-hidden">
-                <div className="h-full bg-gradient-to-r from-blue-500 to-blue-400 animate-pulse w-full opacity-50" />
-              </div>
-              <p className="text-xs text-bambu-gray mt-1">Printing in progress...</p>
-            </div>
-          )}
- 
-          {/* Error message */}
-          {item.error_message && (
-            <p className="text-xs text-red-400 mt-2 flex items-center gap-1">
-              <AlertCircle className="w-3 h-3" />
-              {item.error_message}
-            </p>
-          )}
-        </div>
- 
-        {/* Status badge */}
-        <StatusBadge status={item.status} />
- 
-        {/* Actions */}
-        <div className="flex items-center gap-1">
-          {isPrinting && (
-            <Button
-              variant="ghost"
-              size="sm"
-              onClick={onStop}
-              title="Stop Print"
-              className="text-red-400 hover:text-red-300 hover:bg-red-500/10"
-            >
-              <StopCircle className="w-4 h-4" />
-            </Button>
-          )}
-          {isPending && (
-            <>
-              <Button
-                variant="ghost"
-                size="sm"
-                onClick={onEdit}
-                title="Edit"
-              >
-                <Pencil className="w-4 h-4" />
-              </Button>
-              <Button
-                variant="ghost"
-                size="sm"
-                onClick={onCancel}
-                title="Cancel"
-                className="text-red-400 hover:text-red-300 hover:bg-red-500/10"
-              >
-                <X className="w-4 h-4" />
-              </Button>
-            </>
-          )}
-          {isHistory && (
-            <>
-              <Button
-                variant="ghost"
-                size="sm"
-                onClick={onRequeue}
-                title="Re-queue"
-                className="text-bambu-green hover:text-bambu-green/80 hover:bg-bambu-green/10"
-              >
-                <RefreshCw className="w-4 h-4" />
-              </Button>
-              <Button
-                variant="ghost"
-                size="sm"
-                onClick={onRemove}
-                title="Remove"
-              >
-                <Trash2 className="w-4 h-4" />
-              </Button>
-            </>
-          )}
-        </div>
-      </div>
-    </div>
-  );
-}
- 
-export function QueuePage() {
-  const queryClient = useQueryClient();
-  const { showToast } = useToast();
-  const [filterPrinter, setFilterPrinter] = useState<number | null>(null);
-  const [filterStatus, setFilterStatus] = useState<string>('');
-  const [showClearHistoryConfirm, setShowClearHistoryConfirm] = useState(false);
-  const [editItem, setEditItem] = useState<PrintQueueItem | null>(null);
-  const [confirmAction, setConfirmAction] = useState<{
-    type: 'cancel' | 'remove' | 'stop';
-    item: PrintQueueItem;
-  } | null>(null);
-  const [historySortBy, setHistorySortBy] = useState<'date' | 'name' | 'printer'>(() => {
-    const saved = localStorage.getItem('queue.historySortBy');
-    return (saved as 'date' | 'name' | 'printer') || 'date';
-  });
-  const [historySortAsc, setHistorySortAsc] = useState(() => {
-    const saved = localStorage.getItem('queue.historySortAsc');
-    return saved !== null ? saved === 'true' : false;
-  });
-  const [pendingSortBy, setPendingSortBy] = useState<'position' | 'name' | 'printer' | 'time'>(() => {
-    const saved = localStorage.getItem('queue.pendingSortBy');
-    return (saved as 'position' | 'name' | 'printer' | 'time') || 'position';
-  });
-  const [pendingSortAsc, setPendingSortAsc] = useState(() => {
-    const saved = localStorage.getItem('queue.pendingSortAsc');
-    return saved !== null ? saved === 'true' : true;
-  });
- 
-  // Persist sort settings to localStorage
-  useEffect(() => {
-    localStorage.setItem('queue.historySortBy', historySortBy);
-  }, [historySortBy]);
- 
-  useEffect(() => {
-    localStorage.setItem('queue.historySortAsc', String(historySortAsc));
-  }, [historySortAsc]);
- 
-  useEffect(() => {
-    localStorage.setItem('queue.pendingSortBy', pendingSortBy);
-  }, [pendingSortBy]);
- 
-  useEffect(() => {
-    localStorage.setItem('queue.pendingSortAsc', String(pendingSortAsc));
-  }, [pendingSortAsc]);
- 
-  const sensors = useSensors(
-    useSensor(PointerSensor, { activationConstraint: { distance: 8 } }),
-    useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates })
-  );
- 
-  const { data: queue, isLoading } = useQuery({
-    queryKey: ['queue', filterPrinter, filterStatus],
-    queryFn: () => api.getQueue(filterPrinter || undefined, filterStatus || undefined),
-    refetchInterval: 5000,
-  });
- 
-  const { data: printers } = useQuery({
-    queryKey: ['printers'],
-    queryFn: () => api.getPrinters(),
-  });
- 
-  const cancelMutation = useMutation({
-    mutationFn: (id: number) => api.cancelQueueItem(id),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['queue'] });
-      showToast('Queue item cancelled');
-    },
-    onError: () => showToast('Failed to cancel item', 'error'),
-  });
- 
-  const removeMutation = useMutation({
-    mutationFn: (id: number) => api.removeFromQueue(id),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['queue'] });
-      showToast('Queue item removed');
-    },
-    onError: () => showToast('Failed to remove item', 'error'),
-  });
- 
-  const stopMutation = useMutation({
-    mutationFn: (id: number) => api.stopQueueItem(id),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['queue'] });
-      showToast('Print stopped');
-    },
-    onError: () => showToast('Failed to stop print', 'error'),
-  });
- 
-  const reorderMutation = useMutation({
-    mutationFn: (items: { id: number; position: number }[]) => api.reorderQueue(items),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['queue'] });
-    },
-    onError: () => showToast('Failed to reorder queue', 'error'),
-  });
- 
-  const requeueMutation = useMutation({
-    mutationFn: (item: PrintQueueItem) => {
-      // Schedule far in future so it doesn't start immediately
-      const futureDate = new Date();
-      futureDate.setFullYear(futureDate.getFullYear() + 1);
-      return api.addToQueue({
-        printer_id: item.printer_id,
-        archive_id: item.archive_id,
-        scheduled_time: futureDate.toISOString(),
-        require_previous_success: false,
-        auto_off_after: false,
-      });
-    },
-    onSuccess: (newItem) => {
-      queryClient.invalidateQueries({ queryKey: ['queue'] });
-      showToast('Added back to queue - please set schedule');
-      // Open edit modal for the new item
-      setEditItem(newItem);
-    },
-    onError: (error: Error) => showToast(error.message || 'Failed to re-queue item', 'error'),
-  });
- 
-  const clearHistoryMutation = useMutation({
-    mutationFn: async () => {
-      const historyItems = queue?.filter(i =>
-        ['completed', 'failed', 'skipped', 'cancelled'].includes(i.status)
-      ) || [];
-      for (const item of historyItems) {
-        await api.removeFromQueue(item.id);
-      }
-      return historyItems.length;
-    },
-    onSuccess: (count) => {
-      queryClient.invalidateQueries({ queryKey: ['queue'] });
-      showToast(`Cleared ${count} history item${count !== 1 ? 's' : ''}`);
-    },
-    onError: () => showToast('Failed to clear history', 'error'),
-  });
- 
-  const pendingItems = useMemo(() => {
-    const items = queue?.filter(i => i.status === 'pending') || [];
- 
-    // Helper to get scheduled time as timestamp (ASAP/placeholder = 0 for earliest)
-    const getScheduledTime = (item: PrintQueueItem): number => {
-      if (!item.scheduled_time) return 0;
-      const time = new Date(item.scheduled_time).getTime();
-      // Placeholder dates (> 6 months out) are treated as ASAP
-      const sixMonthsFromNow = Date.now() + (180 * 24 * 60 * 60 * 1000);
-      return time > sixMonthsFromNow ? 0 : time;
-    };
- 
-    return [...items].sort((a, b) => {
-      let cmp: number;
-      if (pendingSortBy === 'name') {
-        cmp = (a.archive_name || '').localeCompare(b.archive_name || '');
-      } else if (pendingSortBy === 'printer') {
-        cmp = (a.printer_name || '').localeCompare(b.printer_name || '');
-      } else if (pendingSortBy === 'time') {
-        // Sort by scheduled start time (when print will begin)
-        cmp = getScheduledTime(a) - getScheduledTime(b);
-      } else {
-        cmp = a.position - b.position;
-      }
-      return pendingSortAsc ? cmp : -cmp;
-    });
-  }, [queue, pendingSortBy, pendingSortAsc]);
-  const activeItems = queue?.filter(i => i.status === 'printing') || [];
-  const historyItems = useMemo(() => {
-    const items = queue?.filter(i => ['completed', 'failed', 'skipped', 'cancelled'].includes(i.status)) || [];
-    return [...items].sort((a, b) => {
-      let cmp: number;
-      if (historySortBy === 'name') {
-        cmp = (a.archive_name || '').localeCompare(b.archive_name || '');
-      } else if (historySortBy === 'printer') {
-        cmp = (a.printer_name || '').localeCompare(b.printer_name || '');
-      } else {
-        // Default: by date - most recent first (desc) is the natural order
-        cmp = new Date(b.completed_at || b.created_at).getTime() - new Date(a.completed_at || a.created_at).getTime();
-      }
-      return historySortAsc ? -cmp : cmp;
-    });
-  }, [queue, historySortBy, historySortAsc]);
- 
-  // Calculate total queue time
-  const totalQueueTime = useMemo(() => {
-    return pendingItems.reduce((acc, item) => acc + (item.print_time_seconds || 0), 0);
-  }, [pendingItems]);
- 
-  const handleDragEnd = (event: DragEndEvent) => {
-    const { active, over } = event;
-    if (!over || active.id === over.id) return;
- 
-    const oldIndex = pendingItems.findIndex(i => i.id === active.id);
-    const newIndex = pendingItems.findIndex(i => i.id === over.id);
- 
-    if (oldIndex !== -1 && newIndex !== -1) {
-      const reordered = arrayMove(pendingItems, oldIndex, newIndex);
-      const updates = reordered.map((item, index) => ({
-        id: item.id,
-        position: index + 1,
-      }));
-      reorderMutation.mutate(updates);
-    }
-  };
- 
-  return (
-    <div className="p-4 md:p-8">
-      {/* Header */}
-      <div className="flex items-center justify-between mb-8">
-        <div>
-          <h1 className="text-2xl font-bold text-white flex items-center gap-3">
-            <ListOrdered className="w-7 h-7 text-bambu-green" />
-            Print Queue
-          </h1>
-          <p className="text-bambu-gray mt-1">Schedule and manage your print jobs</p>
-        </div>
-      </div>
- 
-      {/* Summary Cards */}
-      <div className="grid grid-cols-1 md:grid-cols-4 gap-4 mb-8">
-        <Card className="bg-gradient-to-br from-blue-500/10 to-transparent border-blue-500/20">
-          <CardContent className="p-4">
-            <div className="flex items-center gap-3">
-              <div className="w-10 h-10 rounded-lg bg-blue-500/20 flex items-center justify-center">
-                <Play className="w-5 h-5 text-blue-400" />
-              </div>
-              <div>
-                <p className="text-2xl font-bold text-white">{activeItems.length}</p>
-                <p className="text-sm text-bambu-gray">Printing</p>
-              </div>
-            </div>
-          </CardContent>
-        </Card>
- 
-        <Card className="bg-gradient-to-br from-yellow-500/10 to-transparent border-yellow-500/20">
-          <CardContent className="p-4">
-            <div className="flex items-center gap-3">
-              <div className="w-10 h-10 rounded-lg bg-yellow-500/20 flex items-center justify-center">
-                <Clock className="w-5 h-5 text-yellow-400" />
-              </div>
-              <div>
-                <p className="text-2xl font-bold text-white">{pendingItems.length}</p>
-                <p className="text-sm text-bambu-gray">Queued</p>
-              </div>
-            </div>
-          </CardContent>
-        </Card>
- 
-        <Card className="bg-gradient-to-br from-bambu-green/10 to-transparent border-bambu-green/20">
-          <CardContent className="p-4">
-            <div className="flex items-center gap-3">
-              <div className="w-10 h-10 rounded-lg bg-bambu-green/20 flex items-center justify-center">
-                <Timer className="w-5 h-5 text-bambu-green" />
-              </div>
-              <div>
-                <p className="text-2xl font-bold text-white">{formatDuration(totalQueueTime)}</p>
-                <p className="text-sm text-bambu-gray">Total Queue Time</p>
-              </div>
-            </div>
-          </CardContent>
-        </Card>
- 
-        <Card className="bg-gradient-to-br from-gray-500/10 to-transparent border-gray-500/20">
-          <CardContent className="p-4">
-            <div className="flex items-center gap-3">
-              <div className="w-10 h-10 rounded-lg bg-gray-500/20 flex items-center justify-center">
-                <CheckCircle className="w-5 h-5 text-gray-400" />
-              </div>
-              <div>
-                <p className="text-2xl font-bold text-white">{historyItems.length}</p>
-                <p className="text-sm text-bambu-gray">History</p>
-              </div>
-            </div>
-          </CardContent>
-        </Card>
-      </div>
- 
-      {/* Filters */}
-      <div className="flex items-center gap-4 mb-6">
-        <select
-          className="px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-          value={filterPrinter || ''}
-          onChange={(e) => setFilterPrinter(e.target.value ? Number(e.target.value) : null)}
-        >
-          <option value="">All Printers</option>
-          {printers?.map((p) => (
-            <option key={p.id} value={p.id}>{p.name}</option>
-          ))}
-        </select>
- 
-        <select
-          className="px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-          value={filterStatus}
-          onChange={(e) => setFilterStatus(e.target.value)}
-        >
-          <option value="">All Status</option>
-          <option value="pending">Pending</option>
-          <option value="printing">Printing</option>
-          <option value="completed">Completed</option>
-          <option value="failed">Failed</option>
-          <option value="skipped">Skipped</option>
-          <option value="cancelled">Cancelled</option>
-        </select>
- 
-        <div className="flex-1" />
- 
-        {historyItems.length > 0 && (
-          <Button
-            variant="secondary"
-            size="sm"
-            onClick={() => setShowClearHistoryConfirm(true)}
-          >
-            <Trash2 className="w-4 h-4" />
-            Clear History
-          </Button>
-        )}
-      </div>
- 
-      {isLoading ? (
-        <div className="text-center py-12 text-bambu-gray">Loading...</div>
-      ) : queue?.length === 0 ? (
-        <Card className="p-12 text-center border-dashed">
-          <Calendar className="w-16 h-16 text-bambu-gray mx-auto mb-4 opacity-50" />
-          <h3 className="text-xl font-medium text-white mb-2">No prints scheduled</h3>
-          <p className="text-bambu-gray max-w-md mx-auto">
-            Schedule a print from the Archives page using the "Schedule" option in the context menu,
-            or drag and drop files to get started.
-          </p>
-        </Card>
-      ) : (
-        <div className="space-y-8">
-          {/* Active Prints */}
-          {activeItems.length > 0 && (
-            <div>
-              <h2 className="text-lg font-semibold text-white mb-4 flex items-center gap-2">
-                <div className="w-2 h-2 rounded-full bg-blue-400 animate-pulse" />
-                Currently Printing
-              </h2>
-              <div className="space-y-3">
-                {activeItems.map((item) => (
-                  <SortableQueueItem
-                    key={item.id}
-                    item={item}
-                    onEdit={() => {}}
-                    onCancel={() => {}}
-                    onRemove={() => {}}
-                    onStop={() => setConfirmAction({ type: 'stop', item })}
-                    onRequeue={() => {}}
-                  />
-                ))}
-              </div>
-            </div>
-          )}
- 
-          {/* Pending Queue */}
-          {pendingItems.length > 0 && (
-            <div>
-              <div className="flex items-center justify-between mb-4">
-                <h2 className="text-lg font-semibold text-white flex items-center gap-2">
-                  <Clock className="w-5 h-5 text-yellow-400" />
-                  Queued
-                  <span className="text-sm font-normal text-bambu-gray">
-                    ({pendingItems.length} item{pendingItems.length !== 1 ? 's' : ''})
-                  </span>
-                  <span className="text-xs text-bambu-gray ml-2" title="Position only affects ASAP items. Scheduled items run at their set time.">
-                    Drag to reorder (ASAP only)
-                  </span>
-                </h2>
-                <div className="flex items-center gap-2">
-                  <select
-                    className="px-3 py-1.5 text-sm bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                    value={pendingSortBy}
-                    onChange={(e) => setPendingSortBy(e.target.value as 'position' | 'name' | 'printer' | 'time')}
-                  >
-                    <option value="position">Sort by Position</option>
-                    <option value="name">Sort by Name</option>
-                    <option value="printer">Sort by Printer</option>
-                    <option value="time">Sort by Schedule</option>
-                  </select>
-                  <Button
-                    variant="ghost"
-                    size="sm"
-                    onClick={() => setPendingSortAsc(!pendingSortAsc)}
-                    title={pendingSortAsc ? 'Ascending' : 'Descending'}
-                    className="px-2"
-                  >
-                    {pendingSortAsc ? <ArrowUp className="w-4 h-4" /> : <ArrowDown className="w-4 h-4" />}
-                  </Button>
-                </div>
-              </div>
-              <DndContext
-                sensors={sensors}
-                collisionDetection={closestCenter}
-                onDragEnd={handleDragEnd}
-              >
-                <SortableContext
-                  items={pendingItems.map(i => i.id)}
-                  strategy={verticalListSortingStrategy}
-                >
-                  <div className="space-y-3">
-                    {pendingItems.map((item, index) => (
-                      <SortableQueueItem
-                        key={item.id}
-                        item={item}
-                        position={index + 1}
-                        onEdit={() => setEditItem(item)}
-                        onCancel={() => setConfirmAction({ type: 'cancel', item })}
-                        onRemove={() => {}}
-                        onStop={() => {}}
-                        onRequeue={() => {}}
-                      />
-                    ))}
-                  </div>
-                </SortableContext>
-              </DndContext>
-            </div>
-          )}
- 
-          {/* History */}
-          {historyItems.length > 0 && (
-            <div>
-              <div className="flex items-center justify-between mb-4">
-                <h2 className="text-lg font-semibold text-white flex items-center gap-2">
-                  <CheckCircle className="w-5 h-5 text-bambu-gray" />
-                  History
-                  <span className="text-sm font-normal text-bambu-gray">
-                    ({historyItems.length} item{historyItems.length !== 1 ? 's' : ''})
-                  </span>
-                </h2>
-                <div className="flex items-center gap-2">
-                  <select
-                    className="px-3 py-1.5 text-sm bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                    value={historySortBy}
-                    onChange={(e) => setHistorySortBy(e.target.value as 'date' | 'name' | 'printer')}
-                  >
-                    <option value="date">Sort by Date</option>
-                    <option value="name">Sort by Name</option>
-                    <option value="printer">Sort by Printer</option>
-                  </select>
-                  <Button
-                    variant="ghost"
-                    size="sm"
-                    onClick={() => setHistorySortAsc(!historySortAsc)}
-                    title={historySortAsc ? 'Ascending (oldest first)' : 'Descending (newest first)'}
-                    className="px-2"
-                  >
-                    {historySortAsc ? <ArrowUp className="w-4 h-4" /> : <ArrowDown className="w-4 h-4" />}
-                  </Button>
-                </div>
-              </div>
-              <div className="space-y-3">
-                {historyItems.slice(0, 20).map((item, index) => (
-                  <SortableQueueItem
-                    key={item.id}
-                    item={item}
-                    position={index + 1}
-                    onEdit={() => {}}
-                    onCancel={() => {}}
-                    onRemove={() => setConfirmAction({ type: 'remove', item })}
-                    onStop={() => {}}
-                    onRequeue={() => requeueMutation.mutate(item)}
-                  />
-                ))}
-              </div>
-            </div>
-          )}
-        </div>
-      )}
- 
-      {/* Edit Modal */}
-      {editItem && (
-        <EditQueueItemModal
-          item={editItem}
-          onClose={() => setEditItem(null)}
-        />
-      )}
- 
-      {/* Confirm Action Modal */}
-      {confirmAction && (
-        <ConfirmModal
-          title={
-            confirmAction.type === 'cancel' ? 'Cancel Scheduled Print' :
-            confirmAction.type === 'stop' ? 'Stop Print' :
-            'Remove from History'
-          }
-          message={
-            confirmAction.type === 'cancel'
-              ? `Are you sure you want to cancel "${confirmAction.item.archive_name || 'this print'}"?`
-              : confirmAction.type === 'stop'
-              ? `Are you sure you want to stop the current print "${confirmAction.item.archive_name || 'this print'}"? This will cancel the print job on the printer.`
-              : `Are you sure you want to remove "${confirmAction.item.archive_name || 'this item'}" from the queue history?`
-          }
-          confirmText={
-            confirmAction.type === 'cancel' ? 'Cancel Print' :
-            confirmAction.type === 'stop' ? 'Stop Print' :
-            'Remove'
-          }
-          variant="danger"
-          onConfirm={() => {
-            if (confirmAction.type === 'cancel') {
-              cancelMutation.mutate(confirmAction.item.id);
-            } else if (confirmAction.type === 'stop') {
-              stopMutation.mutate(confirmAction.item.id);
-            } else {
-              removeMutation.mutate(confirmAction.item.id);
-            }
-            setConfirmAction(null);
-          }}
-          onCancel={() => setConfirmAction(null)}
-        />
-      )}
- 
-      {/* Clear History Confirm Modal */}
-      {showClearHistoryConfirm && (
-        <ConfirmModal
-          title="Clear History"
-          message={`Are you sure you want to remove all ${historyItems.length} item${historyItems.length !== 1 ? 's' : ''} from the history?`}
-          confirmText="Clear History"
-          variant="danger"
-          onConfirm={() => {
-            clearHistoryMutation.mutate();
-            setShowClearHistoryConfirm(false);
-          }}
-          onCancel={() => setShowClearHistoryConfirm(false)}
-        />
-      )}
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/pages/SettingsPage.tsx.html b/frontend/coverage/src/pages/SettingsPage.tsx.html deleted file mode 100644 index 339c3b414..000000000 --- a/frontend/coverage/src/pages/SettingsPage.tsx.html +++ /dev/null @@ -1,5593 +0,0 @@ - - - - - - Code coverage report for src/pages/SettingsPage.tsx - - - - - - - - - -
-
-

All files / src/pages SettingsPage.tsx

-
- -
- 0% - Statements - 0/1520 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1520 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -425 -426 -427 -428 -429 -430 -431 -432 -433 -434 -435 -436 -437 -438 -439 -440 -441 -442 -443 -444 -445 -446 -447 -448 -449 -450 -451 -452 -453 -454 -455 -456 -457 -458 -459 -460 -461 -462 -463 -464 -465 -466 -467 -468 -469 -470 -471 -472 -473 -474 -475 -476 -477 -478 -479 -480 -481 -482 -483 -484 -485 -486 -487 -488 -489 -490 -491 -492 -493 -494 -495 -496 -497 -498 -499 -500 -501 -502 -503 -504 -505 -506 -507 -508 -509 -510 -511 -512 -513 -514 -515 -516 -517 -518 -519 -520 -521 -522 -523 -524 -525 -526 -527 -528 -529 -530 -531 -532 -533 -534 -535 -536 -537 -538 -539 -540 -541 -542 -543 -544 -545 -546 -547 -548 -549 -550 -551 -552 -553 -554 -555 -556 -557 -558 -559 -560 -561 -562 -563 -564 -565 -566 -567 -568 -569 -570 -571 -572 -573 -574 -575 -576 -577 -578 -579 -580 -581 -582 -583 -584 -585 -586 -587 -588 -589 -590 -591 -592 -593 -594 -595 -596 -597 -598 -599 -600 -601 -602 -603 -604 -605 -606 -607 -608 -609 -610 -611 -612 -613 -614 -615 -616 -617 -618 -619 -620 -621 -622 -623 -624 -625 -626 -627 -628 -629 -630 -631 -632 -633 -634 -635 -636 -637 -638 -639 -640 -641 -642 -643 -644 -645 -646 -647 -648 -649 -650 -651 -652 -653 -654 -655 -656 -657 -658 -659 -660 -661 -662 -663 -664 -665 -666 -667 -668 -669 -670 -671 -672 -673 -674 -675 -676 -677 -678 -679 -680 -681 -682 -683 -684 -685 -686 -687 -688 -689 -690 -691 -692 -693 -694 -695 -696 -697 -698 -699 -700 -701 -702 -703 -704 -705 -706 -707 -708 -709 -710 -711 -712 -713 -714 -715 -716 -717 -718 -719 -720 -721 -722 -723 -724 -725 -726 -727 -728 -729 -730 -731 -732 -733 -734 -735 -736 -737 -738 -739 -740 -741 -742 -743 -744 -745 -746 -747 -748 -749 -750 -751 -752 -753 -754 -755 -756 -757 -758 -759 -760 -761 -762 -763 -764 -765 -766 -767 -768 -769 -770 -771 -772 -773 -774 -775 -776 -777 -778 -779 -780 -781 -782 -783 -784 -785 -786 -787 -788 -789 -790 -791 -792 -793 -794 -795 -796 -797 -798 -799 -800 -801 -802 -803 -804 -805 -806 -807 -808 -809 -810 -811 -812 -813 -814 -815 -816 -817 -818 -819 -820 -821 -822 -823 -824 -825 -826 -827 -828 -829 -830 -831 -832 -833 -834 -835 -836 -837 -838 -839 -840 -841 -842 -843 -844 -845 -846 -847 -848 -849 -850 -851 -852 -853 -854 -855 -856 -857 -858 -859 -860 -861 -862 -863 -864 -865 -866 -867 -868 -869 -870 -871 -872 -873 -874 -875 -876 -877 -878 -879 -880 -881 -882 -883 -884 -885 -886 -887 -888 -889 -890 -891 -892 -893 -894 -895 -896 -897 -898 -899 -900 -901 -902 -903 -904 -905 -906 -907 -908 -909 -910 -911 -912 -913 -914 -915 -916 -917 -918 -919 -920 -921 -922 -923 -924 -925 -926 -927 -928 -929 -930 -931 -932 -933 -934 -935 -936 -937 -938 -939 -940 -941 -942 -943 -944 -945 -946 -947 -948 -949 -950 -951 -952 -953 -954 -955 -956 -957 -958 -959 -960 -961 -962 -963 -964 -965 -966 -967 -968 -969 -970 -971 -972 -973 -974 -975 -976 -977 -978 -979 -980 -981 -982 -983 -984 -985 -986 -987 -988 -989 -990 -991 -992 -993 -994 -995 -996 -997 -998 -999 -1000 -1001 -1002 -1003 -1004 -1005 -1006 -1007 -1008 -1009 -1010 -1011 -1012 -1013 -1014 -1015 -1016 -1017 -1018 -1019 -1020 -1021 -1022 -1023 -1024 -1025 -1026 -1027 -1028 -1029 -1030 -1031 -1032 -1033 -1034 -1035 -1036 -1037 -1038 -1039 -1040 -1041 -1042 -1043 -1044 -1045 -1046 -1047 -1048 -1049 -1050 -1051 -1052 -1053 -1054 -1055 -1056 -1057 -1058 -1059 -1060 -1061 -1062 -1063 -1064 -1065 -1066 -1067 -1068 -1069 -1070 -1071 -1072 -1073 -1074 -1075 -1076 -1077 -1078 -1079 -1080 -1081 -1082 -1083 -1084 -1085 -1086 -1087 -1088 -1089 -1090 -1091 -1092 -1093 -1094 -1095 -1096 -1097 -1098 -1099 -1100 -1101 -1102 -1103 -1104 -1105 -1106 -1107 -1108 -1109 -1110 -1111 -1112 -1113 -1114 -1115 -1116 -1117 -1118 -1119 -1120 -1121 -1122 -1123 -1124 -1125 -1126 -1127 -1128 -1129 -1130 -1131 -1132 -1133 -1134 -1135 -1136 -1137 -1138 -1139 -1140 -1141 -1142 -1143 -1144 -1145 -1146 -1147 -1148 -1149 -1150 -1151 -1152 -1153 -1154 -1155 -1156 -1157 -1158 -1159 -1160 -1161 -1162 -1163 -1164 -1165 -1166 -1167 -1168 -1169 -1170 -1171 -1172 -1173 -1174 -1175 -1176 -1177 -1178 -1179 -1180 -1181 -1182 -1183 -1184 -1185 -1186 -1187 -1188 -1189 -1190 -1191 -1192 -1193 -1194 -1195 -1196 -1197 -1198 -1199 -1200 -1201 -1202 -1203 -1204 -1205 -1206 -1207 -1208 -1209 -1210 -1211 -1212 -1213 -1214 -1215 -1216 -1217 -1218 -1219 -1220 -1221 -1222 -1223 -1224 -1225 -1226 -1227 -1228 -1229 -1230 -1231 -1232 -1233 -1234 -1235 -1236 -1237 -1238 -1239 -1240 -1241 -1242 -1243 -1244 -1245 -1246 -1247 -1248 -1249 -1250 -1251 -1252 -1253 -1254 -1255 -1256 -1257 -1258 -1259 -1260 -1261 -1262 -1263 -1264 -1265 -1266 -1267 -1268 -1269 -1270 -1271 -1272 -1273 -1274 -1275 -1276 -1277 -1278 -1279 -1280 -1281 -1282 -1283 -1284 -1285 -1286 -1287 -1288 -1289 -1290 -1291 -1292 -1293 -1294 -1295 -1296 -1297 -1298 -1299 -1300 -1301 -1302 -1303 -1304 -1305 -1306 -1307 -1308 -1309 -1310 -1311 -1312 -1313 -1314 -1315 -1316 -1317 -1318 -1319 -1320 -1321 -1322 -1323 -1324 -1325 -1326 -1327 -1328 -1329 -1330 -1331 -1332 -1333 -1334 -1335 -1336 -1337 -1338 -1339 -1340 -1341 -1342 -1343 -1344 -1345 -1346 -1347 -1348 -1349 -1350 -1351 -1352 -1353 -1354 -1355 -1356 -1357 -1358 -1359 -1360 -1361 -1362 -1363 -1364 -1365 -1366 -1367 -1368 -1369 -1370 -1371 -1372 -1373 -1374 -1375 -1376 -1377 -1378 -1379 -1380 -1381 -1382 -1383 -1384 -1385 -1386 -1387 -1388 -1389 -1390 -1391 -1392 -1393 -1394 -1395 -1396 -1397 -1398 -1399 -1400 -1401 -1402 -1403 -1404 -1405 -1406 -1407 -1408 -1409 -1410 -1411 -1412 -1413 -1414 -1415 -1416 -1417 -1418 -1419 -1420 -1421 -1422 -1423 -1424 -1425 -1426 -1427 -1428 -1429 -1430 -1431 -1432 -1433 -1434 -1435 -1436 -1437 -1438 -1439 -1440 -1441 -1442 -1443 -1444 -1445 -1446 -1447 -1448 -1449 -1450 -1451 -1452 -1453 -1454 -1455 -1456 -1457 -1458 -1459 -1460 -1461 -1462 -1463 -1464 -1465 -1466 -1467 -1468 -1469 -1470 -1471 -1472 -1473 -1474 -1475 -1476 -1477 -1478 -1479 -1480 -1481 -1482 -1483 -1484 -1485 -1486 -1487 -1488 -1489 -1490 -1491 -1492 -1493 -1494 -1495 -1496 -1497 -1498 -1499 -1500 -1501 -1502 -1503 -1504 -1505 -1506 -1507 -1508 -1509 -1510 -1511 -1512 -1513 -1514 -1515 -1516 -1517 -1518 -1519 -1520 -1521 -1522 -1523 -1524 -1525 -1526 -1527 -1528 -1529 -1530 -1531 -1532 -1533 -1534 -1535 -1536 -1537 -1538 -1539 -1540 -1541 -1542 -1543 -1544 -1545 -1546 -1547 -1548 -1549 -1550 -1551 -1552 -1553 -1554 -1555 -1556 -1557 -1558 -1559 -1560 -1561 -1562 -1563 -1564 -1565 -1566 -1567 -1568 -1569 -1570 -1571 -1572 -1573 -1574 -1575 -1576 -1577 -1578 -1579 -1580 -1581 -1582 -1583 -1584 -1585 -1586 -1587 -1588 -1589 -1590 -1591 -1592 -1593 -1594 -1595 -1596 -1597 -1598 -1599 -1600 -1601 -1602 -1603 -1604 -1605 -1606 -1607 -1608 -1609 -1610 -1611 -1612 -1613 -1614 -1615 -1616 -1617 -1618 -1619 -1620 -1621 -1622 -1623 -1624 -1625 -1626 -1627 -1628 -1629 -1630 -1631 -1632 -1633 -1634 -1635 -1636 -1637 -1638 -1639 -1640 -1641 -1642 -1643 -1644 -1645 -1646 -1647 -1648 -1649 -1650 -1651 -1652 -1653 -1654 -1655 -1656 -1657 -1658 -1659 -1660 -1661 -1662 -1663 -1664 -1665 -1666 -1667 -1668 -1669 -1670 -1671 -1672 -1673 -1674 -1675 -1676 -1677 -1678 -1679 -1680 -1681 -1682 -1683 -1684 -1685 -1686 -1687 -1688 -1689 -1690 -1691 -1692 -1693 -1694 -1695 -1696 -1697 -1698 -1699 -1700 -1701 -1702 -1703 -1704 -1705 -1706 -1707 -1708 -1709 -1710 -1711 -1712 -1713 -1714 -1715 -1716 -1717 -1718 -1719 -1720 -1721 -1722 -1723 -1724 -1725 -1726 -1727 -1728 -1729 -1730 -1731 -1732 -1733 -1734 -1735 -1736 -1737 -1738 -1739 -1740 -1741 -1742 -1743 -1744 -1745 -1746 -1747 -1748 -1749 -1750 -1751 -1752 -1753 -1754 -1755 -1756 -1757 -1758 -1759 -1760 -1761 -1762 -1763 -1764 -1765 -1766 -1767 -1768 -1769 -1770 -1771 -1772 -1773 -1774 -1775 -1776 -1777 -1778 -1779 -1780 -1781 -1782 -1783 -1784 -1785 -1786 -1787 -1788 -1789 -1790 -1791 -1792 -1793 -1794 -1795 -1796 -1797 -1798 -1799 -1800 -1801 -1802 -1803 -1804 -1805 -1806 -1807 -1808 -1809 -1810 -1811 -1812 -1813 -1814 -1815 -1816 -1817 -1818 -1819 -1820 -1821 -1822 -1823 -1824 -1825 -1826 -1827 -1828 -1829 -1830 -1831 -1832 -1833 -1834 -1835 -1836 -1837  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
-import { Loader2, Plus, Plug, AlertTriangle, RotateCcw, Bell, Download, RefreshCw, ExternalLink, Globe, Droplets, Thermometer, FileText, Edit2, Send, CheckCircle, XCircle, History, Trash2, Upload, Zap, TrendingUp, Calendar, DollarSign, Power, PowerOff, Key, Copy, Database } from 'lucide-react';
-import { useTranslation } from 'react-i18next';
-import { api } from '../api/client';
-import type { AppSettings, SmartPlug, SmartPlugStatus, NotificationProvider, NotificationTemplate, UpdateStatus } from '../api/client';
-import { Card, CardContent, CardHeader } from '../components/Card';
-import { Button } from '../components/Button';
-import { SmartPlugCard } from '../components/SmartPlugCard';
-import { AddSmartPlugModal } from '../components/AddSmartPlugModal';
-import { NotificationProviderCard } from '../components/NotificationProviderCard';
-import { AddNotificationModal } from '../components/AddNotificationModal';
-import { NotificationTemplateEditor } from '../components/NotificationTemplateEditor';
-import { NotificationLogViewer } from '../components/NotificationLogViewer';
-import { ConfirmModal } from '../components/ConfirmModal';
-import { BackupModal } from '../components/BackupModal';
-import { RestoreModal } from '../components/RestoreModal';
-import { SpoolmanSettings } from '../components/SpoolmanSettings';
-import { ExternalLinksSettings } from '../components/ExternalLinksSettings';
-import { defaultNavItems, getDefaultView, setDefaultView } from '../components/Layout';
-import { availableLanguages } from '../i18n';
-import { useToast } from '../contexts/ToastContext';
-import { useState, useEffect, useRef, useCallback } from 'react';
- 
-export function SettingsPage() {
-  const queryClient = useQueryClient();
-  const { t, i18n } = useTranslation();
-  const { showToast } = useToast();
-  const [localSettings, setLocalSettings] = useState<AppSettings | null>(null);
-  const [showPlugModal, setShowPlugModal] = useState(false);
-  const [editingPlug, setEditingPlug] = useState<SmartPlug | null>(null);
-  const [showNotificationModal, setShowNotificationModal] = useState(false);
-  const [editingProvider, setEditingProvider] = useState<NotificationProvider | null>(null);
-  const [editingTemplate, setEditingTemplate] = useState<NotificationTemplate | null>(null);
-  const [showLogViewer, setShowLogViewer] = useState(false);
-  const [defaultView, setDefaultViewState] = useState<string>(getDefaultView());
-  const [activeTab, setActiveTab] = useState<'general' | 'plugs' | 'notifications' | 'apikeys'>('general');
-  const [showCreateAPIKey, setShowCreateAPIKey] = useState(false);
-  const [newAPIKeyName, setNewAPIKeyName] = useState('');
-  const [newAPIKeyPermissions, setNewAPIKeyPermissions] = useState({
-    can_queue: true,
-    can_control_printer: false,
-    can_read_status: true,
-  });
-  const [createdAPIKey, setCreatedAPIKey] = useState<string | null>(null);
-  const [showDeleteAPIKeyConfirm, setShowDeleteAPIKeyConfirm] = useState<number | null>(null);
- 
-  // Confirm modal states
-  const [showClearLogsConfirm, setShowClearLogsConfirm] = useState(false);
-  const [showClearStorageConfirm, setShowClearStorageConfirm] = useState(false);
-  const [showBulkPlugConfirm, setShowBulkPlugConfirm] = useState<'on' | 'off' | null>(null);
-  const [showBackupModal, setShowBackupModal] = useState(false);
-  const [showRestoreModal, setShowRestoreModal] = useState(false);
- 
-  const handleDefaultViewChange = (path: string) => {
-    setDefaultViewState(path);
-    setDefaultView(path);
-  };
- 
-  const handleResetSidebarOrder = () => {
-    localStorage.removeItem('sidebarOrder');
-    window.location.reload();
-  };
- 
-  const { data: settings, isLoading } = useQuery({
-    queryKey: ['settings'],
-    queryFn: api.getSettings,
-  });
- 
-  const { data: smartPlugs, isLoading: plugsLoading } = useQuery({
-    queryKey: ['smart-plugs'],
-    queryFn: api.getSmartPlugs,
-  });
- 
-  // Fetch energy data for all smart plugs when on the plugs tab
-  const { data: plugEnergySummary, isLoading: energyLoading } = useQuery({
-    queryKey: ['smart-plugs-energy', smartPlugs?.map(p => p.id)],
-    queryFn: async () => {
-      if (!smartPlugs || smartPlugs.length === 0) return null;
-      const statuses = await Promise.all(
-        smartPlugs.filter(p => p.enabled).map(async (plug) => {
-          try {
-            const status = await api.getSmartPlugStatus(plug.id);
-            return { plug, status };
-          } catch {
-            return { plug, status: null as SmartPlugStatus | null };
-          }
-        })
-      );
- 
-      // Aggregate energy data
-      let totalPower = 0;
-      let totalToday = 0;
-      let totalYesterday = 0;
-      let totalLifetime = 0;
-      let reachableCount = 0;
- 
-      for (const { status } of statuses) {
-        if (status?.reachable && status.energy) {
-          reachableCount++;
-          if (status.energy.power != null) totalPower += status.energy.power;
-          if (status.energy.today != null) totalToday += status.energy.today;
-          if (status.energy.yesterday != null) totalYesterday += status.energy.yesterday;
-          if (status.energy.total != null) totalLifetime += status.energy.total;
-        }
-      }
- 
-      return {
-        totalPower,
-        totalToday,
-        totalYesterday,
-        totalLifetime,
-        reachableCount,
-        totalPlugs: smartPlugs.filter(p => p.enabled).length,
-      };
-    },
-    enabled: activeTab === 'plugs' && !!smartPlugs && smartPlugs.length > 0,
-    refetchInterval: activeTab === 'plugs' ? 10000 : false, // Refresh every 10s when on plugs tab
-  });
- 
-  const { data: notificationProviders, isLoading: providersLoading } = useQuery({
-    queryKey: ['notification-providers'],
-    queryFn: api.getNotificationProviders,
-  });
- 
-  const { data: apiKeys, isLoading: apiKeysLoading } = useQuery({
-    queryKey: ['api-keys'],
-    queryFn: api.getAPIKeys,
-    enabled: activeTab === 'apikeys',
-  });
- 
-  const createAPIKeyMutation = useMutation({
-    mutationFn: (data: { name: string; can_queue: boolean; can_control_printer: boolean; can_read_status: boolean }) =>
-      api.createAPIKey(data),
-    onSuccess: (data) => {
-      setCreatedAPIKey(data.key || null);
-      setShowCreateAPIKey(false);
-      setNewAPIKeyName('');
-      queryClient.invalidateQueries({ queryKey: ['api-keys'] });
-      showToast('API key created');
-    },
-    onError: (error: Error) => {
-      showToast(`Failed to create API key: ${error.message}`, 'error');
-    },
-  });
- 
-  const deleteAPIKeyMutation = useMutation({
-    mutationFn: (id: number) => api.deleteAPIKey(id),
-    onSuccess: () => {
-      queryClient.invalidateQueries({ queryKey: ['api-keys'] });
-      showToast('API key deleted');
-    },
-    onError: (error: Error) => {
-      showToast(`Failed to delete API key: ${error.message}`, 'error');
-    },
-  });
- 
-  const { data: printers } = useQuery({
-    queryKey: ['printers'],
-    queryFn: api.getPrinters,
-  });
- 
-  const { data: notificationTemplates, isLoading: templatesLoading } = useQuery({
-    queryKey: ['notification-templates'],
-    queryFn: api.getNotificationTemplates,
-  });
- 
-  const { data: ffmpegStatus } = useQuery({
-    queryKey: ['ffmpeg-status'],
-    queryFn: api.checkFfmpeg,
-  });
- 
-  const { data: versionInfo } = useQuery({
-    queryKey: ['version'],
-    queryFn: api.getVersion,
-  });
- 
-  const { data: updateCheck, refetch: refetchUpdateCheck, isRefetching: isCheckingUpdate } = useQuery({
-    queryKey: ['updateCheck'],
-    queryFn: api.checkForUpdates,
-    staleTime: 5 * 60 * 1000,
-  });
- 
-  const { data: updateStatus, refetch: refetchUpdateStatus } = useQuery({
-    queryKey: ['updateStatus'],
-    queryFn: api.getUpdateStatus,
-    refetchInterval: (query) => {
-      const status = query.state.data as UpdateStatus | undefined;
-      // Poll while update is in progress
-      if (status?.status === 'downloading' || status?.status === 'installing') {
-        return 1000;
-      }
-      return false;
-    },
-  });
- 
-  const applyUpdateMutation = useMutation({
-    mutationFn: api.applyUpdate,
-    onSuccess: () => {
-      refetchUpdateStatus();
-    },
-  });
- 
-  // Test all notification providers
-  const [testAllResult, setTestAllResult] = useState<{
-    tested: number;
-    success: number;
-    failed: number;
-    results: Array<{
-      provider_id: number;
-      provider_name: string;
-      provider_type: string;
-      success: boolean;
-      message: string;
-    }>;
-  } | null>(null);
- 
-  const testAllMutation = useMutation({
-    mutationFn: api.testAllNotificationProviders,
-    onSuccess: (data) => {
-      setTestAllResult(data);
-      queryClient.invalidateQueries({ queryKey: ['notification-providers'] });
-      if (data.failed === 0) {
-        showToast(`All ${data.tested} providers tested successfully!`, 'success');
-      } else {
-        showToast(`${data.success}/${data.tested} providers succeeded`, data.failed > 0 ? 'error' : 'success');
-      }
-    },
-    onError: (error: Error) => {
-      showToast(`Failed to test providers: ${error.message}`, 'error');
-    },
-  });
- 
-  // Bulk action for smart plugs
-  const bulkPlugActionMutation = useMutation({
-    mutationFn: async (action: 'on' | 'off') => {
-      if (!smartPlugs) return { success: 0, failed: 0 };
-      const enabledPlugs = smartPlugs.filter(p => p.enabled);
-      const results = await Promise.all(
-        enabledPlugs.map(async (plug) => {
-          try {
-            await api.controlSmartPlug(plug.id, action);
-            return { success: true };
-          } catch {
-            return { success: false };
-          }
-        })
-      );
-      return {
-        success: results.filter(r => r.success).length,
-        failed: results.filter(r => !r.success).length,
-      };
-    },
-    onSuccess: (data, action) => {
-      queryClient.invalidateQueries({ queryKey: ['smart-plugs'] });
-      queryClient.invalidateQueries({ queryKey: ['smart-plugs-energy'] });
-      if (data.failed === 0) {
-        showToast(`All ${data.success} plugs turned ${action}`, 'success');
-      } else {
-        showToast(`${data.success} plugs turned ${action}, ${data.failed} failed`, 'error');
-      }
-    },
-    onError: (error: Error) => {
-      showToast(`Failed: ${error.message}`, 'error');
-    },
-  });
- 
-  // Ref for debounce timeout
-  const saveTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
-  const isInitialLoadRef = useRef(true);
- 
-  // Sync local state when settings load
-  useEffect(() => {
-    if (settings && !localSettings) {
-      setLocalSettings(settings);
-      // Mark initial load complete after a short delay
-      setTimeout(() => {
-        isInitialLoadRef.current = false;
-      }, 100);
-    }
-  }, [settings, localSettings]);
- 
-  const updateMutation = useMutation({
-    mutationFn: api.updateSettings,
-    onSuccess: (data) => {
-      queryClient.setQueryData(['settings'], data);
-      // Invalidate archive stats to reflect energy tracking mode change
-      queryClient.invalidateQueries({ queryKey: ['archiveStats'] });
-      showToast('Settings saved', 'success');
-    },
-    onError: (error: Error) => {
-      showToast(`Failed to save: ${error.message}`, 'error');
-    },
-  });
- 
-  // Debounced auto-save when localSettings change
-  useEffect(() => {
-    // Skip if initial load or no settings
-    if (isInitialLoadRef.current || !localSettings || !settings) {
-      return;
-    }
- 
-    // Check if there are actual changes
-    const hasChanges =
-      settings.auto_archive !== localSettings.auto_archive ||
-      settings.save_thumbnails !== localSettings.save_thumbnails ||
-      settings.capture_finish_photo !== localSettings.capture_finish_photo ||
-      settings.default_filament_cost !== localSettings.default_filament_cost ||
-      settings.currency !== localSettings.currency ||
-      settings.energy_cost_per_kwh !== localSettings.energy_cost_per_kwh ||
-      settings.energy_tracking_mode !== localSettings.energy_tracking_mode ||
-      settings.check_updates !== localSettings.check_updates ||
-      settings.notification_language !== localSettings.notification_language ||
-      settings.ams_humidity_good !== localSettings.ams_humidity_good ||
-      settings.ams_humidity_fair !== localSettings.ams_humidity_fair ||
-      settings.ams_temp_good !== localSettings.ams_temp_good ||
-      settings.ams_temp_fair !== localSettings.ams_temp_fair ||
-      settings.ams_history_retention_days !== localSettings.ams_history_retention_days ||
-      settings.date_format !== localSettings.date_format ||
-      settings.time_format !== localSettings.time_format ||
-      settings.default_printer_id !== localSettings.default_printer_id;
- 
-    if (!hasChanges) {
-      return;
-    }
- 
-    // Clear existing timeout
-    if (saveTimeoutRef.current) {
-      clearTimeout(saveTimeoutRef.current);
-    }
- 
-    // Set new debounced save (500ms delay)
-    saveTimeoutRef.current = setTimeout(() => {
-      updateMutation.mutate(localSettings);
-    }, 500);
- 
-    // Cleanup on unmount or when localSettings changes again
-    return () => {
-      if (saveTimeoutRef.current) {
-        clearTimeout(saveTimeoutRef.current);
-      }
-    };
-  }, [localSettings, settings, updateMutation]);
- 
-  const updateSetting = useCallback(<K extends keyof AppSettings>(key: K, value: AppSettings[K]) => {
-    setLocalSettings(prev => prev ? { ...prev, [key]: value } : null);
-  }, []);
- 
-  if (isLoading || !localSettings) {
-    return (
-      <div className="p-4 md:p-8 flex justify-center">
-        <Loader2 className="w-8 h-8 text-bambu-green animate-spin" />
-      </div>
-    );
-  }
- 
-  return (
-    <div className="p-4 md:p-8">
-      <div className="mb-8">
-        <h1 className="text-2xl font-bold text-white">Settings</h1>
-        <p className="text-bambu-gray">Configure Bambuddy</p>
-      </div>
- 
-      {/* Tab Navigation */}
-      <div className="flex gap-1 mb-6 border-b border-bambu-dark-tertiary">
-        <button
-          onClick={() => setActiveTab('general')}
-          className={`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px ${
-            activeTab === 'general'
-              ? 'text-bambu-green border-bambu-green'
-              : 'text-bambu-gray hover:text-white border-transparent'
-          }`}
-        >
-          General
-        </button>
-        <button
-          onClick={() => setActiveTab('plugs')}
-          className={`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px flex items-center gap-2 ${
-            activeTab === 'plugs'
-              ? 'text-bambu-green border-bambu-green'
-              : 'text-bambu-gray hover:text-white border-transparent'
-          }`}
-        >
-          <Plug className="w-4 h-4" />
-          Smart Plugs
-          {smartPlugs && smartPlugs.length > 0 && (
-            <span className="text-xs bg-bambu-dark-tertiary px-1.5 py-0.5 rounded-full">
-              {smartPlugs.length}
-            </span>
-          )}
-        </button>
-        <button
-          onClick={() => setActiveTab('notifications')}
-          className={`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px flex items-center gap-2 ${
-            activeTab === 'notifications'
-              ? 'text-bambu-green border-bambu-green'
-              : 'text-bambu-gray hover:text-white border-transparent'
-          }`}
-        >
-          <Bell className="w-4 h-4" />
-          Notifications
-          {notificationProviders && notificationProviders.length > 0 && (
-            <span className="text-xs bg-bambu-dark-tertiary px-1.5 py-0.5 rounded-full">
-              {notificationProviders.length}
-            </span>
-          )}
-        </button>
-        <button
-          onClick={() => setActiveTab('apikeys')}
-          className={`px-4 py-2 text-sm font-medium transition-colors border-b-2 -mb-px flex items-center gap-2 ${
-            activeTab === 'apikeys'
-              ? 'text-bambu-green border-bambu-green'
-              : 'text-bambu-gray hover:text-white border-transparent'
-          }`}
-        >
-          <Key className="w-4 h-4" />
-          API Keys
-          {apiKeys && apiKeys.length > 0 && (
-            <span className="text-xs bg-bambu-dark-tertiary px-1.5 py-0.5 rounded-full">
-              {apiKeys.length}
-            </span>
-          )}
-        </button>
-      </div>
- 
-      {/* General Tab */}
-      {activeTab === 'general' && (
-      <div className="flex flex-col lg:flex-row gap-6 lg:gap-8">
-        {/* Left Column - General Settings */}
-        <div className="space-y-6 flex-1 lg:max-w-xl">
-          <Card>
-            <CardHeader>
-              <h2 className="text-lg font-semibold text-white">{t('settings.general')}</h2>
-            </CardHeader>
-            <CardContent className="space-y-4">
-              <div>
-                <label className="block text-sm text-bambu-gray mb-1">
-                  <Globe className="w-4 h-4 inline mr-1" />
-                  {t('settings.language')}
-                </label>
-                <select
-                  value={i18n.language}
-                  onChange={(e) => i18n.changeLanguage(e.target.value)}
-                  className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                >
-                  {availableLanguages.map((lang) => (
-                    <option key={lang.code} value={lang.code}>
-                      {lang.nativeName} ({lang.name})
-                    </option>
-                  ))}
-                </select>
-                <p className="text-xs text-bambu-gray mt-1">
-                  {t('settings.languageDescription')}
-                </p>
-              </div>
-              <div>
-                <label className="block text-sm text-bambu-gray mb-1">
-                  {t('settings.defaultView')}
-                </label>
-                <select
-                  value={defaultView}
-                  onChange={(e) => handleDefaultViewChange(e.target.value)}
-                  className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                >
-                  {defaultNavItems.map((item) => (
-                    <option key={item.id} value={item.to}>
-                      {t(item.labelKey)}
-                    </option>
-                  ))}
-                </select>
-                <p className="text-xs text-bambu-gray mt-1">
-                  {t('settings.defaultViewDescription')}
-                </p>
-              </div>
-              <div className="grid grid-cols-2 gap-3">
-                <div>
-                  <label className="block text-sm text-bambu-gray mb-1">
-                    Date Format
-                  </label>
-                  <select
-                    value={localSettings.date_format || 'system'}
-                    onChange={(e) => updateSetting('date_format', e.target.value as 'system' | 'us' | 'eu' | 'iso')}
-                    className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                  >
-                    <option value="system">System Default</option>
-                    <option value="us">US (MM/DD/YYYY)</option>
-                    <option value="eu">EU (DD/MM/YYYY)</option>
-                    <option value="iso">ISO (YYYY-MM-DD)</option>
-                  </select>
-                </div>
-                <div>
-                  <label className="block text-sm text-bambu-gray mb-1">
-                    Time Format
-                  </label>
-                  <select
-                    value={localSettings.time_format || 'system'}
-                    onChange={(e) => updateSetting('time_format', e.target.value as 'system' | '12h' | '24h')}
-                    className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                  >
-                    <option value="system">System Default</option>
-                    <option value="12h">12-hour (3:30 PM)</option>
-                    <option value="24h">24-hour (15:30)</option>
-                  </select>
-                </div>
-              </div>
-              <div>
-                <label className="block text-sm text-bambu-gray mb-1">
-                  Default Printer
-                </label>
-                <select
-                  value={localSettings.default_printer_id ?? ''}
-                  onChange={(e) => updateSetting('default_printer_id', e.target.value ? Number(e.target.value) : null)}
-                  className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                >
-                  <option value="">No default (ask each time)</option>
-                  {printers?.map((printer) => (
-                    <option key={printer.id} value={printer.id}>
-                      {printer.name}
-                    </option>
-                  ))}
-                </select>
-                <p className="text-xs text-bambu-gray mt-1">
-                  Pre-select this printer for uploads, reprints, and other operations.
-                </p>
-              </div>
-              <div className="flex items-center justify-between">
-                <div>
-                  <p className="text-white">Sidebar order</p>
-                  <p className="text-sm text-bambu-gray">
-                    Drag items in the sidebar to reorder. Reset to default order here.
-                  </p>
-                </div>
-                <Button
-                  variant="secondary"
-                  size="sm"
-                  onClick={handleResetSidebarOrder}
-                >
-                  <RotateCcw className="w-4 h-4" />
-                  Reset
-                </Button>
-              </div>
-            </CardContent>
-          </Card>
- 
-          <Card>
-            <CardHeader>
-              <h2 className="text-lg font-semibold text-white">Archive Settings</h2>
-            </CardHeader>
-            <CardContent className="space-y-4">
-              <div className="flex items-center justify-between">
-                <div>
-                  <p className="text-white">Auto-archive prints</p>
-                  <p className="text-sm text-bambu-gray">
-                    Automatically save 3MF files when prints complete
-                  </p>
-                </div>
-                <label className="relative inline-flex items-center cursor-pointer">
-                  <input
-                    type="checkbox"
-                    checked={localSettings.auto_archive}
-                    onChange={(e) => updateSetting('auto_archive', e.target.checked)}
-                    className="sr-only peer"
-                  />
-                  <div className="w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"></div>
-                </label>
-              </div>
-              <div className="flex items-center justify-between">
-                <div>
-                  <p className="text-white">Save thumbnails</p>
-                  <p className="text-sm text-bambu-gray">
-                    Extract and save preview images from 3MF files
-                  </p>
-                </div>
-                <label className="relative inline-flex items-center cursor-pointer">
-                  <input
-                    type="checkbox"
-                    checked={localSettings.save_thumbnails}
-                    onChange={(e) => updateSetting('save_thumbnails', e.target.checked)}
-                    className="sr-only peer"
-                  />
-                  <div className="w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"></div>
-                </label>
-              </div>
-              <div className="flex items-center justify-between">
-                <div>
-                  <p className="text-white">Capture finish photo</p>
-                  <p className="text-sm text-bambu-gray">
-                    Take a photo from printer camera when print completes
-                  </p>
-                </div>
-                <label className="relative inline-flex items-center cursor-pointer">
-                  <input
-                    type="checkbox"
-                    checked={localSettings.capture_finish_photo}
-                    onChange={(e) => updateSetting('capture_finish_photo', e.target.checked)}
-                    className="sr-only peer"
-                  />
-                  <div className="w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"></div>
-                </label>
-              </div>
-              {localSettings.capture_finish_photo && ffmpegStatus && !ffmpegStatus.installed && (
-                <div className="flex items-start gap-2 p-3 bg-yellow-500/10 border border-yellow-500/30 rounded-lg">
-                  <AlertTriangle className="w-5 h-5 text-yellow-500 flex-shrink-0 mt-0.5" />
-                  <div className="text-sm">
-                    <p className="text-yellow-500 font-medium">ffmpeg not installed</p>
-                    <p className="text-bambu-gray mt-1">
-                      Camera capture requires ffmpeg. Install it via{' '}
-                      <code className="bg-bambu-dark-tertiary px-1 rounded">brew install ffmpeg</code> (macOS) or{' '}
-                      <code className="bg-bambu-dark-tertiary px-1 rounded">apt install ffmpeg</code> (Linux).
-                    </p>
-                  </div>
-                </div>
-              )}
-            </CardContent>
-          </Card>
- 
-          <Card>
-            <CardHeader>
-              <h2 className="text-lg font-semibold text-white">Cost Tracking</h2>
-            </CardHeader>
-            <CardContent className="space-y-4">
-              <div>
-                <label className="block text-sm text-bambu-gray mb-1">
-                  Default filament cost (per kg)
-                </label>
-                <input
-                  type="number"
-                  step="0.01"
-                  min="0"
-                  value={localSettings.default_filament_cost}
-                  onChange={(e) =>
-                    updateSetting('default_filament_cost', parseFloat(e.target.value) || 0)
-                  }
-                  className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                />
-              </div>
-              <div>
-                <label className="block text-sm text-bambu-gray mb-1">Currency</label>
-                <select
-                  value={localSettings.currency}
-                  onChange={(e) => updateSetting('currency', e.target.value)}
-                  className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                >
-                  <option value="USD">USD ($)</option>
-                  <option value="EUR">EUR (€)</option>
-                  <option value="GBP">GBP (£)</option>
-                  <option value="CHF">CHF (Fr.)</option>
-                  <option value="JPY">JPY (¥)</option>
-                  <option value="CNY">CNY (¥)</option>
-                  <option value="CAD">CAD ($)</option>
-                  <option value="AUD">AUD ($)</option>
-                </select>
-              </div>
-              <div>
-                <label className="block text-sm text-bambu-gray mb-1">
-                  Electricity cost per kWh
-                </label>
-                <input
-                  type="number"
-                  step="0.01"
-                  min="0"
-                  value={localSettings.energy_cost_per_kwh}
-                  onChange={(e) =>
-                    updateSetting('energy_cost_per_kwh', parseFloat(e.target.value) || 0)
-                  }
-                  className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                />
-              </div>
-              <div>
-                <label className="block text-sm text-bambu-gray mb-1">
-                  Energy display mode
-                </label>
-                <select
-                  value={localSettings.energy_tracking_mode || 'total'}
-                  onChange={(e) => updateSetting('energy_tracking_mode', e.target.value as 'print' | 'total')}
-                  className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                >
-                  <option value="print">Prints Only</option>
-                  <option value="total">Total Consumption</option>
-                </select>
-                <p className="text-xs text-bambu-gray mt-1">
-                  {localSettings.energy_tracking_mode === 'print'
-                    ? 'Dashboard shows sum of energy used during prints'
-                    : 'Dashboard shows lifetime energy from smart plugs'}
-                </p>
-              </div>
-            </CardContent>
-          </Card>
-        </div>
- 
-        {/* Second Column - AMS & Spoolman */}
-        <div className="space-y-6 flex-1 lg:max-w-md">
-          <Card>
-            <CardHeader>
-              <h2 className="text-lg font-semibold text-white">AMS Display Thresholds</h2>
-            </CardHeader>
-            <CardContent className="space-y-4">
-              <p className="text-sm text-bambu-gray">
-                Configure color thresholds for AMS humidity and temperature indicators.
-              </p>
- 
-              {/* Humidity Thresholds */}
-              <div className="space-y-3">
-                <div className="flex items-center gap-2 text-white">
-                  <Droplets className="w-4 h-4 text-blue-400" />
-                  <span className="font-medium">Humidity</span>
-                </div>
-                <div className="grid grid-cols-2 gap-3">
-                  <div>
-                    <label className="block text-sm text-bambu-gray mb-1">
-                      Good (green) ≤
-                    </label>
-                    <div className="flex items-center gap-2">
-                      <input
-                        type="number"
-                        min="0"
-                        max="100"
-                        value={localSettings.ams_humidity_good ?? 40}
-                        onChange={(e) => updateSetting('ams_humidity_good', parseInt(e.target.value) || 40)}
-                        className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                      />
-                      <span className="text-bambu-gray">%</span>
-                    </div>
-                  </div>
-                  <div>
-                    <label className="block text-sm text-bambu-gray mb-1">
-                      Fair (orange) ≤
-                    </label>
-                    <div className="flex items-center gap-2">
-                      <input
-                        type="number"
-                        min="0"
-                        max="100"
-                        value={localSettings.ams_humidity_fair ?? 60}
-                        onChange={(e) => updateSetting('ams_humidity_fair', parseInt(e.target.value) || 60)}
-                        className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                      />
-                      <span className="text-bambu-gray">%</span>
-                    </div>
-                  </div>
-                </div>
-                <p className="text-xs text-bambu-gray">
-                  Above fair threshold shows as red (bad)
-                </p>
-              </div>
- 
-              {/* Temperature Thresholds */}
-              <div className="space-y-3 pt-2 border-t border-bambu-dark-tertiary">
-                <div className="flex items-center gap-2 text-white">
-                  <Thermometer className="w-4 h-4 text-orange-400" />
-                  <span className="font-medium">Temperature</span>
-                </div>
-                <div className="grid grid-cols-2 gap-3">
-                  <div>
-                    <label className="block text-sm text-bambu-gray mb-1">
-                      Good (blue) ≤
-                    </label>
-                    <div className="flex items-center gap-2">
-                      <input
-                        type="number"
-                        step="0.5"
-                        min="0"
-                        max="60"
-                        value={localSettings.ams_temp_good ?? 28}
-                        onChange={(e) => updateSetting('ams_temp_good', parseFloat(e.target.value) || 28)}
-                        className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                      />
-                      <span className="text-bambu-gray">°C</span>
-                    </div>
-                  </div>
-                  <div>
-                    <label className="block text-sm text-bambu-gray mb-1">
-                      Fair (orange) ≤
-                    </label>
-                    <div className="flex items-center gap-2">
-                      <input
-                        type="number"
-                        step="0.5"
-                        min="0"
-                        max="60"
-                        value={localSettings.ams_temp_fair ?? 35}
-                        onChange={(e) => updateSetting('ams_temp_fair', parseFloat(e.target.value) || 35)}
-                        className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                      />
-                      <span className="text-bambu-gray">°C</span>
-                    </div>
-                  </div>
-                </div>
-                <p className="text-xs text-bambu-gray">
-                  Above fair threshold shows as red (hot)
-                </p>
-              </div>
- 
-              {/* History Retention */}
-              <div className="space-y-3 pt-4 border-t border-bambu-dark-tertiary">
-                <div className="flex items-center gap-2 text-white">
-                  <Database className="w-4 h-4 text-purple-400" />
-                  <span className="font-medium">History Retention</span>
-                </div>
-                <div>
-                  <label className="block text-sm text-bambu-gray mb-1">
-                    Keep sensor history for
-                  </label>
-                  <div className="flex items-center gap-2">
-                    <input
-                      type="number"
-                      min="1"
-                      max="365"
-                      value={localSettings.ams_history_retention_days ?? 30}
-                      onChange={(e) => updateSetting('ams_history_retention_days', parseInt(e.target.value) || 30)}
-                      className="w-24 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                    />
-                    <span className="text-bambu-gray">days</span>
-                  </div>
-                </div>
-                <p className="text-xs text-bambu-gray">
-                  Older humidity and temperature data will be automatically deleted
-                </p>
-              </div>
-            </CardContent>
-          </Card>
- 
-          <SpoolmanSettings />
- 
-          <ExternalLinksSettings />
-        </div>
- 
-        {/* Third Column - Updates */}
-        <div className="space-y-6 flex-1 lg:max-w-sm">
-          <Card>
-            <CardHeader>
-              <h2 className="text-lg font-semibold text-white">Updates</h2>
-            </CardHeader>
-            <CardContent className="space-y-4">
-              <div className="flex items-center justify-between">
-                <div>
-                  <p className="text-white">Check for updates</p>
-                  <p className="text-sm text-bambu-gray">
-                    Automatically check for new versions on startup
-                  </p>
-                </div>
-                <label className="relative inline-flex items-center cursor-pointer">
-                  <input
-                    type="checkbox"
-                    checked={localSettings.check_updates}
-                    onChange={(e) => updateSetting('check_updates', e.target.checked)}
-                    className="sr-only peer"
-                  />
-                  <div className="w-11 h-6 bg-bambu-dark-tertiary peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-bambu-green"></div>
-                </label>
-              </div>
- 
-              <div className="border-t border-bambu-dark-tertiary pt-4">
-                <div className="flex items-center justify-between mb-2">
-                  <div>
-                    <p className="text-white">Current version</p>
-                    <p className="text-sm text-bambu-gray">v{versionInfo?.version || '...'}</p>
-                  </div>
-                  <Button
-                    variant="secondary"
-                    size="sm"
-                    onClick={() => refetchUpdateCheck()}
-                    disabled={isCheckingUpdate}
-                  >
-                    {isCheckingUpdate ? (
-                      <Loader2 className="w-4 h-4 animate-spin" />
-                    ) : (
-                      <RefreshCw className="w-4 h-4" />
-                    )}
-                    Check now
-                  </Button>
-                </div>
- 
-                {updateCheck?.update_available ? (
-                  <div className="mt-4 p-3 bg-bambu-green/10 border border-bambu-green/30 rounded-lg">
-                    <div className="flex items-start justify-between">
-                      <div>
-                        <p className="text-bambu-green font-medium">
-                          Update available: v{updateCheck.latest_version}
-                        </p>
-                        {updateCheck.release_name && updateCheck.release_name !== updateCheck.latest_version && (
-                          <p className="text-sm text-bambu-gray mt-1">{updateCheck.release_name}</p>
-                        )}
-                        {updateCheck.release_notes && (
-                          <p className="text-sm text-bambu-gray mt-2 whitespace-pre-line line-clamp-3">
-                            {updateCheck.release_notes}
-                          </p>
-                        )}
-                      </div>
-                      {updateCheck.release_url && (
-                        <a
-                          href={updateCheck.release_url}
-                          target="_blank"
-                          rel="noopener noreferrer"
-                          className="text-bambu-gray hover:text-white transition-colors"
-                          title="View release on GitHub"
-                        >
-                          <ExternalLink className="w-4 h-4" />
-                        </a>
-                      )}
-                    </div>
- 
-                    {updateStatus?.status === 'downloading' || updateStatus?.status === 'installing' ? (
-                      <div className="mt-3">
-                        <div className="flex items-center gap-2 text-sm text-bambu-gray">
-                          <Loader2 className="w-4 h-4 animate-spin" />
-                          <span>{updateStatus.message}</span>
-                        </div>
-                        <div className="mt-2 w-full bg-bambu-dark-tertiary rounded-full h-2">
-                          <div
-                            className="bg-bambu-green h-2 rounded-full transition-all duration-300"
-                            style={{ width: `${updateStatus.progress}%` }}
-                          />
-                        </div>
-                      </div>
-                    ) : updateStatus?.status === 'complete' ? (
-                      <div className="mt-3 p-2 bg-bambu-green/20 rounded text-sm text-bambu-green">
-                        {updateStatus.message}
-                      </div>
-                    ) : updateStatus?.status === 'error' ? (
-                      <div className="mt-3 p-2 bg-red-500/20 rounded text-sm text-red-400">
-                        {updateStatus.error || updateStatus.message}
-                      </div>
-                    ) : (
-                      <Button
-                        className="mt-3"
-                        onClick={() => applyUpdateMutation.mutate()}
-                        disabled={applyUpdateMutation.isPending}
-                      >
-                        {applyUpdateMutation.isPending ? (
-                          <Loader2 className="w-4 h-4 animate-spin" />
-                        ) : (
-                          <Download className="w-4 h-4" />
-                        )}
-                        Install Update
-                      </Button>
-                    )}
-                  </div>
-                ) : updateCheck?.error ? (
-                  <div className="mt-2 p-2 bg-red-500/10 border border-red-500/30 rounded text-sm text-red-400">
-                    Failed to check for updates: {updateCheck.error}
-                  </div>
-                ) : updateCheck && !updateCheck.update_available ? (
-                  <p className="mt-2 text-sm text-bambu-gray">
-                    You're running the latest version
-                  </p>
-                ) : null}
-              </div>
-            </CardContent>
-          </Card>
- 
-          {/* Data Management */}
-          <Card>
-            <CardHeader>
-              <h2 className="text-lg font-semibold text-white">Data Management</h2>
-            </CardHeader>
-            <CardContent className="space-y-4">
-              {/* Backup/Restore */}
-              <div className="flex items-center justify-between">
-                <div>
-                  <p className="text-white">Backup Data</p>
-                  <p className="text-sm text-bambu-gray">
-                    Export settings, providers, printers, and more
-                  </p>
-                </div>
-                <Button
-                  variant="secondary"
-                  size="sm"
-                  onClick={() => setShowBackupModal(true)}
-                >
-                  <Download className="w-4 h-4" />
-                  Export
-                </Button>
-              </div>
-              <div className="flex items-center justify-between">
-                <div>
-                  <p className="text-white">Restore Backup</p>
-                  <p className="text-sm text-bambu-gray">
-                    Import settings from a backup file with duplicate handling options
-                  </p>
-                </div>
-                <Button
-                  variant="secondary"
-                  size="sm"
-                  onClick={() => setShowRestoreModal(true)}
-                >
-                  <Upload className="w-4 h-4" />
-                  Restore
-                </Button>
-              </div>
- 
-              <div className="border-t border-bambu-dark-tertiary pt-4">
-                <div className="flex items-center justify-between">
-                  <div>
-                    <p className="text-white">Clear Notification Logs</p>
-                    <p className="text-sm text-bambu-gray">
-                      Delete notification logs older than 30 days
-                    </p>
-                  </div>
-                  <Button
-                    variant="secondary"
-                    size="sm"
-                    onClick={() => setShowClearLogsConfirm(true)}
-                  >
-                    <Trash2 className="w-4 h-4" />
-                    Clear
-                  </Button>
-                </div>
-              </div>
-              <div className="flex items-center justify-between">
-                <div>
-                  <p className="text-white">Reset UI Preferences</p>
-                  <p className="text-sm text-bambu-gray">
-                    Reset sidebar order, theme, view modes, and layout preferences. Printers, archives, and settings are not affected.
-                  </p>
-                </div>
-                <Button
-                  variant="secondary"
-                  size="sm"
-                  onClick={() => setShowClearStorageConfirm(true)}
-                >
-                  <Trash2 className="w-4 h-4" />
-                  Reset
-                </Button>
-              </div>
-            </CardContent>
-          </Card>
-        </div>
-      </div>
-      )}
- 
-      {/* Smart Plugs Tab */}
-      {activeTab === 'plugs' && (
-        <div className="max-w-4xl">
-          <div className="flex items-start justify-between mb-6">
-            <div>
-              <h2 className="text-lg font-semibold text-white flex items-center gap-2">
-                <Plug className="w-5 h-5 text-bambu-green" />
-                Smart Plugs
-              </h2>
-              <p className="text-sm text-bambu-gray mt-1">
-                Connect Tasmota-based smart plugs to automate power control and track energy usage for your printers.
-              </p>
-            </div>
-            <div className="flex items-center gap-2 pt-1 shrink-0">
-              {smartPlugs && smartPlugs.filter(p => p.enabled).length > 1 && (
-                <>
-                  <Button
-                    variant="secondary"
-                    size="sm"
-                    className="whitespace-nowrap"
-                    onClick={() => setShowBulkPlugConfirm('on')}
-                    disabled={bulkPlugActionMutation.isPending}
-                    title="Turn all plugs on"
-                  >
-                    {bulkPlugActionMutation.isPending ? (
-                      <Loader2 className="w-4 h-4 animate-spin" />
-                    ) : (
-                      <Power className="w-4 h-4 text-bambu-green" />
-                    )}
-                    All On
-                  </Button>
-                  <Button
-                    variant="secondary"
-                    size="sm"
-                    className="whitespace-nowrap"
-                    onClick={() => setShowBulkPlugConfirm('off')}
-                    disabled={bulkPlugActionMutation.isPending}
-                    title="Turn all plugs off"
-                  >
-                    {bulkPlugActionMutation.isPending ? (
-                      <Loader2 className="w-4 h-4 animate-spin" />
-                    ) : (
-                      <PowerOff className="w-4 h-4 text-red-400" />
-                    )}
-                    All Off
-                  </Button>
-                </>
-              )}
-              <Button
-                className="whitespace-nowrap"
-                onClick={() => {
-                  setEditingPlug(null);
-                  setShowPlugModal(true);
-                }}
-              >
-                <Plus className="w-4 h-4" />
-                Add Smart Plug
-              </Button>
-            </div>
-          </div>
- 
-          {/* Energy Summary Card */}
-          {smartPlugs && smartPlugs.length > 0 && (
-            <Card className="mb-6">
-              <CardHeader>
-                <h3 className="text-base font-semibold text-white flex items-center gap-2">
-                  <Zap className="w-4 h-4 text-yellow-400" />
-                  Energy Summary
-                  {energyLoading && (
-                    <Loader2 className="w-4 h-4 animate-spin text-bambu-gray ml-2" />
-                  )}
-                </h3>
-              </CardHeader>
-              <CardContent>
-                {plugEnergySummary ? (
-                  <div className="grid grid-cols-2 md:grid-cols-4 gap-4">
-                    {/* Current Power */}
-                    <div className="bg-bambu-dark rounded-lg p-3">
-                      <div className="flex items-center gap-2 text-bambu-gray text-xs mb-1">
-                        <Zap className="w-3 h-3" />
-                        Current Power
-                      </div>
-                      <div className="text-xl font-bold text-white">
-                        {plugEnergySummary.totalPower.toFixed(1)}
-                        <span className="text-sm font-normal text-bambu-gray ml-1">W</span>
-                      </div>
-                      <div className="text-xs text-bambu-gray mt-1">
-                        {plugEnergySummary.reachableCount}/{plugEnergySummary.totalPlugs} plugs online
-                      </div>
-                    </div>
- 
-                    {/* Today */}
-                    <div className="bg-bambu-dark rounded-lg p-3">
-                      <div className="flex items-center gap-2 text-bambu-gray text-xs mb-1">
-                        <Calendar className="w-3 h-3" />
-                        Today
-                      </div>
-                      <div className="text-xl font-bold text-white">
-                        {plugEnergySummary.totalToday.toFixed(2)}
-                        <span className="text-sm font-normal text-bambu-gray ml-1">kWh</span>
-                      </div>
-                      {localSettings && localSettings.energy_cost_per_kwh > 0 && (
-                        <div className="text-xs text-bambu-gray mt-1">
-                          ~{(plugEnergySummary.totalToday * localSettings.energy_cost_per_kwh).toFixed(2)} {localSettings.currency}
-                        </div>
-                      )}
-                    </div>
- 
-                    {/* Yesterday */}
-                    <div className="bg-bambu-dark rounded-lg p-3">
-                      <div className="flex items-center gap-2 text-bambu-gray text-xs mb-1">
-                        <TrendingUp className="w-3 h-3" />
-                        Yesterday
-                      </div>
-                      <div className="text-xl font-bold text-white">
-                        {plugEnergySummary.totalYesterday.toFixed(2)}
-                        <span className="text-sm font-normal text-bambu-gray ml-1">kWh</span>
-                      </div>
-                      {localSettings && localSettings.energy_cost_per_kwh > 0 && (
-                        <div className="text-xs text-bambu-gray mt-1">
-                          ~{(plugEnergySummary.totalYesterday * localSettings.energy_cost_per_kwh).toFixed(2)} {localSettings.currency}
-                        </div>
-                      )}
-                    </div>
- 
-                    {/* Total Lifetime */}
-                    <div className="bg-bambu-dark rounded-lg p-3">
-                      <div className="flex items-center gap-2 text-bambu-gray text-xs mb-1">
-                        <DollarSign className="w-3 h-3" />
-                        Total
-                      </div>
-                      <div className="text-xl font-bold text-white">
-                        {plugEnergySummary.totalLifetime.toFixed(1)}
-                        <span className="text-sm font-normal text-bambu-gray ml-1">kWh</span>
-                      </div>
-                      {localSettings && localSettings.energy_cost_per_kwh > 0 && (
-                        <div className="text-xs text-bambu-gray mt-1">
-                          ~{(plugEnergySummary.totalLifetime * localSettings.energy_cost_per_kwh).toFixed(2)} {localSettings.currency}
-                        </div>
-                      )}
-                    </div>
-                  </div>
-                ) : !energyLoading ? (
-                  <p className="text-sm text-bambu-gray">
-                    Enable plugs to see energy summary
-                  </p>
-                ) : null}
-              </CardContent>
-            </Card>
-          )}
- 
-          {plugsLoading ? (
-            <div className="flex justify-center py-12">
-              <Loader2 className="w-8 h-8 text-bambu-green animate-spin" />
-            </div>
-          ) : smartPlugs && smartPlugs.length > 0 ? (
-            <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
-              {smartPlugs.map((plug) => (
-                <SmartPlugCard
-                  key={plug.id}
-                  plug={plug}
-                  onEdit={(p) => {
-                    setEditingPlug(p);
-                    setShowPlugModal(true);
-                  }}
-                />
-              ))}
-            </div>
-          ) : (
-            <Card>
-              <CardContent className="py-12">
-                <div className="text-center text-bambu-gray">
-                  <Plug className="w-16 h-16 mx-auto mb-4 opacity-30" />
-                  <p className="text-lg font-medium text-white mb-2">No smart plugs configured</p>
-                  <p className="text-sm mb-4">Add a Tasmota-based smart plug to track energy usage and automate power control.</p>
-                  <Button
-                    onClick={() => {
-                      setEditingPlug(null);
-                      setShowPlugModal(true);
-                    }}
-                  >
-                    <Plus className="w-4 h-4" />
-                    Add Your First Smart Plug
-                  </Button>
-                </div>
-              </CardContent>
-            </Card>
-          )}
-        </div>
-      )}
- 
-      {/* Notifications Tab */}
-      {activeTab === 'notifications' && (
-        <div className="grid grid-cols-1 lg:grid-cols-2 gap-8">
-          {/* Left Column: Providers */}
-          <div>
-            <div className="flex items-center justify-between mb-4">
-              <h2 className="text-lg font-semibold text-white flex items-center gap-2">
-                <Bell className="w-5 h-5 text-bambu-green" />
-                Providers
-              </h2>
-              <div className="flex items-center gap-2">
-                <Button
-                  size="sm"
-                  variant="secondary"
-                  onClick={() => setShowLogViewer(true)}
-                >
-                  <History className="w-4 h-4" />
-                  Log
-                </Button>
-                {notificationProviders && notificationProviders.length > 0 && (
-                  <Button
-                    size="sm"
-                    variant="secondary"
-                    onClick={() => {
-                      setTestAllResult(null);
-                      testAllMutation.mutate();
-                    }}
-                    disabled={testAllMutation.isPending}
-                  >
-                    {testAllMutation.isPending ? (
-                      <Loader2 className="w-4 h-4 animate-spin" />
-                    ) : (
-                      <Send className="w-4 h-4" />
-                    )}
-                    Test All
-                  </Button>
-                )}
-                <Button
-                  size="sm"
-                  onClick={() => {
-                    setEditingProvider(null);
-                    setShowNotificationModal(true);
-                  }}
-                >
-                  <Plus className="w-4 h-4" />
-                  Add
-                </Button>
-              </div>
-            </div>
- 
-            {/* Notification Language Setting */}
-            <Card className="mb-4">
-              <CardContent className="py-3">
-                <div className="flex items-center justify-between">
-                  <div>
-                    <p className="text-white text-sm font-medium">{t('settings.notificationLanguage')}</p>
-                    <p className="text-xs text-bambu-gray">{t('settings.notificationLanguageDescription')}</p>
-                  </div>
-                  <select
-                    value={localSettings.notification_language || 'en'}
-                    onChange={(e) => updateSetting('notification_language', e.target.value)}
-                    className="px-2 py-1.5 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm focus:outline-none focus:ring-1 focus:ring-bambu-green"
-                  >
-                    {availableLanguages.map((lang) => (
-                      <option key={lang.code} value={lang.code}>
-                        {lang.nativeName}
-                      </option>
-                    ))}
-                  </select>
-                </div>
-              </CardContent>
-            </Card>
- 
-            {/* Test All Results */}
-            {testAllResult && (
-              <Card className="mb-4">
-                <CardContent className="py-3">
-                  <div className="flex items-center justify-between mb-2">
-                    <span className="text-sm font-medium text-white">Test Results</span>
-                    <button
-                      onClick={() => setTestAllResult(null)}
-                      className="text-bambu-gray hover:text-white text-xs"
-                    >
-                      Dismiss
-                    </button>
-                  </div>
-                  <div className="flex items-center gap-4 text-sm mb-2">
-                    <span className="flex items-center gap-1 text-bambu-green">
-                      <CheckCircle className="w-4 h-4" />
-                      {testAllResult.success} passed
-                    </span>
-                    {testAllResult.failed > 0 && (
-                      <span className="flex items-center gap-1 text-red-400">
-                        <XCircle className="w-4 h-4" />
-                        {testAllResult.failed} failed
-                      </span>
-                    )}
-                  </div>
-                  {testAllResult.results.filter(r => !r.success).length > 0 && (
-                    <div className="space-y-1 mt-2 pt-2 border-t border-bambu-dark-tertiary">
-                      {testAllResult.results.filter(r => !r.success).map((result) => (
-                        <div key={result.provider_id} className="text-xs text-red-400">
-                          <span className="font-medium">{result.provider_name}:</span> {result.message}
-                        </div>
-                      ))}
-                    </div>
-                  )}
-                </CardContent>
-              </Card>
-            )}
- 
-            {providersLoading ? (
-              <div className="flex justify-center py-12">
-                <Loader2 className="w-6 h-6 text-bambu-green animate-spin" />
-              </div>
-            ) : notificationProviders && notificationProviders.length > 0 ? (
-              <div className="space-y-3">
-                {notificationProviders.map((provider) => (
-                  <NotificationProviderCard
-                    key={provider.id}
-                    provider={provider}
-                    onEdit={(p) => {
-                      setEditingProvider(p);
-                      setShowNotificationModal(true);
-                    }}
-                  />
-                ))}
-              </div>
-            ) : (
-              <Card>
-                <CardContent className="py-8">
-                  <div className="text-center text-bambu-gray">
-                    <Bell className="w-12 h-12 mx-auto mb-3 opacity-30" />
-                    <p className="text-sm font-medium text-white mb-2">No providers configured</p>
-                    <p className="text-xs mb-3">Add a provider to receive alerts.</p>
-                    <Button
-                      size="sm"
-                      onClick={() => {
-                        setEditingProvider(null);
-                        setShowNotificationModal(true);
-                      }}
-                    >
-                      <Plus className="w-4 h-4" />
-                      Add Provider
-                    </Button>
-                  </div>
-                </CardContent>
-              </Card>
-            )}
-          </div>
- 
-          {/* Right Column: Templates */}
-          <div>
-            <h2 className="text-lg font-semibold text-white flex items-center gap-2 mb-4">
-              <FileText className="w-5 h-5 text-bambu-green" />
-              Message Templates
-            </h2>
-            <p className="text-sm text-bambu-gray mb-4">
-              Customize notification messages for each event.
-            </p>
- 
-            {templatesLoading ? (
-              <div className="flex justify-center py-8">
-                <Loader2 className="w-6 h-6 text-bambu-green animate-spin" />
-              </div>
-            ) : notificationTemplates && notificationTemplates.length > 0 ? (
-              <div className="space-y-2">
-                {notificationTemplates.map((template) => (
-                  <Card
-                    key={template.id}
-                    className="cursor-pointer hover:border-bambu-green/50 transition-colors"
-                    onClick={() => setEditingTemplate(template)}
-                  >
-                    <CardContent className="py-2.5 px-3">
-                      <div className="flex items-center justify-between">
-                        <div className="min-w-0 flex-1">
-                          <p className="text-white font-medium text-sm truncate">{template.name}</p>
-                          <p className="text-bambu-gray text-xs truncate mt-0.5">
-                            {template.title_template}
-                          </p>
-                        </div>
-                        <button
-                          className="p-1.5 hover:bg-bambu-dark-tertiary rounded transition-colors shrink-0 ml-2"
-                          onClick={(e) => {
-                            e.stopPropagation();
-                            setEditingTemplate(template);
-                          }}
-                        >
-                          <Edit2 className="w-4 h-4 text-bambu-gray" />
-                        </button>
-                      </div>
-                    </CardContent>
-                  </Card>
-                ))}
-              </div>
-            ) : (
-              <Card>
-                <CardContent className="py-8">
-                  <div className="text-center text-bambu-gray">
-                    <FileText className="w-12 h-12 mx-auto mb-3 opacity-30" />
-                    <p className="text-sm">No templates available. Restart the backend to seed default templates.</p>
-                  </div>
-                </CardContent>
-              </Card>
-            )}
-          </div>
-        </div>
-      )}
- 
-      {/* API Keys Tab */}
-      {activeTab === 'apikeys' && (
-        <div className="max-w-3xl">
-          <div className="flex items-start justify-between gap-4 mb-6">
-            <div className="flex-1">
-              <h2 className="text-lg font-semibold text-white flex items-center gap-2">
-                <Key className="w-5 h-5 text-bambu-green" />
-                API Keys
-              </h2>
-              <p className="text-sm text-bambu-gray mt-1">
-                Create API keys for external integrations and webhooks. Use these keys to control your printers from automation tools like Home Assistant.
-              </p>
-            </div>
-            <Button size="sm" onClick={() => setShowCreateAPIKey(true)} className="flex-shrink-0">
-              <Plus className="w-4 h-4" />
-              Create Key
-            </Button>
-          </div>
- 
-          {/* Created Key Display */}
-          {createdAPIKey && (
-            <Card className="mb-6 border-bambu-green">
-              <CardContent className="py-4">
-                <div className="flex items-start gap-3">
-                  <CheckCircle className="w-5 h-5 text-bambu-green flex-shrink-0 mt-0.5" />
-                  <div className="flex-1">
-                    <p className="text-white font-medium mb-1">API Key Created Successfully</p>
-                    <p className="text-sm text-bambu-gray mb-2">
-                      Copy this key now - it won't be shown again!
-                    </p>
-                    <div className="flex items-center gap-2 bg-bambu-dark rounded-lg p-2">
-                      <code className="flex-1 text-sm text-bambu-green font-mono break-all">
-                        {createdAPIKey}
-                      </code>
-                      <Button
-                        variant="secondary"
-                        size="sm"
-                        onClick={async () => {
-                          try {
-                            if (navigator.clipboard && navigator.clipboard.writeText) {
-                              await navigator.clipboard.writeText(createdAPIKey);
-                            } else {
-                              // Fallback for non-HTTPS contexts
-                              const textArea = document.createElement('textarea');
-                              textArea.value = createdAPIKey;
-                              textArea.style.position = 'fixed';
-                              textArea.style.left = '-999999px';
-                              document.body.appendChild(textArea);
-                              textArea.select();
-                              document.execCommand('copy');
-                              document.body.removeChild(textArea);
-                            }
-                            showToast('Key copied to clipboard');
-                          } catch {
-                            showToast('Failed to copy key', 'error');
-                          }
-                        }}
-                      >
-                        <Copy className="w-4 h-4" />
-                      </Button>
-                    </div>
-                    <Button
-                      variant="secondary"
-                      size="sm"
-                      className="mt-3"
-                      onClick={() => setCreatedAPIKey(null)}
-                    >
-                      Dismiss
-                    </Button>
-                  </div>
-                </div>
-              </CardContent>
-            </Card>
-          )}
- 
-          {/* Create Key Form */}
-          {showCreateAPIKey && (
-            <Card className="mb-6">
-              <CardHeader>
-                <h3 className="text-base font-semibold text-white">Create New API Key</h3>
-              </CardHeader>
-              <CardContent className="space-y-4">
-                <div>
-                  <label className="block text-sm text-bambu-gray mb-1">Key Name</label>
-                  <input
-                    type="text"
-                    value={newAPIKeyName}
-                    onChange={(e) => setNewAPIKeyName(e.target.value)}
-                    placeholder="e.g., Home Assistant, OctoPrint"
-                    className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"
-                  />
-                </div>
-                <div>
-                  <label className="block text-sm text-bambu-gray mb-2">Permissions</label>
-                  <div className="space-y-2">
-                    <label className="flex items-center gap-3 cursor-pointer">
-                      <input
-                        type="checkbox"
-                        checked={newAPIKeyPermissions.can_read_status}
-                        onChange={(e) => setNewAPIKeyPermissions(prev => ({ ...prev, can_read_status: e.target.checked }))}
-                        className="w-4 h-4 text-bambu-green rounded border-bambu-dark-tertiary bg-bambu-dark focus:ring-bambu-green"
-                      />
-                      <div>
-                        <span className="text-white">Read Status</span>
-                        <p className="text-xs text-bambu-gray">View printer status and queue</p>
-                      </div>
-                    </label>
-                    <label className="flex items-center gap-3 cursor-pointer">
-                      <input
-                        type="checkbox"
-                        checked={newAPIKeyPermissions.can_queue}
-                        onChange={(e) => setNewAPIKeyPermissions(prev => ({ ...prev, can_queue: e.target.checked }))}
-                        className="w-4 h-4 text-bambu-green rounded border-bambu-dark-tertiary bg-bambu-dark focus:ring-bambu-green"
-                      />
-                      <div>
-                        <span className="text-white">Manage Queue</span>
-                        <p className="text-xs text-bambu-gray">Add and remove items from print queue</p>
-                      </div>
-                    </label>
-                    <label className="flex items-center gap-3 cursor-pointer">
-                      <input
-                        type="checkbox"
-                        checked={newAPIKeyPermissions.can_control_printer}
-                        onChange={(e) => setNewAPIKeyPermissions(prev => ({ ...prev, can_control_printer: e.target.checked }))}
-                        className="w-4 h-4 text-bambu-green rounded border-bambu-dark-tertiary bg-bambu-dark focus:ring-bambu-green"
-                      />
-                      <div>
-                        <span className="text-white">Control Printer</span>
-                        <p className="text-xs text-bambu-gray">Pause, resume, and stop prints</p>
-                      </div>
-                    </label>
-                  </div>
-                </div>
-                <div className="flex items-center gap-2 pt-2">
-                  <Button
-                    onClick={() => createAPIKeyMutation.mutate({
-                      name: newAPIKeyName || 'Unnamed Key',
-                      ...newAPIKeyPermissions,
-                    })}
-                    disabled={createAPIKeyMutation.isPending}
-                  >
-                    {createAPIKeyMutation.isPending ? (
-                      <Loader2 className="w-4 h-4 animate-spin" />
-                    ) : (
-                      <Plus className="w-4 h-4" />
-                    )}
-                    Create Key
-                  </Button>
-                  <Button variant="secondary" onClick={() => setShowCreateAPIKey(false)}>
-                    Cancel
-                  </Button>
-                </div>
-              </CardContent>
-            </Card>
-          )}
- 
-          {/* Existing Keys List */}
-          {apiKeysLoading ? (
-            <div className="flex justify-center py-12">
-              <Loader2 className="w-8 h-8 text-bambu-green animate-spin" />
-            </div>
-          ) : apiKeys && apiKeys.length > 0 ? (
-            <div className="space-y-3">
-              {apiKeys.map((key) => (
-                <Card key={key.id}>
-                  <CardContent className="py-3">
-                    <div className="flex items-center justify-between">
-                      <div className="flex items-center gap-3">
-                        <Key className={`w-5 h-5 ${key.enabled ? 'text-bambu-green' : 'text-bambu-gray'}`} />
-                        <div>
-                          <p className="text-white font-medium">{key.name}</p>
-                          <p className="text-xs text-bambu-gray">
-                            {key.key_prefix}••••••••
-                            {key.last_used && ` · Last used: ${new Date(key.last_used).toLocaleDateString()}`}
-                          </p>
-                        </div>
-                      </div>
-                      <div className="flex items-center gap-2">
-                        <div className="flex gap-1 text-xs">
-                          {key.can_read_status && (
-                            <span className="px-1.5 py-0.5 bg-blue-500/20 text-blue-400 rounded">Read</span>
-                          )}
-                          {key.can_queue && (
-                            <span className="px-1.5 py-0.5 bg-green-500/20 text-green-400 rounded">Queue</span>
-                          )}
-                          {key.can_control_printer && (
-                            <span className="px-1.5 py-0.5 bg-orange-500/20 text-orange-400 rounded">Control</span>
-                          )}
-                        </div>
-                        <Button
-                          variant="secondary"
-                          size="sm"
-                          onClick={() => setShowDeleteAPIKeyConfirm(key.id)}
-                        >
-                          <Trash2 className="w-4 h-4 text-red-400" />
-                        </Button>
-                      </div>
-                    </div>
-                  </CardContent>
-                </Card>
-              ))}
-            </div>
-          ) : (
-            <Card>
-              <CardContent className="py-12">
-                <div className="text-center text-bambu-gray">
-                  <Key className="w-16 h-16 mx-auto mb-4 opacity-30" />
-                  <p className="text-lg font-medium text-white mb-2">No API keys</p>
-                  <p className="text-sm mb-4">Create an API key to integrate with external services.</p>
-                  <Button onClick={() => setShowCreateAPIKey(true)}>
-                    <Plus className="w-4 h-4" />
-                    Create Your First Key
-                  </Button>
-                </div>
-              </CardContent>
-            </Card>
-          )}
- 
-          {/* Webhook Documentation */}
-          <Card className="mt-6">
-            <CardHeader>
-              <h3 className="text-base font-semibold text-white">Webhook Endpoints</h3>
-            </CardHeader>
-            <CardContent className="space-y-3 text-sm">
-              <p className="text-bambu-gray">
-                Use your API key in the <code className="text-bambu-green">X-API-Key</code> header.
-              </p>
-              <div className="space-y-2 font-mono text-xs">
-                <div className="p-2 bg-bambu-dark rounded">
-                  <span className="text-blue-400">GET</span>{' '}
-                  <span className="text-white">/api/v1/webhook/status</span>
-                  <span className="text-bambu-gray"> - Get all printer status</span>
-                </div>
-                <div className="p-2 bg-bambu-dark rounded">
-                  <span className="text-blue-400">GET</span>{' '}
-                  <span className="text-white">/api/v1/webhook/status/:id</span>
-                  <span className="text-bambu-gray"> - Get specific printer status</span>
-                </div>
-                <div className="p-2 bg-bambu-dark rounded">
-                  <span className="text-green-400">POST</span>{' '}
-                  <span className="text-white">/api/v1/webhook/queue</span>
-                  <span className="text-bambu-gray"> - Add to print queue</span>
-                </div>
-                <div className="p-2 bg-bambu-dark rounded">
-                  <span className="text-orange-400">POST</span>{' '}
-                  <span className="text-white">/api/v1/webhook/printer/:id/pause</span>
-                  <span className="text-bambu-gray"> - Pause print</span>
-                </div>
-                <div className="p-2 bg-bambu-dark rounded">
-                  <span className="text-orange-400">POST</span>{' '}
-                  <span className="text-white">/api/v1/webhook/printer/:id/resume</span>
-                  <span className="text-bambu-gray"> - Resume print</span>
-                </div>
-                <div className="p-2 bg-bambu-dark rounded">
-                  <span className="text-red-400">POST</span>{' '}
-                  <span className="text-white">/api/v1/webhook/printer/:id/stop</span>
-                  <span className="text-bambu-gray"> - Stop print</span>
-                </div>
-              </div>
-            </CardContent>
-          </Card>
-        </div>
-      )}
- 
-      {/* Delete API Key Confirmation */}
-      {showDeleteAPIKeyConfirm !== null && (
-        <ConfirmModal
-          title="Delete API Key"
-          message="Are you sure you want to delete this API key? Any integrations using this key will stop working."
-          confirmText="Delete Key"
-          variant="danger"
-          onConfirm={() => {
-            deleteAPIKeyMutation.mutate(showDeleteAPIKeyConfirm);
-            setShowDeleteAPIKeyConfirm(null);
-          }}
-          onCancel={() => setShowDeleteAPIKeyConfirm(null)}
-        />
-      )}
- 
-      {/* Smart Plug Modal */}
-      {showPlugModal && (
-        <AddSmartPlugModal
-          plug={editingPlug}
-          onClose={() => {
-            setShowPlugModal(false);
-            setEditingPlug(null);
-          }}
-        />
-      )}
- 
-      {/* Notification Modal */}
-      {showNotificationModal && (
-        <AddNotificationModal
-          provider={editingProvider}
-          onClose={() => {
-            setShowNotificationModal(false);
-            setEditingProvider(null);
-          }}
-        />
-      )}
- 
-      {/* Template Editor Modal */}
-      {editingTemplate && (
-        <NotificationTemplateEditor
-          template={editingTemplate}
-          onClose={() => setEditingTemplate(null)}
-        />
-      )}
- 
-      {/* Notification Log Viewer */}
-      {showLogViewer && (
-        <NotificationLogViewer
-          onClose={() => setShowLogViewer(false)}
-        />
-      )}
- 
-      {/* Confirm Modal: Clear Notification Logs */}
-      {showClearLogsConfirm && (
-        <ConfirmModal
-          title="Clear Notification Logs"
-          message="This will permanently delete all notification logs older than 30 days. This action cannot be undone."
-          confirmText="Clear Logs"
-          variant="warning"
-          onConfirm={async () => {
-            setShowClearLogsConfirm(false);
-            try {
-              const result = await api.clearNotificationLogs(30);
-              showToast(result.message, 'success');
-            } catch {
-              showToast('Failed to clear logs', 'error');
-            }
-          }}
-          onCancel={() => setShowClearLogsConfirm(false)}
-        />
-      )}
- 
-      {/* Confirm Modal: Clear Local Storage */}
-      {showClearStorageConfirm && (
-        <ConfirmModal
-          title="Reset UI Preferences"
-          message="This will reset all UI preferences to defaults: sidebar order, theme, dashboard layout, view modes, and sorting preferences. Your printers, archives, and server settings will NOT be affected. The page will reload after clearing."
-          confirmText="Reset Preferences"
-          variant="default"
-          onConfirm={() => {
-            setShowClearStorageConfirm(false);
-            localStorage.clear();
-            showToast('UI preferences reset. Refreshing...', 'success');
-            setTimeout(() => window.location.reload(), 1000);
-          }}
-          onCancel={() => setShowClearStorageConfirm(false)}
-        />
-      )}
- 
-      {/* Confirm Modal: Bulk Plug Action */}
-      {showBulkPlugConfirm && (
-        <ConfirmModal
-          title={`Turn All Plugs ${showBulkPlugConfirm === 'on' ? 'On' : 'Off'}`}
-          message={`This will turn ${showBulkPlugConfirm === 'on' ? 'ON' : 'OFF'} all ${smartPlugs?.filter(p => p.enabled).length || 0} enabled smart plugs. ${showBulkPlugConfirm === 'off' ? 'Any running printers may be affected!' : ''}`}
-          confirmText={`Turn All ${showBulkPlugConfirm === 'on' ? 'On' : 'Off'}`}
-          variant={showBulkPlugConfirm === 'off' ? 'danger' : 'warning'}
-          onConfirm={() => {
-            const action = showBulkPlugConfirm;
-            setShowBulkPlugConfirm(null);
-            bulkPlugActionMutation.mutate(action);
-          }}
-          onCancel={() => setShowBulkPlugConfirm(null)}
-        />
-      )}
- 
-      {/* Backup Modal */}
-      {showBackupModal && (
-        <BackupModal
-          onClose={() => setShowBackupModal(false)}
-          onExport={async (categories) => {
-            setShowBackupModal(false);
-            try {
-              const { blob, filename } = await api.exportBackup(categories);
-              const url = URL.createObjectURL(blob);
-              const a = document.createElement('a');
-              a.href = url;
-              a.download = filename;
-              a.click();
-              URL.revokeObjectURL(url);
-              showToast('Backup downloaded', 'success');
-            } catch (err) {
-              showToast('Failed to create backup', 'error');
-            }
-          }}
-        />
-      )}
- 
-      {/* Restore Modal */}
-      {showRestoreModal && (
-        <RestoreModal
-          onClose={() => setShowRestoreModal(false)}
-          onRestore={async (file, overwrite) => {
-            return await api.importBackup(file, overwrite);
-          }}
-          onSuccess={() => {
-            queryClient.invalidateQueries();
-          }}
-        />
-      )}
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/pages/StatsPage.tsx.html b/frontend/coverage/src/pages/StatsPage.tsx.html deleted file mode 100644 index dde8405bb..000000000 --- a/frontend/coverage/src/pages/StatsPage.tsx.html +++ /dev/null @@ -1,1768 +0,0 @@ - - - - - - Code coverage report for src/pages/StatsPage.tsx - - - - - - - - - -
-
-

All files / src/pages StatsPage.tsx

-
- -
- 0% - Statements - 0/440 -
- - -
- 0% - Branches - 0/1 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/440 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -425 -426 -427 -428 -429 -430 -431 -432 -433 -434 -435 -436 -437 -438 -439 -440 -441 -442 -443 -444 -445 -446 -447 -448 -449 -450 -451 -452 -453 -454 -455 -456 -457 -458 -459 -460 -461 -462 -463 -464 -465 -466 -467 -468 -469 -470 -471 -472 -473 -474 -475 -476 -477 -478 -479 -480 -481 -482 -483 -484 -485 -486 -487 -488 -489 -490 -491 -492 -493 -494 -495 -496 -497 -498 -499 -500 -501 -502 -503 -504 -505 -506 -507 -508 -509 -510 -511 -512 -513 -514 -515 -516 -517 -518 -519 -520 -521 -522 -523 -524 -525 -526 -527 -528 -529 -530 -531 -532 -533 -534 -535 -536 -537 -538 -539 -540 -541 -542 -543 -544 -545 -546 -547 -548 -549 -550 -551 -552 -553 -554 -555 -556 -557 -558 -559 -560 -561 -562  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useQuery } from '@tanstack/react-query';
-import { useState } from 'react';
-import {
-  Package,
-  Clock,
-  CheckCircle,
-  XCircle,
-  DollarSign,
-  Printer,
-  Target,
-  Zap,
-  AlertTriangle,
-  TrendingDown,
-  FileSpreadsheet,
-  FileText,
-  Loader2,
-  RotateCcw,
-} from 'lucide-react';
-import { Button } from '../components/Button';
-import { useToast } from '../contexts/ToastContext';
-import { api } from '../api/client';
-import { PrintCalendar } from '../components/PrintCalendar';
-import { FilamentTrends } from '../components/FilamentTrends';
-import { Dashboard, type DashboardWidget } from '../components/Dashboard';
- 
-// Widget Components
-function QuickStatsWidget({
-  stats,
-  currency,
-}: {
-  stats: {
-    total_prints: number;
-    successful_prints: number;
-    failed_prints: number;
-    total_print_time_hours: number;
-    total_filament_grams: number;
-    total_cost: number;
-    total_energy_kwh: number;
-    total_energy_cost: number;
-  } | undefined;
-  currency: string;
-}) {
-  return (
-    <div className="grid grid-cols-2 sm:grid-cols-3 gap-4">
-      <div className="flex items-start gap-3">
-        <div className="p-2 rounded-lg bg-bambu-dark text-bambu-green">
-          <Package className="w-5 h-5" />
-        </div>
-        <div>
-          <p className="text-xs text-bambu-gray">Total Prints</p>
-          <p className="text-xl font-bold text-white">{stats?.total_prints || 0}</p>
-        </div>
-      </div>
-      <div className="flex items-start gap-3">
-        <div className="p-2 rounded-lg bg-bambu-dark text-blue-400">
-          <Clock className="w-5 h-5" />
-        </div>
-        <div>
-          <p className="text-xs text-bambu-gray">Print Time</p>
-          <p className="text-xl font-bold text-white">{stats?.total_print_time_hours.toFixed(1) || 0}h</p>
-        </div>
-      </div>
-      <div className="flex items-start gap-3">
-        <div className="p-2 rounded-lg bg-bambu-dark text-orange-400">
-          <Package className="w-5 h-5" />
-        </div>
-        <div>
-          <p className="text-xs text-bambu-gray">Filament Used</p>
-          <p className="text-xl font-bold text-white">{((stats?.total_filament_grams || 0) / 1000).toFixed(2)}kg</p>
-        </div>
-      </div>
-      <div className="flex items-start gap-3">
-        <div className="p-2 rounded-lg bg-bambu-dark text-green-400">
-          <DollarSign className="w-5 h-5" />
-        </div>
-        <div>
-          <p className="text-xs text-bambu-gray">Filament Cost</p>
-          <p className="text-xl font-bold text-white">{currency} {stats?.total_cost.toFixed(2) || '0.00'}</p>
-        </div>
-      </div>
-      <div className="flex items-start gap-3">
-        <div className="p-2 rounded-lg bg-bambu-dark text-yellow-400">
-          <Zap className="w-5 h-5" />
-        </div>
-        <div>
-          <p className="text-xs text-bambu-gray">Energy Used</p>
-          <p className="text-xl font-bold text-white">{stats?.total_energy_kwh.toFixed(2) || '0.00'} kWh</p>
-        </div>
-      </div>
-      <div className="flex items-start gap-3">
-        <div className="p-2 rounded-lg bg-bambu-dark text-yellow-500">
-          <DollarSign className="w-5 h-5" />
-        </div>
-        <div>
-          <p className="text-xs text-bambu-gray">Energy Cost</p>
-          <p className="text-xl font-bold text-white">{currency} {stats?.total_energy_cost.toFixed(2) || '0.00'}</p>
-        </div>
-      </div>
-    </div>
-  );
-}
- 
-function SuccessRateWidget({
-  stats,
-}: {
-  stats: {
-    total_prints: number;
-    successful_prints: number;
-    failed_prints: number;
-  } | undefined;
-}) {
-  const successRate = stats?.total_prints
-    ? Math.round((stats.successful_prints / stats.total_prints) * 100)
-    : 0;
- 
-  return (
-    <div className="flex items-center gap-6">
-      <div className="relative w-28 h-28">
-        <svg className="w-full h-full -rotate-90">
-          <circle cx="56" cy="56" r="48" fill="none" stroke="#3d3d3d" strokeWidth="10" />
-          <circle
-            cx="56"
-            cy="56"
-            r="48"
-            fill="none"
-            stroke="#00ae42"
-            strokeWidth="10"
-            strokeLinecap="round"
-            strokeDasharray={`${successRate * 3.02} 302`}
-          />
-        </svg>
-        <div className="absolute inset-0 flex items-center justify-center">
-          <span className="text-xl font-bold text-white">{successRate}%</span>
-        </div>
-      </div>
-      <div className="space-y-2">
-        <div className="flex items-center gap-2">
-          <CheckCircle className="w-4 h-4 text-bambu-green" />
-          <span className="text-sm text-bambu-gray">Successful:</span>
-          <span className="text-sm text-white font-medium">{stats?.successful_prints || 0}</span>
-        </div>
-        <div className="flex items-center gap-2">
-          <XCircle className="w-4 h-4 text-red-400" />
-          <span className="text-sm text-bambu-gray">Failed:</span>
-          <span className="text-sm text-white font-medium">{stats?.failed_prints || 0}</span>
-        </div>
-      </div>
-    </div>
-  );
-}
- 
-function TimeAccuracyWidget({
-  stats,
-  printerMap,
-}: {
-  stats: {
-    average_time_accuracy: number | null;
-    time_accuracy_by_printer: Record<string, number> | null;
-  } | undefined;
-  printerMap: Map<string, string>;
-}) {
-  const accuracy = stats?.average_time_accuracy;
- 
-  if (accuracy === null || accuracy === undefined) {
-    return (
-      <div className="flex items-center justify-center h-full">
-        <p className="text-bambu-gray text-center py-4">No time accuracy data yet</p>
-      </div>
-    );
-  }
- 
-  // Normalize accuracy for display (100% = perfect, clamp between 50-150 for gauge)
-  const displayValue = Math.min(150, Math.max(50, accuracy));
-  const normalizedForGauge = ((displayValue - 50) / 100) * 100; // 50-150 -> 0-100
- 
-  // Color based on accuracy
-  const getColor = (acc: number) => {
-    if (acc >= 95 && acc <= 105) return '#00ae42'; // Green - within 5%
-    if (acc > 105) return '#3b82f6'; // Blue - faster than expected
-    return '#f97316'; // Orange - slower than expected
-  };
- 
-  const color = getColor(accuracy);
-  const deviation = accuracy - 100;
- 
-  return (
-    <div className="flex items-center gap-6">
-      <div className="relative w-28 h-28">
-        <svg className="w-full h-full -rotate-90">
-          <circle cx="56" cy="56" r="48" fill="none" stroke="#3d3d3d" strokeWidth="10" />
-          <circle
-            cx="56"
-            cy="56"
-            r="48"
-            fill="none"
-            stroke={color}
-            strokeWidth="10"
-            strokeLinecap="round"
-            strokeDasharray={`${normalizedForGauge * 3.02} 302`}
-          />
-        </svg>
-        <div className="absolute inset-0 flex flex-col items-center justify-center">
-          <span className="text-xl font-bold text-white">{accuracy.toFixed(0)}%</span>
-          <span className={`text-xs ${deviation >= 0 ? 'text-blue-400' : 'text-orange-400'}`}>
-            {deviation >= 0 ? '+' : ''}{deviation.toFixed(0)}%
-          </span>
-        </div>
-      </div>
-      <div className="space-y-2 flex-1">
-        <div className="flex items-center gap-2 text-xs text-bambu-gray">
-          <Target className="w-3 h-3" />
-          <span>100% = perfect estimate</span>
-        </div>
-        {stats?.time_accuracy_by_printer && Object.keys(stats.time_accuracy_by_printer).length > 0 && (
-          <div className="space-y-1 mt-2">
-            {Object.entries(stats.time_accuracy_by_printer).slice(0, 3).map(([printerId, acc]) => (
-              <div key={printerId} className="flex items-center justify-between text-xs">
-                <span className="text-bambu-gray truncate max-w-[100px]">
-                  {printerMap.get(printerId) || `Printer ${printerId}`}
-                </span>
-                <span className={`font-medium ${
-                  acc >= 95 && acc <= 105 ? 'text-bambu-green' :
-                  acc > 105 ? 'text-blue-400' : 'text-orange-400'
-                }`}>
-                  {acc.toFixed(0)}%
-                </span>
-              </div>
-            ))}
-          </div>
-        )}
-      </div>
-    </div>
-  );
-}
- 
-function FilamentTypesWidget({
-  stats,
-}: {
-  stats: {
-    total_prints: number;
-    prints_by_filament_type: Record<string, number>;
-  } | undefined;
-}) {
-  if (!stats?.prints_by_filament_type || Object.keys(stats.prints_by_filament_type).length === 0) {
-    return <p className="text-bambu-gray text-center py-4">No filament data available</p>;
-  }
- 
-  // Sort by print count descending
-  const sortedEntries = Object.entries(stats.prints_by_filament_type).sort(
-    ([, a], [, b]) => b - a
-  );
- 
-  return (
-    <div className="space-y-3">
-      {sortedEntries.map(([type, count]) => {
-        const percentage = Math.round((count / (stats.total_prints || 1)) * 100);
-        return (
-          <div key={type}>
-            <div className="flex justify-between text-sm mb-1">
-              <span className="text-white">{type}</span>
-              <span className="text-bambu-gray">{count} prints</span>
-            </div>
-            <div className="h-2 bg-bambu-dark rounded-full">
-              <div
-                className="h-full bg-bambu-green rounded-full transition-all"
-                style={{ width: `${percentage}%` }}
-              />
-            </div>
-          </div>
-        );
-      })}
-    </div>
-  );
-}
- 
-function PrintActivityWidget({ printDates }: { printDates: string[] }) {
-  return <PrintCalendar printDates={printDates} months={4} />;
-}
- 
-function PrintsByPrinterWidget({
-  stats,
-  printerMap,
-}: {
-  stats: { prints_by_printer: Record<string, number> } | undefined;
-  printerMap: Map<string, string>;
-}) {
-  if (!stats?.prints_by_printer || Object.keys(stats.prints_by_printer).length === 0) {
-    return <p className="text-bambu-gray text-center py-4">No printer data available</p>;
-  }
- 
-  return (
-    <div className="grid grid-cols-1 sm:grid-cols-2 gap-3">
-      {Object.entries(stats.prints_by_printer).map(([printerId, count]) => (
-        <div key={printerId} className="flex items-center gap-3 p-3 bg-bambu-dark rounded-lg">
-          <div className="p-2 bg-bambu-dark-tertiary rounded-lg">
-            <Printer className="w-4 h-4 text-bambu-green" />
-          </div>
-          <div>
-            <p className="text-white font-medium text-sm">
-              {printerMap.get(printerId) || `Printer ${printerId}`}
-            </p>
-            <p className="text-xs text-bambu-gray">{count} prints</p>
-          </div>
-        </div>
-      ))}
-    </div>
-  );
-}
- 
-function FilamentTrendsWidget({
-  archives,
-  currency,
-}: {
-  archives: Parameters<typeof FilamentTrends>[0]['archives'];
-  currency: string;
-}) {
-  if (!archives || archives.length === 0) {
-    return <p className="text-bambu-gray text-center py-4">No print data available</p>;
-  }
-  return <FilamentTrends archives={archives} currency={currency} />;
-}
- 
-function FailureAnalysisWidget() {
-  const { data: analysis, isLoading } = useQuery({
-    queryKey: ['failureAnalysis'],
-    queryFn: () => api.getFailureAnalysis({ days: 30 }),
-  });
- 
-  if (isLoading) {
-    return (
-      <div className="flex justify-center py-4">
-        <Loader2 className="w-6 h-6 text-bambu-green animate-spin" />
-      </div>
-    );
-  }
- 
-  if (!analysis || analysis.total_prints === 0) {
-    return <p className="text-bambu-gray text-center py-4">No print data in the last 30 days</p>;
-  }
- 
-  const topReasons = Object.entries(analysis.failures_by_reason)
-    .sort(([, a], [, b]) => b - a)
-    .slice(0, 5);
- 
-  return (
-    <div className="space-y-4">
-      {/* Summary */}
-      <div className="flex items-center gap-4">
-        <div className="flex items-center gap-2">
-          <AlertTriangle className={`w-5 h-5 ${analysis.failure_rate > 20 ? 'text-red-400' : analysis.failure_rate > 10 ? 'text-yellow-400' : 'text-bambu-green'}`} />
-          <span className="text-2xl font-bold text-white">{analysis.failure_rate.toFixed(1)}%</span>
-          <span className="text-sm text-bambu-gray">failure rate</span>
-        </div>
-        <div className="text-sm text-bambu-gray">
-          {analysis.failed_prints} / {analysis.total_prints} prints failed
-        </div>
-      </div>
- 
-      {/* Top Failure Reasons */}
-      {topReasons.length > 0 && (
-        <div className="space-y-2">
-          <p className="text-xs text-bambu-gray font-medium">Top Failure Reasons</p>
-          {topReasons.map(([reason, count]) => (
-            <div key={reason} className="flex items-center justify-between text-sm">
-              <span className="text-white truncate max-w-[200px]">{reason || 'Unknown'}</span>
-              <span className="text-bambu-gray">{count}</span>
-            </div>
-          ))}
-        </div>
-      )}
- 
-      {/* Trend indicator */}
-      {analysis.trend && analysis.trend.length >= 2 && (
-        <div className="pt-2 border-t border-bambu-dark-tertiary">
-          <div className="flex items-center gap-2 text-sm">
-            <TrendingDown className={`w-4 h-4 ${
-              analysis.trend[analysis.trend.length - 1].failure_rate < analysis.trend[analysis.trend.length - 2].failure_rate
-                ? 'text-bambu-green'
-                : 'text-red-400'
-            }`} />
-            <span className="text-bambu-gray">
-              Last week: {analysis.trend[analysis.trend.length - 1].failure_rate.toFixed(1)}%
-            </span>
-          </div>
-        </div>
-      )}
-    </div>
-  );
-}
- 
-export function StatsPage() {
-  const { showToast } = useToast();
-  const [isExporting, setIsExporting] = useState(false);
-  const [showExportMenu, setShowExportMenu] = useState(false);
-  const [dashboardKey, setDashboardKey] = useState(0);
- 
-  const { data: stats, isLoading } = useQuery({
-    queryKey: ['archiveStats'],
-    queryFn: api.getArchiveStats,
-  });
- 
-  const { data: printers } = useQuery({
-    queryKey: ['printers'],
-    queryFn: api.getPrinters,
-  });
- 
-  const { data: archives } = useQuery({
-    queryKey: ['archives'],
-    queryFn: () => api.getArchives(undefined, 1000, 0),
-  });
- 
-  const { data: settings } = useQuery({
-    queryKey: ['settings'],
-    queryFn: api.getSettings,
-  });
- 
-  const handleExport = async (format: 'csv' | 'xlsx') => {
-    setShowExportMenu(false);
-    setIsExporting(true);
-    try {
-      const { blob, filename } = await api.exportStats({ format, days: 90 });
-      const url = URL.createObjectURL(blob);
-      const a = document.createElement('a');
-      a.href = url;
-      a.download = filename;
-      a.click();
-      URL.revokeObjectURL(url);
-      showToast('Export downloaded');
-    } catch (err) {
-      showToast('Export failed', 'error');
-    } finally {
-      setIsExporting(false);
-    }
-  };
- 
-  const currency = settings?.currency || '$';
-  const printerMap = new Map(printers?.map((p) => [String(p.id), p.name]) || []);
-  const printDates = archives?.map((a) => a.created_at) || [];
- 
-  if (isLoading) {
-    return (
-      <div className="p-4 md:p-8">
-        <div className="text-center py-12 text-bambu-gray">Loading statistics...</div>
-      </div>
-    );
-  }
- 
-  // Define dashboard widgets
-  // Sizes: 1 = quarter (1/4), 2 = half (1/2), 4 = full width
-  const widgets: DashboardWidget[] = [
-    {
-      id: 'quick-stats',
-      title: 'Quick Stats',
-      component: <QuickStatsWidget stats={stats} currency={currency} />,
-      defaultSize: 2,
-    },
-    {
-      id: 'success-rate',
-      title: 'Success Rate',
-      component: <SuccessRateWidget stats={stats} />,
-      defaultSize: 1,
-    },
-    {
-      id: 'time-accuracy',
-      title: 'Time Accuracy',
-      component: <TimeAccuracyWidget stats={stats} printerMap={printerMap} />,
-      defaultSize: 1,
-    },
-    {
-      id: 'filament-types',
-      title: 'Filament Types',
-      component: <FilamentTypesWidget stats={stats} />,
-      defaultSize: 1,
-    },
-    {
-      id: 'failure-analysis',
-      title: 'Failure Analysis (30 days)',
-      component: <FailureAnalysisWidget />,
-      defaultSize: 1,
-    },
-    {
-      id: 'print-activity',
-      title: 'Print Activity',
-      component: <PrintActivityWidget printDates={printDates} />,
-      defaultSize: 2,
-    },
-    {
-      id: 'prints-by-printer',
-      title: 'Prints by Printer',
-      component: <PrintsByPrinterWidget stats={stats} printerMap={printerMap} />,
-      defaultSize: 2,
-    },
-    {
-      id: 'filament-trends',
-      title: 'Filament Usage Trends',
-      component: <FilamentTrendsWidget archives={archives || []} currency={currency} />,
-      defaultSize: 4,
-    },
-  ];
- 
-  const handleResetLayout = () => {
-    localStorage.removeItem('bambusy-dashboard-layout');
-    setDashboardKey(prev => prev + 1);
-    showToast('Layout reset');
-  };
- 
-  return (
-    <div className="p-4 md:p-8">
-      <div className="flex items-center justify-between mb-6">
-        <div>
-          <h1 className="text-2xl font-bold text-white">Dashboard</h1>
-          <p className="text-bambu-gray">Drag widgets to rearrange. Click the eye icon to hide.</p>
-        </div>
-        <div className="flex items-center gap-2">
-          <Button
-            variant="secondary"
-            onClick={handleResetLayout}
-          >
-            <RotateCcw className="w-4 h-4" />
-            Reset Layout
-          </Button>
-          {/* Export dropdown */}
-          <div className="relative">
-            <Button
-              variant="secondary"
-              onClick={() => setShowExportMenu(!showExportMenu)}
-              disabled={isExporting}
-            >
-              {isExporting ? (
-                <Loader2 className="w-4 h-4 animate-spin" />
-              ) : (
-                <FileSpreadsheet className="w-4 h-4" />
-              )}
-              Export Stats
-            </Button>
-            {showExportMenu && (
-              <div className="absolute right-0 top-full mt-1 w-48 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg shadow-xl z-20">
-                <button
-                  className="w-full px-4 py-2 text-left text-white hover:bg-bambu-dark-tertiary transition-colors flex items-center gap-2 rounded-t-lg"
-                  onClick={() => handleExport('csv')}
-                >
-                  <FileText className="w-4 h-4" />
-                  Export as CSV
-                </button>
-                <button
-                  className="w-full px-4 py-2 text-left text-white hover:bg-bambu-dark-tertiary transition-colors flex items-center gap-2 rounded-b-lg"
-                  onClick={() => handleExport('xlsx')}
-                >
-                  <FileSpreadsheet className="w-4 h-4" />
-                  Export as Excel
-                </button>
-              </div>
-            )}
-          </div>
-        </div>
-      </div>
- 
-      <Dashboard key={dashboardKey} widgets={widgets} storageKey="bambusy-dashboard-layout" hideControls />
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/pages/index.html b/frontend/coverage/src/pages/index.html deleted file mode 100644 index 1b0d61ff4..000000000 --- a/frontend/coverage/src/pages/index.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - Code coverage report for src/pages - - - - - - - - - -
-
-

All files src/pages

-
- -
- 0% - Statements - 0/9231 -
- - -
- 0% - Branches - 0/10 -
- - -
- 0% - Functions - 0/10 -
- - -
- 0% - Lines - 0/9231 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
ArchivesPage.tsx -
-
0%0/14260%0/10%0/10%0/1426
CameraPage.tsx -
-
0%0/1880%0/10%0/10%0/188
ExternalLinkPage.tsx -
-
0%0/310%0/10%0/10%0/31
MaintenancePage.tsx -
-
0%0/8120%0/10%0/10%0/812
PrintersPage.tsx -
-
0%0/15940%0/10%0/10%0/1594
ProfilesPage.tsx -
-
0%0/22350%0/10%0/10%0/2235
ProjectsPage.tsx -
-
0%0/3510%0/10%0/10%0/351
QueuePage.tsx -
-
0%0/6340%0/10%0/10%0/634
SettingsPage.tsx -
-
0%0/15200%0/10%0/10%0/1520
StatsPage.tsx -
-
0%0/4400%0/10%0/10%0/440
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/static/assets/index-DUGbV7GF.css b/static/assets/index-DUGbV7GF.css deleted file mode 100644 index 75c11f32c..000000000 --- a/static/assets/index-DUGbV7GF.css +++ /dev/null @@ -1 +0,0 @@ -@import"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap";@layer properties,theme,base,components,utilities;@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-orange-200:oklch(90.1% .076 70.697);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-700:oklch(55.3% .195 38.402);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-cyan-300:oklch(86.5% .127 207.078);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-cyan-600:oklch(60.9% .126 221.723);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--tracking-widest:.1em;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-sm:8px;--aspect-video:16/9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-bambu-green:#00ae42;--color-bambu-green-light:#00c64d;--color-bambu-green-dark:#009438;--color-bambu-dark:var(--bg-primary);--color-bambu-dark-secondary:var(--bg-secondary);--color-bambu-dark-tertiary:var(--bg-tertiary);--color-bambu-gray:var(--text-muted);--color-bambu-gray-light:var(--text-secondary);--color-bambu-gray-dark:var(--text-tertiary)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.inset-x-0{inset-inline:calc(var(--spacing)*0)}.inset-y-0{inset-block:calc(var(--spacing)*0)}.-top-1{top:calc(var(--spacing)*-1)}.top-0{top:calc(var(--spacing)*0)}.top-1{top:calc(var(--spacing)*1)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing)*2)}.top-4{top:calc(var(--spacing)*4)}.top-8{top:calc(var(--spacing)*8)}.top-\[2px\]{top:2px}.top-\[3px\]{top:3px}.top-full{top:100%}.-right-1{right:calc(var(--spacing)*-1)}.right-0{right:calc(var(--spacing)*0)}.right-1{right:calc(var(--spacing)*1)}.right-2{right:calc(var(--spacing)*2)}.right-4{right:calc(var(--spacing)*4)}.right-6{right:calc(var(--spacing)*6)}.right-10{right:calc(var(--spacing)*10)}.right-12{right:calc(var(--spacing)*12)}.right-full{right:100%}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-1{bottom:calc(var(--spacing)*1)}.bottom-2{bottom:calc(var(--spacing)*2)}.bottom-4{bottom:calc(var(--spacing)*4)}.bottom-6{bottom:calc(var(--spacing)*6)}.bottom-full{bottom:100%}.left-0{left:calc(var(--spacing)*0)}.left-1{left:calc(var(--spacing)*1)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing)*2)}.left-2\.5{left:calc(var(--spacing)*2.5)}.left-3{left:calc(var(--spacing)*3)}.left-4{left:calc(var(--spacing)*4)}.left-12{left:calc(var(--spacing)*12)}.left-\[2px\]{left:2px}.left-\[3px\]{left:3px}.left-full{left:100%}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-60,.z-\[60\]{z-index:60}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-4{grid-column:span 4/span 4}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.-mx-4{margin-inline:calc(var(--spacing)*-4)}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-4{margin-inline:calc(var(--spacing)*4)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing)*1)}.my-8{margin-block:calc(var(--spacing)*8)}.-mt-2{margin-top:calc(var(--spacing)*-2)}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-14{margin-top:calc(var(--spacing)*14)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-2{margin-right:calc(var(--spacing)*2)}.mr-3{margin-right:calc(var(--spacing)*3)}.mr-4{margin-right:calc(var(--spacing)*4)}.-mb-px{margin-bottom:-1px}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.-ml-1{margin-left:calc(var(--spacing)*-1)}.-ml-2{margin-left:calc(var(--spacing)*-2)}.ml-0\.5{margin-left:calc(var(--spacing)*.5)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-1\.5{margin-left:calc(var(--spacing)*1.5)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-3{margin-left:calc(var(--spacing)*3)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-8{margin-left:calc(var(--spacing)*8)}.ml-14{margin-left:calc(var(--spacing)*14)}.ml-16{margin-left:calc(var(--spacing)*16)}.ml-64{margin-left:calc(var(--spacing)*64)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.h-1{height:calc(var(--spacing)*1)}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-14{height:calc(var(--spacing)*14)}.h-16{height:calc(var(--spacing)*16)}.h-20{height:calc(var(--spacing)*20)}.h-28{height:calc(var(--spacing)*28)}.h-64{height:calc(var(--spacing)*64)}.h-80{height:calc(var(--spacing)*80)}.h-\[80vh\]{height:80vh}.h-\[160px\]{height:160px}.h-\[300px\]{height:300px}.h-full{height:100%}.max-h-40{max-height:calc(var(--spacing)*40)}.max-h-60{max-height:calc(var(--spacing)*60)}.max-h-64{max-height:calc(var(--spacing)*64)}.max-h-80{max-height:calc(var(--spacing)*80)}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-\[60vh\]{max-height:60vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[85vh\]{max-height:85vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[300px\]{max-height:300px}.max-h-\[400px\]{max-height:400px}.max-h-\[calc\(90vh-80px\)\]{max-height:calc(90vh - 80px)}.max-h-\[calc\(100vh-320px\)\]{max-height:calc(100vh - 320px)}.max-h-full{max-height:100%}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-\[44px\]{min-height:44px}.min-h-\[48px\]{min-height:48px}.min-h-\[120px\]{min-height:120px}.min-h-\[400px\]{min-height:400px}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-0\.5{width:calc(var(--spacing)*.5)}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-1\/3{width:33.3333%}.w-2{width:calc(var(--spacing)*2)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-11{width:calc(var(--spacing)*11)}.w-12{width:calc(var(--spacing)*12)}.w-14{width:calc(var(--spacing)*14)}.w-16{width:calc(var(--spacing)*16)}.w-20{width:calc(var(--spacing)*20)}.w-24{width:calc(var(--spacing)*24)}.w-28{width:calc(var(--spacing)*28)}.w-32{width:calc(var(--spacing)*32)}.w-36{width:calc(var(--spacing)*36)}.w-40{width:calc(var(--spacing)*40)}.w-48{width:calc(var(--spacing)*48)}.w-56{width:calc(var(--spacing)*56)}.w-64{width:calc(var(--spacing)*64)}.w-72{width:calc(var(--spacing)*72)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-32{max-width:calc(var(--spacing)*32)}.max-w-\[60px\]{max-width:60px}.max-w-\[90vw\]{max-width:90vw}.max-w-\[100px\]{max-width:100px}.max-w-\[120px\]{max-width:120px}.max-w-\[150px\]{max-width:150px}.max-w-\[200px\]{max-width:200px}.max-w-\[280px\]{max-width:280px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-48{min-width:calc(var(--spacing)*48)}.min-w-\[80px\]{min-width:80px}.min-w-\[100px\]{min-width:100px}.min-w-\[120px\]{min-width:120px}.min-w-\[150px\]{min-width:150px}.min-w-\[160px\]{min-width:160px}.min-w-\[180px\]{min-width:180px}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-0{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-0\.5{--tw-translate-x:calc(var(--spacing)*.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-3\.5{--tw-translate-x:calc(var(--spacing)*3.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-4{--tw-translate-x:calc(var(--spacing)*4);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-6{--tw-translate-x:calc(var(--spacing)*6);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-110{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-\[1\.02\]{scale:1.02}.-rotate-90{rotate:-90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-ew-resize{cursor:ew-resize}.cursor-grab{cursor:grab}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-manipulation{touch-action:manipulation}.resize{resize:both}.resize-none{resize:none}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.appearance-none{appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}.gap-8{gap:calc(var(--spacing)*8)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-6{column-gap:calc(var(--spacing)*6)}.gap-y-3{row-gap:calc(var(--spacing)*3)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-bambu-dark-tertiary>:not(:last-child)){border-color:var(--color-bambu-dark-tertiary)}:where(.divide-bambu-gray\/20>:not(:last-child)){border-color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){:where(.divide-bambu-gray\/20>:not(:last-child)){border-color:color-mix(in oklab,var(--color-bambu-gray)20%,transparent)}}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.rounded-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-b-lg{border-bottom-right-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-500\/20{border-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/20{border-color:color-mix(in oklab,var(--color-amber-500)20%,transparent)}}.border-bambu-dark-tertiary{border-color:var(--color-bambu-dark-tertiary)}.border-bambu-gray,.border-bambu-gray\/30{border-color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.border-bambu-gray\/30{border-color:color-mix(in oklab,var(--color-bambu-gray)30%,transparent)}}.border-bambu-green{border-color:var(--color-bambu-green)}.border-bambu-green\/20{border-color:#00ae4233}@supports (color:color-mix(in lab,red,red)){.border-bambu-green\/20{border-color:color-mix(in oklab,var(--color-bambu-green)20%,transparent)}}.border-bambu-green\/30{border-color:#00ae424d}@supports (color:color-mix(in lab,red,red)){.border-bambu-green\/30{border-color:color-mix(in oklab,var(--color-bambu-green)30%,transparent)}}.border-bambu-green\/50{border-color:#00ae4280}@supports (color:color-mix(in lab,red,red)){.border-bambu-green\/50{border-color:color-mix(in oklab,var(--color-bambu-green)50%,transparent)}}.border-blue-400\/20{border-color:#54a2ff33}@supports (color:color-mix(in lab,red,red)){.border-blue-400\/20{border-color:color-mix(in oklab,var(--color-blue-400)20%,transparent)}}.border-blue-500\/20{border-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.border-blue-500\/20{border-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.border-blue-500\/30{border-color:#3080ff4d}@supports (color:color-mix(in lab,red,red)){.border-blue-500\/30{border-color:color-mix(in oklab,var(--color-blue-500)30%,transparent)}}.border-blue-500\/50{border-color:#3080ff80}@supports (color:color-mix(in lab,red,red)){.border-blue-500\/50{border-color:color-mix(in oklab,var(--color-blue-500)50%,transparent)}}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-400\/20{border-color:#99a1af33}@supports (color:color-mix(in lab,red,red)){.border-gray-400\/20{border-color:color-mix(in oklab,var(--color-gray-400)20%,transparent)}}.border-gray-500\/20{border-color:#6a728233}@supports (color:color-mix(in lab,red,red)){.border-gray-500\/20{border-color:color-mix(in oklab,var(--color-gray-500)20%,transparent)}}.border-gray-700{border-color:var(--color-gray-700)}.border-green-400\/20{border-color:#05df7233}@supports (color:color-mix(in lab,red,red)){.border-green-400\/20{border-color:color-mix(in oklab,var(--color-green-400)20%,transparent)}}.border-green-500\/30{border-color:#00c7584d}@supports (color:color-mix(in lab,red,red)){.border-green-500\/30{border-color:color-mix(in oklab,var(--color-green-500)30%,transparent)}}.border-green-500\/50{border-color:#00c75880}@supports (color:color-mix(in lab,red,red)){.border-green-500\/50{border-color:color-mix(in oklab,var(--color-green-500)50%,transparent)}}.border-orange-400\/20{border-color:#ff8b1a33}@supports (color:color-mix(in lab,red,red)){.border-orange-400\/20{border-color:color-mix(in oklab,var(--color-orange-400)20%,transparent)}}.border-orange-400\/50{border-color:#ff8b1a80}@supports (color:color-mix(in lab,red,red)){.border-orange-400\/50{border-color:color-mix(in oklab,var(--color-orange-400)50%,transparent)}}.border-orange-500\/20{border-color:#fe6e0033}@supports (color:color-mix(in lab,red,red)){.border-orange-500\/20{border-color:color-mix(in oklab,var(--color-orange-500)20%,transparent)}}.border-orange-500\/30{border-color:#fe6e004d}@supports (color:color-mix(in lab,red,red)){.border-orange-500\/30{border-color:color-mix(in oklab,var(--color-orange-500)30%,transparent)}}.border-red-400\/20{border-color:#ff656833}@supports (color:color-mix(in lab,red,red)){.border-red-400\/20{border-color:color-mix(in oklab,var(--color-red-400)20%,transparent)}}.border-red-500{border-color:var(--color-red-500)}.border-red-500\/20{border-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.border-red-500\/20{border-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.border-red-500\/30{border-color:#fb2c364d}@supports (color:color-mix(in lab,red,red)){.border-red-500\/30{border-color:color-mix(in oklab,var(--color-red-500)30%,transparent)}}.border-red-500\/50{border-color:#fb2c3680}@supports (color:color-mix(in lab,red,red)){.border-red-500\/50{border-color:color-mix(in oklab,var(--color-red-500)50%,transparent)}}.border-transparent{border-color:#0000}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.border-white\/20{border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.border-white\/20{border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.border-yellow-400\/20{border-color:#fac80033}@supports (color:color-mix(in lab,red,red)){.border-yellow-400\/20{border-color:color-mix(in oklab,var(--color-yellow-400)20%,transparent)}}.border-yellow-500{border-color:var(--color-yellow-500)}.border-yellow-500\/20{border-color:#edb20033}@supports (color:color-mix(in lab,red,red)){.border-yellow-500\/20{border-color:color-mix(in oklab,var(--color-yellow-500)20%,transparent)}}.border-yellow-500\/30{border-color:#edb2004d}@supports (color:color-mix(in lab,red,red)){.border-yellow-500\/30{border-color:color-mix(in oklab,var(--color-yellow-500)30%,transparent)}}.border-yellow-500\/50{border-color:#edb20080}@supports (color:color-mix(in lab,red,red)){.border-yellow-500\/50{border-color:color-mix(in oklab,var(--color-yellow-500)50%,transparent)}}.border-t-transparent{border-top-color:#0000}.border-l-yellow-500{border-left-color:var(--color-yellow-500)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/5{background-color:#f99c000d}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/5{background-color:color-mix(in oklab,var(--color-amber-500)5%,transparent)}}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500)10%,transparent)}}.bg-amber-500\/20{background-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/20{background-color:color-mix(in oklab,var(--color-amber-500)20%,transparent)}}.bg-amber-600\/20{background-color:#dd740033}@supports (color:color-mix(in lab,red,red)){.bg-amber-600\/20{background-color:color-mix(in oklab,var(--color-amber-600)20%,transparent)}}.bg-bambu-dark{background-color:var(--color-bambu-dark)}.bg-bambu-dark-secondary,.bg-bambu-dark-secondary\/50{background-color:var(--color-bambu-dark-secondary)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark-secondary\/50{background-color:color-mix(in oklab,var(--color-bambu-dark-secondary)50%,transparent)}}.bg-bambu-dark-secondary\/90{background-color:var(--color-bambu-dark-secondary)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark-secondary\/90{background-color:color-mix(in oklab,var(--color-bambu-dark-secondary)90%,transparent)}}.bg-bambu-dark-tertiary,.bg-bambu-dark-tertiary\/50{background-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark-tertiary\/50{background-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)50%,transparent)}}.bg-bambu-dark\/20{background-color:var(--color-bambu-dark)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark\/20{background-color:color-mix(in oklab,var(--color-bambu-dark)20%,transparent)}}.bg-bambu-dark\/30{background-color:var(--color-bambu-dark)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark\/30{background-color:color-mix(in oklab,var(--color-bambu-dark)30%,transparent)}}.bg-bambu-dark\/50{background-color:var(--color-bambu-dark)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark\/50{background-color:color-mix(in oklab,var(--color-bambu-dark)50%,transparent)}}.bg-bambu-dark\/80{background-color:var(--color-bambu-dark)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark\/80{background-color:color-mix(in oklab,var(--color-bambu-dark)80%,transparent)}}.bg-bambu-dark\/90{background-color:var(--color-bambu-dark)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark\/90{background-color:color-mix(in oklab,var(--color-bambu-dark)90%,transparent)}}.bg-bambu-gray\/10{background-color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-gray\/10{background-color:color-mix(in oklab,var(--color-bambu-gray)10%,transparent)}}.bg-bambu-gray\/20{background-color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-gray\/20{background-color:color-mix(in oklab,var(--color-bambu-gray)20%,transparent)}}.bg-bambu-gray\/30{background-color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-gray\/30{background-color:color-mix(in oklab,var(--color-bambu-gray)30%,transparent)}}.bg-bambu-green{background-color:var(--color-bambu-green)}.bg-bambu-green\/10{background-color:#00ae421a}@supports (color:color-mix(in lab,red,red)){.bg-bambu-green\/10{background-color:color-mix(in oklab,var(--color-bambu-green)10%,transparent)}}.bg-bambu-green\/20{background-color:#00ae4233}@supports (color:color-mix(in lab,red,red)){.bg-bambu-green\/20{background-color:color-mix(in oklab,var(--color-bambu-green)20%,transparent)}}.bg-bambu-green\/30{background-color:#00ae424d}@supports (color:color-mix(in lab,red,red)){.bg-bambu-green\/30{background-color:color-mix(in oklab,var(--color-bambu-green)30%,transparent)}}.bg-bambu-green\/50{background-color:#00ae4280}@supports (color:color-mix(in lab,red,red)){.bg-bambu-green\/50{background-color:color-mix(in oklab,var(--color-bambu-green)50%,transparent)}}.bg-bambu-green\/75{background-color:#00ae42bf}@supports (color:color-mix(in lab,red,red)){.bg-bambu-green\/75{background-color:color-mix(in oklab,var(--color-bambu-green)75%,transparent)}}.bg-black{background-color:var(--color-black)}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black)30%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black)60%,transparent)}}.bg-black\/70{background-color:#000000b3}@supports (color:color-mix(in lab,red,red)){.bg-black\/70{background-color:color-mix(in oklab,var(--color-black)70%,transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black)80%,transparent)}}.bg-black\/90{background-color:#000000e6}@supports (color:color-mix(in lab,red,red)){.bg-black\/90{background-color:color-mix(in oklab,var(--color-black)90%,transparent)}}.bg-blue-400{background-color:var(--color-blue-400)}.bg-blue-400\/10{background-color:#54a2ff1a}@supports (color:color-mix(in lab,red,red)){.bg-blue-400\/10{background-color:color-mix(in oklab,var(--color-blue-400)10%,transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/10{background-color:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.bg-blue-500\/20{background-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/20{background-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.bg-blue-500\/30{background-color:#3080ff4d}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/30{background-color:color-mix(in oklab,var(--color-blue-500)30%,transparent)}}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-600\/20{background-color:#155dfc33}@supports (color:color-mix(in lab,red,red)){.bg-blue-600\/20{background-color:color-mix(in oklab,var(--color-blue-600)20%,transparent)}}.bg-cyan-500\/20{background-color:#00b7d733}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/20{background-color:color-mix(in oklab,var(--color-cyan-500)20%,transparent)}}.bg-cyan-600\/20{background-color:#0092b533}@supports (color:color-mix(in lab,red,red)){.bg-cyan-600\/20{background-color:color-mix(in oklab,var(--color-cyan-600)20%,transparent)}}.bg-emerald-500\/20{background-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/20{background-color:color-mix(in oklab,var(--color-emerald-500)20%,transparent)}}.bg-gray-400{background-color:var(--color-gray-400)}.bg-gray-400\/10{background-color:#99a1af1a}@supports (color:color-mix(in lab,red,red)){.bg-gray-400\/10{background-color:color-mix(in oklab,var(--color-gray-400)10%,transparent)}}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-500\/20{background-color:#6a728233}@supports (color:color-mix(in lab,red,red)){.bg-gray-500\/20{background-color:color-mix(in oklab,var(--color-gray-500)20%,transparent)}}.bg-gray-900{background-color:var(--color-gray-900)}.bg-green-400{background-color:var(--color-green-400)}.bg-green-400\/10{background-color:#05df721a}@supports (color:color-mix(in lab,red,red)){.bg-green-400\/10{background-color:color-mix(in oklab,var(--color-green-400)10%,transparent)}}.bg-green-500{background-color:var(--color-green-500)}.bg-green-500\/10{background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.bg-green-500\/10{background-color:color-mix(in oklab,var(--color-green-500)10%,transparent)}}.bg-green-500\/20{background-color:#00c75833}@supports (color:color-mix(in lab,red,red)){.bg-green-500\/20{background-color:color-mix(in oklab,var(--color-green-500)20%,transparent)}}.bg-indigo-500\/20{background-color:#625fff33}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/20{background-color:color-mix(in oklab,var(--color-indigo-500)20%,transparent)}}.bg-orange-400\/10{background-color:#ff8b1a1a}@supports (color:color-mix(in lab,red,red)){.bg-orange-400\/10{background-color:color-mix(in oklab,var(--color-orange-400)10%,transparent)}}.bg-orange-500\/10{background-color:#fe6e001a}@supports (color:color-mix(in lab,red,red)){.bg-orange-500\/10{background-color:color-mix(in oklab,var(--color-orange-500)10%,transparent)}}.bg-orange-500\/20{background-color:#fe6e0033}@supports (color:color-mix(in lab,red,red)){.bg-orange-500\/20{background-color:color-mix(in oklab,var(--color-orange-500)20%,transparent)}}.bg-orange-600{background-color:var(--color-orange-600)}.bg-orange-600\/20{background-color:#f0510033}@supports (color:color-mix(in lab,red,red)){.bg-orange-600\/20{background-color:color-mix(in oklab,var(--color-orange-600)20%,transparent)}}.bg-purple-500\/20{background-color:#ac4bff33}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/20{background-color:color-mix(in oklab,var(--color-purple-500)20%,transparent)}}.bg-purple-500\/80{background-color:#ac4bffcc}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/80{background-color:color-mix(in oklab,var(--color-purple-500)80%,transparent)}}.bg-red-400{background-color:var(--color-red-400)}.bg-red-400\/10{background-color:#ff65681a}@supports (color:color-mix(in lab,red,red)){.bg-red-400\/10{background-color:color-mix(in oklab,var(--color-red-400)10%,transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\/5{background-color:#fb2c360d}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/5{background-color:color-mix(in oklab,var(--color-red-500)5%,transparent)}}.bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/10{background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.bg-red-500\/15{background-color:#fb2c3626}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/15{background-color:color-mix(in oklab,var(--color-red-500)15%,transparent)}}.bg-red-500\/20{background-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/20{background-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.bg-red-500\/30{background-color:#fb2c364d}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/30{background-color:color-mix(in oklab,var(--color-red-500)30%,transparent)}}.bg-red-500\/40{background-color:#fb2c3666}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/40{background-color:color-mix(in oklab,var(--color-red-500)40%,transparent)}}.bg-red-500\/80{background-color:#fb2c36cc}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/80{background-color:color-mix(in oklab,var(--color-red-500)80%,transparent)}}.bg-red-600{background-color:var(--color-red-600)}.bg-rose-500\/20{background-color:#ff235733}@supports (color:color-mix(in lab,red,red)){.bg-rose-500\/20{background-color:color-mix(in oklab,var(--color-rose-500)20%,transparent)}}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-yellow-400{background-color:var(--color-yellow-400)}.bg-yellow-400\/10{background-color:#fac8001a}@supports (color:color-mix(in lab,red,red)){.bg-yellow-400\/10{background-color:color-mix(in oklab,var(--color-yellow-400)10%,transparent)}}.bg-yellow-400\/20{background-color:#fac80033}@supports (color:color-mix(in lab,red,red)){.bg-yellow-400\/20{background-color:color-mix(in oklab,var(--color-yellow-400)20%,transparent)}}.bg-yellow-500{background-color:var(--color-yellow-500)}.bg-yellow-500\/5{background-color:#edb2000d}@supports (color:color-mix(in lab,red,red)){.bg-yellow-500\/5{background-color:color-mix(in oklab,var(--color-yellow-500)5%,transparent)}}.bg-yellow-500\/10{background-color:#edb2001a}@supports (color:color-mix(in lab,red,red)){.bg-yellow-500\/10{background-color:color-mix(in oklab,var(--color-yellow-500)10%,transparent)}}.bg-yellow-500\/20{background-color:#edb20033}@supports (color:color-mix(in lab,red,red)){.bg-yellow-500\/20{background-color:color-mix(in oklab,var(--color-yellow-500)20%,transparent)}}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-bambu-green\/10{--tw-gradient-from:#00ae421a}@supports (color:color-mix(in lab,red,red)){.from-bambu-green\/10{--tw-gradient-from:color-mix(in oklab,var(--color-bambu-green)10%,transparent)}}.from-bambu-green\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-black\/80{--tw-gradient-from:#000c}@supports (color:color-mix(in lab,red,red)){.from-black\/80{--tw-gradient-from:color-mix(in oklab,var(--color-black)80%,transparent)}}.from-black\/80{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-500{--tw-gradient-from:var(--color-blue-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-500\/5{--tw-gradient-from:#3080ff0d}@supports (color:color-mix(in lab,red,red)){.from-blue-500\/5{--tw-gradient-from:color-mix(in oklab,var(--color-blue-500)5%,transparent)}}.from-blue-500\/5{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-500\/10{--tw-gradient-from:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.from-blue-500\/10{--tw-gradient-from:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.from-blue-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-gray-500\/10{--tw-gradient-from:#6a72821a}@supports (color:color-mix(in lab,red,red)){.from-gray-500\/10{--tw-gradient-from:color-mix(in oklab,var(--color-gray-500)10%,transparent)}}.from-gray-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-500\/10{--tw-gradient-from:#edb2001a}@supports (color:color-mix(in lab,red,red)){.from-yellow-500\/10{--tw-gradient-from:color-mix(in oklab,var(--color-yellow-500)10%,transparent)}}.from-yellow-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-bambu-dark-secondary{--tw-gradient-to:var(--color-bambu-dark-secondary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-400{--tw-gradient-to:var(--color-blue-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.bg-cover{background-size:cover}.bg-center{background-position:50%}.fill-yellow-400{fill:var(--color-yellow-400)}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.object-left{object-position:left}.p-0{padding:calc(var(--spacing)*0)}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-2\.5{padding:calc(var(--spacing)*2.5)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-5{padding:calc(var(--spacing)*5)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.p-12{padding:calc(var(--spacing)*12)}.\!px-3{padding-inline:calc(var(--spacing)*3)!important}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.py-16{padding-block:calc(var(--spacing)*16)}.py-20{padding-block:calc(var(--spacing)*20)}.py-24{padding-block:calc(var(--spacing)*24)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-2{padding-right:calc(var(--spacing)*2)}.pr-3{padding-right:calc(var(--spacing)*3)}.pr-4{padding-right:calc(var(--spacing)*4)}.pr-8{padding-right:calc(var(--spacing)*8)}.pr-10{padding-right:calc(var(--spacing)*10)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pl-4{padding-left:calc(var(--spacing)*4)}.pl-6{padding-left:calc(var(--spacing)*6)}.pl-8{padding-left:calc(var(--spacing)*8)}.pl-10{padding-left:calc(var(--spacing)*10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-300{color:var(--color-amber-300)}.text-amber-400{color:var(--color-amber-400)}.text-amber-400\/70{color:#fcbb00b3}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/70{color:color-mix(in oklab,var(--color-amber-400)70%,transparent)}}.text-amber-600{color:var(--color-amber-600)}.text-bambu-dark-tertiary{color:var(--color-bambu-dark-tertiary)}.text-bambu-gray{color:var(--color-bambu-gray)}.text-bambu-gray-dark{color:var(--color-bambu-gray-dark)}.text-bambu-gray-light{color:var(--color-bambu-gray-light)}.text-bambu-gray\/30{color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.text-bambu-gray\/30{color:color-mix(in oklab,var(--color-bambu-gray)30%,transparent)}}.text-bambu-gray\/50{color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.text-bambu-gray\/50{color:color-mix(in oklab,var(--color-bambu-gray)50%,transparent)}}.text-bambu-gray\/60{color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.text-bambu-gray\/60{color:color-mix(in oklab,var(--color-bambu-gray)60%,transparent)}}.text-bambu-gray\/70{color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.text-bambu-gray\/70{color:color-mix(in oklab,var(--color-bambu-gray)70%,transparent)}}.text-bambu-gray\/80{color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.text-bambu-gray\/80{color:color-mix(in oklab,var(--color-bambu-gray)80%,transparent)}}.text-bambu-green{color:var(--color-bambu-green)}.text-bambu-green\/70{color:#00ae42b3}@supports (color:color-mix(in lab,red,red)){.text-bambu-green\/70{color:color-mix(in oklab,var(--color-bambu-green)70%,transparent)}}.text-blue-300{color:var(--color-blue-300)}.text-blue-400{color:var(--color-blue-400)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-cyan-300{color:var(--color-cyan-300)}.text-cyan-400{color:var(--color-cyan-400)}.text-emerald-400{color:var(--color-emerald-400)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-900{color:var(--color-gray-900)}.text-green-300{color:var(--color-green-300)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-indigo-400{color:var(--color-indigo-400)}.text-orange-300{color:var(--color-orange-300)}.text-orange-400{color:var(--color-orange-400)}.text-orange-500{color:var(--color-orange-500)}.text-orange-600{color:var(--color-orange-600)}.text-orange-700{color:var(--color-orange-700)}.text-purple-400{color:var(--color-purple-400)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-red-400\/70{color:#ff6568b3}@supports (color:color-mix(in lab,red,red)){.text-red-400\/70{color:color-mix(in oklab,var(--color-red-400)70%,transparent)}}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-rose-400{color:var(--color-rose-400)}.text-white{color:var(--color-white)}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.text-white\/80{color:color-mix(in oklab,var(--color-white)80%,transparent)}}.text-yellow-200{color:var(--color-yellow-200)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-400\/80{color:#fac800cc}@supports (color:color-mix(in lab,red,red)){.text-yellow-400\/80{color:color-mix(in oklab,var(--color-yellow-400)80%,transparent)}}.text-yellow-500{color:var(--color-yellow-500)}.text-yellow-500\/70{color:#edb200b3}@supports (color:color-mix(in lab,red,red)){.text-yellow-500\/70{color:color-mix(in oklab,var(--color-yellow-500)70%,transparent)}}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.placeholder-bambu-gray::placeholder{color:var(--color-bambu-gray)}.placeholder-bambu-gray-dark::placeholder{color:var(--color-bambu-gray-dark)}.placeholder-bambu-gray\/50::placeholder{color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.placeholder-bambu-gray\/50::placeholder{color:color-mix(in oklab,var(--color-bambu-gray)50%,transparent)}}.accent-bambu-green{accent-color:var(--color-bambu-green)}.opacity-0{opacity:0}.opacity-20{opacity:.2}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-80{opacity:.8}.opacity-\[0\.65\]{opacity:.65}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-bambu-green\/25{--tw-shadow-color:#00ae4240}@supports (color:color-mix(in lab,red,red)){.shadow-bambu-green\/25{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-bambu-green)25%,transparent)var(--tw-shadow-alpha),transparent)}}.ring-bambu-green{--tw-ring-color:var(--color-bambu-green)}.ring-white{--tw-ring-color:var(--color-white)}.ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.ring-offset-bambu-dark-secondary{--tw-ring-offset-color:var(--color-bambu-dark-secondary)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}@media(hover:hover){.group-hover\:bg-bambu-green\/20:is(:where(.group):hover *){background-color:#00ae4233}@supports (color:color-mix(in lab,red,red)){.group-hover\:bg-bambu-green\/20:is(:where(.group):hover *){background-color:color-mix(in oklab,var(--color-bambu-green)20%,transparent)}}.group-hover\:text-bambu-gray:is(:where(.group):hover *){color:var(--color-bambu-gray)}.group-hover\:text-bambu-green:is(:where(.group):hover *){color:var(--color-bambu-green)}.group-hover\:opacity-50:is(:where(.group):hover *){opacity:.5}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.peer-checked\:bg-bambu-green:is(:where(.peer):checked~*){background-color:var(--color-bambu-green)}.peer-focus\:outline-none:is(:where(.peer):focus~*){--tw-outline-style:none;outline-style:none}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:top-0:before{content:var(--tw-content);top:calc(var(--spacing)*0)}.before\:right-0:before{content:var(--tw-content);right:calc(var(--spacing)*0)}.before\:left-0:before{content:var(--tw-content);left:calc(var(--spacing)*0)}.before\:h-0\.5:before{content:var(--tw-content);height:calc(var(--spacing)*.5)}.before\:bg-bambu-green:before{content:var(--tw-content);background-color:var(--color-bambu-green)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:top-\[2px\]:after{content:var(--tw-content);top:2px}.after\:left-\[2px\]:after{content:var(--tw-content);left:2px}.after\:h-4:after{content:var(--tw-content);height:calc(var(--spacing)*4)}.after\:h-5:after{content:var(--tw-content);height:calc(var(--spacing)*5)}.after\:w-4:after{content:var(--tw-content);width:calc(var(--spacing)*4)}.after\:w-5:after{content:var(--tw-content);width:calc(var(--spacing)*5)}.after\:rounded-full:after{content:var(--tw-content);border-radius:3.40282e38px}.after\:bg-white:after{content:var(--tw-content);background-color:var(--color-white)}.after\:transition-all:after{content:var(--tw-content);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.after\:content-\[\'\'\]:after{--tw-content:"";content:var(--tw-content)}.peer-checked\:after\:translate-x-full:is(:where(.peer):checked~*):after{content:var(--tw-content);--tw-translate-x:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.peer-checked\:after\:border-white:is(:where(.peer):checked~*):after{content:var(--tw-content);border-color:var(--color-white)}@media(hover:hover){.hover\:border-bambu-dark-tertiary\/80:hover{border-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:border-bambu-dark-tertiary\/80:hover{border-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)80%,transparent)}}.hover\:border-bambu-gray:hover{border-color:var(--color-bambu-gray)}.hover\:border-bambu-gray-dark:hover{border-color:var(--color-bambu-gray-dark)}.hover\:border-bambu-gray\/30:hover{border-color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.hover\:border-bambu-gray\/30:hover{border-color:color-mix(in oklab,var(--color-bambu-gray)30%,transparent)}}.hover\:border-bambu-green:hover{border-color:var(--color-bambu-green)}.hover\:border-bambu-green\/50:hover{border-color:#00ae4280}@supports (color:color-mix(in lab,red,red)){.hover\:border-bambu-green\/50:hover{border-color:color-mix(in oklab,var(--color-bambu-green)50%,transparent)}}.hover\:border-white\/40:hover{border-color:#fff6}@supports (color:color-mix(in lab,red,red)){.hover\:border-white\/40:hover{border-color:color-mix(in oklab,var(--color-white)40%,transparent)}}.hover\:bg-bambu-dark:hover{background-color:var(--color-bambu-dark)}.hover\:bg-bambu-dark-secondary:hover{background-color:var(--color-bambu-dark-secondary)}.hover\:bg-bambu-dark-tertiary:hover,.hover\:bg-bambu-dark-tertiary\/30:hover{background-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-dark-tertiary\/30:hover{background-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)30%,transparent)}}.hover\:bg-bambu-dark-tertiary\/50:hover{background-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-dark-tertiary\/50:hover{background-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)50%,transparent)}}.hover\:bg-bambu-dark-tertiary\/70:hover{background-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-dark-tertiary\/70:hover{background-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)70%,transparent)}}.hover\:bg-bambu-dark-tertiary\/80:hover{background-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-dark-tertiary\/80:hover{background-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)80%,transparent)}}.hover\:bg-bambu-dark\/50:hover{background-color:var(--color-bambu-dark)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-dark\/50:hover{background-color:color-mix(in oklab,var(--color-bambu-dark)50%,transparent)}}.hover\:bg-bambu-gray-dark:hover{background-color:var(--color-bambu-gray-dark)}.hover\:bg-bambu-gray\/20:hover{background-color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-gray\/20:hover{background-color:color-mix(in oklab,var(--color-bambu-gray)20%,transparent)}}.hover\:bg-bambu-green:hover{background-color:var(--color-bambu-green)}.hover\:bg-bambu-green-dark:hover{background-color:var(--color-bambu-green-dark)}.hover\:bg-bambu-green-light:hover{background-color:var(--color-bambu-green-light)}.hover\:bg-bambu-green\/10:hover{background-color:#00ae421a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-green\/10:hover{background-color:color-mix(in oklab,var(--color-bambu-green)10%,transparent)}}.hover\:bg-bambu-green\/20:hover{background-color:#00ae4233}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-green\/20:hover{background-color:color-mix(in oklab,var(--color-bambu-green)20%,transparent)}}.hover\:bg-bambu-green\/30:hover{background-color:#00ae424d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-green\/30:hover{background-color:color-mix(in oklab,var(--color-bambu-green)30%,transparent)}}.hover\:bg-bambu-green\/80:hover{background-color:#00ae42cc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-green\/80:hover{background-color:color-mix(in oklab,var(--color-bambu-green)80%,transparent)}}.hover\:bg-black\/40:hover{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/40:hover{background-color:color-mix(in oklab,var(--color-black)40%,transparent)}}.hover\:bg-black\/70:hover{background-color:#000000b3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/70:hover{background-color:color-mix(in oklab,var(--color-black)70%,transparent)}}.hover\:bg-black\/80:hover{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/80:hover{background-color:color-mix(in oklab,var(--color-black)80%,transparent)}}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-orange-400\/20:hover{background-color:#ff8b1a33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-orange-400\/20:hover{background-color:color-mix(in oklab,var(--color-orange-400)20%,transparent)}}.hover\:bg-red-400\/10:hover{background-color:#ff65681a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-400\/10:hover{background-color:color-mix(in oklab,var(--color-red-400)10%,transparent)}}.hover\:bg-red-500\/10:hover{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/10:hover{background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.hover\:bg-red-500\/20:hover{background-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/20:hover{background-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.hover\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:bg-yellow-600:hover{background-color:var(--color-yellow-600)}.hover\:text-bambu-green:hover{color:var(--color-bambu-green)}.hover\:text-bambu-green-light:hover{color:var(--color-bambu-green-light)}.hover\:text-bambu-green\/70:hover{color:#00ae42b3}@supports (color:color-mix(in lab,red,red)){.hover\:text-bambu-green\/70:hover{color:color-mix(in oklab,var(--color-bambu-green)70%,transparent)}}.hover\:text-bambu-green\/80:hover{color:#00ae42cc}@supports (color:color-mix(in lab,red,red)){.hover\:text-bambu-green\/80:hover{color:color-mix(in oklab,var(--color-bambu-green)80%,transparent)}}.hover\:text-blue-300:hover{color:var(--color-blue-300)}.hover\:text-gray-900:hover{color:var(--color-gray-900)}.hover\:text-orange-300:hover{color:var(--color-orange-300)}.hover\:text-red-300:hover{color:var(--color-red-300)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:text-white:hover{color:var(--color-white)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-70:hover{opacity:.7}.hover\:opacity-80:hover{opacity:.8}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-bambu-green\/5:hover{--tw-shadow-color:#00ae420d}@supports (color:color-mix(in lab,red,red)){.hover\:shadow-bambu-green\/5:hover{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-bambu-green)5%,transparent)var(--tw-shadow-alpha),transparent)}}}.focus\:border-bambu-green:focus{border-color:var(--color-bambu-green)}.focus\:border-red-500:focus{border-color:var(--color-red-500)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-bambu-gray:focus{--tw-ring-color:var(--color-bambu-gray)}.focus\:ring-bambu-green:focus{--tw-ring-color:var(--color-bambu-green)}.focus\:ring-red-500:focus{--tw-ring-color:var(--color-red-500)}.focus\:ring-offset-0:focus{--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:ring-offset-bambu-dark:focus{--tw-ring-offset-color:var(--color-bambu-dark)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:40rem){.sm\:inline{display:inline}.sm\:h-4{height:calc(var(--spacing)*4)}.sm\:w-4{width:calc(var(--spacing)*4)}.sm\:w-auto{width:auto}.sm\:max-w-none{max-width:none}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:gap-3{gap:calc(var(--spacing)*3)}.sm\:p-1\.5{padding:calc(var(--spacing)*1.5)}}@media(min-width:48rem){.md\:top-\[2px\]{top:2px}.md\:left-\[2px\]{left:2px}.md\:mx-0{margin-inline:calc(var(--spacing)*0)}.md\:block{display:block}.md\:inline{display:inline}.md\:h-4{height:calc(var(--spacing)*4)}.md\:h-5{height:calc(var(--spacing)*5)}.md\:h-8{height:calc(var(--spacing)*8)}.md\:min-h-0{min-height:calc(var(--spacing)*0)}.md\:w-4{width:calc(var(--spacing)*4)}.md\:w-8{width:calc(var(--spacing)*8)}.md\:w-9{width:calc(var(--spacing)*9)}.md\:min-w-\[200px\]{min-width:200px}.md\:flex-1{flex:1}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:flex-wrap{flex-wrap:wrap}.md\:items-center{align-items:center}.md\:gap-4{gap:calc(var(--spacing)*4)}.md\:p-8{padding:calc(var(--spacing)*8)}.md\:px-0{padding-inline:calc(var(--spacing)*0)}.md\:py-2{padding-block:calc(var(--spacing)*2)}.md\:pb-0{padding-bottom:calc(var(--spacing)*0)}}@media(min-width:64rem){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:w-80{width:calc(var(--spacing)*80)}.lg\:w-\[480px\]{width:480px}.lg\:max-w-md{max-width:var(--container-md)}.lg\:max-w-sm{max-width:var(--container-sm)}.lg\:max-w-xl{max-width:var(--container-xl)}.lg\:flex-shrink-0{flex-shrink:0}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:gap-8{gap:calc(var(--spacing)*8)}.lg\:p-8{padding:calc(var(--spacing)*8)}}@media(min-width:80rem){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}.dark\:border-bambu-dark-tertiary:where(.dark,.dark *){border-color:var(--color-bambu-dark-tertiary)}.dark\:bg-bambu-dark-secondary:where(.dark,.dark *){background-color:var(--color-bambu-dark-secondary)}.dark\:text-bambu-gray:where(.dark,.dark *){color:var(--color-bambu-gray)}.dark\:text-blue-200:where(.dark,.dark *){color:var(--color-blue-200)}.dark\:text-blue-200\/80:where(.dark,.dark *){color:#bedbffcc}@supports (color:color-mix(in lab,red,red)){.dark\:text-blue-200\/80:where(.dark,.dark *){color:color-mix(in oklab,var(--color-blue-200)80%,transparent)}}.dark\:text-blue-300:where(.dark,.dark *){color:var(--color-blue-300)}.dark\:text-blue-400:where(.dark,.dark *){color:var(--color-blue-400)}.dark\:text-orange-200:where(.dark,.dark *){color:var(--color-orange-200)}.dark\:text-orange-400:where(.dark,.dark *){color:var(--color-orange-400)}.dark\:text-white:where(.dark,.dark *){color:var(--color-white)}.dark\:text-yellow-200:where(.dark,.dark *){color:var(--color-yellow-200)}.dark\:text-yellow-200\/70:where(.dark,.dark *){color:#fff085b3}@supports (color:color-mix(in lab,red,red)){.dark\:text-yellow-200\/70:where(.dark,.dark *){color:color-mix(in oklab,var(--color-yellow-200)70%,transparent)}}@media(hover:hover){.dark\:hover\:bg-bambu-dark-tertiary:where(.dark,.dark *):hover{background-color:var(--color-bambu-dark-tertiary)}.dark\:hover\:text-white:where(.dark,.dark *):hover{color:var(--color-white)}}.\[\&\:\:-webkit-slider-thumb\]\:h-3::-webkit-slider-thumb{height:calc(var(--spacing)*3)}.\[\&\:\:-webkit-slider-thumb\]\:w-3::-webkit-slider-thumb{width:calc(var(--spacing)*3)}.\[\&\:\:-webkit-slider-thumb\]\:cursor-pointer::-webkit-slider-thumb{cursor:pointer}.\[\&\:\:-webkit-slider-thumb\]\:appearance-none::-webkit-slider-thumb{appearance:none}.\[\&\:\:-webkit-slider-thumb\]\:rounded-full::-webkit-slider-thumb{border-radius:3.40282e38px}.\[\&\:\:-webkit-slider-thumb\]\:bg-bambu-green::-webkit-slider-thumb{background-color:var(--color-bambu-green)}}:root{--bg-primary:#f5f5f5;--bg-secondary:#fff;--bg-tertiary:#e5e5e5;--text-primary:#1a1a1a;--text-secondary:#4a4a4a;--text-muted:#6b6b6b;--text-tertiary:gray;--border-color:#d4d4d4;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Inter,system-ui,sans-serif;font-weight:400;line-height:1.5}.dark{--bg-primary:#1a1a1a;--bg-secondary:#2d2d2d;--bg-tertiary:#3d3d3d;--text-primary:#fff;--text-secondary:#a0a0a0;--text-muted:gray;--text-tertiary:#4a4a4a;--border-color:#3d3d3d}body{background-color:var(--bg-primary);color:var(--text-primary);min-height:100vh;margin:0;transition:background-color .2s,color .2s}#root{min-height:100vh}.text-white{color:var(--text-primary)}.bg-bambu-dark,.bg-bambu-dark-secondary,.bg-bambu-dark-tertiary,.border-bambu-dark-tertiary{transition:background-color .2s,border-color .2s}@keyframes slide-in{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}.animate-slide-in{animation:.2s ease-out slide-in}.icon-theme{opacity:.5}.dark .icon-theme{filter:invert();opacity:.4}.icon-green{filter:invert(48%)sepia(89%)saturate(459%)hue-rotate(93deg)brightness(95%)contrast(92%);opacity:1}.icon-heating{filter:invert(50%)sepia()saturate(1000%)hue-rotate(360deg)brightness()contrast();opacity:1}.dark .jogpad-theme{filter:brightness(.35)contrast(1.2)}.ams-empty-slot{background:repeating-linear-gradient(45deg,#444,#444 2px,#222 2px 4px)}.dark .ams-empty-slot{background:repeating-linear-gradient(45deg,#555,#555 2px,#333 2px 4px)}.touch-manipulation{touch-action:manipulation}.safe-area-bottom{padding-bottom:env(safe-area-inset-bottom,0)}.safe-area-top{padding-top:env(safe-area-inset-top,0)}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}.scrollbar-hide::-webkit-scrollbar{display:none}@keyframes slide-in-left{0%{transform:translate(-100%)}to{transform:translate(0)}}.animate-slide-in-left{animation:.3s ease-out slide-in-left}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}} diff --git a/static/assets/index-VRY-O4QB.js b/static/assets/index-VRY-O4QB.js deleted file mode 100644 index b233c79de..000000000 --- a/static/assets/index-VRY-O4QB.js +++ /dev/null @@ -1,8619 +0,0 @@ -function Bre(t,e){for(var n=0;nr[i]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const a of i)if(a.type==="childList")for(const s of a.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&r(s)}).observe(document,{childList:!0,subtree:!0});function n(i){const a={};return i.integrity&&(a.integrity=i.integrity),i.referrerPolicy&&(a.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?a.credentials="include":i.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function r(i){if(i.ep)return;i.ep=!0;const a=n(i);fetch(i.href,a)}})();var vv=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function go(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var kT={exports:{}},ux={};var gF;function Hre(){if(gF)return ux;gF=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function n(r,i,a){var s=null;if(a!==void 0&&(s=""+a),i.key!==void 0&&(s=""+i.key),"key"in i){a={};for(var o in i)o!=="key"&&(a[o]=i[o])}else a=i;return i=a.ref,{$$typeof:t,type:r,key:s,ref:i!==void 0?i:null,props:a}}return ux.Fragment=e,ux.jsx=n,ux.jsxs=n,ux}var xF;function $re(){return xF||(xF=1,kT.exports=Hre()),kT.exports}var l=$re(),PT={exports:{}},Jt={};var bF;function Vre(){if(bF)return Jt;bF=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),a=Symbol.for("react.consumer"),s=Symbol.for("react.context"),o=Symbol.for("react.forward_ref"),c=Symbol.for("react.suspense"),u=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),f=Symbol.for("react.activity"),g=Symbol.iterator;function p(B){return B===null||typeof B!="object"?null:(B=g&&B[g]||B["@@iterator"],typeof B=="function"?B:null)}var x={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},v=Object.assign,y={};function b(B,$,Z){this.props=B,this.context=$,this.refs=y,this.updater=Z||x}b.prototype.isReactComponent={},b.prototype.setState=function(B,$){if(typeof B!="object"&&typeof B!="function"&&B!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,B,$,"setState")},b.prototype.forceUpdate=function(B){this.updater.enqueueForceUpdate(this,B,"forceUpdate")};function E(){}E.prototype=b.prototype;function w(B,$,Z){this.props=B,this.context=$,this.refs=y,this.updater=Z||x}var T=w.prototype=new E;T.constructor=w,v(T,b.prototype),T.isPureReactComponent=!0;var A=Array.isArray;function C(){}var N={H:null,A:null,T:null,S:null},F=Object.prototype.hasOwnProperty;function k(B,$,Z){var te=Z.ref;return{$$typeof:t,type:B,key:$,ref:te!==void 0?te:null,props:Z}}function R(B,$){return k(B.type,$,B.props)}function I(B){return typeof B=="object"&&B!==null&&B.$$typeof===t}function L(B){var $={"=":"=0",":":"=2"};return"$"+B.replace(/[=:]/g,function(Z){return $[Z]})}var q=/\/+/g;function j(B,$){return typeof B=="object"&&B!==null&&B.key!=null?L(""+B.key):$.toString(36)}function V(B){switch(B.status){case"fulfilled":return B.value;case"rejected":throw B.reason;default:switch(typeof B.status=="string"?B.then(C,C):(B.status="pending",B.then(function($){B.status==="pending"&&(B.status="fulfilled",B.value=$)},function($){B.status==="pending"&&(B.status="rejected",B.reason=$)})),B.status){case"fulfilled":return B.value;case"rejected":throw B.reason}}throw B}function K(B,$,Z,te,he){var de=typeof B;(de==="undefined"||de==="boolean")&&(B=null);var ge=!1;if(B===null)ge=!0;else switch(de){case"bigint":case"string":case"number":ge=!0;break;case"object":switch(B.$$typeof){case t:case e:ge=!0;break;case d:return ge=B._init,K(ge(B._payload),$,Z,te,he)}}if(ge)return he=he(B),ge=te===""?"."+j(B,0):te,A(he)?(Z="",ge!=null&&(Z=ge.replace(q,"$&/")+"/"),K(he,$,Z,"",function(ce){return ce})):he!=null&&(I(he)&&(he=R(he,Z+(he.key==null||B&&B.key===he.key?"":(""+he.key).replace(q,"$&/")+"/")+ge)),$.push(he)),1;ge=0;var Ae=te===""?".":te+":";if(A(B))for(var me=0;me>>1,Q=K[ee];if(0>>1;eei(Z,J))tei(he,Z)?(K[ee]=he,K[te]=J,ee=te):(K[ee]=Z,K[$]=J,ee=$);else if(tei(he,J))K[ee]=he,K[te]=J,ee=te;else break e}}return G}function i(K,G){var J=K.sortIndex-G.sortIndex;return J!==0?J:K.id-G.id}if(t.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var a=performance;t.unstable_now=function(){return a.now()}}else{var s=Date,o=s.now();t.unstable_now=function(){return s.now()-o}}var c=[],u=[],d=1,f=null,g=3,p=!1,x=!1,v=!1,y=!1,b=typeof setTimeout=="function"?setTimeout:null,E=typeof clearTimeout=="function"?clearTimeout:null,w=typeof setImmediate<"u"?setImmediate:null;function T(K){for(var G=n(u);G!==null;){if(G.callback===null)r(u);else if(G.startTime<=K)r(u),G.sortIndex=G.expirationTime,e(c,G);else break;G=n(u)}}function A(K){if(v=!1,T(K),!x)if(n(c)!==null)x=!0,C||(C=!0,L());else{var G=n(u);G!==null&&V(A,G.startTime-K)}}var C=!1,N=-1,F=5,k=-1;function R(){return y?!0:!(t.unstable_now()-kK&&R());){var ee=f.callback;if(typeof ee=="function"){f.callback=null,g=f.priorityLevel;var Q=ee(f.expirationTime<=K);if(K=t.unstable_now(),typeof Q=="function"){f.callback=Q,T(K),G=!0;break t}f===n(c)&&r(c),T(K)}else r(c);f=n(c)}if(f!==null)G=!0;else{var B=n(u);B!==null&&V(A,B.startTime-K),G=!1}}break e}finally{f=null,g=J,p=!1}G=void 0}}finally{G?L():C=!1}}}var L;if(typeof w=="function")L=function(){w(I)};else if(typeof MessageChannel<"u"){var q=new MessageChannel,j=q.port2;q.port1.onmessage=I,L=function(){j.postMessage(null)}}else L=function(){b(I,0)};function V(K,G){N=b(function(){K(t.unstable_now())},G)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(K){K.callback=null},t.unstable_forceFrameRate=function(K){0>K||125ee?(K.sortIndex=J,e(u,K),n(c)===null&&K===n(u)&&(v?(E(N),N=-1):v=!0,V(A,J-ee))):(K.sortIndex=Q,e(c,K),x||p||(x=!0,C||(C=!0,L()))),K},t.unstable_shouldYield=R,t.unstable_wrapCallback=function(K){var G=g;return function(){var J=g;g=G;try{return K.apply(this,arguments)}finally{g=J}}}})(DT)),DT}var _F;function qre(){return _F||(_F=1,RT.exports=Wre()),RT.exports}var OT={exports:{}},oa={};var wF;function Kre(){if(wF)return oa;wF=1;var t=Zp();function e(c){var u="https://react.dev/errors/"+c;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),OT.exports=Kre(),OT.exports}var MF;function Xre(){if(MF)return dx;MF=1;var t=qre(),e=Zp(),n=I9();function r(h){var m="https://react.dev/errors/"+h;if(1Q||(h.current=ee[Q],ee[Q]=null,Q--)}function Z(h,m){Q++,ee[Q]=h.current,h.current=m}var te=B(null),he=B(null),de=B(null),ge=B(null);function Ae(h,m){switch(Z(de,m),Z(he,h),Z(te,null),m.nodeType){case 9:case 11:h=(h=m.documentElement)&&(h=h.namespaceURI)?U5(h):0;break;default:if(h=m.tagName,m=m.namespaceURI)m=U5(m),h=z5(m,h);else switch(h){case"svg":h=1;break;case"math":h=2;break;default:h=0}}$(te),Z(te,h)}function me(){$(te),$(he),$(de)}function ce(h){h.memoizedState!==null&&Z(ge,h);var m=te.current,_=z5(m,h.type);m!==_&&(Z(he,h),Z(te,_))}function Pe(h){he.current===h&&($(te),$(he)),ge.current===h&&($(ge),sx._currentValue=J)}var oe,Le;function z(h){if(oe===void 0)try{throw Error()}catch(_){var m=_.stack.trim().match(/\n( *(at )?)/);oe=m&&m[1]||"",Le=-1<_.stack.indexOf(` - at`)?" ()":-1<_.stack.indexOf("@")?"@unknown:0:0":""}return` -`+oe+h+Le}var H=!1;function ne(h,m){if(!h||H)return"";H=!0;var _=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var S={DetermineComponentFrameRoot:function(){try{if(m){var ft=function(){throw Error()};if(Object.defineProperty(ft.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(ft,[])}catch(st){var Qe=st}Reflect.construct(h,[],ft)}else{try{ft.call()}catch(st){Qe=st}h.call(ft.prototype)}}else{try{throw Error()}catch(st){Qe=st}(ft=h())&&typeof ft.catch=="function"&&ft.catch(function(){})}}catch(st){if(st&&Qe&&typeof st.stack=="string")return[st.stack,Qe.stack]}return[null,null]}};S.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var P=Object.getOwnPropertyDescriptor(S.DetermineComponentFrameRoot,"name");P&&P.configurable&&Object.defineProperty(S.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var D=S.DetermineComponentFrameRoot(),X=D[0],le=D[1];if(X&&le){var Ce=X.split(` -`),Ye=le.split(` -`);for(P=S=0;SP||Ce[S]!==Ye[P]){var ct=` -`+Ce[S].replace(" at new "," at ");return h.displayName&&ct.includes("")&&(ct=ct.replace("",h.displayName)),ct}while(1<=S&&0<=P);break}}}finally{H=!1,Error.prepareStackTrace=_}return(_=h?h.displayName||h.name:"")?z(_):""}function W(h,m){switch(h.tag){case 26:case 27:case 5:return z(h.type);case 16:return z("Lazy");case 13:return h.child!==m&&m!==null?z("Suspense Fallback"):z("Suspense");case 19:return z("SuspenseList");case 0:case 15:return ne(h.type,!1);case 11:return ne(h.type.render,!1);case 1:return ne(h.type,!0);case 31:return z("Activity");default:return""}}function Y(h){try{var m="",_=null;do m+=W(h,_),_=h,h=h.return;while(h);return m}catch(S){return` -Error generating stack: `+S.message+` -`+S.stack}}var se=Object.prototype.hasOwnProperty,be=t.unstable_scheduleCallback,Te=t.unstable_cancelCallback,Me=t.unstable_shouldYield,U=t.unstable_requestPaint,O=t.unstable_now,re=t.unstable_getCurrentPriorityLevel,ve=t.unstable_ImmediatePriority,we=t.unstable_UserBlockingPriority,ye=t.unstable_NormalPriority,rt=t.unstable_LowPriority,Ve=t.unstable_IdlePriority,tt=t.log,ut=t.unstable_setDisableYieldValue,ue=null,ae=null;function $e(h){if(typeof tt=="function"&&ut(h),ae&&typeof ae.setStrictMode=="function")try{ae.setStrictMode(ue,h)}catch{}}var Ue=Math.clz32?Math.clz32:fe,Ze=Math.log,dt=Math.LN2;function fe(h){return h>>>=0,h===0?32:31-(Ze(h)/dt|0)|0}var Je=256,xe=262144,ze=4194304;function Re(h){var m=h&42;if(m!==0)return m;switch(h&-h){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return h&261888;case 262144:case 524288:case 1048576:case 2097152:return h&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return h&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return h}}function _e(h,m,_){var S=h.pendingLanes;if(S===0)return 0;var P=0,D=h.suspendedLanes,X=h.pingedLanes;h=h.warmLanes;var le=S&134217727;return le!==0?(S=le&~D,S!==0?P=Re(S):(X&=le,X!==0?P=Re(X):_||(_=le&~h,_!==0&&(P=Re(_))))):(le=S&~D,le!==0?P=Re(le):X!==0?P=Re(X):_||(_=S&~h,_!==0&&(P=Re(_)))),P===0?0:m!==0&&m!==P&&(m&D)===0&&(D=P&-P,_=m&-m,D>=_||D===32&&(_&4194048)!==0)?m:P}function qe(h,m){return(h.pendingLanes&~(h.suspendedLanes&~h.pingedLanes)&m)===0}function lt(h,m){switch(h){case 1:case 2:case 4:case 8:case 64:return m+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return m+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Se(){var h=ze;return ze<<=1,(ze&62914560)===0&&(ze=4194304),h}function bt(h){for(var m=[],_=0;31>_;_++)m.push(h);return m}function Gt(h,m){h.pendingLanes|=m,m!==268435456&&(h.suspendedLanes=0,h.pingedLanes=0,h.warmLanes=0)}function kt(h,m,_,S,P,D){var X=h.pendingLanes;h.pendingLanes=_,h.suspendedLanes=0,h.pingedLanes=0,h.warmLanes=0,h.expiredLanes&=_,h.entangledLanes&=_,h.errorRecoveryDisabledLanes&=_,h.shellSuspendCounter=0;var le=h.entanglements,Ce=h.expirationTimes,Ye=h.hiddenUpdates;for(_=X&~_;0<_;){var ct=31-Ue(_),ft=1<"u")return null;try{return h.activeElement||h.body}catch{return h.body}}var Br=/[\n"\\]/g;function Ln(h){return h.replace(Br,function(m){return"\\"+m.charCodeAt(0).toString(16)+" "})}function yo(h,m,_,S,P,D,X,le){h.name="",X!=null&&typeof X!="function"&&typeof X!="symbol"&&typeof X!="boolean"?h.type=X:h.removeAttribute("type"),m!=null?X==="number"?(m===0&&h.value===""||h.value!=m)&&(h.value=""+fn(m)):h.value!==""+fn(m)&&(h.value=""+fn(m)):X!=="submit"&&X!=="reset"||h.removeAttribute("value"),m!=null?Ti(h,X,fn(m)):_!=null?Ti(h,X,fn(_)):S!=null&&h.removeAttribute("value"),P==null&&D!=null&&(h.defaultChecked=!!D),P!=null&&(h.checked=P&&typeof P!="function"&&typeof P!="symbol"),le!=null&&typeof le!="function"&&typeof le!="symbol"&&typeof le!="boolean"?h.name=""+fn(le):h.removeAttribute("name")}function Fn(h,m,_,S,P,D,X,le){if(D!=null&&typeof D!="function"&&typeof D!="symbol"&&typeof D!="boolean"&&(h.type=D),m!=null||_!=null){if(!(D!=="submit"&&D!=="reset"||m!=null)){Qt(h);return}_=_!=null?""+fn(_):"",m=m!=null?""+fn(m):_,le||m===h.value||(h.value=m),h.defaultValue=m}S=S??P,S=typeof S!="function"&&typeof S!="symbol"&&!!S,h.checked=le?h.checked:!!S,h.defaultChecked=!!S,X!=null&&typeof X!="function"&&typeof X!="symbol"&&typeof X!="boolean"&&(h.name=X),Qt(h)}function Ti(h,m,_){m==="number"&&kr(h.ownerDocument)===h||h.defaultValue===""+_||(h.defaultValue=""+_)}function ci(h,m,_,S){if(h=h.options,m){m={};for(var P=0;P<_.length;P++)m["$"+_[P]]=!0;for(_=0;_"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),kE=!1;if(Ll)try{var Mg={};Object.defineProperty(Mg,"passive",{get:function(){kE=!0}}),window.addEventListener("test",Mg,Mg),window.removeEventListener("test",Mg,Mg)}catch{kE=!1}var tu=null,PE=null,hy=null;function zL(){if(hy)return hy;var h,m=PE,_=m.length,S,P="value"in tu?tu.value:tu.textContent,D=P.length;for(h=0;h<_&&m[h]===P[h];h++);var X=_-h;for(S=1;S<=X&&m[_-S]===P[D-S];S++);return hy=P.slice(h,1=Ag),WL=" ",qL=!1;function KL(h,m){switch(h){case"keyup":return cne.indexOf(m.keyCode)!==-1;case"keydown":return m.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function XL(h){return h=h.detail,typeof h=="object"&&"data"in h?h.data:null}var Af=!1;function dne(h,m){switch(h){case"compositionend":return XL(m);case"keypress":return m.which!==32?null:(qL=!0,WL);case"textInput":return h=m.data,h===WL&&qL?null:h;default:return null}}function hne(h,m){if(Af)return h==="compositionend"||!LE&&KL(h,m)?(h=zL(),hy=PE=tu=null,Af=!1,h):null;switch(h){case"paste":return null;case"keypress":if(!(m.ctrlKey||m.altKey||m.metaKey)||m.ctrlKey&&m.altKey){if(m.char&&1=m)return{node:_,offset:m-h};h=S}e:{for(;_;){if(_.nextSibling){_=_.nextSibling;break e}_=_.parentNode}_=void 0}_=r4(_)}}function a4(h,m){return h&&m?h===m?!0:h&&h.nodeType===3?!1:m&&m.nodeType===3?a4(h,m.parentNode):"contains"in h?h.contains(m):h.compareDocumentPosition?!!(h.compareDocumentPosition(m)&16):!1:!1}function s4(h){h=h!=null&&h.ownerDocument!=null&&h.ownerDocument.defaultView!=null?h.ownerDocument.defaultView:window;for(var m=kr(h.document);m instanceof h.HTMLIFrameElement;){try{var _=typeof m.contentWindow.location.href=="string"}catch{_=!1}if(_)h=m.contentWindow;else break;m=kr(h.document)}return m}function UE(h){var m=h&&h.nodeName&&h.nodeName.toLowerCase();return m&&(m==="input"&&(h.type==="text"||h.type==="search"||h.type==="tel"||h.type==="url"||h.type==="password")||m==="textarea"||h.contentEditable==="true")}var vne=Ll&&"documentMode"in document&&11>=document.documentMode,Nf=null,zE=null,Pg=null,BE=!1;function o4(h,m,_){var S=_.window===_?_.document:_.nodeType===9?_:_.ownerDocument;BE||Nf==null||Nf!==kr(S)||(S=Nf,"selectionStart"in S&&UE(S)?S={start:S.selectionStart,end:S.selectionEnd}:(S=(S.ownerDocument&&S.ownerDocument.defaultView||window).getSelection(),S={anchorNode:S.anchorNode,anchorOffset:S.anchorOffset,focusNode:S.focusNode,focusOffset:S.focusOffset}),Pg&&kg(Pg,S)||(Pg=S,S=av(zE,"onSelect"),0>=X,P-=X,Ko=1<<32-Ue(m)+P|_<rn?(_n=It,It=null):_n=It.sibling;var kn=Qe(He,It,Xe[rn],ht);if(kn===null){It===null&&(It=_n);break}h&&It&&kn.alternate===null&&m(He,It),De=D(kn,De,rn),Cn===null?zt=kn:Cn.sibling=kn,Cn=kn,It=_n}if(rn===Xe.length)return _(He,It),Mn&&Fl(He,rn),zt;if(It===null){for(;rnrn?(_n=It,It=null):_n=It.sibling;var Su=Qe(He,It,kn.value,ht);if(Su===null){It===null&&(It=_n);break}h&&It&&Su.alternate===null&&m(He,It),De=D(Su,De,rn),Cn===null?zt=Su:Cn.sibling=Su,Cn=Su,It=_n}if(kn.done)return _(He,It),Mn&&Fl(He,rn),zt;if(It===null){for(;!kn.done;rn++,kn=Xe.next())kn=ft(He,kn.value,ht),kn!==null&&(De=D(kn,De,rn),Cn===null?zt=kn:Cn.sibling=kn,Cn=kn);return Mn&&Fl(He,rn),zt}for(It=S(It);!kn.done;rn++,kn=Xe.next())kn=st(It,He,rn,kn.value,ht),kn!==null&&(h&&kn.alternate!==null&&It.delete(kn.key===null?rn:kn.key),De=D(kn,De,rn),Cn===null?zt=kn:Cn.sibling=kn,Cn=kn);return h&&It.forEach(function(zre){return m(He,zre)}),Mn&&Fl(He,rn),zt}function Kn(He,De,Xe,ht){if(typeof Xe=="object"&&Xe!==null&&Xe.type===v&&Xe.key===null&&(Xe=Xe.props.children),typeof Xe=="object"&&Xe!==null){switch(Xe.$$typeof){case p:e:{for(var zt=Xe.key;De!==null;){if(De.key===zt){if(zt=Xe.type,zt===v){if(De.tag===7){_(He,De.sibling),ht=P(De,Xe.props.children),ht.return=He,He=ht;break e}}else if(De.elementType===zt||typeof zt=="object"&&zt!==null&&zt.$$typeof===F&&Gd(zt)===De.type){_(He,De.sibling),ht=P(De,Xe.props),Ig(ht,Xe),ht.return=He,He=ht;break e}_(He,De);break}else m(He,De);De=De.sibling}Xe.type===v?(ht=zd(Xe.props.children,He.mode,ht,Xe.key),ht.return=He,He=ht):(ht=wy(Xe.type,Xe.key,Xe.props,null,He.mode,ht),Ig(ht,Xe),ht.return=He,He=ht)}return X(He);case x:e:{for(zt=Xe.key;De!==null;){if(De.key===zt)if(De.tag===4&&De.stateNode.containerInfo===Xe.containerInfo&&De.stateNode.implementation===Xe.implementation){_(He,De.sibling),ht=P(De,Xe.children||[]),ht.return=He,He=ht;break e}else{_(He,De);break}else m(He,De);De=De.sibling}ht=KE(Xe,He.mode,ht),ht.return=He,He=ht}return X(He);case F:return Xe=Gd(Xe),Kn(He,De,Xe,ht)}if(V(Xe))return Ot(He,De,Xe,ht);if(L(Xe)){if(zt=L(Xe),typeof zt!="function")throw Error(r(150));return Xe=zt.call(Xe),Wt(He,De,Xe,ht)}if(typeof Xe.then=="function")return Kn(He,De,Cy(Xe),ht);if(Xe.$$typeof===w)return Kn(He,De,Ey(He,Xe),ht);ky(He,Xe)}return typeof Xe=="string"&&Xe!==""||typeof Xe=="number"||typeof Xe=="bigint"?(Xe=""+Xe,De!==null&&De.tag===6?(_(He,De.sibling),ht=P(De,Xe),ht.return=He,He=ht):(_(He,De),ht=qE(Xe,He.mode,ht),ht.return=He,He=ht),X(He)):_(He,De)}return function(He,De,Xe,ht){try{Lg=0;var zt=Kn(He,De,Xe,ht);return Uf=null,zt}catch(It){if(It===Ff||It===Ay)throw It;var Cn=cs(29,It,null,He.mode);return Cn.lanes=ht,Cn.return=He,Cn}finally{}}}var qd=k4(!0),P4=k4(!1),su=!1;function s2(h){h.updateQueue={baseState:h.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function o2(h,m){h=h.updateQueue,m.updateQueue===h&&(m.updateQueue={baseState:h.baseState,firstBaseUpdate:h.firstBaseUpdate,lastBaseUpdate:h.lastBaseUpdate,shared:h.shared,callbacks:null})}function ou(h){return{lane:h,tag:0,payload:null,callback:null,next:null}}function lu(h,m,_){var S=h.updateQueue;if(S===null)return null;if(S=S.shared,(Dn&2)!==0){var P=S.pending;return P===null?m.next=m:(m.next=P.next,P.next=m),S.pending=m,m=_y(h),m4(h,null,_),m}return vy(h,S,m,_),_y(h)}function Fg(h,m,_){if(m=m.updateQueue,m!==null&&(m=m.shared,(_&4194048)!==0)){var S=m.lanes;S&=h.pendingLanes,_|=S,m.lanes=_,Nn(h,_)}}function l2(h,m){var _=h.updateQueue,S=h.alternate;if(S!==null&&(S=S.updateQueue,_===S)){var P=null,D=null;if(_=_.firstBaseUpdate,_!==null){do{var X={lane:_.lane,tag:_.tag,payload:_.payload,callback:null,next:null};D===null?P=D=X:D=D.next=X,_=_.next}while(_!==null);D===null?P=D=m:D=D.next=m}else P=D=m;_={baseState:S.baseState,firstBaseUpdate:P,lastBaseUpdate:D,shared:S.shared,callbacks:S.callbacks},h.updateQueue=_;return}h=_.lastBaseUpdate,h===null?_.firstBaseUpdate=m:h.next=m,_.lastBaseUpdate=m}var c2=!1;function Ug(){if(c2){var h=If;if(h!==null)throw h}}function zg(h,m,_,S){c2=!1;var P=h.updateQueue;su=!1;var D=P.firstBaseUpdate,X=P.lastBaseUpdate,le=P.shared.pending;if(le!==null){P.shared.pending=null;var Ce=le,Ye=Ce.next;Ce.next=null,X===null?D=Ye:X.next=Ye,X=Ce;var ct=h.alternate;ct!==null&&(ct=ct.updateQueue,le=ct.lastBaseUpdate,le!==X&&(le===null?ct.firstBaseUpdate=Ye:le.next=Ye,ct.lastBaseUpdate=Ce))}if(D!==null){var ft=P.baseState;X=0,ct=Ye=Ce=null,le=D;do{var Qe=le.lane&-536870913,st=Qe!==le.lane;if(st?(vn&Qe)===Qe:(S&Qe)===Qe){Qe!==0&&Qe===Lf&&(c2=!0),ct!==null&&(ct=ct.next={lane:0,tag:le.tag,payload:le.payload,callback:null,next:null});e:{var Ot=h,Wt=le;Qe=m;var Kn=_;switch(Wt.tag){case 1:if(Ot=Wt.payload,typeof Ot=="function"){ft=Ot.call(Kn,ft,Qe);break e}ft=Ot;break e;case 3:Ot.flags=Ot.flags&-65537|128;case 0:if(Ot=Wt.payload,Qe=typeof Ot=="function"?Ot.call(Kn,ft,Qe):Ot,Qe==null)break e;ft=f({},ft,Qe);break e;case 2:su=!0}}Qe=le.callback,Qe!==null&&(h.flags|=64,st&&(h.flags|=8192),st=P.callbacks,st===null?P.callbacks=[Qe]:st.push(Qe))}else st={lane:Qe,tag:le.tag,payload:le.payload,callback:le.callback,next:null},ct===null?(Ye=ct=st,Ce=ft):ct=ct.next=st,X|=Qe;if(le=le.next,le===null){if(le=P.shared.pending,le===null)break;st=le,le=st.next,st.next=null,P.lastBaseUpdate=st,P.shared.pending=null}}while(!0);ct===null&&(Ce=ft),P.baseState=Ce,P.firstBaseUpdate=Ye,P.lastBaseUpdate=ct,D===null&&(P.shared.lanes=0),fu|=X,h.lanes=X,h.memoizedState=ft}}function j4(h,m){if(typeof h!="function")throw Error(r(191,h));h.call(m)}function R4(h,m){var _=h.callbacks;if(_!==null)for(h.callbacks=null,h=0;h<_.length;h++)j4(_[h],m)}var zf=B(null),Py=B(0);function D4(h,m){h=Xl,Z(Py,h),Z(zf,m),Xl=h|m.baseLanes}function u2(){Z(Py,Xl),Z(zf,zf.current)}function d2(){Xl=Py.current,$(zf),$(Py)}var us=B(null),Is=null;function cu(h){var m=h.alternate;Z(Hr,Hr.current&1),Z(us,h),Is===null&&(m===null||zf.current!==null||m.memoizedState!==null)&&(Is=h)}function h2(h){Z(Hr,Hr.current),Z(us,h),Is===null&&(Is=h)}function O4(h){h.tag===22?(Z(Hr,Hr.current),Z(us,h),Is===null&&(Is=h)):uu()}function uu(){Z(Hr,Hr.current),Z(us,us.current)}function ds(h){$(us),Is===h&&(Is=null),$(Hr)}var Hr=B(0);function jy(h){for(var m=h;m!==null;){if(m.tag===13){var _=m.memoizedState;if(_!==null&&(_=_.dehydrated,_===null||bT(_)||yT(_)))return m}else if(m.tag===19&&(m.memoizedProps.revealOrder==="forwards"||m.memoizedProps.revealOrder==="backwards"||m.memoizedProps.revealOrder==="unstable_legacy-backwards"||m.memoizedProps.revealOrder==="together")){if((m.flags&128)!==0)return m}else if(m.child!==null){m.child.return=m,m=m.child;continue}if(m===h)break;for(;m.sibling===null;){if(m.return===null||m.return===h)return null;m=m.return}m.sibling.return=m.return,m=m.sibling}return null}var Bl=0,tn=null,Wn=null,Zr=null,Ry=!1,Bf=!1,Kd=!1,Dy=0,Bg=0,Hf=null,kne=0;function Pr(){throw Error(r(321))}function f2(h,m){if(m===null)return!1;for(var _=0;_D?D:8;var X=K.T,le={};K.T=le,N2(h,!1,m,_);try{var Ce=P(),Ye=K.S;if(Ye!==null&&Ye(le,Ce),Ce!==null&&typeof Ce=="object"&&typeof Ce.then=="function"){var ct=Cne(Ce,S);$g(h,m,ct,ms(h))}else $g(h,m,S,ms(h))}catch(ft){$g(h,m,{then:function(){},status:"rejected",reason:ft},ms())}finally{G.p=D,X!==null&&le.types!==null&&(X.types=le.types),K.T=X}}function One(){}function T2(h,m,_,S){if(h.tag!==5)throw Error(r(476));var P=dI(h).queue;uI(h,P,m,J,_===null?One:function(){return hI(h),_(S)})}function dI(h){var m=h.memoizedState;if(m!==null)return m;m={memoizedState:J,baseState:J,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Hl,lastRenderedState:J},next:null};var _={};return m.next={memoizedState:_,baseState:_,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Hl,lastRenderedState:_},next:null},h.memoizedState=m,h=h.alternate,h!==null&&(h.memoizedState=m),m}function hI(h){var m=dI(h);m.next===null&&(m=h.alternate.memoizedState),$g(h,m.next.queue,{},ms())}function A2(){return Vi(sx)}function fI(){return $r().memoizedState}function mI(){return $r().memoizedState}function Lne(h){for(var m=h.return;m!==null;){switch(m.tag){case 24:case 3:var _=ms();h=ou(_);var S=lu(m,h,_);S!==null&&(Va(S,m,_),Fg(S,m,_)),m={cache:n2()},h.payload=m;return}m=m.return}}function Ine(h,m,_){var S=ms();_={lane:S,revertLane:0,gesture:null,action:_,hasEagerState:!1,eagerState:null,next:null},zy(h)?gI(m,_):(_=GE(h,m,_,S),_!==null&&(Va(_,h,S),xI(_,m,S)))}function pI(h,m,_){var S=ms();$g(h,m,_,S)}function $g(h,m,_,S){var P={lane:S,revertLane:0,gesture:null,action:_,hasEagerState:!1,eagerState:null,next:null};if(zy(h))gI(m,P);else{var D=h.alternate;if(h.lanes===0&&(D===null||D.lanes===0)&&(D=m.lastRenderedReducer,D!==null))try{var X=m.lastRenderedState,le=D(X,_);if(P.hasEagerState=!0,P.eagerState=le,ls(le,X))return vy(h,m,P,0),rr===null&&yy(),!1}catch{}finally{}if(_=GE(h,m,P,S),_!==null)return Va(_,h,S),xI(_,m,S),!0}return!1}function N2(h,m,_,S){if(S={lane:2,revertLane:sT(),gesture:null,action:S,hasEagerState:!1,eagerState:null,next:null},zy(h)){if(m)throw Error(r(479))}else m=GE(h,_,S,2),m!==null&&Va(m,h,2)}function zy(h){var m=h.alternate;return h===tn||m!==null&&m===tn}function gI(h,m){Bf=Ry=!0;var _=h.pending;_===null?m.next=m:(m.next=_.next,_.next=m),h.pending=m}function xI(h,m,_){if((_&4194048)!==0){var S=m.lanes;S&=h.pendingLanes,_|=S,m.lanes=_,Nn(h,_)}}var Vg={readContext:Vi,use:Ly,useCallback:Pr,useContext:Pr,useEffect:Pr,useImperativeHandle:Pr,useLayoutEffect:Pr,useInsertionEffect:Pr,useMemo:Pr,useReducer:Pr,useRef:Pr,useState:Pr,useDebugValue:Pr,useDeferredValue:Pr,useTransition:Pr,useSyncExternalStore:Pr,useId:Pr,useHostTransitionStatus:Pr,useFormState:Pr,useActionState:Pr,useOptimistic:Pr,useMemoCache:Pr,useCacheRefresh:Pr};Vg.useEffectEvent=Pr;var bI={readContext:Vi,use:Ly,useCallback:function(h,m){return Sa().memoizedState=[h,m===void 0?null:m],h},useContext:Vi,useEffect:tI,useImperativeHandle:function(h,m,_){_=_!=null?_.concat([h]):null,Fy(4194308,4,aI.bind(null,m,h),_)},useLayoutEffect:function(h,m){return Fy(4194308,4,h,m)},useInsertionEffect:function(h,m){Fy(4,2,h,m)},useMemo:function(h,m){var _=Sa();m=m===void 0?null:m;var S=h();if(Kd){$e(!0);try{h()}finally{$e(!1)}}return _.memoizedState=[S,m],S},useReducer:function(h,m,_){var S=Sa();if(_!==void 0){var P=_(m);if(Kd){$e(!0);try{_(m)}finally{$e(!1)}}}else P=m;return S.memoizedState=S.baseState=P,h={pending:null,lanes:0,dispatch:null,lastRenderedReducer:h,lastRenderedState:P},S.queue=h,h=h.dispatch=Ine.bind(null,tn,h),[S.memoizedState,h]},useRef:function(h){var m=Sa();return h={current:h},m.memoizedState=h},useState:function(h){h=_2(h);var m=h.queue,_=pI.bind(null,tn,m);return m.dispatch=_,[h.memoizedState,_]},useDebugValue:M2,useDeferredValue:function(h,m){var _=Sa();return E2(_,h,m)},useTransition:function(){var h=_2(!1);return h=uI.bind(null,tn,h.queue,!0,!1),Sa().memoizedState=h,[!1,h]},useSyncExternalStore:function(h,m,_){var S=tn,P=Sa();if(Mn){if(_===void 0)throw Error(r(407));_=_()}else{if(_=m(),rr===null)throw Error(r(349));(vn&127)!==0||U4(S,m,_)}P.memoizedState=_;var D={value:_,getSnapshot:m};return P.queue=D,tI(B4.bind(null,S,D,h),[h]),S.flags|=2048,$f(9,{destroy:void 0},z4.bind(null,S,D,_,m),null),_},useId:function(){var h=Sa(),m=rr.identifierPrefix;if(Mn){var _=Xo,S=Ko;_=(S&~(1<<32-Ue(S)-1)).toString(32)+_,m="_"+m+"R_"+_,_=Dy++,0<_&&(m+="H"+_.toString(32)),m+="_"}else _=kne++,m="_"+m+"r_"+_.toString(32)+"_";return h.memoizedState=m},useHostTransitionStatus:A2,useFormState:Y4,useActionState:Y4,useOptimistic:function(h){var m=Sa();m.memoizedState=m.baseState=h;var _={pending:null,lanes:0,dispatch:null,lastRenderedReducer:null,lastRenderedState:null};return m.queue=_,m=N2.bind(null,tn,!0,_),_.dispatch=m,[h,m]},useMemoCache:b2,useCacheRefresh:function(){return Sa().memoizedState=Lne.bind(null,tn)},useEffectEvent:function(h){var m=Sa(),_={impl:h};return m.memoizedState=_,function(){if((Dn&2)!==0)throw Error(r(440));return _.impl.apply(void 0,arguments)}}},C2={readContext:Vi,use:Ly,useCallback:oI,useContext:Vi,useEffect:S2,useImperativeHandle:sI,useInsertionEffect:rI,useLayoutEffect:iI,useMemo:lI,useReducer:Iy,useRef:eI,useState:function(){return Iy(Hl)},useDebugValue:M2,useDeferredValue:function(h,m){var _=$r();return cI(_,Wn.memoizedState,h,m)},useTransition:function(){var h=Iy(Hl)[0],m=$r().memoizedState;return[typeof h=="boolean"?h:Hg(h),m]},useSyncExternalStore:F4,useId:fI,useHostTransitionStatus:A2,useFormState:Z4,useActionState:Z4,useOptimistic:function(h,m){var _=$r();return V4(_,Wn,h,m)},useMemoCache:b2,useCacheRefresh:mI};C2.useEffectEvent=nI;var yI={readContext:Vi,use:Ly,useCallback:oI,useContext:Vi,useEffect:S2,useImperativeHandle:sI,useInsertionEffect:rI,useLayoutEffect:iI,useMemo:lI,useReducer:v2,useRef:eI,useState:function(){return v2(Hl)},useDebugValue:M2,useDeferredValue:function(h,m){var _=$r();return Wn===null?E2(_,h,m):cI(_,Wn.memoizedState,h,m)},useTransition:function(){var h=v2(Hl)[0],m=$r().memoizedState;return[typeof h=="boolean"?h:Hg(h),m]},useSyncExternalStore:F4,useId:fI,useHostTransitionStatus:A2,useFormState:J4,useActionState:J4,useOptimistic:function(h,m){var _=$r();return Wn!==null?V4(_,Wn,h,m):(_.baseState=h,[h,_.queue.dispatch])},useMemoCache:b2,useCacheRefresh:mI};yI.useEffectEvent=nI;function k2(h,m,_,S){m=h.memoizedState,_=_(S,m),_=_==null?m:f({},m,_),h.memoizedState=_,h.lanes===0&&(h.updateQueue.baseState=_)}var P2={enqueueSetState:function(h,m,_){h=h._reactInternals;var S=ms(),P=ou(S);P.payload=m,_!=null&&(P.callback=_),m=lu(h,P,S),m!==null&&(Va(m,h,S),Fg(m,h,S))},enqueueReplaceState:function(h,m,_){h=h._reactInternals;var S=ms(),P=ou(S);P.tag=1,P.payload=m,_!=null&&(P.callback=_),m=lu(h,P,S),m!==null&&(Va(m,h,S),Fg(m,h,S))},enqueueForceUpdate:function(h,m){h=h._reactInternals;var _=ms(),S=ou(_);S.tag=2,m!=null&&(S.callback=m),m=lu(h,S,_),m!==null&&(Va(m,h,_),Fg(m,h,_))}};function vI(h,m,_,S,P,D,X){return h=h.stateNode,typeof h.shouldComponentUpdate=="function"?h.shouldComponentUpdate(S,D,X):m.prototype&&m.prototype.isPureReactComponent?!kg(_,S)||!kg(P,D):!0}function _I(h,m,_,S){h=m.state,typeof m.componentWillReceiveProps=="function"&&m.componentWillReceiveProps(_,S),typeof m.UNSAFE_componentWillReceiveProps=="function"&&m.UNSAFE_componentWillReceiveProps(_,S),m.state!==h&&P2.enqueueReplaceState(m,m.state,null)}function Xd(h,m){var _=m;if("ref"in m){_={};for(var S in m)S!=="ref"&&(_[S]=m[S])}if(h=h.defaultProps){_===m&&(_=f({},_));for(var P in h)_[P]===void 0&&(_[P]=h[P])}return _}function wI(h){by(h)}function SI(h){console.error(h)}function MI(h){by(h)}function By(h,m){try{var _=h.onUncaughtError;_(m.value,{componentStack:m.stack})}catch(S){setTimeout(function(){throw S})}}function EI(h,m,_){try{var S=h.onCaughtError;S(_.value,{componentStack:_.stack,errorBoundary:m.tag===1?m.stateNode:null})}catch(P){setTimeout(function(){throw P})}}function j2(h,m,_){return _=ou(_),_.tag=3,_.payload={element:null},_.callback=function(){By(h,m)},_}function TI(h){return h=ou(h),h.tag=3,h}function AI(h,m,_,S){var P=_.type.getDerivedStateFromError;if(typeof P=="function"){var D=S.value;h.payload=function(){return P(D)},h.callback=function(){EI(m,_,S)}}var X=_.stateNode;X!==null&&typeof X.componentDidCatch=="function"&&(h.callback=function(){EI(m,_,S),typeof P!="function"&&(mu===null?mu=new Set([this]):mu.add(this));var le=S.stack;this.componentDidCatch(S.value,{componentStack:le!==null?le:""})})}function Fne(h,m,_,S,P){if(_.flags|=32768,S!==null&&typeof S=="object"&&typeof S.then=="function"){if(m=_.alternate,m!==null&&Of(m,_,P,!0),_=us.current,_!==null){switch(_.tag){case 31:case 13:return Is===null?Jy():_.alternate===null&&jr===0&&(jr=3),_.flags&=-257,_.flags|=65536,_.lanes=P,S===Ny?_.flags|=16384:(m=_.updateQueue,m===null?_.updateQueue=new Set([S]):m.add(S),rT(h,S,P)),!1;case 22:return _.flags|=65536,S===Ny?_.flags|=16384:(m=_.updateQueue,m===null?(m={transitions:null,markerInstances:null,retryQueue:new Set([S])},_.updateQueue=m):(_=m.retryQueue,_===null?m.retryQueue=new Set([S]):_.add(S)),rT(h,S,P)),!1}throw Error(r(435,_.tag))}return rT(h,S,P),Jy(),!1}if(Mn)return m=us.current,m!==null?((m.flags&65536)===0&&(m.flags|=256),m.flags|=65536,m.lanes=P,S!==ZE&&(h=Error(r(422),{cause:S}),Rg(Rs(h,_)))):(S!==ZE&&(m=Error(r(423),{cause:S}),Rg(Rs(m,_))),h=h.current.alternate,h.flags|=65536,P&=-P,h.lanes|=P,S=Rs(S,_),P=j2(h.stateNode,S,P),l2(h,P),jr!==4&&(jr=2)),!1;var D=Error(r(520),{cause:S});if(D=Rs(D,_),Qg===null?Qg=[D]:Qg.push(D),jr!==4&&(jr=2),m===null)return!0;S=Rs(S,_),_=m;do{switch(_.tag){case 3:return _.flags|=65536,h=P&-P,_.lanes|=h,h=j2(_.stateNode,S,h),l2(_,h),!1;case 1:if(m=_.type,D=_.stateNode,(_.flags&128)===0&&(typeof m.getDerivedStateFromError=="function"||D!==null&&typeof D.componentDidCatch=="function"&&(mu===null||!mu.has(D))))return _.flags|=65536,P&=-P,_.lanes|=P,P=TI(P),AI(P,h,_,S),l2(_,P),!1}_=_.return}while(_!==null);return!1}var R2=Error(r(461)),Qr=!1;function Gi(h,m,_,S){m.child=h===null?P4(m,null,_,S):qd(m,h.child,_,S)}function NI(h,m,_,S,P){_=_.render;var D=m.ref;if("ref"in S){var X={};for(var le in S)le!=="ref"&&(X[le]=S[le])}else X=S;return $d(m),S=m2(h,m,_,X,D,P),le=p2(),h!==null&&!Qr?(g2(h,m,P),$l(h,m,P)):(Mn&&le&&XE(m),m.flags|=1,Gi(h,m,S,P),m.child)}function CI(h,m,_,S,P){if(h===null){var D=_.type;return typeof D=="function"&&!WE(D)&&D.defaultProps===void 0&&_.compare===null?(m.tag=15,m.type=D,kI(h,m,D,S,P)):(h=wy(_.type,null,S,m,m.mode,P),h.ref=m.ref,h.return=m,m.child=h)}if(D=h.child,!B2(h,P)){var X=D.memoizedProps;if(_=_.compare,_=_!==null?_:kg,_(X,S)&&h.ref===m.ref)return $l(h,m,P)}return m.flags|=1,h=Il(D,S),h.ref=m.ref,h.return=m,m.child=h}function kI(h,m,_,S,P){if(h!==null){var D=h.memoizedProps;if(kg(D,S)&&h.ref===m.ref)if(Qr=!1,m.pendingProps=S=D,B2(h,P))(h.flags&131072)!==0&&(Qr=!0);else return m.lanes=h.lanes,$l(h,m,P)}return D2(h,m,_,S,P)}function PI(h,m,_,S){var P=S.children,D=h!==null?h.memoizedState:null;if(h===null&&m.stateNode===null&&(m.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),S.mode==="hidden"){if((m.flags&128)!==0){if(D=D!==null?D.baseLanes|_:_,h!==null){for(S=m.child=h.child,P=0;S!==null;)P=P|S.lanes|S.childLanes,S=S.sibling;S=P&~D}else S=0,m.child=null;return jI(h,m,D,_,S)}if((_&536870912)!==0)m.memoizedState={baseLanes:0,cachePool:null},h!==null&&Ty(m,D!==null?D.cachePool:null),D!==null?D4(m,D):u2(),O4(m);else return S=m.lanes=536870912,jI(h,m,D!==null?D.baseLanes|_:_,_,S)}else D!==null?(Ty(m,D.cachePool),D4(m,D),uu(),m.memoizedState=null):(h!==null&&Ty(m,null),u2(),uu());return Gi(h,m,P,_),m.child}function Gg(h,m){return h!==null&&h.tag===22||m.stateNode!==null||(m.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),m.sibling}function jI(h,m,_,S,P){var D=i2();return D=D===null?null:{parent:Yr._currentValue,pool:D},m.memoizedState={baseLanes:_,cachePool:D},h!==null&&Ty(m,null),u2(),O4(m),h!==null&&Of(h,m,S,!0),m.childLanes=P,null}function Hy(h,m){return m=Vy({mode:m.mode,children:m.children},h.mode),m.ref=h.ref,h.child=m,m.return=h,m}function RI(h,m,_){return qd(m,h.child,null,_),h=Hy(m,m.pendingProps),h.flags|=2,ds(m),m.memoizedState=null,h}function Une(h,m,_){var S=m.pendingProps,P=(m.flags&128)!==0;if(m.flags&=-129,h===null){if(Mn){if(S.mode==="hidden")return h=Hy(m,S),m.lanes=536870912,Gg(null,h);if(h2(m),(h=ur)?(h=G5(h,Ls),h=h!==null&&h.data==="&"?h:null,h!==null&&(m.memoizedState={dehydrated:h,treeContext:nu!==null?{id:Ko,overflow:Xo}:null,retryLane:536870912,hydrationErrors:null},_=g4(h),_.return=m,m.child=_,$i=m,ur=null)):h=null,h===null)throw iu(m);return m.lanes=536870912,null}return Hy(m,S)}var D=h.memoizedState;if(D!==null){var X=D.dehydrated;if(h2(m),P)if(m.flags&256)m.flags&=-257,m=RI(h,m,_);else if(m.memoizedState!==null)m.child=h.child,m.flags|=128,m=null;else throw Error(r(558));else if(Qr||Of(h,m,_,!1),P=(_&h.childLanes)!==0,Qr||P){if(S=rr,S!==null&&(X=nn(S,_),X!==0&&X!==D.retryLane))throw D.retryLane=X,Ud(h,X),Va(S,h,X),R2;Jy(),m=RI(h,m,_)}else h=D.treeContext,ur=Fs(X.nextSibling),$i=m,Mn=!0,ru=null,Ls=!1,h!==null&&y4(m,h),m=Hy(m,S),m.flags|=4096;return m}return h=Il(h.child,{mode:S.mode,children:S.children}),h.ref=m.ref,m.child=h,h.return=m,h}function $y(h,m){var _=m.ref;if(_===null)h!==null&&h.ref!==null&&(m.flags|=4194816);else{if(typeof _!="function"&&typeof _!="object")throw Error(r(284));(h===null||h.ref!==_)&&(m.flags|=4194816)}}function D2(h,m,_,S,P){return $d(m),_=m2(h,m,_,S,void 0,P),S=p2(),h!==null&&!Qr?(g2(h,m,P),$l(h,m,P)):(Mn&&S&&XE(m),m.flags|=1,Gi(h,m,_,P),m.child)}function DI(h,m,_,S,P,D){return $d(m),m.updateQueue=null,_=I4(m,S,_,P),L4(h),S=p2(),h!==null&&!Qr?(g2(h,m,D),$l(h,m,D)):(Mn&&S&&XE(m),m.flags|=1,Gi(h,m,_,D),m.child)}function OI(h,m,_,S,P){if($d(m),m.stateNode===null){var D=Pf,X=_.contextType;typeof X=="object"&&X!==null&&(D=Vi(X)),D=new _(S,D),m.memoizedState=D.state!==null&&D.state!==void 0?D.state:null,D.updater=P2,m.stateNode=D,D._reactInternals=m,D=m.stateNode,D.props=S,D.state=m.memoizedState,D.refs={},s2(m),X=_.contextType,D.context=typeof X=="object"&&X!==null?Vi(X):Pf,D.state=m.memoizedState,X=_.getDerivedStateFromProps,typeof X=="function"&&(k2(m,_,X,S),D.state=m.memoizedState),typeof _.getDerivedStateFromProps=="function"||typeof D.getSnapshotBeforeUpdate=="function"||typeof D.UNSAFE_componentWillMount!="function"&&typeof D.componentWillMount!="function"||(X=D.state,typeof D.componentWillMount=="function"&&D.componentWillMount(),typeof D.UNSAFE_componentWillMount=="function"&&D.UNSAFE_componentWillMount(),X!==D.state&&P2.enqueueReplaceState(D,D.state,null),zg(m,S,D,P),Ug(),D.state=m.memoizedState),typeof D.componentDidMount=="function"&&(m.flags|=4194308),S=!0}else if(h===null){D=m.stateNode;var le=m.memoizedProps,Ce=Xd(_,le);D.props=Ce;var Ye=D.context,ct=_.contextType;X=Pf,typeof ct=="object"&&ct!==null&&(X=Vi(ct));var ft=_.getDerivedStateFromProps;ct=typeof ft=="function"||typeof D.getSnapshotBeforeUpdate=="function",le=m.pendingProps!==le,ct||typeof D.UNSAFE_componentWillReceiveProps!="function"&&typeof D.componentWillReceiveProps!="function"||(le||Ye!==X)&&_I(m,D,S,X),su=!1;var Qe=m.memoizedState;D.state=Qe,zg(m,S,D,P),Ug(),Ye=m.memoizedState,le||Qe!==Ye||su?(typeof ft=="function"&&(k2(m,_,ft,S),Ye=m.memoizedState),(Ce=su||vI(m,_,Ce,S,Qe,Ye,X))?(ct||typeof D.UNSAFE_componentWillMount!="function"&&typeof D.componentWillMount!="function"||(typeof D.componentWillMount=="function"&&D.componentWillMount(),typeof D.UNSAFE_componentWillMount=="function"&&D.UNSAFE_componentWillMount()),typeof D.componentDidMount=="function"&&(m.flags|=4194308)):(typeof D.componentDidMount=="function"&&(m.flags|=4194308),m.memoizedProps=S,m.memoizedState=Ye),D.props=S,D.state=Ye,D.context=X,S=Ce):(typeof D.componentDidMount=="function"&&(m.flags|=4194308),S=!1)}else{D=m.stateNode,o2(h,m),X=m.memoizedProps,ct=Xd(_,X),D.props=ct,ft=m.pendingProps,Qe=D.context,Ye=_.contextType,Ce=Pf,typeof Ye=="object"&&Ye!==null&&(Ce=Vi(Ye)),le=_.getDerivedStateFromProps,(Ye=typeof le=="function"||typeof D.getSnapshotBeforeUpdate=="function")||typeof D.UNSAFE_componentWillReceiveProps!="function"&&typeof D.componentWillReceiveProps!="function"||(X!==ft||Qe!==Ce)&&_I(m,D,S,Ce),su=!1,Qe=m.memoizedState,D.state=Qe,zg(m,S,D,P),Ug();var st=m.memoizedState;X!==ft||Qe!==st||su||h!==null&&h.dependencies!==null&&My(h.dependencies)?(typeof le=="function"&&(k2(m,_,le,S),st=m.memoizedState),(ct=su||vI(m,_,ct,S,Qe,st,Ce)||h!==null&&h.dependencies!==null&&My(h.dependencies))?(Ye||typeof D.UNSAFE_componentWillUpdate!="function"&&typeof D.componentWillUpdate!="function"||(typeof D.componentWillUpdate=="function"&&D.componentWillUpdate(S,st,Ce),typeof D.UNSAFE_componentWillUpdate=="function"&&D.UNSAFE_componentWillUpdate(S,st,Ce)),typeof D.componentDidUpdate=="function"&&(m.flags|=4),typeof D.getSnapshotBeforeUpdate=="function"&&(m.flags|=1024)):(typeof D.componentDidUpdate!="function"||X===h.memoizedProps&&Qe===h.memoizedState||(m.flags|=4),typeof D.getSnapshotBeforeUpdate!="function"||X===h.memoizedProps&&Qe===h.memoizedState||(m.flags|=1024),m.memoizedProps=S,m.memoizedState=st),D.props=S,D.state=st,D.context=Ce,S=ct):(typeof D.componentDidUpdate!="function"||X===h.memoizedProps&&Qe===h.memoizedState||(m.flags|=4),typeof D.getSnapshotBeforeUpdate!="function"||X===h.memoizedProps&&Qe===h.memoizedState||(m.flags|=1024),S=!1)}return D=S,$y(h,m),S=(m.flags&128)!==0,D||S?(D=m.stateNode,_=S&&typeof _.getDerivedStateFromError!="function"?null:D.render(),m.flags|=1,h!==null&&S?(m.child=qd(m,h.child,null,P),m.child=qd(m,null,_,P)):Gi(h,m,_,P),m.memoizedState=D.state,h=m.child):h=$l(h,m,P),h}function LI(h,m,_,S){return Bd(),m.flags|=256,Gi(h,m,_,S),m.child}var O2={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function L2(h){return{baseLanes:h,cachePool:E4()}}function I2(h,m,_){return h=h!==null?h.childLanes&~_:0,m&&(h|=fs),h}function II(h,m,_){var S=m.pendingProps,P=!1,D=(m.flags&128)!==0,X;if((X=D)||(X=h!==null&&h.memoizedState===null?!1:(Hr.current&2)!==0),X&&(P=!0,m.flags&=-129),X=(m.flags&32)!==0,m.flags&=-33,h===null){if(Mn){if(P?cu(m):uu(),(h=ur)?(h=G5(h,Ls),h=h!==null&&h.data!=="&"?h:null,h!==null&&(m.memoizedState={dehydrated:h,treeContext:nu!==null?{id:Ko,overflow:Xo}:null,retryLane:536870912,hydrationErrors:null},_=g4(h),_.return=m,m.child=_,$i=m,ur=null)):h=null,h===null)throw iu(m);return yT(h)?m.lanes=32:m.lanes=536870912,null}var le=S.children;return S=S.fallback,P?(uu(),P=m.mode,le=Vy({mode:"hidden",children:le},P),S=zd(S,P,_,null),le.return=m,S.return=m,le.sibling=S,m.child=le,S=m.child,S.memoizedState=L2(_),S.childLanes=I2(h,X,_),m.memoizedState=O2,Gg(null,S)):(cu(m),F2(m,le))}var Ce=h.memoizedState;if(Ce!==null&&(le=Ce.dehydrated,le!==null)){if(D)m.flags&256?(cu(m),m.flags&=-257,m=U2(h,m,_)):m.memoizedState!==null?(uu(),m.child=h.child,m.flags|=128,m=null):(uu(),le=S.fallback,P=m.mode,S=Vy({mode:"visible",children:S.children},P),le=zd(le,P,_,null),le.flags|=2,S.return=m,le.return=m,S.sibling=le,m.child=S,qd(m,h.child,null,_),S=m.child,S.memoizedState=L2(_),S.childLanes=I2(h,X,_),m.memoizedState=O2,m=Gg(null,S));else if(cu(m),yT(le)){if(X=le.nextSibling&&le.nextSibling.dataset,X)var Ye=X.dgst;X=Ye,S=Error(r(419)),S.stack="",S.digest=X,Rg({value:S,source:null,stack:null}),m=U2(h,m,_)}else if(Qr||Of(h,m,_,!1),X=(_&h.childLanes)!==0,Qr||X){if(X=rr,X!==null&&(S=nn(X,_),S!==0&&S!==Ce.retryLane))throw Ce.retryLane=S,Ud(h,S),Va(X,h,S),R2;bT(le)||Jy(),m=U2(h,m,_)}else bT(le)?(m.flags|=192,m.child=h.child,m=null):(h=Ce.treeContext,ur=Fs(le.nextSibling),$i=m,Mn=!0,ru=null,Ls=!1,h!==null&&y4(m,h),m=F2(m,S.children),m.flags|=4096);return m}return P?(uu(),le=S.fallback,P=m.mode,Ce=h.child,Ye=Ce.sibling,S=Il(Ce,{mode:"hidden",children:S.children}),S.subtreeFlags=Ce.subtreeFlags&65011712,Ye!==null?le=Il(Ye,le):(le=zd(le,P,_,null),le.flags|=2),le.return=m,S.return=m,S.sibling=le,m.child=S,Gg(null,S),S=m.child,le=h.child.memoizedState,le===null?le=L2(_):(P=le.cachePool,P!==null?(Ce=Yr._currentValue,P=P.parent!==Ce?{parent:Ce,pool:Ce}:P):P=E4(),le={baseLanes:le.baseLanes|_,cachePool:P}),S.memoizedState=le,S.childLanes=I2(h,X,_),m.memoizedState=O2,Gg(h.child,S)):(cu(m),_=h.child,h=_.sibling,_=Il(_,{mode:"visible",children:S.children}),_.return=m,_.sibling=null,h!==null&&(X=m.deletions,X===null?(m.deletions=[h],m.flags|=16):X.push(h)),m.child=_,m.memoizedState=null,_)}function F2(h,m){return m=Vy({mode:"visible",children:m},h.mode),m.return=h,h.child=m}function Vy(h,m){return h=cs(22,h,null,m),h.lanes=0,h}function U2(h,m,_){return qd(m,h.child,null,_),h=F2(m,m.pendingProps.children),h.flags|=2,m.memoizedState=null,h}function FI(h,m,_){h.lanes|=m;var S=h.alternate;S!==null&&(S.lanes|=m),e2(h.return,m,_)}function z2(h,m,_,S,P,D){var X=h.memoizedState;X===null?h.memoizedState={isBackwards:m,rendering:null,renderingStartTime:0,last:S,tail:_,tailMode:P,treeForkCount:D}:(X.isBackwards=m,X.rendering=null,X.renderingStartTime=0,X.last=S,X.tail=_,X.tailMode=P,X.treeForkCount=D)}function UI(h,m,_){var S=m.pendingProps,P=S.revealOrder,D=S.tail;S=S.children;var X=Hr.current,le=(X&2)!==0;if(le?(X=X&1|2,m.flags|=128):X&=1,Z(Hr,X),Gi(h,m,S,_),S=Mn?jg:0,!le&&h!==null&&(h.flags&128)!==0)e:for(h=m.child;h!==null;){if(h.tag===13)h.memoizedState!==null&&FI(h,_,m);else if(h.tag===19)FI(h,_,m);else if(h.child!==null){h.child.return=h,h=h.child;continue}if(h===m)break e;for(;h.sibling===null;){if(h.return===null||h.return===m)break e;h=h.return}h.sibling.return=h.return,h=h.sibling}switch(P){case"forwards":for(_=m.child,P=null;_!==null;)h=_.alternate,h!==null&&jy(h)===null&&(P=_),_=_.sibling;_=P,_===null?(P=m.child,m.child=null):(P=_.sibling,_.sibling=null),z2(m,!1,P,_,D,S);break;case"backwards":case"unstable_legacy-backwards":for(_=null,P=m.child,m.child=null;P!==null;){if(h=P.alternate,h!==null&&jy(h)===null){m.child=P;break}h=P.sibling,P.sibling=_,_=P,P=h}z2(m,!0,_,null,D,S);break;case"together":z2(m,!1,null,null,void 0,S);break;default:m.memoizedState=null}return m.child}function $l(h,m,_){if(h!==null&&(m.dependencies=h.dependencies),fu|=m.lanes,(_&m.childLanes)===0)if(h!==null){if(Of(h,m,_,!1),(_&m.childLanes)===0)return null}else return null;if(h!==null&&m.child!==h.child)throw Error(r(153));if(m.child!==null){for(h=m.child,_=Il(h,h.pendingProps),m.child=_,_.return=m;h.sibling!==null;)h=h.sibling,_=_.sibling=Il(h,h.pendingProps),_.return=m;_.sibling=null}return m.child}function B2(h,m){return(h.lanes&m)!==0?!0:(h=h.dependencies,!!(h!==null&&My(h)))}function zne(h,m,_){switch(m.tag){case 3:Ae(m,m.stateNode.containerInfo),au(m,Yr,h.memoizedState.cache),Bd();break;case 27:case 5:ce(m);break;case 4:Ae(m,m.stateNode.containerInfo);break;case 10:au(m,m.type,m.memoizedProps.value);break;case 31:if(m.memoizedState!==null)return m.flags|=128,h2(m),null;break;case 13:var S=m.memoizedState;if(S!==null)return S.dehydrated!==null?(cu(m),m.flags|=128,null):(_&m.child.childLanes)!==0?II(h,m,_):(cu(m),h=$l(h,m,_),h!==null?h.sibling:null);cu(m);break;case 19:var P=(h.flags&128)!==0;if(S=(_&m.childLanes)!==0,S||(Of(h,m,_,!1),S=(_&m.childLanes)!==0),P){if(S)return UI(h,m,_);m.flags|=128}if(P=m.memoizedState,P!==null&&(P.rendering=null,P.tail=null,P.lastEffect=null),Z(Hr,Hr.current),S)break;return null;case 22:return m.lanes=0,PI(h,m,_,m.pendingProps);case 24:au(m,Yr,h.memoizedState.cache)}return $l(h,m,_)}function zI(h,m,_){if(h!==null)if(h.memoizedProps!==m.pendingProps)Qr=!0;else{if(!B2(h,_)&&(m.flags&128)===0)return Qr=!1,zne(h,m,_);Qr=(h.flags&131072)!==0}else Qr=!1,Mn&&(m.flags&1048576)!==0&&b4(m,jg,m.index);switch(m.lanes=0,m.tag){case 16:e:{var S=m.pendingProps;if(h=Gd(m.elementType),m.type=h,typeof h=="function")WE(h)?(S=Xd(h,S),m.tag=1,m=OI(null,m,h,S,_)):(m.tag=0,m=D2(null,m,h,S,_));else{if(h!=null){var P=h.$$typeof;if(P===T){m.tag=11,m=NI(null,m,h,S,_);break e}else if(P===N){m.tag=14,m=CI(null,m,h,S,_);break e}}throw m=j(h)||h,Error(r(306,m,""))}}return m;case 0:return D2(h,m,m.type,m.pendingProps,_);case 1:return S=m.type,P=Xd(S,m.pendingProps),OI(h,m,S,P,_);case 3:e:{if(Ae(m,m.stateNode.containerInfo),h===null)throw Error(r(387));S=m.pendingProps;var D=m.memoizedState;P=D.element,o2(h,m),zg(m,S,null,_);var X=m.memoizedState;if(S=X.cache,au(m,Yr,S),S!==D.cache&&t2(m,[Yr],_,!0),Ug(),S=X.element,D.isDehydrated)if(D={element:S,isDehydrated:!1,cache:X.cache},m.updateQueue.baseState=D,m.memoizedState=D,m.flags&256){m=LI(h,m,S,_);break e}else if(S!==P){P=Rs(Error(r(424)),m),Rg(P),m=LI(h,m,S,_);break e}else{switch(h=m.stateNode.containerInfo,h.nodeType){case 9:h=h.body;break;default:h=h.nodeName==="HTML"?h.ownerDocument.body:h}for(ur=Fs(h.firstChild),$i=m,Mn=!0,ru=null,Ls=!0,_=P4(m,null,S,_),m.child=_;_;)_.flags=_.flags&-3|4096,_=_.sibling}else{if(Bd(),S===P){m=$l(h,m,_);break e}Gi(h,m,S,_)}m=m.child}return m;case 26:return $y(h,m),h===null?(_=Z5(m.type,null,m.pendingProps,null))?m.memoizedState=_:Mn||(_=m.type,h=m.pendingProps,S=sv(de.current).createElement(_),S[wr]=m,S[zr]=h,Wi(S,_,h),Ie(S),m.stateNode=S):m.memoizedState=Z5(m.type,h.memoizedProps,m.pendingProps,h.memoizedState),null;case 27:return ce(m),h===null&&Mn&&(S=m.stateNode=K5(m.type,m.pendingProps,de.current),$i=m,Ls=!0,P=ur,bu(m.type)?(vT=P,ur=Fs(S.firstChild)):ur=P),Gi(h,m,m.pendingProps.children,_),$y(h,m),h===null&&(m.flags|=4194304),m.child;case 5:return h===null&&Mn&&((P=S=ur)&&(S=gre(S,m.type,m.pendingProps,Ls),S!==null?(m.stateNode=S,$i=m,ur=Fs(S.firstChild),Ls=!1,P=!0):P=!1),P||iu(m)),ce(m),P=m.type,D=m.pendingProps,X=h!==null?h.memoizedProps:null,S=D.children,pT(P,D)?S=null:X!==null&&pT(P,X)&&(m.flags|=32),m.memoizedState!==null&&(P=m2(h,m,Pne,null,null,_),sx._currentValue=P),$y(h,m),Gi(h,m,S,_),m.child;case 6:return h===null&&Mn&&((h=_=ur)&&(_=xre(_,m.pendingProps,Ls),_!==null?(m.stateNode=_,$i=m,ur=null,h=!0):h=!1),h||iu(m)),null;case 13:return II(h,m,_);case 4:return Ae(m,m.stateNode.containerInfo),S=m.pendingProps,h===null?m.child=qd(m,null,S,_):Gi(h,m,S,_),m.child;case 11:return NI(h,m,m.type,m.pendingProps,_);case 7:return Gi(h,m,m.pendingProps,_),m.child;case 8:return Gi(h,m,m.pendingProps.children,_),m.child;case 12:return Gi(h,m,m.pendingProps.children,_),m.child;case 10:return S=m.pendingProps,au(m,m.type,S.value),Gi(h,m,S.children,_),m.child;case 9:return P=m.type._context,S=m.pendingProps.children,$d(m),P=Vi(P),S=S(P),m.flags|=1,Gi(h,m,S,_),m.child;case 14:return CI(h,m,m.type,m.pendingProps,_);case 15:return kI(h,m,m.type,m.pendingProps,_);case 19:return UI(h,m,_);case 31:return Une(h,m,_);case 22:return PI(h,m,_,m.pendingProps);case 24:return $d(m),S=Vi(Yr),h===null?(P=i2(),P===null&&(P=rr,D=n2(),P.pooledCache=D,D.refCount++,D!==null&&(P.pooledCacheLanes|=_),P=D),m.memoizedState={parent:S,cache:P},s2(m),au(m,Yr,P)):((h.lanes&_)!==0&&(o2(h,m),zg(m,null,null,_),Ug()),P=h.memoizedState,D=m.memoizedState,P.parent!==S?(P={parent:S,cache:S},m.memoizedState=P,m.lanes===0&&(m.memoizedState=m.updateQueue.baseState=P),au(m,Yr,S)):(S=D.cache,au(m,Yr,S),S!==P.cache&&t2(m,[Yr],_,!0))),Gi(h,m,m.pendingProps.children,_),m.child;case 29:throw m.pendingProps}throw Error(r(156,m.tag))}function Vl(h){h.flags|=4}function H2(h,m,_,S,P){if((m=(h.mode&32)!==0)&&(m=!1),m){if(h.flags|=16777216,(P&335544128)===P)if(h.stateNode.complete)h.flags|=8192;else if(f5())h.flags|=8192;else throw Wd=Ny,a2}else h.flags&=-16777217}function BI(h,m){if(m.type!=="stylesheet"||(m.state.loading&4)!==0)h.flags&=-16777217;else if(h.flags|=16777216,!nF(m))if(f5())h.flags|=8192;else throw Wd=Ny,a2}function Gy(h,m){m!==null&&(h.flags|=4),h.flags&16384&&(m=h.tag!==22?Se():536870912,h.lanes|=m,qf|=m)}function Wg(h,m){if(!Mn)switch(h.tailMode){case"hidden":m=h.tail;for(var _=null;m!==null;)m.alternate!==null&&(_=m),m=m.sibling;_===null?h.tail=null:_.sibling=null;break;case"collapsed":_=h.tail;for(var S=null;_!==null;)_.alternate!==null&&(S=_),_=_.sibling;S===null?m||h.tail===null?h.tail=null:h.tail.sibling=null:S.sibling=null}}function dr(h){var m=h.alternate!==null&&h.alternate.child===h.child,_=0,S=0;if(m)for(var P=h.child;P!==null;)_|=P.lanes|P.childLanes,S|=P.subtreeFlags&65011712,S|=P.flags&65011712,P.return=h,P=P.sibling;else for(P=h.child;P!==null;)_|=P.lanes|P.childLanes,S|=P.subtreeFlags,S|=P.flags,P.return=h,P=P.sibling;return h.subtreeFlags|=S,h.childLanes=_,m}function Bne(h,m,_){var S=m.pendingProps;switch(YE(m),m.tag){case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return dr(m),null;case 1:return dr(m),null;case 3:return _=m.stateNode,S=null,h!==null&&(S=h.memoizedState.cache),m.memoizedState.cache!==S&&(m.flags|=2048),zl(Yr),me(),_.pendingContext&&(_.context=_.pendingContext,_.pendingContext=null),(h===null||h.child===null)&&(Df(m)?Vl(m):h===null||h.memoizedState.isDehydrated&&(m.flags&256)===0||(m.flags|=1024,QE())),dr(m),null;case 26:var P=m.type,D=m.memoizedState;return h===null?(Vl(m),D!==null?(dr(m),BI(m,D)):(dr(m),H2(m,P,null,S,_))):D?D!==h.memoizedState?(Vl(m),dr(m),BI(m,D)):(dr(m),m.flags&=-16777217):(h=h.memoizedProps,h!==S&&Vl(m),dr(m),H2(m,P,h,S,_)),null;case 27:if(Pe(m),_=de.current,P=m.type,h!==null&&m.stateNode!=null)h.memoizedProps!==S&&Vl(m);else{if(!S){if(m.stateNode===null)throw Error(r(166));return dr(m),null}h=te.current,Df(m)?v4(m):(h=K5(P,S,_),m.stateNode=h,Vl(m))}return dr(m),null;case 5:if(Pe(m),P=m.type,h!==null&&m.stateNode!=null)h.memoizedProps!==S&&Vl(m);else{if(!S){if(m.stateNode===null)throw Error(r(166));return dr(m),null}if(D=te.current,Df(m))v4(m);else{var X=sv(de.current);switch(D){case 1:D=X.createElementNS("http://www.w3.org/2000/svg",P);break;case 2:D=X.createElementNS("http://www.w3.org/1998/Math/MathML",P);break;default:switch(P){case"svg":D=X.createElementNS("http://www.w3.org/2000/svg",P);break;case"math":D=X.createElementNS("http://www.w3.org/1998/Math/MathML",P);break;case"script":D=X.createElement("div"),D.innerHTML=" - - - -
- - - - - diff --git a/static/manifest.json b/static/manifest.json deleted file mode 100644 index 48eb8eef3..000000000 --- a/static/manifest.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "name": "Bambuddy", - "short_name": "Bambuddy", - "description": "Monitor and manage your Bambu Lab 3D printers", - "start_url": "/", - "display": "standalone", - "background_color": "#1a1a1a", - "theme_color": "#00ae42", - "orientation": "any", - "scope": "/", - "icons": [ - { - "src": "/img/favicon-16x16.png", - "sizes": "16x16", - "type": "image/png" - }, - { - "src": "/img/favicon-32x32.png", - "sizes": "32x32", - "type": "image/png" - }, - { - "src": "/img/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png", - "purpose": "any" - }, - { - "src": "/img/android-chrome-512x512.png", - "sizes": "512x512", - "type": "image/png", - "purpose": "any" - }, - { - "src": "/img/apple-touch-icon.png", - "sizes": "180x180", - "type": "image/png", - "purpose": "any maskable" - } - ], - "categories": ["utilities", "productivity"], - "shortcuts": [ - { - "name": "Printers", - "short_name": "Printers", - "description": "View your printers", - "url": "/", - "icons": [{ "src": "/img/android-chrome-192x192.png", "sizes": "192x192" }] - }, - { - "name": "Archives", - "short_name": "Archives", - "description": "View print archives", - "url": "/archives", - "icons": [{ "src": "/img/android-chrome-192x192.png", "sizes": "192x192" }] - }, - { - "name": "Queue", - "short_name": "Queue", - "description": "View print queue", - "url": "/queue", - "icons": [{ "src": "/img/android-chrome-192x192.png", "sizes": "192x192" }] - }, - { - "name": "Projects", - "short_name": "Projects", - "description": "View print projects", - "url": "/projects", - "icons": [{ "src": "/img/android-chrome-192x192.png", "sizes": "192x192" }] - } - ] -} diff --git a/static/sw.js b/static/sw.js deleted file mode 100644 index ffa84f9fd..000000000 --- a/static/sw.js +++ /dev/null @@ -1,199 +0,0 @@ -// Bambuddy Service Worker -const CACHE_NAME = 'bambuddy-v4'; -const STATIC_CACHE = 'bambuddy-static-v4'; - -// Static assets to cache on install -const STATIC_ASSETS = [ - '/', - '/manifest.json', - '/img/favicon.png', - '/img/favicon-16x16.png', - '/img/favicon-32x32.png', - '/img/android-chrome-192x192.png', - '/img/android-chrome-512x512.png', - '/img/apple-touch-icon.png', - '/img/bambuddy_logo_dark.png', -]; - -// Install event - cache static assets -self.addEventListener('install', (event) => { - console.log('[SW] Installing service worker...'); - event.waitUntil( - caches.open(STATIC_CACHE).then((cache) => { - console.log('[SW] Caching static assets'); - return cache.addAll(STATIC_ASSETS); - }) - ); - // Activate immediately - self.skipWaiting(); -}); - -// Activate event - clean up old caches -self.addEventListener('activate', (event) => { - console.log('[SW] Activating service worker...'); - event.waitUntil( - caches.keys().then((cacheNames) => { - return Promise.all( - cacheNames - .filter((name) => name !== CACHE_NAME && name !== STATIC_CACHE) - .map((name) => { - console.log('[SW] Deleting old cache:', name); - return caches.delete(name); - }) - ); - }) - ); - // Take control immediately - self.clients.claim(); -}); - -// Fetch event - network-first for API, cache-first for static -self.addEventListener('fetch', (event) => { - const { request } = event; - const url = new URL(request.url); - - // Skip non-GET requests - if (request.method !== 'GET') { - return; - } - - // Skip WebSocket connections - if (url.protocol === 'ws:' || url.protocol === 'wss:') { - return; - } - - // API requests - network first, no cache (real-time data is critical) - if (url.pathname.startsWith('/api/')) { - event.respondWith( - fetch(request).catch(() => { - // Return offline response for API failures - return new Response( - JSON.stringify({ error: 'offline', message: 'You are currently offline' }), - { - status: 503, - headers: { 'Content-Type': 'application/json' }, - } - ); - }) - ); - return; - } - - // Static assets - cache first, then network - if ( - url.pathname.startsWith('/img/') || - url.pathname.startsWith('/icons/') || - url.pathname.endsWith('.png') || - url.pathname.endsWith('.jpg') || - url.pathname.endsWith('.svg') || - url.pathname.endsWith('.ico') - ) { - event.respondWith( - caches.match(request).then((cached) => { - if (cached) { - return cached; - } - return fetch(request).then((response) => { - // Cache successful responses - if (response.ok) { - const clone = response.clone(); - caches.open(STATIC_CACHE).then((cache) => { - cache.put(request, clone); - }); - } - return response; - }); - }) - ); - return; - } - - // JS/CSS assets - stale-while-revalidate - if ( - url.pathname.startsWith('/assets/') || - url.pathname.endsWith('.js') || - url.pathname.endsWith('.css') - ) { - event.respondWith( - caches.match(request).then((cached) => { - const fetchPromise = fetch(request).then((response) => { - if (response.ok) { - const clone = response.clone(); - caches.open(CACHE_NAME).then((cache) => { - cache.put(request, clone); - }); - } - return response; - }); - return cached || fetchPromise; - }) - ); - return; - } - - // HTML pages - network first, fall back to cache - event.respondWith( - fetch(request) - .then((response) => { - if (response.ok) { - const clone = response.clone(); - caches.open(CACHE_NAME).then((cache) => { - cache.put(request, clone); - }); - } - return response; - }) - .catch(() => { - return caches.match(request).then((cached) => { - if (cached) { - return cached; - } - // Return cached index for SPA navigation - return caches.match('/'); - }); - }) - ); -}); - -// Handle push notifications (for future use) -self.addEventListener('push', (event) => { - if (!event.data) return; - - const data = event.data.json(); - const options = { - body: data.body || 'New notification from Bambuddy', - icon: '/img/android-chrome-192x192.png', - badge: '/img/favicon-32x32.png', - vibrate: [100, 50, 100], - data: { - url: data.url || '/', - }, - }; - - event.waitUntil( - self.registration.showNotification(data.title || 'Bambuddy', options) - ); -}); - -// Handle notification clicks -self.addEventListener('notificationclick', (event) => { - event.notification.close(); - - const url = event.notification.data?.url || '/'; - - event.waitUntil( - clients.matchAll({ type: 'window', includeUncontrolled: true }).then((windowClients) => { - // Check if there's already a window open - for (const client of windowClients) { - if (client.url.includes(self.location.origin) && 'focus' in client) { - client.navigate(url); - return client.focus(); - } - } - // Open a new window if none exists - if (clients.openWindow) { - return clients.openWindow(url); - } - }) - ); -}); diff --git a/static/vite.svg b/static/vite.svg deleted file mode 100644 index e7b8dfb1b..000000000 --- a/static/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file