diff --git a/.app_version b/.app_version index d2b13eb6..faef31a4 100644 --- a/.app_version +++ b/.app_version @@ -1 +1 @@ -0.6.4 +0.7.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index 27903a9a..11589f3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,31 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## [0.7.0] — 2024-06-19 + +## The GPX MVP Release + +This release introduces support for GPX files to be imported. Now you can import GPX files from your devices to Dawarich. The import process is the same as for other kinds of files, just select the GPX file instead and choose "gpx" as a source. Both single-segmented and multi-segmented GPX files are supported. + +⚠️ BREAKING CHANGES: ⚠️ + +- `/api/v1/points` endpoint is removed. Please use `/api/v1/owntracks/points` endpoint to upload your points from OwnTracks mobile app instead. + +### Added + +- Support for GPX files to be imported. + +### Changed + +- Couple of unnecessary params were hidden from route popup and now can be shown using `?debug=true` query parameter. This is useful for debugging purposes. + +### Removed + +- `/exports/download` endpoint is removed. Now you can download your exports directly from the Exports page. +- `/api/v1/points` endpoint is removed. + +--- + ## [0.6.4] — 2024-06-18 ### Added diff --git a/app/assets/builds/tailwind.css b/app/assets/builds/tailwind.css index 7828a28d..49bf9ca8 100644 --- a/app/assets/builds/tailwind.css +++ b/app/assets/builds/tailwind.css @@ -1 +1 @@ -/*! tailwindcss v3.4.4 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:Inter var,ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}:root,[data-theme]{background-color:var(--fallback-b1,oklch(var(--b1)/1));color:var(--fallback-bc,oklch(var(--bc)/1))}@supports not (color:oklch(0 0 0)){:root{--fallback-p:#491eff;--fallback-pc:#d4dbff;--fallback-s:#ff41c7;--fallback-sc:#fff9fc;--fallback-a:#00cfbd;--fallback-ac:#00100d;--fallback-n:#2b3440;--fallback-nc:#d7dde4;--fallback-b1:#fff;--fallback-b2:#e5e6e6;--fallback-b3:#e5e6e6;--fallback-bc:#1f2937;--fallback-in:#00b3f0;--fallback-inc:#000;--fallback-su:#00ca92;--fallback-suc:#000;--fallback-wa:#ffc22d;--fallback-wac:#000;--fallback-er:#ff6f70;--fallback-erc:#000;color-scheme:light}@media (prefers-color-scheme:dark){:root{--fallback-p:#7582ff;--fallback-pc:#050617;--fallback-s:#ff71cf;--fallback-sc:#190211;--fallback-a:#00c7b5;--fallback-ac:#000e0c;--fallback-n:#2a323c;--fallback-nc:#a6adbb;--fallback-b1:#1d232a;--fallback-b2:#191e24;--fallback-b3:#15191e;--fallback-bc:#a6adbb;--fallback-in:#00b3f0;--fallback-inc:#000;--fallback-su:#00ca92;--fallback-suc:#000;--fallback-wa:#ffc22d;--fallback-wac:#000;--fallback-er:#ff6f70;--fallback-erc:#000;color-scheme:dark}}}html{-webkit-tap-highlight-color:transparent}:root{--in:0.7206 0.191 231.6;--su:64.8% 0.150 160;--wa:0.8471 0.199 83.87;--er:0.7176 0.221 22.18;--pc:0.89824 0.06192 275.75;--ac:0.15352 0.0368 183.61;--inc:0 0 0;--suc:0 0 0;--wac:0 0 0;--erc:0 0 0;--rounded-box:1rem;--rounded-btn:0.5rem;--rounded-badge:1.9rem;--animation-btn:0.25s;--animation-input:.2s;--btn-focus-scale:0.95;--border-btn:1px;--tab-border:1px;--tab-radius:0.5rem;--p:0.4912 0.3096 275.75;--s:0.6971 0.329 342.55;--sc:0.9871 0.0106 342.55;--a:0.7676 0.184 183.61;--n:0.321785 0.02476 255.701624;--nc:0.894994 0.011585 252.096176;--b1:1 0 0;--b2:0.961151 0 0;--b3:0.924169 0.00108 197.137559;--bc:0.278078 0.029596 256.847952;color-scheme:light}@media (prefers-color-scheme:dark){:root{--in:0.7206 0.191 231.6;--su:64.8% 0.150 160;--wa:0.8471 0.199 83.87;--er:0.7176 0.221 22.18;--pc:0.13138 0.0392 275.75;--sc:0.1496 0.052 342.55;--ac:0.14902 0.0334 183.61;--inc:0 0 0;--suc:0 0 0;--wac:0 0 0;--erc:0 0 0;--rounded-box:1rem;--rounded-btn:0.5rem;--rounded-badge:1.9rem;--animation-btn:0.25s;--animation-input:.2s;--btn-focus-scale:0.95;--border-btn:1px;--tab-border:1px;--tab-radius:0.5rem;--p:0.6569 0.196 275.75;--s:0.748 0.26 342.55;--a:0.7451 0.167 183.61;--n:0.313815 0.021108 254.139175;--nc:0.746477 0.0216 264.435964;--b1:0.253267 0.015896 252.417568;--b2:0.232607 0.013807 253.100675;--b3:0.211484 0.01165 254.087939;--bc:0.746477 0.0216 264.435964;color-scheme:dark}}[data-theme=light]{--in:0.7206 0.191 231.6;--su:64.8% 0.150 160;--wa:0.8471 0.199 83.87;--er:0.7176 0.221 22.18;--pc:0.89824 0.06192 275.75;--ac:0.15352 0.0368 183.61;--inc:0 0 0;--suc:0 0 0;--wac:0 0 0;--erc:0 0 0;--rounded-box:1rem;--rounded-btn:0.5rem;--rounded-badge:1.9rem;--animation-btn:0.25s;--animation-input:.2s;--btn-focus-scale:0.95;--border-btn:1px;--tab-border:1px;--tab-radius:0.5rem;--p:0.4912 0.3096 275.75;--s:0.6971 0.329 342.55;--sc:0.9871 0.0106 342.55;--a:0.7676 0.184 183.61;--n:0.321785 0.02476 255.701624;--nc:0.894994 0.011585 252.096176;--b1:1 0 0;--b2:0.961151 0 0;--b3:0.924169 0.00108 197.137559;--bc:0.278078 0.029596 256.847952;color-scheme:light}[data-theme=dark]{--in:0.7206 0.191 231.6;--su:64.8% 0.150 160;--wa:0.8471 0.199 83.87;--er:0.7176 0.221 22.18;--pc:0.13138 0.0392 275.75;--sc:0.1496 0.052 342.55;--ac:0.14902 0.0334 183.61;--inc:0 0 0;--suc:0 0 0;--wac:0 0 0;--erc:0 0 0;--rounded-box:1rem;--rounded-btn:0.5rem;--rounded-badge:1.9rem;--animation-btn:0.25s;--animation-input:.2s;--btn-focus-scale:0.95;--border-btn:1px;--tab-border:1px;--tab-radius:0.5rem;--p:0.6569 0.196 275.75;--s:0.748 0.26 342.55;--a:0.7451 0.167 183.61;--n:0.313815 0.021108 254.139175;--nc:0.746477 0.0216 264.435964;--b1:0.253267 0.015896 252.417568;--b2:0.232607 0.013807 253.100675;--b3:0.211484 0.01165 254.087939;--bc:0.746477 0.0216 264.435964;color-scheme:dark}[multiple],[type=date],[type=datetime-local],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],select,textarea{--tw-shadow:0 0 #0000;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}[multiple]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,select:focus,textarea:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}input::-moz-placeholder,textarea::-moz-placeholder{color:#6b7280;opacity:1}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em}::-webkit-datetime-edit,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-year-field{padding-bottom:0;padding-top:0}select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple]{background-image:none;background-position:0 0;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}[type=checkbox],[type=radio]{--tw-shadow:0 0 #0000;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#6b7280;border-width:1px;color:#2563eb;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:1rem}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}[type=checkbox]:checked,[type=radio]:checked{background-color:currentColor;background-position:50%;background-repeat:no-repeat;background-size:100% 100%;border-color:#0000}[type=checkbox]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 16 16'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0z'/%3E%3C/svg%3E")}[type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}[type=checkbox]:checked:focus,[type=checkbox]:checked:hover,[type=checkbox]:indeterminate,[type=radio]:checked:focus,[type=radio]:checked:hover{background-color:currentColor;border-color:#0000}[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}[type=checkbox]:indeterminate:focus,[type=checkbox]:indeterminate:hover{background-color:currentColor;border-color:#0000}[type=file]{background:unset;border-color:inherit;border-radius:0;border-width:0;font-size:unset;line-height:inherit;padding:0}[type=file]:focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.alert{--tw-border-opacity:1;--tw-text-opacity:1;--alert-bg:var(--fallback-b2,oklch(var(--b2)/1));--alert-bg-mix:var(--fallback-b1,oklch(var(--b1)/1));align-content:flex-start;align-items:center;background-color:var(--alert-bg);border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));border-radius:var(--rounded-box,1rem);border-width:1px;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));display:grid;gap:1rem;grid-auto-flow:row;justify-items:center;padding:1rem;text-align:center;width:100%}@media (min-width:640px){.alert{grid-auto-flow:column;grid-template-columns:auto minmax(auto,1fr);justify-items:start;text-align:start}}.badge{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));border-radius:var(--rounded-badge,1.9rem);border-width:1px;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));display:inline-flex;font-size:.875rem;height:1.25rem;justify-content:center;line-height:1.25rem;padding-left:.563rem;padding-right:.563rem;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:-moz-fit-content;width:fit-content}@media (hover:hover){.label a:hover{--tw-text-opacity:1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.menu li>:not(ul,.menu-title,details,.btn).active,.menu li>:not(ul,.menu-title,details,.btn):active,.menu li>details>summary:active{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.tab:hover{--tw-text-opacity:1}.tabs-boxed .tab-active:not(.tab-disabled):not([disabled]):hover,.tabs-boxed :is(input:checked):hover{--tw-text-opacity:1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.table tr.hover:hover,.table tr.hover:nth-child(2n):hover{--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.table-zebra tr.hover:hover,.table-zebra tr.hover:nth-child(2n):hover{--tw-bg-opacity:1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}}.btn{--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-bg-opacity:1;--tw-border-opacity:1;align-items:center;animation:button-pop var(--animation-btn,.25s) ease-out;background-color:oklch(var(--btn-color,var(--b2))/var(--tw-bg-opacity));border-color:#0000;border-color:oklch(var(--btn-color,var(--b2))/var(--tw-border-opacity));border-radius:var(--rounded-btn,.5rem);border-width:var(--border-btn,1px);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));cursor:pointer;display:inline-flex;flex-shrink:0;flex-wrap:wrap;font-size:.875rem;font-weight:600;gap:.5rem;height:3rem;justify-content:center;line-height:1em;min-height:3rem;outline-color:var(--fallback-bc,oklch(var(--bc)/1));padding-left:1rem;padding-right:1rem;text-align:center;text-decoration-line:none;transition-duration:.2s;transition-property:color,background-color,border-color,opacity,box-shadow,transform;transition-timing-function:cubic-bezier(0,0,.2,1);-webkit-user-select:none;-moz-user-select:none;user-select:none}.btn-disabled,.btn:disabled,.btn[disabled]{pointer-events:none}:where(.btn:is(input[type=checkbox])),:where(.btn:is(input[type=radio])){-webkit-appearance:none;-moz-appearance:none;appearance:none;width:auto}.btn:is(input[type=checkbox]):after,.btn:is(input[type=radio]):after{--tw-content:attr(aria-label);content:var(--tw-content)}.card{border-radius:var(--rounded-box,1rem);display:flex;flex-direction:column;position:relative}.card:focus{outline:2px solid #0000;outline-offset:2px}.card-body{display:flex;flex:1 1 auto;flex-direction:column;gap:.5rem;padding:var(--padding-card,2rem)}.card-body :where(p){flex-grow:1}.card-actions{align-items:flex-start;display:flex;flex-wrap:wrap;gap:.5rem}.card figure{align-items:center;display:flex;justify-content:center}.card.image-full{display:grid}.card.image-full:before{--tw-bg-opacity:1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));border-radius:var(--rounded-box,1rem);content:"";opacity:.75;position:relative;z-index:10}.card.image-full:before,.card.image-full>*{grid-column-start:1;grid-row-start:1}.card.image-full>figure img{height:100%;-o-object-fit:cover;object-fit:cover}.card.image-full>.card-body{--tw-text-opacity:1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));position:relative;z-index:20}.checkbox{--chkbg:var(--fallback-bc,oklch(var(--bc)/1));--chkfg:var(--fallback-b1,oklch(var(--b1)/1));--tw-border-opacity:0.2;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));border-radius:var(--rounded-btn,.5rem);border-width:1px;cursor:pointer;flex-shrink:0;height:1.5rem;width:1.5rem}.dropdown{display:inline-block;position:relative}.dropdown>:not(summary):focus{outline:2px solid #0000;outline-offset:2px}.dropdown .dropdown-content{position:absolute}.dropdown:is(:not(details)) .dropdown-content{--tw-scale-x:.95;--tw-scale-y:.95;opacity:0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transform-origin:top;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);visibility:hidden}.dropdown-end .dropdown-content{inset-inline-end:0}.dropdown-left .dropdown-content{bottom:auto;inset-inline-end:100%;top:0;transform-origin:right}.dropdown-right .dropdown-content{bottom:auto;inset-inline-start:100%;top:0;transform-origin:left}.dropdown-bottom .dropdown-content{bottom:auto;top:100%;transform-origin:top}.dropdown-top .dropdown-content{bottom:100%;top:auto;transform-origin:bottom}.dropdown-end.dropdown-left .dropdown-content,.dropdown-end.dropdown-right .dropdown-content{bottom:0;top:auto}.dropdown.dropdown-open .dropdown-content,.dropdown:focus-within .dropdown-content,.dropdown:not(.dropdown-hover):focus .dropdown-content{opacity:1;visibility:visible}@media (hover:hover){.dropdown.dropdown-hover:hover .dropdown-content{opacity:1;visibility:visible}.btn:hover{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));border-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn:hover{background-color:color-mix(in oklab,oklch(var(--btn-color,var(--b2))/var(--tw-bg-opacity,1)) 90%,#000);border-color:color-mix(in oklab,oklch(var(--btn-color,var(--b2))/var(--tw-border-opacity,1)) 90%,#000)}}@supports not (color:oklch(0 0 0)){.btn:hover{background-color:var(--btn-color,var(--fallback-b2));border-color:var(--btn-color,var(--fallback-b2))}}.btn.glass:hover{--glass-opacity:25%;--glass-border-opacity:15%}.btn-ghost:hover{border-color:#0000}@supports (color:oklch(0 0 0)){.btn-ghost:hover{background-color:var(--fallback-bc,oklch(var(--bc)/.2))}}.btn-outline:hover{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));color:var(--fallback-b1,oklch(var(--b1)/var(--tw-text-opacity)))}.btn-outline.btn-primary:hover{--tw-text-opacity:1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn-outline.btn-primary:hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000)}}.btn-outline.btn-secondary:hover{--tw-text-opacity:1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn-outline.btn-secondary:hover{background-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,#000)}}.btn-outline.btn-accent:hover{--tw-text-opacity:1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn-outline.btn-accent:hover{background-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,#000)}}.btn-outline.btn-success:hover{--tw-text-opacity:1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn-outline.btn-success:hover{background-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,#000)}}.btn-outline.btn-info:hover{--tw-text-opacity:1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn-outline.btn-info:hover{background-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,#000)}}.btn-outline.btn-warning:hover{--tw-text-opacity:1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn-outline.btn-warning:hover{background-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,#000)}}.btn-outline.btn-error:hover{--tw-text-opacity:1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn-outline.btn-error:hover{background-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,#000)}}.btn-disabled:hover,.btn:disabled:hover,.btn[disabled]:hover{--tw-border-opacity:0;--tw-bg-opacity:0.2;--tw-text-opacity:0.2;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn:is(input[type=checkbox]:checked):hover,.btn:is(input[type=radio]:checked):hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000)}}.dropdown.dropdown-hover:hover .dropdown-content{--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:where(.menu li:not(.menu-title,.disabled)>:not(ul,details,.menu-title)):not(.active,.btn):hover,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.active,.btn):hover{cursor:pointer;outline:2px solid #0000;outline-offset:2px}@supports (color:oklch(0 0 0)){:where(.menu li:not(.menu-title,.disabled)>:not(ul,details,.menu-title)):not(.active,.btn):hover,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.active,.btn):hover{background-color:var(--fallback-bc,oklch(var(--bc)/.1))}}.tab[disabled],.tab[disabled]:hover{--tw-text-opacity:0.2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));cursor:not-allowed}}.dropdown:is(details) summary::-webkit-details-marker{display:none}.file-input{--tw-border-opacity:0;--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));border-radius:var(--rounded-btn,.5rem);border-width:1px;flex-shrink:1;font-size:1rem;height:3rem;line-height:2;line-height:1.5rem;overflow:hidden;padding-inline-end:1rem}.file-input::file-selector-button{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;animation:button-pop var(--animation-btn,.25s) ease-out;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));border-color:var(--fallback-n,oklch(var(--n)/var(--tw-border-opacity)));border-style:solid;border-width:var(--border-btn,1px);color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));cursor:pointer;display:inline-flex;flex-shrink:0;flex-wrap:wrap;font-size:.875rem;font-weight:600;height:100%;justify-content:center;line-height:1.25rem;line-height:1em;margin-inline-end:1rem;padding-left:1rem;padding-right:1rem;text-align:center;text-decoration-line:none;text-transform:uppercase;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);-webkit-user-select:none;-moz-user-select:none;user-select:none}.footer{-moz-column-gap:1rem;column-gap:1rem;font-size:.875rem;grid-auto-flow:row;line-height:1.25rem;row-gap:2.5rem;width:100%}.footer,.footer>*{display:grid;place-items:start}.footer>*{gap:.5rem}.footer-center{text-align:center}.footer-center,.footer-center>*{place-items:center}@media (min-width:48rem){.footer{grid-auto-flow:column}.footer-center{grid-auto-flow:row dense}}.form-control{flex-direction:column}.form-control,.label{display:flex}.label{align-items:center;justify-content:space-between;padding:.5rem .25rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.hero{background-position:50%;background-size:cover;display:grid;place-items:center;width:100%}.hero>*{grid-column-start:1;grid-row-start:1}.hero-content{align-items:center;display:flex;gap:1rem;justify-content:center;max-width:80rem;padding:1rem;z-index:0}.input{--tw-bg-opacity:1;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));border-color:#0000;border-radius:var(--rounded-btn,.5rem);border-width:1px;flex-shrink:1;font-size:1rem;height:3rem;line-height:2;line-height:1.5rem;padding-left:1rem;padding-right:1rem}.input-md[type=number]::-webkit-inner-spin-button,.input[type=number]::-webkit-inner-spin-button{margin-bottom:-1rem;margin-top:-1rem;margin-inline-end:-1rem}.join .dropdown .join-item:first-child:not(:last-child),.join :first-child:not(:last-child) .dropdown .join-item{border-end-end-radius:inherit;border-start-end-radius:inherit}.link{cursor:pointer;text-decoration-line:underline}.menu{display:flex;flex-direction:column;flex-wrap:wrap;font-size:.875rem;line-height:1.25rem;padding:.5rem}.menu :where(li ul){margin-inline-start:1rem;padding-inline-start:.5rem;position:relative;white-space:nowrap}.menu :where(li:not(.menu-title)>:not(ul,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){align-content:flex-start;align-items:center;display:grid;gap:.5rem;grid-auto-columns:minmax(auto,max-content) auto max-content;grid-auto-flow:column;-webkit-user-select:none;-moz-user-select:none;user-select:none}.menu li.disabled{color:var(--fallback-bc,oklch(var(--bc)/.3));cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;user-select:none}.menu :where(li>.menu-dropdown:not(.menu-dropdown-show)){display:none}:where(.menu li){align-items:stretch;display:flex;flex-direction:column;flex-shrink:0;flex-wrap:wrap;position:relative}:where(.menu li) .badge{justify-self:end}.mockup-code{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));border-radius:var(--rounded-box,1rem);color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));direction:ltr;min-width:18rem;overflow:hidden;overflow-x:auto;padding-bottom:1.25rem;padding-top:1.25rem;position:relative}.mockup-code pre[data-prefix]:before{content:attr(data-prefix);display:inline-block;opacity:.5;text-align:right;width:2rem}.modal{background-color:initial;color:inherit;display:grid;height:100%;inset:0;justify-items:center;margin:0;max-height:none;max-width:none;opacity:0;overflow-y:hidden;overscroll-behavior:contain;padding:0;pointer-events:none;position:fixed;transition-duration:.2s;transition-property:transform,opacity,visibility;transition-timing-function:cubic-bezier(0,0,.2,1);width:100%;z-index:999}:where(.modal){align-items:center}.modal-box{--tw-scale-x:.9;--tw-scale-y:.9;--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));border-bottom-left-radius:var(--rounded-box,1rem);border-bottom-right-radius:var(--rounded-box,1rem);border-top-left-radius:var(--rounded-box,1rem);border-top-right-radius:var(--rounded-box,1rem);box-shadow:0 25px 50px -12px #00000040;grid-column-start:1;grid-row-start:1;max-height:calc(100vh - 5em);max-width:32rem;overflow-y:auto;overscroll-behavior:contain;padding:1.5rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:91.666667%}.modal-open,.modal-toggle:checked+.modal,.modal:target,.modal[open]{opacity:1;pointer-events:auto;visibility:visible}:root:has(:is(.modal-open,.modal:target,.modal-toggle:checked+.modal,.modal[open])){overflow:hidden}.navbar{align-items:center;display:flex;min-height:4rem;padding:var(--navbar-padding,.5rem);width:100%}:where(.navbar>:not(script,style)){align-items:center;display:inline-flex}.navbar-start{justify-content:flex-start;width:50%}.navbar-center{flex-shrink:0}.navbar-end{justify-content:flex-end;width:50%}.progress{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--fallback-bc,oklch(var(--bc)/.2));border-radius:var(--rounded-box,1rem);height:.5rem;overflow:hidden;position:relative;width:100%}.radio{--chkbg:var(--bc);--tw-border-opacity:0.2;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));border-radius:9999px;border-width:1px;flex-shrink:0;height:1.5rem;width:1.5rem}.radio,.select{-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer}.select{--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));background-image:linear-gradient(45deg,#0000 50%,currentColor 0),linear-gradient(135deg,currentColor 50%,#0000 0);background-position:calc(100% - 20px) calc(1px + 50%),calc(100% - 16.1px) calc(1px + 50%);background-repeat:no-repeat;background-size:4px 4px,4px 4px;border-color:#0000;border-radius:var(--rounded-btn,.5rem);border-width:1px;display:inline-flex;font-size:.875rem;height:3rem;line-height:1.25rem;line-height:2;min-height:3rem;padding-left:1rem;padding-right:2.5rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.select[multiple]{height:auto}.stats{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));border-radius:var(--rounded-box,1rem);color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));display:inline-grid}:where(.stats){grid-auto-flow:column;overflow-x:auto}.stat{--tw-border-opacity:0.1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));-moz-column-gap:1rem;column-gap:1rem;display:inline-grid;grid-template-columns:repeat(1,1fr);padding:1rem 1.5rem;width:100%}.stat-title{color:var(--fallback-bc,oklch(var(--bc)/.6))}.stat-title,.stat-value{grid-column-start:1;white-space:nowrap}.stat-value{font-size:2.25rem;font-weight:800;line-height:2.5rem}.tabs{align-items:flex-end;display:grid}.tabs-lifted:has(.tab-content[class*=" rounded-"]) .tab:first-child:not(.tab-active),.tabs-lifted:has(.tab-content[class^=rounded-]) .tab:first-child:not(.tab-active){border-bottom-color:#0000}.tab{--tab-padding:1rem;--tw-text-opacity:0.5;--tab-color:var(--fallback-bc,oklch(var(--bc)/1));--tab-bg:var(--fallback-b1,oklch(var(--b1)/1));--tab-border-color:var(--fallback-b3,oklch(var(--b3)/1));align-items:center;-webkit-appearance:none;-moz-appearance:none;appearance:none;color:var(--tab-color);cursor:pointer;display:inline-flex;flex-wrap:wrap;font-size:.875rem;grid-row-start:1;height:2rem;justify-content:center;line-height:1.25rem;line-height:2;padding-inline-end:var(--tab-padding,1rem);padding-inline-start:var(--tab-padding,1rem);position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none}.tab:is(input[type=radio]){border-bottom-left-radius:0;border-bottom-right-radius:0;width:auto}.tab:is(input[type=radio]):after{--tw-content:attr(aria-label);content:var(--tw-content)}.tab:not(input):empty{cursor:default;grid-column-start:span 9999}.tab-content{border-color:#0000;border-width:var(--tab-border,0);display:none;grid-column-end:span 9999;grid-column-start:1;grid-row-start:2;margin-top:calc(var(--tab-border)*-1)}.tab-active+.tab-content:nth-child(2),:checked+.tab-content:nth-child(2){border-start-start-radius:0}.tab-active+.tab-content,input.tab:checked+.tab-content{display:block}.table{border-radius:var(--rounded-box,1rem);font-size:.875rem;line-height:1.25rem;position:relative;text-align:left;width:100%}.table :where(.table-pin-rows thead tr){--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));position:sticky;top:0;z-index:1}.table :where(.table-pin-rows tfoot tr){--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));bottom:0;position:sticky;z-index:1}.table :where(.table-pin-cols tr th){--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));left:0;position:sticky;right:0}.alert-info{--tw-text-opacity:1;--alert-bg:var(--fallback-in,oklch(var(--in)/1));--alert-bg-mix:var(--fallback-b1,oklch(var(--b1)/1));border-color:var(--fallback-in,oklch(var(--in)/.2));color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)))}.alert-warning{--tw-text-opacity:1;--alert-bg:var(--fallback-wa,oklch(var(--wa)/1));--alert-bg-mix:var(--fallback-b1,oklch(var(--b1)/1));border-color:var(--fallback-wa,oklch(var(--wa)/.2));color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}.badge-outline{--tw-border-opacity:0.5;background-color:initial;border-color:currentColor;color:currentColor}.badge-outline.badge-neutral{--tw-text-opacity:1;color:var(--fallback-n,oklch(var(--n)/var(--tw-text-opacity)))}.badge-outline.badge-primary{--tw-text-opacity:1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}.badge-outline.badge-secondary{--tw-text-opacity:1;color:var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity)))}.badge-outline.badge-accent{--tw-text-opacity:1;color:var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity)))}.badge-outline.badge-info{--tw-text-opacity:1;color:var(--fallback-in,oklch(var(--in)/var(--tw-text-opacity)))}.badge-outline.badge-success{--tw-text-opacity:1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity)))}.badge-outline.badge-warning{--tw-text-opacity:1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity)))}.badge-outline.badge-error{--tw-text-opacity:1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity)))}.btm-nav>* .label{font-size:1rem;line-height:1.5rem}.btn:active:focus,.btn:active:hover{animation:button-pop 0s ease-out;transform:scale(var(--btn-focus-scale,.97))}@supports not (color:oklch(0 0 0)){.btn{background-color:var(--btn-color,var(--fallback-b2));border-color:var(--btn-color,var(--fallback-b2))}.btn-primary{--btn-color:var(--fallback-p)}.btn-neutral{--btn-color:var(--fallback-n)}}@supports (color:color-mix(in oklab,black,black)){.btn-active{background-color:color-mix(in oklab,oklch(var(--btn-color,var(--b3))/var(--tw-bg-opacity,1)) 90%,#000);border-color:color-mix(in oklab,oklch(var(--btn-color,var(--b3))/var(--tw-border-opacity,1)) 90%,#000)}.btn-outline.btn-primary.btn-active{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000)}.btn-outline.btn-secondary.btn-active{background-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,#000)}.btn-outline.btn-accent.btn-active{background-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,#000)}.btn-outline.btn-success.btn-active{background-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,#000)}.btn-outline.btn-info.btn-active{background-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,#000)}.btn-outline.btn-warning.btn-active{background-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,#000)}.btn-outline.btn-error.btn-active{background-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,#000)}}.btn:focus-visible{outline-offset:2px;outline-style:solid;outline-width:2px}.btn-primary{--tw-text-opacity:1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));outline-color:var(--fallback-p,oklch(var(--p)/1))}@supports (color:oklch(0 0 0)){.btn-primary{--btn-color:var(--p)}.btn-neutral{--btn-color:var(--n)}}.btn-neutral{--tw-text-opacity:1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));outline-color:var(--fallback-n,oklch(var(--n)/1))}.btn.glass{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);outline-color:currentColor}.btn.glass.btn-active{--glass-opacity:25%;--glass-border-opacity:15%}.btn-ghost{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;background-color:initial;border-color:#0000;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:currentColor;outline-color:currentColor}.btn-ghost.btn-active{background-color:var(--fallback-bc,oklch(var(--bc)/.2));border-color:#0000}.btn-link.btn-active{background-color:initial;border-color:#0000;text-decoration-line:underline}.btn-outline{--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;background-color:initial;border-color:currentColor;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.btn-outline.btn-active{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));color:var(--fallback-b1,oklch(var(--b1)/var(--tw-text-opacity)))}.btn-outline.btn-primary{--tw-text-opacity:1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}.btn-outline.btn-primary.btn-active{--tw-text-opacity:1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn-outline.btn-secondary{--tw-text-opacity:1;color:var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity)))}.btn-outline.btn-secondary.btn-active{--tw-text-opacity:1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}.btn-outline.btn-accent{--tw-text-opacity:1;color:var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity)))}.btn-outline.btn-accent.btn-active{--tw-text-opacity:1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)))}.btn-outline.btn-success{--tw-text-opacity:1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity)))}.btn-outline.btn-success.btn-active{--tw-text-opacity:1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}.btn-outline.btn-info{--tw-text-opacity:1;color:var(--fallback-in,oklch(var(--in)/var(--tw-text-opacity)))}.btn-outline.btn-info.btn-active{--tw-text-opacity:1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)))}.btn-outline.btn-warning{--tw-text-opacity:1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity)))}.btn-outline.btn-warning.btn-active{--tw-text-opacity:1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}.btn-outline.btn-error{--tw-text-opacity:1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity)))}.btn-outline.btn-error.btn-active{--tw-text-opacity:1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)))}.btn.btn-disabled,.btn:disabled,.btn[disabled]{--tw-border-opacity:0;--tw-bg-opacity:0.2;--tw-text-opacity:0.2;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.btn:is(input[type=checkbox]:checked),.btn:is(input[type=radio]:checked){--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn:is(input[type=checkbox]:checked):focus-visible,.btn:is(input[type=radio]:checked):focus-visible{outline-color:var(--fallback-p,oklch(var(--p)/1))}@keyframes button-pop{0%{transform:scale(var(--btn-focus-scale,.98))}40%{transform:scale(1.02)}to{transform:scale(1)}}.card :where(figure:first-child){border-end-end-radius:unset;border-end-start-radius:unset;border-start-end-radius:inherit;border-start-start-radius:inherit;overflow:hidden}.card :where(figure:last-child){border-end-end-radius:inherit;border-end-start-radius:inherit;border-start-end-radius:unset;border-start-start-radius:unset;overflow:hidden}.card:focus-visible{outline:2px solid currentColor;outline-offset:2px}.card.bordered{--tw-border-opacity:1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));border-width:1px}.card.compact .card-body{font-size:.875rem;line-height:1.25rem;padding:1rem}.card-title{align-items:center;display:flex;font-size:1.25rem;font-weight:600;gap:.5rem;line-height:1.75rem}.card.image-full :where(figure){border-radius:inherit;overflow:hidden}.checkbox:focus{box-shadow:none}.checkbox:focus-visible{outline-color:var(--fallback-bc,oklch(var(--bc)/1));outline-offset:2px;outline-style:solid;outline-width:2px}.checkbox:checked,.checkbox[aria-checked=true],.checkbox[checked=true]{animation:checkmark var(--animation-input,.2s) ease-out;background-color:var(--chkbg);background-image:linear-gradient(-45deg,#0000 65%,var(--chkbg) 65.99%),linear-gradient(45deg,#0000 75%,var(--chkbg) 75.99%),linear-gradient(-45deg,var(--chkbg) 40%,#0000 40.99%),linear-gradient(45deg,var(--chkbg) 30%,var(--chkfg) 30.99%,var(--chkfg) 40%,#0000 40.99%),linear-gradient(-45deg,var(--chkfg) 50%,var(--chkbg) 50.99%);background-repeat:no-repeat}.checkbox:indeterminate{animation:checkmark var(--animation-input,.2s) ease-out;background-image:linear-gradient(90deg,#0000 80%,var(--chkbg) 80%),linear-gradient(-90deg,#0000 80%,var(--chkbg) 80%),linear-gradient(0deg,var(--chkbg) 43%,var(--chkfg) 43%,var(--chkfg) 57%,var(--chkbg) 57%);background-repeat:no-repeat}.checkbox:disabled,.checkbox:indeterminate{--tw-bg-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)))}.checkbox:disabled{border-color:#0000;cursor:not-allowed;opacity:.2}@keyframes checkmark{0%{background-position-y:5px}50%{background-position-y:-2px}to{background-position-y:0}}.dropdown.dropdown-open .dropdown-content,.dropdown:focus .dropdown-content,.dropdown:focus-within .dropdown-content{--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.file-input-bordered{--tw-border-opacity:0.2}.file-input:focus{outline-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-offset:2px;outline-style:solid;outline-width:2px}.file-input-disabled,.file-input[disabled]{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:0.2;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));cursor:not-allowed}.file-input-disabled::-moz-placeholder,.file-input[disabled]::-moz-placeholder{--tw-placeholder-opacity:0.2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)))}.file-input-disabled::placeholder,.file-input[disabled]::placeholder{--tw-placeholder-opacity:0.2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)))}.file-input-disabled::file-selector-button,.file-input[disabled]::file-selector-button{--tw-border-opacity:0;--tw-bg-opacity:0.2;--tw-text-opacity:0.2;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.label-text{--tw-text-opacity:1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));font-size:.875rem;line-height:1.25rem}.input input{--tw-bg-opacity:1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));background-color:initial}.input input:focus{outline:2px solid #0000;outline-offset:2px}.input[list]::-webkit-calendar-picker-indicator{line-height:1em}.input-bordered,.input:focus,.input:focus-within{border-color:var(--fallback-bc,oklch(var(--bc)/.2))}.input:focus,.input:focus-within{box-shadow:none;outline-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-offset:2px;outline-style:solid;outline-width:2px}.input-disabled,.input:disabled,.input[disabled]{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4));cursor:not-allowed}.input-disabled::-moz-placeholder,.input:disabled::-moz-placeholder,.input[disabled]::-moz-placeholder{--tw-placeholder-opacity:0.2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)))}.input-disabled::placeholder,.input:disabled::placeholder,.input[disabled]::placeholder{--tw-placeholder-opacity:0.2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)))}.input::-webkit-date-and-time-value{text-align:inherit}.link:focus{outline:2px solid #0000;outline-offset:2px}.link:focus-visible{outline:2px solid currentColor;outline-offset:2px}:where(.menu li:empty){--tw-bg-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));height:1px;margin:.5rem 1rem;opacity:.1}.menu :where(li ul):before{--tw-bg-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));bottom:.75rem;content:"";inset-inline-start:0;opacity:.1;position:absolute;top:.75rem;width:1px}.menu :where(li:not(.menu-title)>:not(ul,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){text-wrap:balance;border-radius:var(--rounded-btn,.5rem);padding:.5rem 1rem;text-align:start;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1)}:where(.menu li:not(.menu-title,.disabled)>:not(ul,details,.menu-title)):is(summary):not(.active,.btn):focus-visible,:where(.menu li:not(.menu-title,.disabled)>:not(ul,details,.menu-title)):not(summary,.active,.btn).focus,:where(.menu li:not(.menu-title,.disabled)>:not(ul,details,.menu-title)):not(summary,.active,.btn):focus,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):is(summary):not(.active,.btn):focus-visible,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(summary,.active,.btn).focus,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(summary,.active,.btn):focus{--tw-text-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/.1));color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));cursor:pointer;outline:2px solid #0000;outline-offset:2px}.menu li>:not(ul,.menu-title,details,.btn).active,.menu li>:not(ul,.menu-title,details,.btn):active,.menu li>details>summary:active{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.menu :where(li>details>summary)::-webkit-details-marker{display:none}.menu :where(li>.menu-dropdown-toggle):after,.menu :where(li>details>summary):after{box-shadow:2px 2px;content:"";display:block;height:.5rem;justify-self:end;margin-top:-.5rem;pointer-events:none;transform:rotate(45deg);transform-origin:75% 75%;transition-duration:.3s;transition-property:transform,margin-top;transition-timing-function:cubic-bezier(.4,0,.2,1);width:.5rem}.menu :where(li>.menu-dropdown-toggle.menu-dropdown-show):after,.menu :where(li>details[open]>summary):after{margin-top:0;transform:rotate(225deg)}.mockup-code:before{border-radius:9999px;box-shadow:1.4em 0,2.8em 0,4.2em 0;content:"";display:block;height:.75rem;margin-bottom:1rem;opacity:.3;width:.75rem}.mockup-code pre{padding-right:1.25rem}.mockup-code pre:before{content:"";margin-right:2ch}.mockup-browser .mockup-browser-toolbar .input{--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));direction:ltr;display:block;height:1.75rem;margin-left:auto;margin-right:auto;overflow:hidden;padding-left:2rem;position:relative;text-overflow:ellipsis;white-space:nowrap;width:24rem}.mockup-browser .mockup-browser-toolbar .input:before{--tw-translate-y:-50%;aspect-ratio:1/1;border-color:currentColor;border-radius:9999px;border-width:2px;height:.75rem;left:.5rem}.mockup-browser .mockup-browser-toolbar .input:after,.mockup-browser .mockup-browser-toolbar .input:before{content:"";opacity:.6;position:absolute;top:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.mockup-browser .mockup-browser-toolbar .input:after{--tw-translate-y:25%;--tw-rotate:-45deg;border-color:currentColor;border-radius:9999px;border-width:1px;height:.5rem;left:1.25rem}.modal::backdrop,.modal:not(dialog:not(.modal-open)){animation:modal-pop .2s ease-out;background-color:#0006}.modal-backdrop{align-self:stretch;color:#0000;display:grid;grid-column-start:1;grid-row-start:1;justify-self:stretch;z-index:-1}.modal-open .modal-box,.modal-toggle:checked+.modal .modal-box,.modal:target .modal-box,.modal[open] .modal-box{--tw-translate-y:0px;--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes modal-pop{0%{opacity:0}}.progress::-moz-progress-bar{--tw-bg-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));border-radius:var(--rounded-box,1rem)}.progress:indeterminate{--progress-color:var(--fallback-bc,oklch(var(--bc)/1));animation:progress-loading 5s ease-in-out infinite;background-image:repeating-linear-gradient(90deg,var(--progress-color) -1%,var(--progress-color) 10%,#0000 10%,#0000 90%);background-position-x:15%;background-size:200%}.progress::-webkit-progress-bar{background-color:initial;border-radius:var(--rounded-box,1rem)}.progress::-webkit-progress-value{--tw-bg-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));border-radius:var(--rounded-box,1rem)}.progress:indeterminate::-moz-progress-bar{animation:progress-loading 5s ease-in-out infinite;background-color:initial;background-image:repeating-linear-gradient(90deg,var(--progress-color) -1%,var(--progress-color) 10%,#0000 10%,#0000 90%);background-position-x:15%;background-size:200%}@keyframes progress-loading{50%{background-position-x:-115%}}.radio:focus{box-shadow:none}.radio:focus-visible{outline-color:var(--fallback-bc,oklch(var(--bc)/1));outline-offset:2px;outline-style:solid;outline-width:2px}.radio:checked,.radio[aria-checked=true]{--tw-bg-opacity:1;animation:radiomark var(--animation-input,.2s) ease-out;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));background-image:none;box-shadow:0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset}.radio:disabled{cursor:not-allowed;opacity:.2}@keyframes radiomark{0%{box-shadow:0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset}50%{box-shadow:0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset}to{box-shadow:0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset}}@keyframes rating-pop{0%{transform:translateY(-.125em)}40%{transform:translateY(-.125em)}to{transform:translateY(0)}}.select:focus{border-color:var(--fallback-bc,oklch(var(--bc)/.2));box-shadow:none;outline-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-offset:2px;outline-style:solid;outline-width:2px}.select-disabled,.select:disabled,.select[disabled]{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:0.2;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));cursor:not-allowed}.select-disabled::-moz-placeholder,.select:disabled::-moz-placeholder,.select[disabled]::-moz-placeholder{--tw-placeholder-opacity:0.2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)))}.select-disabled::placeholder,.select:disabled::placeholder,.select[disabled]::placeholder{--tw-placeholder-opacity:0.2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)))}.select-multiple,.select[multiple],.select[size].select:not([size="1"]){background-image:none;padding-right:1rem}[dir=rtl] .select{background-position:12px calc(1px + 50%),16px calc(1px + 50%)}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}:where(.stats)>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;--tw-divide-y-reverse:0;border-width:calc(0px*(1 - var(--tw-divide-y-reverse))) calc(1px*var(--tw-divide-x-reverse)) calc(0px*var(--tw-divide-y-reverse)) calc(1px*(1 - var(--tw-divide-x-reverse)))}:is([dir=rtl] .stats>:not([hidden])~:not([hidden])){--tw-divide-x-reverse:1}.tabs-lifted>.tab:focus-visible{border-end-end-radius:0;border-end-start-radius:0}.tab.tab-active:not(.tab-disabled):not([disabled]),.tab:is(input:checked){--tw-border-opacity:1;--tw-text-opacity:1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)))}.tab:focus{outline:2px solid #0000;outline-offset:2px}.tab:focus-visible{outline:2px solid currentColor;outline-offset:-5px}.tab-disabled,.tab[disabled]{--tw-text-opacity:0.2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));cursor:not-allowed}.tabs-bordered>.tab{--tw-border-opacity:0.2;border-bottom-width:calc(var(--tab-border, 1px) + 1px);border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));border-style:solid}.tabs-lifted>.tab{border:var(--tab-border,1px) solid #0000;border-bottom-color:var(--tab-border-color);border-start-end-radius:var(--tab-radius,.5rem);border-start-start-radius:var(--tab-radius,.5rem);border-width:0 0 var(--tab-border,1px) 0;padding-inline-end:var(--tab-padding,1rem);padding-inline-start:var(--tab-padding,1rem);padding-top:var(--tab-border,1px)}.tabs-lifted>.tab.tab-active:not(.tab-disabled):not([disabled]),.tabs-lifted>.tab:is(input:checked){background-color:var(--tab-bg);border-inline-end-color:var(--tab-border-color);border-inline-start-color:var(--tab-border-color);border-top-color:var(--tab-border-color);border-width:var(--tab-border,1px) var(--tab-border,1px) 0 var(--tab-border,1px);padding-inline-end:calc(var(--tab-padding, 1rem) - var(--tab-border, 1px));padding-bottom:var(--tab-border,1px);padding-inline-start:calc(var(--tab-padding, 1rem) - var(--tab-border, 1px));padding-top:0}.tabs-lifted>.tab.tab-active:not(.tab-disabled):not([disabled]):before,.tabs-lifted>.tab:is(input:checked):before{--tab-grad:calc(69% - var(--tab-border, 1px));--radius-start:radial-gradient(circle at top left,#0000 var(--tab-grad),var(--tab-border-color) calc(var(--tab-grad) + 0.25px),var(--tab-border-color) calc(var(--tab-grad) + var(--tab-border, 1px)),var(--tab-bg) calc(var(--tab-grad) + var(--tab-border, 1px) + 0.25px));--radius-end:radial-gradient(circle at top right,#0000 var(--tab-grad),var(--tab-border-color) calc(var(--tab-grad) + 0.25px),var(--tab-border-color) calc(var(--tab-grad) + var(--tab-border, 1px)),var(--tab-bg) calc(var(--tab-grad) + var(--tab-border, 1px) + 0.25px));background-image:var(--radius-start),var(--radius-end);background-position:0 0,100% 0;background-repeat:no-repeat;background-size:var(--tab-radius,.5rem);bottom:0;content:"";display:block;height:var(--tab-radius,.5rem);position:absolute;width:calc(100% + var(--tab-radius, .5rem)*2);z-index:1}.tabs-lifted>.tab.tab-active:not(.tab-disabled):not([disabled]):first-child:before,.tabs-lifted>.tab:is(input:checked):first-child:before{background-image:var(--radius-end);background-position:100% 0}.tabs-lifted>.tab.tab-active:not(.tab-disabled):not([disabled]):last-child:before,.tabs-lifted>.tab:is(input:checked):last-child:before,[dir=rtl] .tabs-lifted>.tab.tab-active:not(.tab-disabled):not([disabled]):first-child:before,[dir=rtl] .tabs-lifted>.tab:is(input:checked):first-child:before{background-image:var(--radius-start);background-position:0 0}.tabs-lifted>.tab-active:not(.tab-disabled):not([disabled])+.tabs-lifted .tab-active:not(.tab-disabled):not([disabled]):before,.tabs-lifted>.tab:is(input:checked)+.tabs-lifted .tab:is(input:checked):before,[dir=rtl] .tabs-lifted>.tab.tab-active:not(.tab-disabled):not([disabled]):last-child:before,[dir=rtl] .tabs-lifted>.tab:is(input:checked):last-child:before{background-image:var(--radius-end);background-position:100% 0}.tabs-boxed{--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));padding:.25rem}.tabs-boxed,.tabs-boxed .tab{border-radius:var(--rounded-btn,.5rem)}.tabs-boxed .tab-active:not(.tab-disabled):not([disabled]),.tabs-boxed :is(input:checked){--tw-bg-opacity:1;--tw-text-opacity:1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}:is([dir=rtl] .table){text-align:right}.table :where(th,td){padding:.75rem 1rem;vertical-align:middle}.table tr.active,.table tr.active:nth-child(2n),.table-zebra tbody tr:nth-child(2n){--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.table :where(thead,tbody) :where(tr:first-child:last-child),.table :where(thead,tbody) :where(tr:not(:last-child)){--tw-border-opacity:1;border-bottom-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));border-bottom-width:1px}.table :where(thead,tfoot){color:var(--fallback-bc,oklch(var(--bc)/.6));font-size:.75rem;font-weight:700;line-height:1rem;white-space:nowrap}@keyframes toast-pop{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.glass,.glass.btn-active{-webkit-backdrop-filter:blur(var(--glass-blur,40px));backdrop-filter:blur(var(--glass-blur,40px));background-color:initial;background-image:linear-gradient(135deg,rgb(255 255 255/var(--glass-opacity,30%)) 0,#0000 100%),linear-gradient(var(--glass-reflex-degree,100deg),rgb(255 255 255/var(--glass-reflex-opacity,10%)) 25%,#0000 25%);border:none;box-shadow:0 0 0 1px rgb(255 255 255/var(--glass-border-opacity,10%)) inset,0 0 0 2px #0000000d;text-shadow:0 1px rgb(0 0 0/var(--glass-text-shadow-opacity,5%))}@media (hover:hover){.glass.btn-active{-webkit-backdrop-filter:blur(var(--glass-blur,40px));backdrop-filter:blur(var(--glass-blur,40px));background-color:initial;background-image:linear-gradient(135deg,rgb(255 255 255/var(--glass-opacity,30%)) 0,#0000 100%),linear-gradient(var(--glass-reflex-degree,100deg),rgb(255 255 255/var(--glass-reflex-opacity,10%)) 25%,#0000 25%);border:none;box-shadow:0 0 0 1px rgb(255 255 255/var(--glass-border-opacity,10%)) inset,0 0 0 2px #0000000d;text-shadow:0 1px rgb(0 0 0/var(--glass-text-shadow-opacity,5%))}}[type=checkbox].checkbox-sm{height:1.25rem;width:1.25rem}.menu-horizontal{display:inline-flex;flex-direction:row}.menu-horizontal>li:not(.menu-title)>details>ul{position:absolute}.stats-vertical{grid-auto-flow:row}.tabs-md :where(.tab){--tab-padding:1rem;font-size:.875rem;height:2rem;line-height:1.25rem;line-height:2}.tabs-lg :where(.tab){--tab-padding:1.25rem;font-size:1.125rem;height:3rem;line-height:1.75rem;line-height:2}.tabs-sm :where(.tab){--tab-padding:0.75rem;font-size:.875rem;height:1.5rem;line-height:.75rem}.tabs-xs :where(.tab){--tab-padding:0.5rem;font-size:.75rem;height:1.25rem;line-height:.75rem}.tooltip{--tooltip-offset:calc(100% + 1px + var(--tooltip-tail, 0px))}.tooltip:before{--tw-content:attr(data-tip);content:var(--tw-content);pointer-events:none;position:absolute;z-index:1}.tooltip-top:before,.tooltip:before{bottom:var(--tooltip-offset);left:50%;right:auto;top:auto;transform:translateX(-50%)}.tooltip-bottom:before{bottom:auto;left:50%;right:auto;top:var(--tooltip-offset);transform:translateX(-50%)}.card-compact .card-body{font-size:.875rem;line-height:1.25rem;padding:1rem}.card-compact .card-title{margin-bottom:.25rem}.card-normal .card-body{font-size:1rem;line-height:1.5rem;padding:var(--padding-card,2rem)}.card-normal .card-title{margin-bottom:.75rem}.menu-horizontal>li:not(.menu-title)>details>ul{margin-inline-start:0;margin-top:1rem;padding-bottom:.5rem;padding-inline-end:.5rem;padding-top:.5rem}.menu-horizontal>li>details>ul:before{content:none}:where(.menu-horizontal>li:not(.menu-title)>details>ul){--tw-bg-opacity:1;--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));border-radius:var(--rounded-box,1rem);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.menu-sm :where(li:not(.menu-title)>:not(ul,details,.menu-title)),.menu-sm :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--rounded-btn,.5rem);font-size:.875rem;line-height:1.25rem;padding:.25rem .75rem}.menu-sm .menu-title{padding:.5rem .75rem}.modal-top :where(.modal-box){--tw-translate-y:-2.5rem;--tw-scale-x:1;--tw-scale-y:1;border-bottom-left-radius:var(--rounded-box,1rem);border-bottom-right-radius:var(--rounded-box,1rem);border-top-left-radius:0;border-top-right-radius:0;max-width:none;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));width:100%}.modal-middle :where(.modal-box){--tw-translate-y:0px;--tw-scale-x:.9;--tw-scale-y:.9;border-bottom-left-radius:var(--rounded-box,1rem);border-bottom-right-radius:var(--rounded-box,1rem);border-top-left-radius:var(--rounded-box,1rem);border-top-right-radius:var(--rounded-box,1rem);max-width:32rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));width:91.666667%}.modal-bottom :where(.modal-box){--tw-translate-y:2.5rem;--tw-scale-x:1;--tw-scale-y:1;border-bottom-left-radius:0;border-bottom-right-radius:0;border-top-left-radius:var(--rounded-box,1rem);border-top-right-radius:var(--rounded-box,1rem);max-width:none;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));width:100%}.stats-vertical>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;--tw-divide-y-reverse:0;border-width:calc(1px*(1 - var(--tw-divide-y-reverse))) calc(0px*var(--tw-divide-x-reverse)) calc(1px*var(--tw-divide-y-reverse)) calc(0px*(1 - var(--tw-divide-x-reverse)))}.stats-vertical{overflow-y:auto}.tooltip{--tooltip-tail:0.1875rem;--tooltip-color:var(--fallback-n,oklch(var(--n)/1));--tooltip-text-color:var(--fallback-nc,oklch(var(--nc)/1));--tooltip-tail-offset:calc(100% + 0.0625rem - var(--tooltip-tail));display:inline-block;position:relative;text-align:center}.tooltip:after,.tooltip:before{opacity:0;transition-delay:.1s;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.tooltip:after{border-style:solid;border-width:var(--tooltip-tail,0);content:"";display:block;height:0;position:absolute;width:0}.tooltip:before{background-color:var(--tooltip-color);border-radius:.25rem;color:var(--tooltip-text-color);font-size:.875rem;line-height:1.25rem;max-width:20rem;padding:.25rem .5rem;width:-moz-max-content;width:max-content}.tooltip.tooltip-open:after,.tooltip.tooltip-open:before,.tooltip:has(:focus-visible):after,.tooltip:has(:focus-visible):before,.tooltip:hover:after,.tooltip:hover:before{opacity:1;transition-delay:75ms}.tooltip:not([data-tip]):hover:after,.tooltip:not([data-tip]):hover:before{opacity:0;visibility:hidden}.tooltip-top:after,.tooltip:after{border-color:var(--tooltip-color) #0000 #0000 #0000;bottom:var(--tooltip-tail-offset);left:50%;right:auto;top:auto;transform:translateX(-50%)}.tooltip-bottom:after{border-color:#0000 #0000 var(--tooltip-color) #0000;bottom:auto;left:50%;right:auto;top:var(--tooltip-tail-offset);transform:translateX(-50%)}.static{position:static}.fixed{position:fixed}.right-5{right:1.25rem}.top-5{top:1.25rem}.z-10{z-index:10}.z-\[1\]{z-index:1}.m-1{margin:.25rem}.m-auto{margin:auto}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-10{margin-bottom:2.5rem;margin-top:2.5rem}.my-2{margin-bottom:.5rem;margin-top:.5rem}.my-3{margin-bottom:.75rem;margin-top:.75rem}.my-5{margin-bottom:1.25rem;margin-top:1.25rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.ml-2{margin-left:.5rem}.mr-4{margin-right:1rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mb-2{margin-bottom:.5rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-\[25rem\]{height:25rem}.h-fit{height:-moz-fit-content;height:fit-content}.min-h-screen{min-height:100vh}.min-h-80{min-height:20rem}.w-1\/5{width:20%}.w-4\/5{width:80%}.w-5{width:1.25rem}.w-52{width:13rem}.w-6{width:1.5rem}.w-96{width:24rem}.w-auto{width:auto}.w-full{width:100%}.min-w-full{min-width:100%}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-shrink-0,.shrink-0{flex-shrink:0}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.justify-self-center{justify-self:center}.overflow-x-auto{overflow-x:auto}.rounded-box{border-radius:var(--rounded-box,1rem)}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.border-base-300{--tw-border-opacity:1;border-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)))}.border-blue-300{--tw-border-opacity:1;border-color:rgb(147 197 253/var(--tw-border-opacity))}.border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}.bg-base-100{--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.bg-base-200{--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.bg-base-300{--tw-bg-opacity:1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}.bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity))}.bg-neutral{--tw-bg-opacity:1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)))}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.bg-secondary-content{--tw-bg-opacity:1;background-color:var(--fallback-sc,oklch(var(--sc)/var(--tw-bg-opacity)))}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}.bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.stroke-current{stroke:currentColor}.p-2{padding:.5rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-20{padding-bottom:5rem;padding-top:5rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-5{padding-bottom:1.25rem;padding-top:1.25rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.text-center{text-align:center}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.normal-case{text-transform:none}.text-base-content{--tw-text-opacity:1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.text-neutral-content{--tw-text-opacity:1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.text-primary{--tw-text-opacity:1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.text-secondary{--tw-text-opacity:1;color:var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity)))}.text-success{--tw-text-opacity:1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity)))}.text-warning{--tw-text-opacity:1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity)))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-2xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px #00000040;--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.shadow-xl{--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}@tailwind daisyui;@media (min-width:1024px){.lg\:stats-horizontal{grid-auto-flow:column}.lg\:stats-horizontal>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;--tw-divide-y-reverse:0;border-width:calc(0px*(1 - var(--tw-divide-y-reverse))) calc(1px*var(--tw-divide-x-reverse)) calc(0px*var(--tw-divide-y-reverse)) calc(1px*(1 - var(--tw-divide-x-reverse)))}.lg\:stats-horizontal{overflow-x:auto}:is([dir=rtl] .lg\:stats-horizontal){--tw-divide-x-reverse:1}}.hover\:cursor-pointer:hover{cursor:pointer}.hover\:no-underline:hover{text-decoration-line:none}@media (min-width:640px){.sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}}@media (min-width:768px){.md\:w-2\/12{width:16.666667%}.md\:w-2\/3{width:66.666667%}.md\:w-2\/6{width:33.333333%}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-end{align-items:flex-end}.md\:space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}}@media (min-width:1024px){.lg\:flex{display:flex}.lg\:hidden{display:none}.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\:flex-row-reverse{flex-direction:row-reverse}.lg\:text-left{text-align:left}} \ No newline at end of file +/*! tailwindcss v3.4.4 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:Inter var,ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}:root,[data-theme]{background-color:var(--fallback-b1,oklch(var(--b1)/1));color:var(--fallback-bc,oklch(var(--bc)/1))}@supports not (color:oklch(0 0 0)){:root{--fallback-p:#491eff;--fallback-pc:#d4dbff;--fallback-s:#ff41c7;--fallback-sc:#fff9fc;--fallback-a:#00cfbd;--fallback-ac:#00100d;--fallback-n:#2b3440;--fallback-nc:#d7dde4;--fallback-b1:#fff;--fallback-b2:#e5e6e6;--fallback-b3:#e5e6e6;--fallback-bc:#1f2937;--fallback-in:#00b3f0;--fallback-inc:#000;--fallback-su:#00ca92;--fallback-suc:#000;--fallback-wa:#ffc22d;--fallback-wac:#000;--fallback-er:#ff6f70;--fallback-erc:#000;color-scheme:light}@media (prefers-color-scheme:dark){:root{--fallback-p:#7582ff;--fallback-pc:#050617;--fallback-s:#ff71cf;--fallback-sc:#190211;--fallback-a:#00c7b5;--fallback-ac:#000e0c;--fallback-n:#2a323c;--fallback-nc:#a6adbb;--fallback-b1:#1d232a;--fallback-b2:#191e24;--fallback-b3:#15191e;--fallback-bc:#a6adbb;--fallback-in:#00b3f0;--fallback-inc:#000;--fallback-su:#00ca92;--fallback-suc:#000;--fallback-wa:#ffc22d;--fallback-wac:#000;--fallback-er:#ff6f70;--fallback-erc:#000;color-scheme:dark}}}html{-webkit-tap-highlight-color:transparent}:root{--in:0.7206 0.191 231.6;--su:64.8% 0.150 160;--wa:0.8471 0.199 83.87;--er:0.7176 0.221 22.18;--pc:0.89824 0.06192 275.75;--ac:0.15352 0.0368 183.61;--inc:0 0 0;--suc:0 0 0;--wac:0 0 0;--erc:0 0 0;--rounded-box:1rem;--rounded-btn:0.5rem;--rounded-badge:1.9rem;--animation-btn:0.25s;--animation-input:.2s;--btn-focus-scale:0.95;--border-btn:1px;--tab-border:1px;--tab-radius:0.5rem;--p:0.4912 0.3096 275.75;--s:0.6971 0.329 342.55;--sc:0.9871 0.0106 342.55;--a:0.7676 0.184 183.61;--n:0.321785 0.02476 255.701624;--nc:0.894994 0.011585 252.096176;--b1:1 0 0;--b2:0.961151 0 0;--b3:0.924169 0.00108 197.137559;--bc:0.278078 0.029596 256.847952;color-scheme:light}@media (prefers-color-scheme:dark){:root{--in:0.7206 0.191 231.6;--su:64.8% 0.150 160;--wa:0.8471 0.199 83.87;--er:0.7176 0.221 22.18;--pc:0.13138 0.0392 275.75;--sc:0.1496 0.052 342.55;--ac:0.14902 0.0334 183.61;--inc:0 0 0;--suc:0 0 0;--wac:0 0 0;--erc:0 0 0;--rounded-box:1rem;--rounded-btn:0.5rem;--rounded-badge:1.9rem;--animation-btn:0.25s;--animation-input:.2s;--btn-focus-scale:0.95;--border-btn:1px;--tab-border:1px;--tab-radius:0.5rem;--p:0.6569 0.196 275.75;--s:0.748 0.26 342.55;--a:0.7451 0.167 183.61;--n:0.313815 0.021108 254.139175;--nc:0.746477 0.0216 264.435964;--b1:0.253267 0.015896 252.417568;--b2:0.232607 0.013807 253.100675;--b3:0.211484 0.01165 254.087939;--bc:0.746477 0.0216 264.435964;color-scheme:dark}}[data-theme=light]{--in:0.7206 0.191 231.6;--su:64.8% 0.150 160;--wa:0.8471 0.199 83.87;--er:0.7176 0.221 22.18;--pc:0.89824 0.06192 275.75;--ac:0.15352 0.0368 183.61;--inc:0 0 0;--suc:0 0 0;--wac:0 0 0;--erc:0 0 0;--rounded-box:1rem;--rounded-btn:0.5rem;--rounded-badge:1.9rem;--animation-btn:0.25s;--animation-input:.2s;--btn-focus-scale:0.95;--border-btn:1px;--tab-border:1px;--tab-radius:0.5rem;--p:0.4912 0.3096 275.75;--s:0.6971 0.329 342.55;--sc:0.9871 0.0106 342.55;--a:0.7676 0.184 183.61;--n:0.321785 0.02476 255.701624;--nc:0.894994 0.011585 252.096176;--b1:1 0 0;--b2:0.961151 0 0;--b3:0.924169 0.00108 197.137559;--bc:0.278078 0.029596 256.847952;color-scheme:light}[data-theme=dark]{--in:0.7206 0.191 231.6;--su:64.8% 0.150 160;--wa:0.8471 0.199 83.87;--er:0.7176 0.221 22.18;--pc:0.13138 0.0392 275.75;--sc:0.1496 0.052 342.55;--ac:0.14902 0.0334 183.61;--inc:0 0 0;--suc:0 0 0;--wac:0 0 0;--erc:0 0 0;--rounded-box:1rem;--rounded-btn:0.5rem;--rounded-badge:1.9rem;--animation-btn:0.25s;--animation-input:.2s;--btn-focus-scale:0.95;--border-btn:1px;--tab-border:1px;--tab-radius:0.5rem;--p:0.6569 0.196 275.75;--s:0.748 0.26 342.55;--a:0.7451 0.167 183.61;--n:0.313815 0.021108 254.139175;--nc:0.746477 0.0216 264.435964;--b1:0.253267 0.015896 252.417568;--b2:0.232607 0.013807 253.100675;--b3:0.211484 0.01165 254.087939;--bc:0.746477 0.0216 264.435964;color-scheme:dark}[multiple],[type=date],[type=datetime-local],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],select,textarea{--tw-shadow:0 0 #0000;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}[multiple]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,select:focus,textarea:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}input::-moz-placeholder,textarea::-moz-placeholder{color:#6b7280;opacity:1}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em}::-webkit-datetime-edit,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-year-field{padding-bottom:0;padding-top:0}select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple]{background-image:none;background-position:0 0;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}[type=checkbox],[type=radio]{--tw-shadow:0 0 #0000;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#6b7280;border-width:1px;color:#2563eb;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:1rem}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}[type=checkbox]:checked,[type=radio]:checked{background-color:currentColor;background-position:50%;background-repeat:no-repeat;background-size:100% 100%;border-color:#0000}[type=checkbox]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 16 16'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0z'/%3E%3C/svg%3E")}[type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}[type=checkbox]:checked:focus,[type=checkbox]:checked:hover,[type=checkbox]:indeterminate,[type=radio]:checked:focus,[type=radio]:checked:hover{background-color:currentColor;border-color:#0000}[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}[type=checkbox]:indeterminate:focus,[type=checkbox]:indeterminate:hover{background-color:currentColor;border-color:#0000}[type=file]{background:unset;border-color:inherit;border-radius:0;border-width:0;font-size:unset;line-height:inherit;padding:0}[type=file]:focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.alert{--tw-border-opacity:1;--tw-text-opacity:1;--alert-bg:var(--fallback-b2,oklch(var(--b2)/1));--alert-bg-mix:var(--fallback-b1,oklch(var(--b1)/1));align-content:flex-start;align-items:center;background-color:var(--alert-bg);border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));border-radius:var(--rounded-box,1rem);border-width:1px;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));display:grid;gap:1rem;grid-auto-flow:row;justify-items:center;padding:1rem;text-align:center;width:100%}@media (min-width:640px){.alert{grid-auto-flow:column;grid-template-columns:auto minmax(auto,1fr);justify-items:start;text-align:start}}.badge{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));border-radius:var(--rounded-badge,1.9rem);border-width:1px;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));display:inline-flex;font-size:.875rem;height:1.25rem;justify-content:center;line-height:1.25rem;padding-left:.563rem;padding-right:.563rem;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:-moz-fit-content;width:fit-content}@media (hover:hover){.label a:hover{--tw-text-opacity:1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.menu li>:not(ul,.menu-title,details,.btn).active,.menu li>:not(ul,.menu-title,details,.btn):active,.menu li>details>summary:active{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.radio-primary:hover{--tw-border-opacity:1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)))}.tab:hover{--tw-text-opacity:1}.tabs-boxed .tab-active:not(.tab-disabled):not([disabled]):hover,.tabs-boxed :is(input:checked):hover{--tw-text-opacity:1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.table tr.hover:hover,.table tr.hover:nth-child(2n):hover{--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.table-zebra tr.hover:hover,.table-zebra tr.hover:nth-child(2n):hover{--tw-bg-opacity:1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}}.btn{--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-bg-opacity:1;--tw-border-opacity:1;align-items:center;animation:button-pop var(--animation-btn,.25s) ease-out;background-color:oklch(var(--btn-color,var(--b2))/var(--tw-bg-opacity));border-color:#0000;border-color:oklch(var(--btn-color,var(--b2))/var(--tw-border-opacity));border-radius:var(--rounded-btn,.5rem);border-width:var(--border-btn,1px);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));cursor:pointer;display:inline-flex;flex-shrink:0;flex-wrap:wrap;font-size:.875rem;font-weight:600;gap:.5rem;height:3rem;justify-content:center;line-height:1em;min-height:3rem;outline-color:var(--fallback-bc,oklch(var(--bc)/1));padding-left:1rem;padding-right:1rem;text-align:center;text-decoration-line:none;transition-duration:.2s;transition-property:color,background-color,border-color,opacity,box-shadow,transform;transition-timing-function:cubic-bezier(0,0,.2,1);-webkit-user-select:none;-moz-user-select:none;user-select:none}.btn-disabled,.btn:disabled,.btn[disabled]{pointer-events:none}:where(.btn:is(input[type=checkbox])),:where(.btn:is(input[type=radio])){-webkit-appearance:none;-moz-appearance:none;appearance:none;width:auto}.btn:is(input[type=checkbox]):after,.btn:is(input[type=radio]):after{--tw-content:attr(aria-label);content:var(--tw-content)}.card{border-radius:var(--rounded-box,1rem);display:flex;flex-direction:column;position:relative}.card:focus{outline:2px solid #0000;outline-offset:2px}.card-body{display:flex;flex:1 1 auto;flex-direction:column;gap:.5rem;padding:var(--padding-card,2rem)}.card-body :where(p){flex-grow:1}.card-actions{align-items:flex-start;display:flex;flex-wrap:wrap;gap:.5rem}.card figure{align-items:center;display:flex;justify-content:center}.card.image-full{display:grid}.card.image-full:before{--tw-bg-opacity:1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));border-radius:var(--rounded-box,1rem);content:"";opacity:.75;position:relative;z-index:10}.card.image-full:before,.card.image-full>*{grid-column-start:1;grid-row-start:1}.card.image-full>figure img{height:100%;-o-object-fit:cover;object-fit:cover}.card.image-full>.card-body{--tw-text-opacity:1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));position:relative;z-index:20}.checkbox{--chkbg:var(--fallback-bc,oklch(var(--bc)/1));--chkfg:var(--fallback-b1,oklch(var(--b1)/1));--tw-border-opacity:0.2;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));border-radius:var(--rounded-btn,.5rem);border-width:1px;cursor:pointer;flex-shrink:0;height:1.5rem;width:1.5rem}.dropdown{display:inline-block;position:relative}.dropdown>:not(summary):focus{outline:2px solid #0000;outline-offset:2px}.dropdown .dropdown-content{position:absolute}.dropdown:is(:not(details)) .dropdown-content{--tw-scale-x:.95;--tw-scale-y:.95;opacity:0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transform-origin:top;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);visibility:hidden}.dropdown-end .dropdown-content{inset-inline-end:0}.dropdown-left .dropdown-content{bottom:auto;inset-inline-end:100%;top:0;transform-origin:right}.dropdown-right .dropdown-content{bottom:auto;inset-inline-start:100%;top:0;transform-origin:left}.dropdown-bottom .dropdown-content{bottom:auto;top:100%;transform-origin:top}.dropdown-top .dropdown-content{bottom:100%;top:auto;transform-origin:bottom}.dropdown-end.dropdown-left .dropdown-content,.dropdown-end.dropdown-right .dropdown-content{bottom:0;top:auto}.dropdown.dropdown-open .dropdown-content,.dropdown:focus-within .dropdown-content,.dropdown:not(.dropdown-hover):focus .dropdown-content{opacity:1;visibility:visible}@media (hover:hover){.dropdown.dropdown-hover:hover .dropdown-content{opacity:1;visibility:visible}.btn:hover{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));border-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn:hover{background-color:color-mix(in oklab,oklch(var(--btn-color,var(--b2))/var(--tw-bg-opacity,1)) 90%,#000);border-color:color-mix(in oklab,oklch(var(--btn-color,var(--b2))/var(--tw-border-opacity,1)) 90%,#000)}}@supports not (color:oklch(0 0 0)){.btn:hover{background-color:var(--btn-color,var(--fallback-b2));border-color:var(--btn-color,var(--fallback-b2))}}.btn.glass:hover{--glass-opacity:25%;--glass-border-opacity:15%}.btn-ghost:hover{border-color:#0000}@supports (color:oklch(0 0 0)){.btn-ghost:hover{background-color:var(--fallback-bc,oklch(var(--bc)/.2))}}.btn-outline:hover{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));color:var(--fallback-b1,oklch(var(--b1)/var(--tw-text-opacity)))}.btn-outline.btn-primary:hover{--tw-text-opacity:1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn-outline.btn-primary:hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000)}}.btn-outline.btn-secondary:hover{--tw-text-opacity:1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn-outline.btn-secondary:hover{background-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,#000)}}.btn-outline.btn-accent:hover{--tw-text-opacity:1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn-outline.btn-accent:hover{background-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,#000)}}.btn-outline.btn-success:hover{--tw-text-opacity:1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn-outline.btn-success:hover{background-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,#000)}}.btn-outline.btn-info:hover{--tw-text-opacity:1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn-outline.btn-info:hover{background-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,#000)}}.btn-outline.btn-warning:hover{--tw-text-opacity:1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn-outline.btn-warning:hover{background-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,#000)}}.btn-outline.btn-error:hover{--tw-text-opacity:1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn-outline.btn-error:hover{background-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,#000)}}.btn-disabled:hover,.btn:disabled:hover,.btn[disabled]:hover{--tw-border-opacity:0;--tw-bg-opacity:0.2;--tw-text-opacity:0.2;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn:is(input[type=checkbox]:checked):hover,.btn:is(input[type=radio]:checked):hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000)}}.dropdown.dropdown-hover:hover .dropdown-content{--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:where(.menu li:not(.menu-title,.disabled)>:not(ul,details,.menu-title)):not(.active,.btn):hover,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.active,.btn):hover{cursor:pointer;outline:2px solid #0000;outline-offset:2px}@supports (color:oklch(0 0 0)){:where(.menu li:not(.menu-title,.disabled)>:not(ul,details,.menu-title)):not(.active,.btn):hover,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.active,.btn):hover{background-color:var(--fallback-bc,oklch(var(--bc)/.1))}}.tab[disabled],.tab[disabled]:hover{--tw-text-opacity:0.2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));cursor:not-allowed}}.dropdown:is(details) summary::-webkit-details-marker{display:none}.file-input{--tw-border-opacity:0;--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));border-radius:var(--rounded-btn,.5rem);border-width:1px;flex-shrink:1;font-size:1rem;height:3rem;line-height:2;line-height:1.5rem;overflow:hidden;padding-inline-end:1rem}.file-input::file-selector-button{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;animation:button-pop var(--animation-btn,.25s) ease-out;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));border-color:var(--fallback-n,oklch(var(--n)/var(--tw-border-opacity)));border-style:solid;border-width:var(--border-btn,1px);color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));cursor:pointer;display:inline-flex;flex-shrink:0;flex-wrap:wrap;font-size:.875rem;font-weight:600;height:100%;justify-content:center;line-height:1.25rem;line-height:1em;margin-inline-end:1rem;padding-left:1rem;padding-right:1rem;text-align:center;text-decoration-line:none;text-transform:uppercase;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);-webkit-user-select:none;-moz-user-select:none;user-select:none}.footer{-moz-column-gap:1rem;column-gap:1rem;font-size:.875rem;grid-auto-flow:row;line-height:1.25rem;row-gap:2.5rem;width:100%}.footer,.footer>*{display:grid;place-items:start}.footer>*{gap:.5rem}.footer-center{text-align:center}.footer-center,.footer-center>*{place-items:center}@media (min-width:48rem){.footer{grid-auto-flow:column}.footer-center{grid-auto-flow:row dense}}.form-control{flex-direction:column}.form-control,.label{display:flex}.label{align-items:center;justify-content:space-between;padding:.5rem .25rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.hero{background-position:50%;background-size:cover;display:grid;place-items:center;width:100%}.hero>*{grid-column-start:1;grid-row-start:1}.hero-content{align-items:center;display:flex;gap:1rem;justify-content:center;max-width:80rem;padding:1rem;z-index:0}.input{--tw-bg-opacity:1;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));border-color:#0000;border-radius:var(--rounded-btn,.5rem);border-width:1px;flex-shrink:1;font-size:1rem;height:3rem;line-height:2;line-height:1.5rem;padding-left:1rem;padding-right:1rem}.input-md[type=number]::-webkit-inner-spin-button,.input[type=number]::-webkit-inner-spin-button{margin-bottom:-1rem;margin-top:-1rem;margin-inline-end:-1rem}.join .dropdown .join-item:first-child:not(:last-child),.join :first-child:not(:last-child) .dropdown .join-item{border-end-end-radius:inherit;border-start-end-radius:inherit}.link{cursor:pointer;text-decoration-line:underline}.menu{display:flex;flex-direction:column;flex-wrap:wrap;font-size:.875rem;line-height:1.25rem;padding:.5rem}.menu :where(li ul){margin-inline-start:1rem;padding-inline-start:.5rem;position:relative;white-space:nowrap}.menu :where(li:not(.menu-title)>:not(ul,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){align-content:flex-start;align-items:center;display:grid;gap:.5rem;grid-auto-columns:minmax(auto,max-content) auto max-content;grid-auto-flow:column;-webkit-user-select:none;-moz-user-select:none;user-select:none}.menu li.disabled{color:var(--fallback-bc,oklch(var(--bc)/.3));cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;user-select:none}.menu :where(li>.menu-dropdown:not(.menu-dropdown-show)){display:none}:where(.menu li){align-items:stretch;display:flex;flex-direction:column;flex-shrink:0;flex-wrap:wrap;position:relative}:where(.menu li) .badge{justify-self:end}.mockup-code{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));border-radius:var(--rounded-box,1rem);color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));direction:ltr;min-width:18rem;overflow:hidden;overflow-x:auto;padding-bottom:1.25rem;padding-top:1.25rem;position:relative}.mockup-code pre[data-prefix]:before{content:attr(data-prefix);display:inline-block;opacity:.5;text-align:right;width:2rem}.modal{background-color:initial;color:inherit;display:grid;height:100%;inset:0;justify-items:center;margin:0;max-height:none;max-width:none;opacity:0;overflow-y:hidden;overscroll-behavior:contain;padding:0;pointer-events:none;position:fixed;transition-duration:.2s;transition-property:transform,opacity,visibility;transition-timing-function:cubic-bezier(0,0,.2,1);width:100%;z-index:999}:where(.modal){align-items:center}.modal-box{--tw-scale-x:.9;--tw-scale-y:.9;--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));border-bottom-left-radius:var(--rounded-box,1rem);border-bottom-right-radius:var(--rounded-box,1rem);border-top-left-radius:var(--rounded-box,1rem);border-top-right-radius:var(--rounded-box,1rem);box-shadow:0 25px 50px -12px #00000040;grid-column-start:1;grid-row-start:1;max-height:calc(100vh - 5em);max-width:32rem;overflow-y:auto;overscroll-behavior:contain;padding:1.5rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:91.666667%}.modal-open,.modal-toggle:checked+.modal,.modal:target,.modal[open]{opacity:1;pointer-events:auto;visibility:visible}:root:has(:is(.modal-open,.modal:target,.modal-toggle:checked+.modal,.modal[open])){overflow:hidden}.navbar{align-items:center;display:flex;min-height:4rem;padding:var(--navbar-padding,.5rem);width:100%}:where(.navbar>:not(script,style)){align-items:center;display:inline-flex}.navbar-start{justify-content:flex-start;width:50%}.navbar-center{flex-shrink:0}.navbar-end{justify-content:flex-end;width:50%}.progress{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--fallback-bc,oklch(var(--bc)/.2));border-radius:var(--rounded-box,1rem);height:.5rem;overflow:hidden;position:relative;width:100%}.radio{--chkbg:var(--bc);--tw-border-opacity:0.2;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));border-radius:9999px;border-width:1px;flex-shrink:0;height:1.5rem;width:1.5rem}.radio,.select{-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer}.select{--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));background-image:linear-gradient(45deg,#0000 50%,currentColor 0),linear-gradient(135deg,currentColor 50%,#0000 0);background-position:calc(100% - 20px) calc(1px + 50%),calc(100% - 16.1px) calc(1px + 50%);background-repeat:no-repeat;background-size:4px 4px,4px 4px;border-color:#0000;border-radius:var(--rounded-btn,.5rem);border-width:1px;display:inline-flex;font-size:.875rem;height:3rem;line-height:1.25rem;line-height:2;min-height:3rem;padding-left:1rem;padding-right:2.5rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.select[multiple]{height:auto}.stats{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));border-radius:var(--rounded-box,1rem);color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));display:inline-grid}:where(.stats){grid-auto-flow:column;overflow-x:auto}.stat{--tw-border-opacity:0.1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));-moz-column-gap:1rem;column-gap:1rem;display:inline-grid;grid-template-columns:repeat(1,1fr);padding:1rem 1.5rem;width:100%}.stat-title{color:var(--fallback-bc,oklch(var(--bc)/.6))}.stat-title,.stat-value{grid-column-start:1;white-space:nowrap}.stat-value{font-size:2.25rem;font-weight:800;line-height:2.5rem}.tabs{align-items:flex-end;display:grid}.tabs-lifted:has(.tab-content[class*=" rounded-"]) .tab:first-child:not(.tab-active),.tabs-lifted:has(.tab-content[class^=rounded-]) .tab:first-child:not(.tab-active){border-bottom-color:#0000}.tab{--tab-padding:1rem;--tw-text-opacity:0.5;--tab-color:var(--fallback-bc,oklch(var(--bc)/1));--tab-bg:var(--fallback-b1,oklch(var(--b1)/1));--tab-border-color:var(--fallback-b3,oklch(var(--b3)/1));align-items:center;-webkit-appearance:none;-moz-appearance:none;appearance:none;color:var(--tab-color);cursor:pointer;display:inline-flex;flex-wrap:wrap;font-size:.875rem;grid-row-start:1;height:2rem;justify-content:center;line-height:1.25rem;line-height:2;padding-inline-end:var(--tab-padding,1rem);padding-inline-start:var(--tab-padding,1rem);position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none}.tab:is(input[type=radio]){border-bottom-left-radius:0;border-bottom-right-radius:0;width:auto}.tab:is(input[type=radio]):after{--tw-content:attr(aria-label);content:var(--tw-content)}.tab:not(input):empty{cursor:default;grid-column-start:span 9999}.tab-content{border-color:#0000;border-width:var(--tab-border,0);display:none;grid-column-end:span 9999;grid-column-start:1;grid-row-start:2;margin-top:calc(var(--tab-border)*-1)}.tab-active+.tab-content:nth-child(2),:checked+.tab-content:nth-child(2){border-start-start-radius:0}.tab-active+.tab-content,input.tab:checked+.tab-content{display:block}.table{border-radius:var(--rounded-box,1rem);font-size:.875rem;line-height:1.25rem;position:relative;text-align:left;width:100%}.table :where(.table-pin-rows thead tr){--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));position:sticky;top:0;z-index:1}.table :where(.table-pin-rows tfoot tr){--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));bottom:0;position:sticky;z-index:1}.table :where(.table-pin-cols tr th){--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));left:0;position:sticky;right:0}.alert-info{--tw-text-opacity:1;--alert-bg:var(--fallback-in,oklch(var(--in)/1));--alert-bg-mix:var(--fallback-b1,oklch(var(--b1)/1));border-color:var(--fallback-in,oklch(var(--in)/.2));color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)))}.alert-warning{--tw-text-opacity:1;--alert-bg:var(--fallback-wa,oklch(var(--wa)/1));--alert-bg-mix:var(--fallback-b1,oklch(var(--b1)/1));border-color:var(--fallback-wa,oklch(var(--wa)/.2));color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}.alert-error{--tw-text-opacity:1;--alert-bg:var(--fallback-er,oklch(var(--er)/1));--alert-bg-mix:var(--fallback-b1,oklch(var(--b1)/1));border-color:var(--fallback-er,oklch(var(--er)/.2));color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)))}.badge-outline{--tw-border-opacity:0.5;background-color:initial;border-color:currentColor;color:currentColor}.badge-outline.badge-neutral{--tw-text-opacity:1;color:var(--fallback-n,oklch(var(--n)/var(--tw-text-opacity)))}.badge-outline.badge-primary{--tw-text-opacity:1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}.badge-outline.badge-secondary{--tw-text-opacity:1;color:var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity)))}.badge-outline.badge-accent{--tw-text-opacity:1;color:var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity)))}.badge-outline.badge-info{--tw-text-opacity:1;color:var(--fallback-in,oklch(var(--in)/var(--tw-text-opacity)))}.badge-outline.badge-success{--tw-text-opacity:1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity)))}.badge-outline.badge-warning{--tw-text-opacity:1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity)))}.badge-outline.badge-error{--tw-text-opacity:1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity)))}.btm-nav>* .label{font-size:1rem;line-height:1.5rem}.btn:active:focus,.btn:active:hover{animation:button-pop 0s ease-out;transform:scale(var(--btn-focus-scale,.97))}@supports not (color:oklch(0 0 0)){.btn{background-color:var(--btn-color,var(--fallback-b2));border-color:var(--btn-color,var(--fallback-b2))}.btn-primary{--btn-color:var(--fallback-p)}.btn-neutral{--btn-color:var(--fallback-n)}}@supports (color:color-mix(in oklab,black,black)){.btn-active{background-color:color-mix(in oklab,oklch(var(--btn-color,var(--b3))/var(--tw-bg-opacity,1)) 90%,#000);border-color:color-mix(in oklab,oklch(var(--btn-color,var(--b3))/var(--tw-border-opacity,1)) 90%,#000)}.btn-outline.btn-primary.btn-active{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000)}.btn-outline.btn-secondary.btn-active{background-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,#000)}.btn-outline.btn-accent.btn-active{background-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,#000)}.btn-outline.btn-success.btn-active{background-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,#000)}.btn-outline.btn-info.btn-active{background-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,#000)}.btn-outline.btn-warning.btn-active{background-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,#000)}.btn-outline.btn-error.btn-active{background-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,#000)}}.btn:focus-visible{outline-offset:2px;outline-style:solid;outline-width:2px}.btn-primary{--tw-text-opacity:1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));outline-color:var(--fallback-p,oklch(var(--p)/1))}@supports (color:oklch(0 0 0)){.btn-primary{--btn-color:var(--p)}.btn-neutral{--btn-color:var(--n)}}.btn-neutral{--tw-text-opacity:1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));outline-color:var(--fallback-n,oklch(var(--n)/1))}.btn.glass{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);outline-color:currentColor}.btn.glass.btn-active{--glass-opacity:25%;--glass-border-opacity:15%}.btn-ghost{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;background-color:initial;border-color:#0000;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:currentColor;outline-color:currentColor}.btn-ghost.btn-active{background-color:var(--fallback-bc,oklch(var(--bc)/.2));border-color:#0000}.btn-link.btn-active{background-color:initial;border-color:#0000;text-decoration-line:underline}.btn-outline{--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;background-color:initial;border-color:currentColor;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.btn-outline.btn-active{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));color:var(--fallback-b1,oklch(var(--b1)/var(--tw-text-opacity)))}.btn-outline.btn-primary{--tw-text-opacity:1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}.btn-outline.btn-primary.btn-active{--tw-text-opacity:1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn-outline.btn-secondary{--tw-text-opacity:1;color:var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity)))}.btn-outline.btn-secondary.btn-active{--tw-text-opacity:1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}.btn-outline.btn-accent{--tw-text-opacity:1;color:var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity)))}.btn-outline.btn-accent.btn-active{--tw-text-opacity:1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)))}.btn-outline.btn-success{--tw-text-opacity:1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity)))}.btn-outline.btn-success.btn-active{--tw-text-opacity:1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}.btn-outline.btn-info{--tw-text-opacity:1;color:var(--fallback-in,oklch(var(--in)/var(--tw-text-opacity)))}.btn-outline.btn-info.btn-active{--tw-text-opacity:1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)))}.btn-outline.btn-warning{--tw-text-opacity:1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity)))}.btn-outline.btn-warning.btn-active{--tw-text-opacity:1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}.btn-outline.btn-error{--tw-text-opacity:1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity)))}.btn-outline.btn-error.btn-active{--tw-text-opacity:1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)))}.btn.btn-disabled,.btn:disabled,.btn[disabled]{--tw-border-opacity:0;--tw-bg-opacity:0.2;--tw-text-opacity:0.2;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.btn:is(input[type=checkbox]:checked),.btn:is(input[type=radio]:checked){--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn:is(input[type=checkbox]:checked):focus-visible,.btn:is(input[type=radio]:checked):focus-visible{outline-color:var(--fallback-p,oklch(var(--p)/1))}@keyframes button-pop{0%{transform:scale(var(--btn-focus-scale,.98))}40%{transform:scale(1.02)}to{transform:scale(1)}}.card :where(figure:first-child){border-end-end-radius:unset;border-end-start-radius:unset;border-start-end-radius:inherit;border-start-start-radius:inherit;overflow:hidden}.card :where(figure:last-child){border-end-end-radius:inherit;border-end-start-radius:inherit;border-start-end-radius:unset;border-start-start-radius:unset;overflow:hidden}.card:focus-visible{outline:2px solid currentColor;outline-offset:2px}.card.bordered{--tw-border-opacity:1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));border-width:1px}.card.compact .card-body{font-size:.875rem;line-height:1.25rem;padding:1rem}.card-title{align-items:center;display:flex;font-size:1.25rem;font-weight:600;gap:.5rem;line-height:1.75rem}.card.image-full :where(figure){border-radius:inherit;overflow:hidden}.checkbox:focus{box-shadow:none}.checkbox:focus-visible{outline-color:var(--fallback-bc,oklch(var(--bc)/1));outline-offset:2px;outline-style:solid;outline-width:2px}.checkbox:checked,.checkbox[aria-checked=true],.checkbox[checked=true]{animation:checkmark var(--animation-input,.2s) ease-out;background-color:var(--chkbg);background-image:linear-gradient(-45deg,#0000 65%,var(--chkbg) 65.99%),linear-gradient(45deg,#0000 75%,var(--chkbg) 75.99%),linear-gradient(-45deg,var(--chkbg) 40%,#0000 40.99%),linear-gradient(45deg,var(--chkbg) 30%,var(--chkfg) 30.99%,var(--chkfg) 40%,#0000 40.99%),linear-gradient(-45deg,var(--chkfg) 50%,var(--chkbg) 50.99%);background-repeat:no-repeat}.checkbox:indeterminate{animation:checkmark var(--animation-input,.2s) ease-out;background-image:linear-gradient(90deg,#0000 80%,var(--chkbg) 80%),linear-gradient(-90deg,#0000 80%,var(--chkbg) 80%),linear-gradient(0deg,var(--chkbg) 43%,var(--chkfg) 43%,var(--chkfg) 57%,var(--chkbg) 57%);background-repeat:no-repeat}.checkbox:disabled,.checkbox:indeterminate{--tw-bg-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)))}.checkbox:disabled{border-color:#0000;cursor:not-allowed;opacity:.2}@keyframes checkmark{0%{background-position-y:5px}50%{background-position-y:-2px}to{background-position-y:0}}.dropdown.dropdown-open .dropdown-content,.dropdown:focus .dropdown-content,.dropdown:focus-within .dropdown-content{--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.file-input-bordered{--tw-border-opacity:0.2}.file-input:focus{outline-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-offset:2px;outline-style:solid;outline-width:2px}.file-input-disabled,.file-input[disabled]{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:0.2;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));cursor:not-allowed}.file-input-disabled::-moz-placeholder,.file-input[disabled]::-moz-placeholder{--tw-placeholder-opacity:0.2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)))}.file-input-disabled::placeholder,.file-input[disabled]::placeholder{--tw-placeholder-opacity:0.2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)))}.file-input-disabled::file-selector-button,.file-input[disabled]::file-selector-button{--tw-border-opacity:0;--tw-bg-opacity:0.2;--tw-text-opacity:0.2;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.label-text{--tw-text-opacity:1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));font-size:.875rem;line-height:1.25rem}.input input{--tw-bg-opacity:1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));background-color:initial}.input input:focus{outline:2px solid #0000;outline-offset:2px}.input[list]::-webkit-calendar-picker-indicator{line-height:1em}.input-bordered,.input:focus,.input:focus-within{border-color:var(--fallback-bc,oklch(var(--bc)/.2))}.input:focus,.input:focus-within{box-shadow:none;outline-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-offset:2px;outline-style:solid;outline-width:2px}.input-disabled,.input:disabled,.input[disabled]{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4));cursor:not-allowed}.input-disabled::-moz-placeholder,.input:disabled::-moz-placeholder,.input[disabled]::-moz-placeholder{--tw-placeholder-opacity:0.2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)))}.input-disabled::placeholder,.input:disabled::placeholder,.input[disabled]::placeholder{--tw-placeholder-opacity:0.2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)))}.input::-webkit-date-and-time-value{text-align:inherit}.link:focus{outline:2px solid #0000;outline-offset:2px}.link:focus-visible{outline:2px solid currentColor;outline-offset:2px}:where(.menu li:empty){--tw-bg-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));height:1px;margin:.5rem 1rem;opacity:.1}.menu :where(li ul):before{--tw-bg-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));bottom:.75rem;content:"";inset-inline-start:0;opacity:.1;position:absolute;top:.75rem;width:1px}.menu :where(li:not(.menu-title)>:not(ul,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){text-wrap:balance;border-radius:var(--rounded-btn,.5rem);padding:.5rem 1rem;text-align:start;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1)}:where(.menu li:not(.menu-title,.disabled)>:not(ul,details,.menu-title)):is(summary):not(.active,.btn):focus-visible,:where(.menu li:not(.menu-title,.disabled)>:not(ul,details,.menu-title)):not(summary,.active,.btn).focus,:where(.menu li:not(.menu-title,.disabled)>:not(ul,details,.menu-title)):not(summary,.active,.btn):focus,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):is(summary):not(.active,.btn):focus-visible,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(summary,.active,.btn).focus,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(summary,.active,.btn):focus{--tw-text-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/.1));color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));cursor:pointer;outline:2px solid #0000;outline-offset:2px}.menu li>:not(ul,.menu-title,details,.btn).active,.menu li>:not(ul,.menu-title,details,.btn):active,.menu li>details>summary:active{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.menu :where(li>details>summary)::-webkit-details-marker{display:none}.menu :where(li>.menu-dropdown-toggle):after,.menu :where(li>details>summary):after{box-shadow:2px 2px;content:"";display:block;height:.5rem;justify-self:end;margin-top:-.5rem;pointer-events:none;transform:rotate(45deg);transform-origin:75% 75%;transition-duration:.3s;transition-property:transform,margin-top;transition-timing-function:cubic-bezier(.4,0,.2,1);width:.5rem}.menu :where(li>.menu-dropdown-toggle.menu-dropdown-show):after,.menu :where(li>details[open]>summary):after{margin-top:0;transform:rotate(225deg)}.mockup-code:before{border-radius:9999px;box-shadow:1.4em 0,2.8em 0,4.2em 0;content:"";display:block;height:.75rem;margin-bottom:1rem;opacity:.3;width:.75rem}.mockup-code pre{padding-right:1.25rem}.mockup-code pre:before{content:"";margin-right:2ch}.mockup-browser .mockup-browser-toolbar .input{--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));direction:ltr;display:block;height:1.75rem;margin-left:auto;margin-right:auto;overflow:hidden;padding-left:2rem;position:relative;text-overflow:ellipsis;white-space:nowrap;width:24rem}.mockup-browser .mockup-browser-toolbar .input:before{--tw-translate-y:-50%;aspect-ratio:1/1;border-color:currentColor;border-radius:9999px;border-width:2px;height:.75rem;left:.5rem}.mockup-browser .mockup-browser-toolbar .input:after,.mockup-browser .mockup-browser-toolbar .input:before{content:"";opacity:.6;position:absolute;top:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.mockup-browser .mockup-browser-toolbar .input:after{--tw-translate-y:25%;--tw-rotate:-45deg;border-color:currentColor;border-radius:9999px;border-width:1px;height:.5rem;left:1.25rem}.modal::backdrop,.modal:not(dialog:not(.modal-open)){animation:modal-pop .2s ease-out;background-color:#0006}.modal-backdrop{align-self:stretch;color:#0000;display:grid;grid-column-start:1;grid-row-start:1;justify-self:stretch;z-index:-1}.modal-open .modal-box,.modal-toggle:checked+.modal .modal-box,.modal:target .modal-box,.modal[open] .modal-box{--tw-translate-y:0px;--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes modal-pop{0%{opacity:0}}.progress::-moz-progress-bar{--tw-bg-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));border-radius:var(--rounded-box,1rem)}.progress:indeterminate{--progress-color:var(--fallback-bc,oklch(var(--bc)/1));animation:progress-loading 5s ease-in-out infinite;background-image:repeating-linear-gradient(90deg,var(--progress-color) -1%,var(--progress-color) 10%,#0000 10%,#0000 90%);background-position-x:15%;background-size:200%}.progress::-webkit-progress-bar{background-color:initial;border-radius:var(--rounded-box,1rem)}.progress::-webkit-progress-value{--tw-bg-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));border-radius:var(--rounded-box,1rem)}.progress:indeterminate::-moz-progress-bar{animation:progress-loading 5s ease-in-out infinite;background-color:initial;background-image:repeating-linear-gradient(90deg,var(--progress-color) -1%,var(--progress-color) 10%,#0000 10%,#0000 90%);background-position-x:15%;background-size:200%}@keyframes progress-loading{50%{background-position-x:-115%}}.radio:focus{box-shadow:none}.radio:focus-visible{outline-color:var(--fallback-bc,oklch(var(--bc)/1));outline-offset:2px;outline-style:solid;outline-width:2px}.radio:checked,.radio[aria-checked=true]{--tw-bg-opacity:1;animation:radiomark var(--animation-input,.2s) ease-out;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));background-image:none;box-shadow:0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset}.radio-primary{--chkbg:var(--p);--tw-border-opacity:1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)))}.radio-primary:focus-visible{outline-color:var(--fallback-p,oklch(var(--p)/1))}.radio-primary:checked,.radio-primary[aria-checked=true]{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.radio:disabled{cursor:not-allowed;opacity:.2}@keyframes radiomark{0%{box-shadow:0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset}50%{box-shadow:0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset}to{box-shadow:0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset}}@keyframes rating-pop{0%{transform:translateY(-.125em)}40%{transform:translateY(-.125em)}to{transform:translateY(0)}}.select:focus{border-color:var(--fallback-bc,oklch(var(--bc)/.2));box-shadow:none;outline-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-offset:2px;outline-style:solid;outline-width:2px}.select-disabled,.select:disabled,.select[disabled]{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:0.2;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));cursor:not-allowed}.select-disabled::-moz-placeholder,.select:disabled::-moz-placeholder,.select[disabled]::-moz-placeholder{--tw-placeholder-opacity:0.2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)))}.select-disabled::placeholder,.select:disabled::placeholder,.select[disabled]::placeholder{--tw-placeholder-opacity:0.2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)))}.select-multiple,.select[multiple],.select[size].select:not([size="1"]){background-image:none;padding-right:1rem}[dir=rtl] .select{background-position:12px calc(1px + 50%),16px calc(1px + 50%)}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}:where(.stats)>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;--tw-divide-y-reverse:0;border-width:calc(0px*(1 - var(--tw-divide-y-reverse))) calc(1px*var(--tw-divide-x-reverse)) calc(0px*var(--tw-divide-y-reverse)) calc(1px*(1 - var(--tw-divide-x-reverse)))}:is([dir=rtl] .stats>:not([hidden])~:not([hidden])){--tw-divide-x-reverse:1}.tabs-lifted>.tab:focus-visible{border-end-end-radius:0;border-end-start-radius:0}.tab.tab-active:not(.tab-disabled):not([disabled]),.tab:is(input:checked){--tw-border-opacity:1;--tw-text-opacity:1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)))}.tab:focus{outline:2px solid #0000;outline-offset:2px}.tab:focus-visible{outline:2px solid currentColor;outline-offset:-5px}.tab-disabled,.tab[disabled]{--tw-text-opacity:0.2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));cursor:not-allowed}.tabs-bordered>.tab{--tw-border-opacity:0.2;border-bottom-width:calc(var(--tab-border, 1px) + 1px);border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));border-style:solid}.tabs-lifted>.tab{border:var(--tab-border,1px) solid #0000;border-bottom-color:var(--tab-border-color);border-start-end-radius:var(--tab-radius,.5rem);border-start-start-radius:var(--tab-radius,.5rem);border-width:0 0 var(--tab-border,1px) 0;padding-inline-end:var(--tab-padding,1rem);padding-inline-start:var(--tab-padding,1rem);padding-top:var(--tab-border,1px)}.tabs-lifted>.tab.tab-active:not(.tab-disabled):not([disabled]),.tabs-lifted>.tab:is(input:checked){background-color:var(--tab-bg);border-inline-end-color:var(--tab-border-color);border-inline-start-color:var(--tab-border-color);border-top-color:var(--tab-border-color);border-width:var(--tab-border,1px) var(--tab-border,1px) 0 var(--tab-border,1px);padding-inline-end:calc(var(--tab-padding, 1rem) - var(--tab-border, 1px));padding-bottom:var(--tab-border,1px);padding-inline-start:calc(var(--tab-padding, 1rem) - var(--tab-border, 1px));padding-top:0}.tabs-lifted>.tab.tab-active:not(.tab-disabled):not([disabled]):before,.tabs-lifted>.tab:is(input:checked):before{--tab-grad:calc(69% - var(--tab-border, 1px));--radius-start:radial-gradient(circle at top left,#0000 var(--tab-grad),var(--tab-border-color) calc(var(--tab-grad) + 0.25px),var(--tab-border-color) calc(var(--tab-grad) + var(--tab-border, 1px)),var(--tab-bg) calc(var(--tab-grad) + var(--tab-border, 1px) + 0.25px));--radius-end:radial-gradient(circle at top right,#0000 var(--tab-grad),var(--tab-border-color) calc(var(--tab-grad) + 0.25px),var(--tab-border-color) calc(var(--tab-grad) + var(--tab-border, 1px)),var(--tab-bg) calc(var(--tab-grad) + var(--tab-border, 1px) + 0.25px));background-image:var(--radius-start),var(--radius-end);background-position:0 0,100% 0;background-repeat:no-repeat;background-size:var(--tab-radius,.5rem);bottom:0;content:"";display:block;height:var(--tab-radius,.5rem);position:absolute;width:calc(100% + var(--tab-radius, .5rem)*2);z-index:1}.tabs-lifted>.tab.tab-active:not(.tab-disabled):not([disabled]):first-child:before,.tabs-lifted>.tab:is(input:checked):first-child:before{background-image:var(--radius-end);background-position:100% 0}.tabs-lifted>.tab.tab-active:not(.tab-disabled):not([disabled]):last-child:before,.tabs-lifted>.tab:is(input:checked):last-child:before,[dir=rtl] .tabs-lifted>.tab.tab-active:not(.tab-disabled):not([disabled]):first-child:before,[dir=rtl] .tabs-lifted>.tab:is(input:checked):first-child:before{background-image:var(--radius-start);background-position:0 0}.tabs-lifted>.tab-active:not(.tab-disabled):not([disabled])+.tabs-lifted .tab-active:not(.tab-disabled):not([disabled]):before,.tabs-lifted>.tab:is(input:checked)+.tabs-lifted .tab:is(input:checked):before,[dir=rtl] .tabs-lifted>.tab.tab-active:not(.tab-disabled):not([disabled]):last-child:before,[dir=rtl] .tabs-lifted>.tab:is(input:checked):last-child:before{background-image:var(--radius-end);background-position:100% 0}.tabs-boxed{--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));padding:.25rem}.tabs-boxed,.tabs-boxed .tab{border-radius:var(--rounded-btn,.5rem)}.tabs-boxed .tab-active:not(.tab-disabled):not([disabled]),.tabs-boxed :is(input:checked){--tw-bg-opacity:1;--tw-text-opacity:1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}:is([dir=rtl] .table){text-align:right}.table :where(th,td){padding:.75rem 1rem;vertical-align:middle}.table tr.active,.table tr.active:nth-child(2n),.table-zebra tbody tr:nth-child(2n){--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.table :where(thead,tbody) :where(tr:first-child:last-child),.table :where(thead,tbody) :where(tr:not(:last-child)){--tw-border-opacity:1;border-bottom-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));border-bottom-width:1px}.table :where(thead,tfoot){color:var(--fallback-bc,oklch(var(--bc)/.6));font-size:.75rem;font-weight:700;line-height:1rem;white-space:nowrap}@keyframes toast-pop{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.glass,.glass.btn-active{-webkit-backdrop-filter:blur(var(--glass-blur,40px));backdrop-filter:blur(var(--glass-blur,40px));background-color:initial;background-image:linear-gradient(135deg,rgb(255 255 255/var(--glass-opacity,30%)) 0,#0000 100%),linear-gradient(var(--glass-reflex-degree,100deg),rgb(255 255 255/var(--glass-reflex-opacity,10%)) 25%,#0000 25%);border:none;box-shadow:0 0 0 1px rgb(255 255 255/var(--glass-border-opacity,10%)) inset,0 0 0 2px #0000000d;text-shadow:0 1px rgb(0 0 0/var(--glass-text-shadow-opacity,5%))}@media (hover:hover){.glass.btn-active{-webkit-backdrop-filter:blur(var(--glass-blur,40px));backdrop-filter:blur(var(--glass-blur,40px));background-color:initial;background-image:linear-gradient(135deg,rgb(255 255 255/var(--glass-opacity,30%)) 0,#0000 100%),linear-gradient(var(--glass-reflex-degree,100deg),rgb(255 255 255/var(--glass-reflex-opacity,10%)) 25%,#0000 25%);border:none;box-shadow:0 0 0 1px rgb(255 255 255/var(--glass-border-opacity,10%)) inset,0 0 0 2px #0000000d;text-shadow:0 1px rgb(0 0 0/var(--glass-text-shadow-opacity,5%))}}[type=checkbox].checkbox-sm{height:1.25rem;width:1.25rem}.menu-horizontal{display:inline-flex;flex-direction:row}.menu-horizontal>li:not(.menu-title)>details>ul{position:absolute}.stats-vertical{grid-auto-flow:row}.tabs-md :where(.tab){--tab-padding:1rem;font-size:.875rem;height:2rem;line-height:1.25rem;line-height:2}.tabs-lg :where(.tab){--tab-padding:1.25rem;font-size:1.125rem;height:3rem;line-height:1.75rem;line-height:2}.tabs-sm :where(.tab){--tab-padding:0.75rem;font-size:.875rem;height:1.5rem;line-height:.75rem}.tabs-xs :where(.tab){--tab-padding:0.5rem;font-size:.75rem;height:1.25rem;line-height:.75rem}.tooltip{--tooltip-offset:calc(100% + 1px + var(--tooltip-tail, 0px))}.tooltip:before{--tw-content:attr(data-tip);content:var(--tw-content);pointer-events:none;position:absolute;z-index:1}.tooltip-top:before,.tooltip:before{bottom:var(--tooltip-offset);left:50%;right:auto;top:auto;transform:translateX(-50%)}.tooltip-bottom:before{bottom:auto;left:50%;right:auto;top:var(--tooltip-offset);transform:translateX(-50%)}.card-compact .card-body{font-size:.875rem;line-height:1.25rem;padding:1rem}.card-compact .card-title{margin-bottom:.25rem}.card-normal .card-body{font-size:1rem;line-height:1.5rem;padding:var(--padding-card,2rem)}.card-normal .card-title{margin-bottom:.75rem}.menu-horizontal>li:not(.menu-title)>details>ul{margin-inline-start:0;margin-top:1rem;padding-bottom:.5rem;padding-inline-end:.5rem;padding-top:.5rem}.menu-horizontal>li>details>ul:before{content:none}:where(.menu-horizontal>li:not(.menu-title)>details>ul){--tw-bg-opacity:1;--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));border-radius:var(--rounded-box,1rem);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.menu-sm :where(li:not(.menu-title)>:not(ul,details,.menu-title)),.menu-sm :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--rounded-btn,.5rem);font-size:.875rem;line-height:1.25rem;padding:.25rem .75rem}.menu-sm .menu-title{padding:.5rem .75rem}.modal-top :where(.modal-box){--tw-translate-y:-2.5rem;--tw-scale-x:1;--tw-scale-y:1;border-bottom-left-radius:var(--rounded-box,1rem);border-bottom-right-radius:var(--rounded-box,1rem);border-top-left-radius:0;border-top-right-radius:0;max-width:none;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));width:100%}.modal-middle :where(.modal-box){--tw-translate-y:0px;--tw-scale-x:.9;--tw-scale-y:.9;border-bottom-left-radius:var(--rounded-box,1rem);border-bottom-right-radius:var(--rounded-box,1rem);border-top-left-radius:var(--rounded-box,1rem);border-top-right-radius:var(--rounded-box,1rem);max-width:32rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));width:91.666667%}.modal-bottom :where(.modal-box){--tw-translate-y:2.5rem;--tw-scale-x:1;--tw-scale-y:1;border-bottom-left-radius:0;border-bottom-right-radius:0;border-top-left-radius:var(--rounded-box,1rem);border-top-right-radius:var(--rounded-box,1rem);max-width:none;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));width:100%}.stats-vertical>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;--tw-divide-y-reverse:0;border-width:calc(1px*(1 - var(--tw-divide-y-reverse))) calc(0px*var(--tw-divide-x-reverse)) calc(1px*var(--tw-divide-y-reverse)) calc(0px*(1 - var(--tw-divide-x-reverse)))}.stats-vertical{overflow-y:auto}.tooltip{--tooltip-tail:0.1875rem;--tooltip-color:var(--fallback-n,oklch(var(--n)/1));--tooltip-text-color:var(--fallback-nc,oklch(var(--nc)/1));--tooltip-tail-offset:calc(100% + 0.0625rem - var(--tooltip-tail));display:inline-block;position:relative;text-align:center}.tooltip:after,.tooltip:before{opacity:0;transition-delay:.1s;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.tooltip:after{border-style:solid;border-width:var(--tooltip-tail,0);content:"";display:block;height:0;position:absolute;width:0}.tooltip:before{background-color:var(--tooltip-color);border-radius:.25rem;color:var(--tooltip-text-color);font-size:.875rem;line-height:1.25rem;max-width:20rem;padding:.25rem .5rem;width:-moz-max-content;width:max-content}.tooltip.tooltip-open:after,.tooltip.tooltip-open:before,.tooltip:has(:focus-visible):after,.tooltip:has(:focus-visible):before,.tooltip:hover:after,.tooltip:hover:before{opacity:1;transition-delay:75ms}.tooltip:not([data-tip]):hover:after,.tooltip:not([data-tip]):hover:before{opacity:0;visibility:hidden}.tooltip-top:after,.tooltip:after{border-color:var(--tooltip-color) #0000 #0000 #0000;bottom:var(--tooltip-tail-offset);left:50%;right:auto;top:auto;transform:translateX(-50%)}.tooltip-bottom:after{border-color:#0000 #0000 var(--tooltip-color) #0000;bottom:auto;left:50%;right:auto;top:var(--tooltip-tail-offset);transform:translateX(-50%)}.static{position:static}.fixed{position:fixed}.right-5{right:1.25rem}.top-5{top:1.25rem}.z-10{z-index:10}.z-\[1\]{z-index:1}.m-1{margin:.25rem}.m-auto{margin:auto}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-10{margin-bottom:2.5rem;margin-top:2.5rem}.my-2{margin-bottom:.5rem;margin-top:.5rem}.my-3{margin-bottom:.75rem;margin-top:.75rem}.my-5{margin-bottom:1.25rem;margin-top:1.25rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.ml-2{margin-left:.5rem}.mr-4{margin-right:1rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mb-2{margin-bottom:.5rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-\[25rem\]{height:25rem}.h-fit{height:-moz-fit-content;height:fit-content}.min-h-screen{min-height:100vh}.min-h-80{min-height:20rem}.w-1\/5{width:20%}.w-4\/5{width:80%}.w-5{width:1.25rem}.w-52{width:13rem}.w-6{width:1.5rem}.w-96{width:24rem}.w-auto{width:auto}.w-full{width:100%}.min-w-full{min-width:100%}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-shrink-0,.shrink-0{flex-shrink:0}.cursor-pointer{cursor:pointer}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.75rem*var(--tw-space-x-reverse))}.justify-self-center{justify-self:center}.overflow-x-auto{overflow-x:auto}.rounded-box{border-radius:var(--rounded-box,1rem)}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.border-base-300{--tw-border-opacity:1;border-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)))}.border-blue-300{--tw-border-opacity:1;border-color:rgb(147 197 253/var(--tw-border-opacity))}.border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}.bg-base-100{--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.bg-base-200{--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.bg-base-300{--tw-bg-opacity:1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}.bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity))}.bg-neutral{--tw-bg-opacity:1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)))}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.bg-secondary-content{--tw-bg-opacity:1;background-color:var(--fallback-sc,oklch(var(--sc)/var(--tw-bg-opacity)))}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}.bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.stroke-current{stroke:currentColor}.p-2{padding:.5rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-20{padding-bottom:5rem;padding-top:5rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-5{padding-bottom:1.25rem;padding-top:1.25rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.text-center{text-align:center}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.normal-case{text-transform:none}.text-base-content{--tw-text-opacity:1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.text-neutral-content{--tw-text-opacity:1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.text-primary{--tw-text-opacity:1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.text-secondary{--tw-text-opacity:1;color:var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity)))}.text-success{--tw-text-opacity:1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity)))}.text-warning{--tw-text-opacity:1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity)))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-2xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px #00000040;--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.shadow-xl{--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.shadow-lg,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}@tailwind daisyui;@media (min-width:1024px){.lg\:stats-horizontal{grid-auto-flow:column}.lg\:stats-horizontal>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;--tw-divide-y-reverse:0;border-width:calc(0px*(1 - var(--tw-divide-y-reverse))) calc(1px*var(--tw-divide-x-reverse)) calc(0px*var(--tw-divide-y-reverse)) calc(1px*(1 - var(--tw-divide-x-reverse)))}.lg\:stats-horizontal{overflow-x:auto}:is([dir=rtl] .lg\:stats-horizontal){--tw-divide-x-reverse:1}}.hover\:cursor-pointer:hover{cursor:pointer}.hover\:no-underline:hover{text-decoration-line:none}@media (min-width:640px){.sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}}@media (min-width:768px){.md\:w-2\/12{width:16.666667%}.md\:w-2\/3{width:66.666667%}.md\:w-2\/6{width:33.333333%}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-end{align-items:flex-end}.md\:space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}}@media (min-width:1024px){.lg\:flex{display:flex}.lg\:hidden{display:none}.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\:flex-row-reverse{flex-direction:row-reverse}.lg\:text-left{text-align:left}} \ No newline at end of file diff --git a/app/controllers/api/v1/points_controller.rb b/app/controllers/api/v1/points_controller.rb deleted file mode 100644 index b7501b59..00000000 --- a/app/controllers/api/v1/points_controller.rb +++ /dev/null @@ -1,20 +0,0 @@ -# frozen_string_literal: true - -# TODO: Deprecate in 1.0 - -class Api::V1::PointsController < ApplicationController - skip_forgery_protection - - def create - Rails.logger.info 'This endpoint will be deprecated in 1.0. Use /api/v1/owntracks/points instead' - Owntracks::PointCreatingJob.perform_later(point_params) - - render json: {}, status: :ok - end - - private - - def point_params - params.permit! - end -end diff --git a/app/controllers/imports_controller.rb b/app/controllers/imports_controller.rb index 428c6fab..3d4b976e 100644 --- a/app/controllers/imports_controller.rb +++ b/app/controllers/imports_controller.rb @@ -23,7 +23,11 @@ class ImportsController < ApplicationController source: params[:import][:source] ) - import.update(raw_data: JSON.parse(File.read(file))) + file = File.read(file) + + raw_data = params[:import][:source] == 'gpx' ? Hash.from_xml(file) : JSON.parse(file) + + import.update(raw_data:) import.id end diff --git a/app/javascript/controllers/maps_controller.js b/app/javascript/controllers/maps_controller.js index bf212250..f376a3f3 100644 --- a/app/javascript/controllers/maps_controller.js +++ b/app/javascript/controllers/maps_controller.js @@ -1,183 +1,44 @@ -import { Controller } from "@hotwired/stimulus" -import L, { circleMarker } from "leaflet" -import "leaflet.heat" +import { Controller } from "@hotwired/stimulus"; +import L from "leaflet"; +import "leaflet.heat"; // Connects to data-controller="maps" export default class extends Controller { - static targets = ["container"] + static targets = ["container"]; connect() { - console.log("Map controller connected") - var markers = JSON.parse(this.element.dataset.coordinates) - var center = markers[markers.length - 1] || JSON.parse(this.element.dataset.center) - var center = (center === undefined) ? [52.514568, 13.350111] : center; - var timezone = this.element.dataset.timezone; + console.log("Map controller connected"); - var map = L.map(this.containerTarget, { - layers: [this.osmMapLayer(), this.osmHotMapLayer()] + const markers = JSON.parse(this.element.dataset.coordinates); + let center = markers[markers.length - 1] || JSON.parse(this.element.dataset.center); + center = center === undefined ? [52.514568, 13.350111] : center; + const timezone = this.element.dataset.timezone; + + const map = L.map(this.containerTarget, { + layers: [this.osmMapLayer(), this.osmHotMapLayer()], }).setView([center[0], center[1]], 14); - var markersArray = this.markersArray(markers); - var markersLayer = L.layerGroup(markersArray); - var heatmapMarkers = markers.map(element => [element[0], element[1], 0.3]); // lat, lon, intensity + const markersArray = this.createMarkersArray(markers); + const markersLayer = L.layerGroup(markersArray); + const heatmapMarkers = markers.map((element) => [element[0], element[1], 0.3]); - // Function to calculate distance between two lat-lng points using Haversine formula - function haversineDistance(lat1, lon1, lat2, lon2) { - const toRad = x => x * Math.PI / 180; - const R = 6371; // Radius of the Earth in kilometers - const dLat = toRad(lat2 - lat1); - const dLon = toRad(lon2 - lon1); - const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + - Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * - Math.sin(dLon / 2) * Math.sin(dLon / 2); - const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); - return R * c * 1000; // Distance in meters - } + const polylinesLayer = this.createPolylinesLayer(markers, map, timezone); + const heatmapLayer = L.heatLayer(heatmapMarkers, { radius: 20 }).addTo(map); - function getURLParameter(name) { - return new URLSearchParams(window.location.search).get(name); - } - - function minutesToDaysHoursMinutes(minutes) { - var days = Math.floor(minutes / (24 * 60)); - var hours = Math.floor((minutes % (24 * 60)) / 60); - var minutes = minutes % 60; - var result = ''; - - if (days > 0) { - result += days + 'd '; - } - - if (hours > 0) { - result += hours + 'h '; - } - - if (minutes > 0) { - result += minutes + 'min'; - } - - return result; - } - - function addHighlightOnHover(polyline, map, startPoint, endPoint, prevPoint, nextPoint, timezone) { - // Define the original and highlight styles - const originalStyle = { color: 'blue', opacity: 0.6, weight: 3 }; - const highlightStyle = { color: 'yellow', opacity: 1, weight: 5 }; - - // Apply original style to the polyline initially - polyline.setStyle(originalStyle); - - // Create the popup content for the route - var firstTimestamp = new Date(startPoint[4] * 1000).toLocaleString('en-GB', { timeZone: timezone }); - var lastTimestamp = new Date(endPoint[4] * 1000).toLocaleString('en-GB', { timeZone: timezone }); - // Make timeOnRoute look nice with split to days, hours and minutes - - var minutes = Math.round((endPoint[4] - startPoint[4]) / 60); - var timeOnRoute = minutesToDaysHoursMinutes(minutes); - - // Calculate distances to previous and next points - var distanceToPrev = prevPoint ? haversineDistance(prevPoint[0], prevPoint[1], startPoint[0], startPoint[1]) : 'N/A'; - var distanceToNext = nextPoint ? haversineDistance(endPoint[0], endPoint[1], nextPoint[0], nextPoint[1]) : 'N/A'; - - // Calculate time between routes - var timeBetweenPrev = prevPoint ? Math.round((startPoint[4] - prevPoint[4]) / 60) : 'N/A'; - var timeBetweenNext = nextPoint ? Math.round((nextPoint[4] - endPoint[4]) / 60) : 'N/A'; - - // Create custom emoji icons - const startIcon = L.divIcon({ html: '🚥', className: 'emoji-icon' }); - const finishIcon = L.divIcon({ html: '🏁', className: 'emoji-icon' }); - - // Create markers for the start and end points - const startMarker = L.marker([startPoint[0], startPoint[1]], { icon: startIcon }).bindPopup(`Start: ${firstTimestamp}`); - const endMarker = L.marker([endPoint[0], endPoint[1]], { icon: finishIcon }).bindPopup(` - Start: ${firstTimestamp} - End: ${lastTimestamp} - Duration: ${timeOnRoute} - Prev Route: ${Math.round(distanceToPrev)}m and ${minutesToDaysHoursMinutes(timeBetweenPrev)} away - Next Route: ${Math.round(distanceToNext)}m and ${minutesToDaysHoursMinutes(timeBetweenNext)} away - `); - - // Add mouseover event to highlight the polyline and show the start and end markers - polyline.on('mouseover', function(e) { - polyline.setStyle(highlightStyle); - startMarker.addTo(map); - endMarker.addTo(map).openPopup(); - }); - - // Add mouseout event to revert the polyline style and remove the start and end markers - polyline.on('mouseout', function(e) { - polyline.setStyle(originalStyle); - map.closePopup(); - map.removeLayer(startMarker); - map.removeLayer(endMarker); - }); - } - - var splitPolylines = []; - var currentPolyline = []; - var distanceThresholdMeters = parseInt(getURLParameter('meters_between_routes')) || 500; - var timeThresholdMinutes = parseInt(getURLParameter('minutes_between_routes')) || 60; - - // Process markers and split polylines based on the distance and time - for (let i = 0, len = markers.length; i < len; i++) { - if (currentPolyline.length === 0) { - currentPolyline.push(markers[i]); - } else { - var lastPoint = currentPolyline[currentPolyline.length - 1]; - var currentPoint = markers[i]; - var distance = haversineDistance(lastPoint[0], lastPoint[1], currentPoint[0], currentPoint[1]); - var timeDifference = (currentPoint[4] - lastPoint[4]) / 60; // Time difference in minutes - - if (distance > distanceThresholdMeters || timeDifference > timeThresholdMinutes) { - splitPolylines.push([...currentPolyline]); // Use spread operator to clone the array - currentPolyline = [currentPoint]; - } else { - currentPolyline.push(currentPoint); - } - } - } - // Add the last polyline if it exists - if (currentPolyline.length > 0) { - splitPolylines.push(currentPolyline); - } - - // Assuming each polylineCoordinates is an array of objects with lat, lng, and timestamp properties - var polylineLayers = splitPolylines.map((polylineCoordinates, index) => { - // Extract lat-lng pairs for the polyline - var latLngs = polylineCoordinates.map(point => [point[0], point[1]]); - - // Create a polyline with the given coordinates - var polyline = L.polyline(latLngs, { color: 'blue', opacity: 0.6, weight: 3 }); - - // Get the start and end points - var startPoint = polylineCoordinates[0]; - var endPoint = polylineCoordinates[polylineCoordinates.length - 1]; - - // Get the previous and next points - var prevPoint = index > 0 ? splitPolylines[index - 1][splitPolylines[index - 1].length - 1] : null; - var nextPoint = index < splitPolylines.length - 1 ? splitPolylines[index + 1][0] : null; - - // Add highlighting and popups on hover - addHighlightOnHover(polyline, map, startPoint, endPoint, prevPoint, nextPoint, timezone); - - return polyline; - }); - - var polylinesLayer = L.layerGroup(polylineLayers).addTo(map); - var heatmapLayer = L.heatLayer(heatmapMarkers, { radius: 20 }).addTo(map); - - var controlsLayer = { - "Points": markersLayer, - "Polylines": polylinesLayer, - "Heatmap": heatmapLayer + const controlsLayer = { + Points: markersLayer, + Polylines: polylinesLayer, + Heatmap: heatmapLayer, }; - L.control.scale({ - position: 'bottomright', // The default position is 'bottomleft' - metric: true, // Display metric scale - imperial: false, // Display imperial scale - maxWidth: 120 // Maximum width of the scale control in pixels - }).addTo(map); + L.control + .scale({ + position: "bottomright", + metric: true, + imperial: false, + maxWidth: 120, + }) + .addTo(map); L.control.layers(this.baseMaps(), controlsLayer).addTo(map); @@ -190,50 +51,35 @@ export default class extends Controller { } osmMapLayer() { - return L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', { + return L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", { maxZoom: 19, - attribution: '© OpenStreetMap' - }) + attribution: "© OpenStreetMap", + }); } osmHotMapLayer() { - return L.tileLayer('https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png', { + return L.tileLayer("https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png", { maxZoom: 19, - attribution: '© OpenStreetMap contributors, Tiles style by Humanitarian OpenStreetMap Team hosted by OpenStreetMap France' - }) + attribution: "© OpenStreetMap contributors, Tiles style by Humanitarian OpenStreetMap Team hosted by OpenStreetMap France", + }); } baseMaps() { return { - "OpenStreetMap": this.osmMapLayer(), - "OpenStreetMap.HOT": this.osmHotMapLayer() - } + OpenStreetMap: this.osmMapLayer(), + "OpenStreetMap.HOT": this.osmHotMapLayer(), + }; } - controlsLayer() { - return { - "Points": this.markersLayer, - "Polyline": this.polylineLayer - } + createMarkersArray(markersData) { + return markersData.map((marker) => { + const [lat, lon] = marker; + const popupContent = this.createPopupContent(marker); + return L.circleMarker([lat, lon], { radius: 4 }).bindPopup(popupContent); + }); } - markersArray(markers_data) { - var markersArray = [] - - for (var i = 0; i < markers_data.length; i++) { - var lat = markers_data[i][0]; - var lon = markers_data[i][1]; - - var popupContent = this.popupContent(markers_data[i]); - var circleMarker = L.circleMarker([lat, lon], {radius: 4}) - - markersArray.push(circleMarker.bindPopup(popupContent).openPopup()) - } - - return markersArray - } - - popupContent(marker) { + createPopupContent(marker) { return ` Timestamp: ${this.formatDate(marker[4])} Latitude: ${marker[0]} @@ -245,30 +91,160 @@ export default class extends Controller { } formatDate(timestamp) { - let date = new Date(timestamp * 1000); // Multiply by 1000 because JavaScript works with milliseconds - - let timezone = this.element.dataset.timezone; - - return date.toLocaleString('en-GB', { timeZone: timezone }); + const date = new Date(timestamp * 1000); + const timezone = this.element.dataset.timezone; + return date.toLocaleString("en-GB", { timeZone: timezone }); } addTileLayer(map) { - L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', { + L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", { maxZoom: 19, - attribution: '© OpenStreetMap' + attribution: "© OpenStreetMap", }).addTo(map); } - - addPolyline(map, markers) { - var coordinates = markers.map(element => element.slice(0, 2)); - L.polyline(coordinates).addTo(map); - } - addLastMarker(map, markers) { if (markers.length > 0) { - var lastMarker = markers[markers.length - 1].slice(0, 2) + const lastMarker = markers[markers.length - 1].slice(0, 2); L.marker(lastMarker).addTo(map); } } + + haversineDistance(lat1, lon1, lat2, lon2) { + const toRad = (x) => (x * Math.PI) / 180; + const R = 6371; // Radius of the Earth in kilometers + const dLat = toRad(lat2 - lat1); + const dLon = toRad(lon2 - lon1); + const a = + Math.sin(dLat / 2) * Math.sin(dLat / 2) + + Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * + Math.sin(dLon / 2) * Math.sin(dLon / 2); + const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + return R * c * 1000; // Distance in meters + } + + minutesToDaysHoursMinutes(minutes) { + const days = Math.floor(minutes / (24 * 60)); + const hours = Math.floor((minutes % (24 * 60)) / 60); + minutes = minutes % 60; + let result = ""; + + if (days > 0) { + result += `${days}d `; + } + + if (hours > 0) { + result += `${hours}h `; + } + + if (minutes > 0) { + result += `${minutes}min`; + } + + return result; + } + + getUrlParameter(name) { + return new URLSearchParams(window.location.search).get(name); + } + + addHighlightOnHover(polyline, map, startPoint, endPoint, prevPoint, nextPoint, timezone) { + const originalStyle = { color: "blue", opacity: 0.6, weight: 3 }; + const highlightStyle = { color: "yellow", opacity: 1, weight: 5 }; + + polyline.setStyle(originalStyle); + + const firstTimestamp = new Date(startPoint[4] * 1000).toLocaleString("en-GB", { timeZone: timezone }); + const lastTimestamp = new Date(endPoint[4] * 1000).toLocaleString("en-GB", { timeZone: timezone }); + + const minutes = Math.round((endPoint[4] - startPoint[4]) / 60); + const timeOnRoute = this.minutesToDaysHoursMinutes(minutes); + const distance = this.haversineDistance(startPoint[0], startPoint[1], endPoint[0], endPoint[1]); + + const distanceToPrev = prevPoint ? this.haversineDistance(prevPoint[0], prevPoint[1], startPoint[0], startPoint[1]) : "N/A"; + const distanceToNext = nextPoint ? this.haversineDistance(endPoint[0], endPoint[1], nextPoint[0], nextPoint[1]) : "N/A"; + + const timeBetweenPrev = prevPoint ? Math.round((startPoint[4] - prevPoint[4]) / 60) : "N/A"; + const timeBetweenNext = nextPoint ? Math.round((nextPoint[4] - endPoint[4]) / 60) : "N/A"; + + const startIcon = L.divIcon({ html: "🚥", className: "emoji-icon" }); + const finishIcon = L.divIcon({ html: "🏁", className: "emoji-icon" }); + + const isDebugMode = this.getUrlParameter("debug") === "true"; + + let popupContent = ` + Start: ${firstTimestamp} + End: ${lastTimestamp} + Duration: ${timeOnRoute} + Distance: ${Math.round(distance)}m + `; + + if (isDebugMode) { + popupContent += ` + Prev Route: ${Math.round(distanceToPrev)}m and ${this.minutesToDaysHoursMinutes(timeBetweenPrev)} away + Next Route: ${Math.round(distanceToNext)}m and ${this.minutesToDaysHoursMinutes(timeBetweenNext)} away + `; + } + + const startMarker = L.marker([startPoint[0], startPoint[1]], { icon: startIcon }).bindPopup(`Start: ${firstTimestamp}`); + const endMarker = L.marker([endPoint[0], endPoint[1]], { icon: finishIcon }).bindPopup(popupContent); + + polyline.on("mouseover", function () { + polyline.setStyle(highlightStyle); + startMarker.addTo(map); + endMarker.addTo(map).openPopup(); + }); + + polyline.on("mouseout", function () { + polyline.setStyle(originalStyle); + map.closePopup(); + map.removeLayer(startMarker); + map.removeLayer(endMarker); + }); + } + + createPolylinesLayer(markers, map, timezone) { + const splitPolylines = []; + let currentPolyline = []; + const distanceThresholdMeters = parseInt(this.getUrlParameter("meters_between_routes")) || 500; + const timeThresholdMinutes = parseInt(this.getUrlParameter("minutes_between_routes")) || 60; + + for (let i = 0, len = markers.length; i < len; i++) { + if (currentPolyline.length === 0) { + currentPolyline.push(markers[i]); + } else { + const lastPoint = currentPolyline[currentPolyline.length - 1]; + const currentPoint = markers[i]; + const distance = this.haversineDistance(lastPoint[0], lastPoint[1], currentPoint[0], currentPoint[1]); + const timeDifference = (currentPoint[4] - lastPoint[4]) / 60; + + if (distance > distanceThresholdMeters || timeDifference > timeThresholdMinutes) { + splitPolylines.push([...currentPolyline]); + currentPolyline = [currentPoint]; + } else { + currentPolyline.push(currentPoint); + } + } + } + + if (currentPolyline.length > 0) { + splitPolylines.push(currentPolyline); + } + + return L.layerGroup( + splitPolylines.map((polylineCoordinates, index) => { + const latLngs = polylineCoordinates.map((point) => [point[0], point[1]]); + const polyline = L.polyline(latLngs, { color: "blue", opacity: 0.6, weight: 3 }); + + const startPoint = polylineCoordinates[0]; + const endPoint = polylineCoordinates[polylineCoordinates.length - 1]; + const prevPoint = index > 0 ? splitPolylines[index - 1][splitPolylines[index - 1].length - 1] : null; + const nextPoint = index < splitPolylines.length - 1 ? splitPolylines[index + 1][0] : null; + + this.addHighlightOnHover(polyline, map, startPoint, endPoint, prevPoint, nextPoint, timezone); + + return polyline; + }) + ).addTo(map); + } } diff --git a/app/jobs/import_job.rb b/app/jobs/import_job.rb index 73f296c6..d34059ac 100644 --- a/app/jobs/import_job.rb +++ b/app/jobs/import_job.rb @@ -20,10 +20,11 @@ class ImportJob < ApplicationJob def parser(source) case source - when 'google_semantic_history' then GoogleMaps::SemanticHistoryParser - when 'google_records' then GoogleMaps::RecordsParser - when 'google_phone_takeout' then GoogleMaps::PhoneTakeoutParser - when 'owntracks' then OwnTracks::ExportParser + when 'google_semantic_history' then GoogleMaps::SemanticHistoryParser + when 'google_records' then GoogleMaps::RecordsParser + when 'google_phone_takeout' then GoogleMaps::PhoneTakeoutParser + when 'owntracks' then OwnTracks::ExportParser + when 'gpx' then Gpx::TrackParser end end end diff --git a/app/models/import.rb b/app/models/import.rb index 543683cd..ae5a4195 100644 --- a/app/models/import.rb +++ b/app/models/import.rb @@ -8,5 +8,5 @@ class Import < ApplicationRecord include ImportUploader::Attachment(:raw) - enum source: { google_semantic_history: 0, owntracks: 1, google_records: 2, google_phone_takeout: 3 } + enum source: { google_semantic_history: 0, owntracks: 1, google_records: 2, google_phone_takeout: 3, gpx: 4 } end diff --git a/app/services/gpx/track_parser.rb b/app/services/gpx/track_parser.rb new file mode 100644 index 00000000..98e45b95 --- /dev/null +++ b/app/services/gpx/track_parser.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +class Gpx::TrackParser + attr_reader :import, :json, :user_id + + def initialize(import, user_id) + @import = import + @json = import.raw_data + @user_id = user_id + end + + def call + segments = json['gpx']['trk']['trkseg'] + + if segments.is_a?(Array) + segments.each do |segment| + segment['trkpt'].each { create_point(_1) } + end + else + segments['trkpt'].each { create_point(_1) } + end + end + + private + + def create_point(point) + return if point['lat'].blank? || point['lon'].blank? || point['time'].blank? + return if point_exists?(point) + + Point.create( + latitude: point['lat'].to_d, + longitude: point['lon'].to_d, + altitude: point['ele'].to_i, + timestamp: Time.parse(point['time']).to_i, + import_id: import.id, + user_id: + ) + end + + def point_exists?(point) + Point.exists?( + latitude: point['lat'].to_d, + longitude: point['lon'].to_d, + timestamp: Time.parse(point['time']).to_i, + user_id: + ) + end +end diff --git a/app/views/imports/_form.html.erb b/app/views/imports/_form.html.erb index 5ae8f89c..5dc2595f 100644 --- a/app/views/imports/_form.html.erb +++ b/app/views/imports/_form.html.erb @@ -11,12 +11,21 @@ <% end %> - - + + Select source + + + <%= form.collection_radio_buttons :source, Import.sources.except('google_records'), :first, :first do |b| %> + + + <%= b.radio_button(class: "radio radio-primary") %> + <%= b.text.humanize %> + + + <% end %> - <%= form.collection_radio_buttons :source, Import.sources.except('google_records'), :first, :first %> - + diff --git a/config/routes.rb b/config/routes.rb index ebc542b2..bad05bd7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,7 +8,6 @@ Rails.application.routes.draw do mount Sidekiq::Web => '/sidekiq' get 'settings/theme', to: 'settings#theme' - get 'export/download', to: 'export#download' resources :imports resources :exports, only: %i[index create destroy] diff --git a/spec/fixtures/files/gpx/gpx_track_multiple_segments.gpx b/spec/fixtures/files/gpx/gpx_track_multiple_segments.gpx new file mode 100644 index 00000000..8797d0a2 --- /dev/null +++ b/spec/fixtures/files/gpx/gpx_track_multiple_segments.gpx @@ -0,0 +1,4494 @@ + + + + 2024-04-21_10-55_Sun + 2024-04-21T11:51:19Z + + + 2024-04-21_10-55 + + + 719.2 + 2024-04-21T09:07:31Z + 5.3 + + 0.3 + + + + 719.2 + 2024-04-21T09:07:37Z + 4.8 + + 0.3 + + + + 719 + 2024-04-21T09:07:43Z + 5.1 + + 0.1 + + + + 719.2 + 2024-04-21T09:07:48Z + 5.2 + + 0.1 + + + + 719.2 + 2024-04-21T09:07:54Z + 5.2 + + 0 + + + + 719.2 + 2024-04-21T09:07:59Z + 4 + + 0.1 + + + + 719.1 + 2024-04-21T09:08:05Z + 4 + + 0.1 + + + + 719.1 + 2024-04-21T09:08:11Z + 4.3 + + 0 + + + + 719.2 + 2024-04-21T09:08:16Z + 4.6 + + 0 + + + + 719.1 + 2024-04-21T09:08:22Z + 4.4 + + 0 + + + + 719.2 + 2024-04-21T09:08:27Z + 4.1 + + 0 + + + + 719.1 + 2024-04-21T09:08:33Z + 4 + + 0 + + + + 719 + 2024-04-21T09:08:38Z + 3.9 + + 0 + + + + 719 + 2024-04-21T09:08:43Z + 3.8 + + 0 + + + + 719.2 + 2024-04-21T09:08:49Z + 3.8 + + 0 + + + + 719 + 2024-04-21T09:08:55Z + 3.8 + + 0 + + + + 719 + 2024-04-21T09:09:00Z + 3.8 + + 0 + + + + 719.2 + 2024-04-21T09:09:06Z + 3.8 + + 0 + + + + 719.2 + 2024-04-21T09:09:12Z + 4.2 + + 0 + + + + 719.2 + 2024-04-21T09:09:18Z + 3.8 + + 0 + + + + 719.1 + 2024-04-21T09:09:23Z + 4.2 + + 0 + + + + 719.1 + 2024-04-21T09:09:28Z + 4.4 + + 0 + + + + 719 + 2024-04-21T09:09:34Z + 4.2 + + 0 + + + + 719.1 + 2024-04-21T09:09:40Z + 4.5 + + 0 + + + + 719.1 + 2024-04-21T09:09:46Z + 7.2 + + 0 + + + + 719.1 + 2024-04-21T09:09:52Z + 6.3 + + 0 + + + + 719 + 2024-04-21T09:09:58Z + 5.8 + + 0 + + + + 719.1 + 2024-04-21T09:10:04Z + 5 + + 0 + + + + 719.1 + 2024-04-21T09:10:09Z + 4.6 + + 0 + + + + 719.1 + 2024-04-21T09:10:15Z + 5.1 + + 0 + + + + 719 + 2024-04-21T09:10:20Z + 4.9 + + 0 + + + + 719 + 2024-04-21T09:10:25Z + 4.8 + + 0 + + + + 719 + 2024-04-21T09:10:31Z + 5.5 + + 0 + + + + 719 + 2024-04-21T09:10:36Z + 4.7 + + 0.4 + + + + 719 + 2024-04-21T09:10:42Z + 4.4 + + 0.2 + + + + 719 + 2024-04-21T09:10:47Z + 4.3 + + 0.1 + + + + 719.1 + 2024-04-21T09:10:53Z + 3.9 + + 0 + + + + 719.1 + 2024-04-21T09:10:59Z + 3.8 + + 0 + + + + 719.1 + 2024-04-21T09:11:04Z + 3.9 + + 0 + + + + 719 + 2024-04-21T09:11:09Z + 3.9 + + 0 + + + + 719.1 + 2024-04-21T09:11:15Z + 4 + + 0 + + + + + + 1000.1 + 2024-04-21T10:09:48Z + 8.2 + + 0.1 + + + + 1005.4 + 2024-04-21T10:09:53Z + 5 + + 2.2 + + + + 1001.8 + 2024-04-21T10:09:59Z + 3.8 + + 2.7 + + + + 1001.6 + 2024-04-21T10:10:05Z + 3.8 + + 3.9 + + + + 1000.5 + 2024-04-21T10:10:11Z + 3.8 + + 3.3 + + + + 1002.8 + 2024-04-21T10:10:17Z + 3.8 + + 4 + + + + 1005.8 + 2024-04-21T10:10:23Z + 3.8 + + 4.3 + + + + 1007.8 + 2024-04-21T10:10:29Z + 3.8 + + 1.1 + + + + 1007.7 + 2024-04-21T10:10:35Z + 3.8 + + 0.1 + + + + 1008.4 + 2024-04-21T10:10:40Z + 3.8 + + 0.3 + + + + 1008.5 + 2024-04-21T10:10:46Z + 3.8 + + 0 + + + + 1008.6 + 2024-04-21T10:10:52Z + 3.9 + + 0 + + + + 1008.6 + 2024-04-21T10:10:58Z + 3.8 + + 0 + + + + 1011.2 + 2024-04-21T10:11:03Z + 4.1 + + 1.7 + + + + 1011 + 2024-04-21T10:11:09Z + 4.1 + + 1.9 + + + + 1011.4 + 2024-04-21T10:11:15Z + 3.8 + + 2.9 + + + + 1013.9 + 2024-04-21T10:11:21Z + 3.8 + + 3.1 + + + + 1015.7 + 2024-04-21T10:11:27Z + 3.8 + + 3.2 + + + + 1018.5 + 2024-04-21T10:11:32Z + 3.8 + + 2.7 + + + + 1019.6 + 2024-04-21T10:11:38Z + 3.8 + + 2.6 + + + + 1022.5 + 2024-04-21T10:11:44Z + 3.8 + + 2.9 + + + + 1022.4 + 2024-04-21T10:11:50Z + 3.8 + + 2.2 + + + + 1021.3 + 2024-04-21T10:11:55Z + 3.8 + + 1.2 + + + + 1023.4 + 2024-04-21T10:12:01Z + 3.8 + + 0.6 + + + + 1022.3 + 2024-04-21T10:12:07Z + 3.8 + + 0.4 + + + + 1024.7 + 2024-04-21T10:12:13Z + 3.8 + + 0.2 + + + + 1024.7 + 2024-04-21T10:12:18Z + 3.8 + + 0.1 + + + + 1025.6 + 2024-04-21T10:12:23Z + 3.8 + + 4.2 + + + + 1027.6 + 2024-04-21T10:12:29Z + 3.8 + + 6.4 + + + + 1027.3 + 2024-04-21T10:12:34Z + 3.8 + + 3.8 + + + + 1028.1 + 2024-04-21T10:12:40Z + 3.8 + + 5.8 + + + + 1029.6 + 2024-04-21T10:12:46Z + 3.8 + + 1.3 + + + + 1028.8 + 2024-04-21T10:12:52Z + 3.8 + + 0.1 + + + + 1029.2 + 2024-04-21T10:12:57Z + 3.8 + + 0.7 + + + + 1027.8 + 2024-04-21T10:13:03Z + 3.8 + + 0.4 + + + + 1028.2 + 2024-04-21T10:13:09Z + 3.8 + + 0.3 + + + + 1028.4 + 2024-04-21T10:13:15Z + 3.8 + + 2.8 + + + + 1029.9 + 2024-04-21T10:13:21Z + 3.8 + + 4.9 + + + + 1031.5 + 2024-04-21T10:13:27Z + 3.8 + + 0.1 + + + + 1031.8 + 2024-04-21T10:13:32Z + 3.8 + + 0.2 + + + + 1032.7 + 2024-04-21T10:13:38Z + 3.8 + + 0.1 + + + + 1032.7 + 2024-04-21T10:13:43Z + 3.8 + + 0 + + + + 1032.4 + 2024-04-21T10:13:49Z + 3.8 + + 2.7 + + + + 1032.8 + 2024-04-21T10:13:54Z + 3.8 + + 2 + + + + 1033.1 + 2024-04-21T10:13:59Z + 3.8 + + 3.1 + + + + 1035.3 + 2024-04-21T10:14:05Z + 3.8 + + 4.2 + + + + 1037 + 2024-04-21T10:14:10Z + 3.8 + + 4.8 + + + + 1039.6 + 2024-04-21T10:14:16Z + 3.8 + + 3.4 + + + + 1041.5 + 2024-04-21T10:14:21Z + 3.8 + + 1.4 + + + + 1041.4 + 2024-04-21T10:14:27Z + 3.8 + + 0 + + + + 1040.5 + 2024-04-21T10:14:33Z + 3.8 + + 0.1 + + + + 1040.2 + 2024-04-21T10:14:39Z + 3.8 + + 0 + + + + 1040.2 + 2024-04-21T10:14:44Z + 3.8 + + 0 + + + + 1040.2 + 2024-04-21T10:14:50Z + 3.8 + + 0 + + + + 1040.2 + 2024-04-21T10:14:56Z + 3.8 + + 0 + + + + 1040.2 + 2024-04-21T10:15:01Z + 3.8 + + 0 + + + + 1040.2 + 2024-04-21T10:15:06Z + 3.8 + + 0 + + + + 1040.2 + 2024-04-21T10:15:12Z + 3.8 + + 0 + + + + 1040.2 + 2024-04-21T10:15:18Z + 3.8 + + 0 + + + + 1040.2 + 2024-04-21T10:15:23Z + 3.8 + + 0 + + + + 1039.9 + 2024-04-21T10:15:28Z + 3.8 + + 3.2 + + + + 1042.2 + 2024-04-21T10:15:34Z + 3.8 + + 5.6 + + + + 1045.7 + 2024-04-21T10:15:40Z + 3.8 + + 5.2 + + + + 1048 + 2024-04-21T10:15:45Z + 3.8 + + 5 + + + + 1048.5 + 2024-04-21T10:15:50Z + 3.8 + + 4 + + + + 1049.7 + 2024-04-21T10:15:56Z + 3.8 + + 0.1 + + + + 1049.9 + 2024-04-21T10:16:01Z + 3.8 + + 0.1 + + + + 1050.2 + 2024-04-21T10:16:06Z + 3.8 + + 0 + + + + 1050.2 + 2024-04-21T10:16:12Z + 3.8 + + 0 + + + + 1050.2 + 2024-04-21T10:16:18Z + 3.8 + + 0 + + + + 1050.2 + 2024-04-21T10:16:24Z + 3.8 + + 0 + + + + 1050.2 + 2024-04-21T10:16:29Z + 3.8 + + 0 + + + + 1050.2 + 2024-04-21T10:16:35Z + 3.8 + + 0 + + + + 1050.2 + 2024-04-21T10:16:40Z + 3.8 + + 0 + + + + 1050.2 + 2024-04-21T10:16:45Z + 3.8 + + 0 + + + + 1050.2 + 2024-04-21T10:16:51Z + 3.8 + + 0 + + + + 1050.3 + 2024-04-21T10:16:57Z + 3.8 + + 0 + + + + 1050.3 + 2024-04-21T10:17:03Z + 3.8 + + 0 + + + + 1049.9 + 2024-04-21T10:17:08Z + 3.8 + + 0.3 + + + + 1049.9 + 2024-04-21T10:17:14Z + 3.8 + + 0.1 + + + + 1049.3 + 2024-04-21T10:17:19Z + 3.8 + + 0 + + + + 1049.2 + 2024-04-21T10:17:25Z + 3.8 + + 0 + + + + 1049.3 + 2024-04-21T10:17:31Z + 3.8 + + 0 + + + + 1049.8 + 2024-04-21T10:17:36Z + 3.8 + + 1.3 + + + + 1050.6 + 2024-04-21T10:17:42Z + 3.8 + + 3.2 + + + + 1051.7 + 2024-04-21T10:17:47Z + 3.8 + + 4.5 + + + + 1054 + 2024-04-21T10:17:53Z + 3.8 + + 4.6 + + + + 1057.6 + 2024-04-21T10:17:59Z + 3.8 + + 4.3 + + + + 1059.3 + 2024-04-21T10:18:04Z + 3.8 + + 4.8 + + + + 1060.7 + 2024-04-21T10:18:10Z + 3.8 + + 4.3 + + + + 1063.2 + 2024-04-21T10:18:16Z + 3.8 + + 2.3 + + + + 1063.7 + 2024-04-21T10:18:21Z + 3.8 + + 1.7 + + + + 1064.8 + 2024-04-21T10:18:27Z + 3.8 + + 0.6 + + + + 1064.9 + 2024-04-21T10:18:32Z + 3.8 + + 0.3 + + + + 1064.7 + 2024-04-21T10:18:38Z + 3.8 + + 0 + + + + 1064.7 + 2024-04-21T10:18:43Z + 3.8 + + 0 + + + + 1064.7 + 2024-04-21T10:18:49Z + 3.8 + + 0 + + + + 1064.7 + 2024-04-21T10:18:54Z + 3.8 + + 0 + + + + 1064.7 + 2024-04-21T10:19:00Z + 3.8 + + 0 + + + + 1064.7 + 2024-04-21T10:19:05Z + 3.8 + + 0 + + + + 1065.3 + 2024-04-21T10:19:11Z + 3.8 + + 1.4 + + + + 1065.1 + 2024-04-21T10:19:16Z + 3.8 + + 3 + + + + 1063.7 + 2024-04-21T10:19:21Z + 3.8 + + 1.9 + + + + 1065.5 + 2024-04-21T10:19:27Z + 3.8 + + 2 + + + + 1065 + 2024-04-21T10:19:33Z + 3.8 + + 2.3 + + + + 1065.1 + 2024-04-21T10:19:39Z + 3.8 + + 3.2 + + + + 1066.4 + 2024-04-21T10:19:45Z + 3.8 + + 2.6 + + + + 1065.9 + 2024-04-21T10:19:50Z + 3.8 + + 3.9 + + + + 1066.4 + 2024-04-21T10:19:55Z + 3.8 + + 2.9 + + + + 1066.4 + 2024-04-21T10:20:01Z + 3.8 + + 4.1 + + + + 1064.8 + 2024-04-21T10:20:06Z + 3.8 + + 4.2 + + + + 1062.8 + 2024-04-21T10:20:12Z + 3.8 + + 5.8 + + + + 1059.8 + 2024-04-21T10:20:18Z + 3.8 + + 7.3 + + + + 1060.6 + 2024-04-21T10:20:24Z + 3.8 + + 8 + + + + 1060.9 + 2024-04-21T10:20:29Z + 3.8 + + 7.4 + + + + 1060 + 2024-04-21T10:20:35Z + 3.8 + + 7.8 + + + + 1058.2 + 2024-04-21T10:20:40Z + 3.8 + + 5.3 + + + + 1053.7 + 2024-04-21T10:20:46Z + 3.8 + + 7.1 + + + + 1055.1 + 2024-04-21T10:20:51Z + 3.8 + + 6.3 + + + + 1056.1 + 2024-04-21T10:20:57Z + 3.8 + + 7.1 + + + + 1053.5 + 2024-04-21T10:21:03Z + 3.8 + + 5.9 + + + + 1054.6 + 2024-04-21T10:21:09Z + 3.8 + + 2.8 + + + + 1053.8 + 2024-04-21T10:21:15Z + 3.8 + + 4.5 + + + + 1053.2 + 2024-04-21T10:21:20Z + 3.8 + + 5.4 + + + + 1054.2 + 2024-04-21T10:21:25Z + 3.8 + + 5 + + + + 1053.7 + 2024-04-21T10:21:31Z + 3.8 + + 6 + + + + 1053.9 + 2024-04-21T10:21:37Z + 3.8 + + 5.5 + + + + 1054.9 + 2024-04-21T10:21:43Z + 3.8 + + 3 + + + + 1056.4 + 2024-04-21T10:21:49Z + 3.8 + + 4.3 + + + + 1057.2 + 2024-04-21T10:21:55Z + 3.8 + + 2.9 + + + + 1057.5 + 2024-04-21T10:22:01Z + 3.8 + + 3.9 + + + + 1059.1 + 2024-04-21T10:22:07Z + 3.8 + + 6.6 + + + + 1062 + 2024-04-21T10:22:12Z + 3.8 + + 5.9 + + + + 1064.6 + 2024-04-21T10:22:18Z + 3.8 + + 3.9 + + + + 1065.8 + 2024-04-21T10:22:24Z + 3.8 + + 5.3 + + + + 1067.7 + 2024-04-21T10:22:30Z + 3.8 + + 5.4 + + + + 1068.6 + 2024-04-21T10:22:35Z + 3.8 + + 4.1 + + + + 1068.2 + 2024-04-21T10:22:40Z + 3.8 + + 0.9 + + + + 1069.5 + 2024-04-21T10:22:46Z + 3.8 + + 1.5 + + + + 1069.4 + 2024-04-21T10:22:51Z + 3.8 + + 0.1 + + + + 1069.4 + 2024-04-21T10:22:56Z + 3.8 + + 0.1 + + + + 1069.4 + 2024-04-21T10:23:02Z + 3.8 + + 0 + + + + 1068.9 + 2024-04-21T10:23:08Z + 3.8 + + 2 + + + + 1069.9 + 2024-04-21T10:23:14Z + 3.8 + + 4.9 + + + + 1070 + 2024-04-21T10:23:19Z + 3.8 + + 3.4 + + + + 1070.8 + 2024-04-21T10:23:24Z + 3.8 + + 2.5 + + + + 1072.1 + 2024-04-21T10:23:30Z + 3.8 + + 2.3 + + + + 1072.3 + 2024-04-21T10:23:36Z + 3.8 + + 3.2 + + + + 1073.2 + 2024-04-21T10:23:42Z + 3.8 + + 2.2 + + + + 1072.8 + 2024-04-21T10:23:48Z + 3.8 + + 2.6 + + + + 1073.9 + 2024-04-21T10:23:54Z + 3.8 + + 2.2 + + + + 1075.8 + 2024-04-21T10:24:00Z + 3.8 + + 3.7 + + + + 1078.4 + 2024-04-21T10:24:05Z + 3.8 + + 5.2 + + + + 1079.7 + 2024-04-21T10:24:11Z + 3.8 + + 5.7 + + + + 1084.2 + 2024-04-21T10:24:17Z + 3.8 + + 6.3 + + + + 1085.7 + 2024-04-21T10:24:23Z + 3.8 + + 3 + + + + 1086.8 + 2024-04-21T10:24:29Z + 3.8 + + 0.8 + + + + 1086.1 + 2024-04-21T10:24:34Z + 3.9 + + 0.6 + + + + 1085.8 + 2024-04-21T10:24:39Z + 3.8 + + 0.9 + + + + 1086.8 + 2024-04-21T10:24:45Z + 3.8 + + 0.6 + + + + 1086.3 + 2024-04-21T10:24:50Z + 3.8 + + 2.5 + + + + 1088.1 + 2024-04-21T10:24:56Z + 3.8 + + 1.6 + + + + 1087.7 + 2024-04-21T10:25:01Z + 3.8 + + 0.6 + + + + 1087.3 + 2024-04-21T10:25:07Z + 3.8 + + 1.9 + + + + 1086.6 + 2024-04-21T10:25:13Z + 3.8 + + 0.3 + + + + 1086.4 + 2024-04-21T10:25:19Z + 3.8 + + 0.2 + + + + 1085.9 + 2024-04-21T10:25:25Z + 3.8 + + 0.5 + + + + 1085.5 + 2024-04-21T10:25:31Z + 3.8 + + 0.6 + + + + 1084.2 + 2024-04-21T10:25:37Z + 3.8 + + 1 + + + + 1085.8 + 2024-04-21T10:25:43Z + 3.8 + + 0.1 + + + + + + 1089.1 + 2024-04-21T10:45:07Z + 3 + + 0.1 + + + + 1089.2 + 2024-04-21T10:45:13Z + 3.4 + + 0 + + + + 1089.2 + 2024-04-21T10:45:19Z + 3.8 + + 0 + + + + 1089.2 + 2024-04-21T10:45:25Z + 3.8 + + 0 + + + + 1089.2 + 2024-04-21T10:45:31Z + 3.8 + + 0 + + + + 1089.2 + 2024-04-21T10:45:37Z + 3.8 + + 0 + + + + 1089.6 + 2024-04-21T10:45:43Z + 3.8 + + 0.5 + + + + 1089.6 + 2024-04-21T10:45:49Z + 3.8 + + 0 + + + + 1089.9 + 2024-04-21T10:45:54Z + 3.8 + + 2.8 + + + + 1088.4 + 2024-04-21T10:46:00Z + 3.8 + + 2.9 + + + + 1088.1 + 2024-04-21T10:46:06Z + 3.8 + + 3.6 + + + + 1086.9 + 2024-04-21T10:46:12Z + 3.8 + + 3.5 + + + + 1086.4 + 2024-04-21T10:46:18Z + 3.8 + + 3.6 + + + + 1085.4 + 2024-04-21T10:46:24Z + 3.8 + + 0.7 + + + + 1085.8 + 2024-04-21T10:46:29Z + 3.8 + + 0.1 + + + + 1085.6 + 2024-04-21T10:46:35Z + 3.8 + + 0 + + + + 1085.6 + 2024-04-21T10:46:41Z + 3.8 + + 0 + + + + 1085.6 + 2024-04-21T10:46:47Z + 3.8 + + 0 + + + + 1084.1 + 2024-04-21T10:46:52Z + 3.8 + + 5.8 + + + + 1081.1 + 2024-04-21T10:46:58Z + 3.8 + + 6.4 + + + + 1081 + 2024-04-21T10:47:04Z + 3.8 + + 6.2 + + + + 1079 + 2024-04-21T10:47:10Z + 3.8 + + 5.3 + + + + 1076.6 + 2024-04-21T10:47:16Z + 3.8 + + 4 + + + + 1074.3 + 2024-04-21T10:47:22Z + 3.8 + + 7.5 + + + + 1071.8 + 2024-04-21T10:47:28Z + 3.8 + + 7.3 + + + + 1069.4 + 2024-04-21T10:47:33Z + 3.8 + + 6.8 + + + + 1066.8 + 2024-04-21T10:47:38Z + 3.8 + + 5.7 + + + + 1063.1 + 2024-04-21T10:47:44Z + 3.8 + + 6.1 + + + + 1061.3 + 2024-04-21T10:47:50Z + 3.8 + + 7.4 + + + + 1058.7 + 2024-04-21T10:47:56Z + 3.8 + + 6.6 + + + + 1056.3 + 2024-04-21T10:48:02Z + 3.8 + + 6.7 + + + + 1052.6 + 2024-04-21T10:48:08Z + 3.8 + + 6.5 + + + + 1054.2 + 2024-04-21T10:48:13Z + 3.8 + + 5.6 + + + + 1054.6 + 2024-04-21T10:48:19Z + 3.8 + + 1.6 + + + + 1054.1 + 2024-04-21T10:48:25Z + 3.8 + + 1.7 + + + + 1054.1 + 2024-04-21T10:48:31Z + 3.9 + + 0.1 + + + + 1053.9 + 2024-04-21T10:48:37Z + 3.8 + + 0 + + + + 1054.7 + 2024-04-21T10:48:43Z + 3.8 + + 3.1 + + + + 1051.4 + 2024-04-21T10:48:49Z + 3.8 + + 3.1 + + + + 1048.3 + 2024-04-21T10:48:54Z + 3.8 + + 2.2 + + + + 1046.8 + 2024-04-21T10:49:00Z + 3.8 + + 1.1 + + + + 1044.3 + 2024-04-21T10:49:06Z + 3.8 + + 1.7 + + + + 1043.5 + 2024-04-21T10:49:12Z + 3.8 + + 0.2 + + + + 1043.1 + 2024-04-21T10:49:18Z + 3.8 + + 0.1 + + + + 1043 + 2024-04-21T10:49:23Z + 3.8 + + 0.3 + + + + 1043 + 2024-04-21T10:49:29Z + 3.8 + + 0.1 + + + + 1043.4 + 2024-04-21T10:49:35Z + 3.8 + + 0.1 + + + + 1043.2 + 2024-04-21T10:49:40Z + 3.8 + + 0.3 + + + + 1042.2 + 2024-04-21T10:49:46Z + 3.8 + + 0.1 + + + + 1041 + 2024-04-21T10:49:51Z + 3.8 + + 1.7 + + + + 1039.8 + 2024-04-21T10:49:57Z + 3.8 + + 1.9 + + + + 1038.7 + 2024-04-21T10:50:03Z + 3.8 + + 0.3 + + + + 1037 + 2024-04-21T10:50:09Z + 3.8 + + 0.3 + + + + 1036.9 + 2024-04-21T10:50:15Z + 3.8 + + 0 + + + + 1036.9 + 2024-04-21T10:50:21Z + 3.8 + + 0 + + + + 1035.5 + 2024-04-21T10:50:27Z + 3.8 + + 3.7 + + + + 1032.2 + 2024-04-21T10:50:33Z + 3.8 + + 3.3 + + + + 1029.1 + 2024-04-21T10:50:39Z + 3.8 + + 3.3 + + + + 1025.4 + 2024-04-21T10:50:44Z + 3.8 + + 2.4 + + + + 1022.2 + 2024-04-21T10:50:49Z + 3.8 + + 6 + + + + 1019.4 + 2024-04-21T10:50:55Z + 3.8 + + 4.6 + + + + 1017 + 2024-04-21T10:51:00Z + 3.8 + + 4.6 + + + + 1014.6 + 2024-04-21T10:51:06Z + 3.8 + + 1.8 + + + + 1011.3 + 2024-04-21T10:51:12Z + 3.8 + + 1.4 + + + + 1010.4 + 2024-04-21T10:51:18Z + 3.8 + + 0.8 + + + + 1006.2 + 2024-04-21T10:51:24Z + 3.8 + + 1 + + + + 1007.5 + 2024-04-21T10:51:29Z + 3.8 + + 0.2 + + + + 1007.7 + 2024-04-21T10:51:35Z + 3.8 + + 0.1 + + + + 1007.7 + 2024-04-21T10:51:41Z + 3.8 + + 0 + + + + 1007.7 + 2024-04-21T10:51:47Z + 3.8 + + 0 + + + + 1007.7 + 2024-04-21T10:51:52Z + 3.8 + + 0 + + + + 1007.7 + 2024-04-21T10:51:58Z + 3.8 + + 0 + + + + 1007.7 + 2024-04-21T10:52:04Z + 3.8 + + 0 + + + + 1007.7 + 2024-04-21T10:52:10Z + 3.8 + + 0 + + + + 1007.5 + 2024-04-21T10:52:15Z + 3.8 + + 0.8 + + + + 1007.5 + 2024-04-21T10:52:21Z + 3.8 + + 0.2 + + + + 1005.9 + 2024-04-21T10:52:27Z + 3.8 + + 0.2 + + + + 1006.2 + 2024-04-21T10:52:32Z + 3.9 + + 0.6 + + + + 1005.9 + 2024-04-21T10:52:37Z + 3.8 + + 0.6 + + + + 1007.4 + 2024-04-21T10:52:43Z + 3.8 + + 0.4 + + + + 1007.1 + 2024-04-21T10:52:49Z + 3.8 + + 0.5 + + + + 1002.9 + 2024-04-21T10:52:55Z + 3.8 + + 0.6 + + + + 1002.7 + 2024-04-21T10:53:01Z + 3.8 + + 1.1 + + + + 1002.6 + 2024-04-21T10:53:07Z + 3.8 + + 0.3 + + + + 1004.1 + 2024-04-21T10:53:13Z + 3.8 + + 0.1 + + + + 1004.4 + 2024-04-21T10:53:19Z + 3.8 + + 0 + + + + 1004.4 + 2024-04-21T10:53:25Z + 3.8 + + 0 + + + + 1002.6 + 2024-04-21T10:53:30Z + 3.8 + + 0.9 + + + + 1002.3 + 2024-04-21T10:53:36Z + 3.8 + + 1.4 + + + + 1001.3 + 2024-04-21T10:53:41Z + 3.8 + + 0.7 + + + + 1000.8 + 2024-04-21T10:53:47Z + 3.8 + + 0.7 + + + + 997.5 + 2024-04-21T10:53:52Z + 3.8 + + 1.5 + + + + 997.2 + 2024-04-21T10:53:58Z + 3.8 + + 0.2 + + + + 996.2 + 2024-04-21T10:54:04Z + 3.8 + + 1.8 + + + + 993.6 + 2024-04-21T10:54:10Z + 3.8 + + 1.6 + + + + 993.9 + 2024-04-21T10:54:16Z + 3.8 + + 0.4 + + + + 990.8 + 2024-04-21T10:54:22Z + 3.8 + + 4.4 + + + + 990.6 + 2024-04-21T10:54:28Z + 3.8 + + 0.1 + + + + 990.4 + 2024-04-21T10:54:34Z + 3.8 + + 0.6 + + + + 989.6 + 2024-04-21T10:54:39Z + 3.8 + + 0.2 + + + + 989.8 + 2024-04-21T10:54:45Z + 3.8 + + 0.1 + + + + 989.7 + 2024-04-21T10:54:51Z + 3.8 + + 0 + + + + 989.6 + 2024-04-21T10:54:57Z + 3.8 + + 0.6 + + + + 989.3 + 2024-04-21T10:55:03Z + 3.8 + + 0.4 + + + + 989.9 + 2024-04-21T10:55:09Z + 3.8 + + 0.2 + + + + 990.2 + 2024-04-21T10:55:15Z + 3.8 + + 0 + + + + 990.2 + 2024-04-21T10:55:20Z + 3.8 + + 0 + + + + 990.6 + 2024-04-21T10:55:26Z + 3.8 + + 3 + + + + 992.4 + 2024-04-21T10:55:31Z + 3.8 + + 3.5 + + + + 991.3 + 2024-04-21T10:55:37Z + 3.8 + + 3.4 + + + + 992.4 + 2024-04-21T10:55:43Z + 3.8 + + 1.2 + + + + 991.9 + 2024-04-21T10:55:49Z + 3.8 + + 0.1 + + + + 991.6 + 2024-04-21T10:55:55Z + 4.2 + + 0 + + + + 991.7 + 2024-04-21T10:56:01Z + 4.4 + + 0 + + + + 991.7 + 2024-04-21T10:56:06Z + 4.9 + + 0 + + + + 991.7 + 2024-04-21T10:56:11Z + 5.5 + + 0 + + + + 991.7 + 2024-04-21T10:56:17Z + 4.8 + + 0 + + + + 991.7 + 2024-04-21T10:56:23Z + 4.1 + + 0 + + + + 992 + 2024-04-21T10:56:28Z + 4.1 + + 1.4 + + + + 992.9 + 2024-04-21T10:56:33Z + 4.5 + + 3.8 + + + + 995.9 + 2024-04-21T10:56:39Z + 3.9 + + 3.4 + + + + 997 + 2024-04-21T10:56:45Z + 3.8 + + 3 + + + + 995.6 + 2024-04-21T10:56:51Z + 3.8 + + 4.2 + + + + 996.7 + 2024-04-21T10:56:57Z + 3.8 + + 3.8 + + + + 995.5 + 2024-04-21T10:57:03Z + 3.8 + + 4.9 + + + + 994.2 + 2024-04-21T10:57:09Z + 3.8 + + 3.7 + + + + 995.1 + 2024-04-21T10:57:15Z + 3.8 + + 3.6 + + + + 993 + 2024-04-21T10:57:21Z + 3.8 + + 5.7 + + + + 991.6 + 2024-04-21T10:57:27Z + 3.8 + + 5.3 + + + + 986.7 + 2024-04-21T10:57:33Z + 3.8 + + 5.4 + + + + 982.3 + 2024-04-21T10:57:38Z + 3.8 + + 8 + + + + 981.5 + 2024-04-21T10:57:44Z + 3.8 + + 4.4 + + + + 983.4 + 2024-04-21T10:57:49Z + 3.8 + + 5.4 + + + + 984.4 + 2024-04-21T10:57:55Z + 3.8 + + 4.3 + + + + 983.4 + 2024-04-21T10:58:01Z + 3.8 + + 3.3 + + + + 984.5 + 2024-04-21T10:58:07Z + 3.8 + + 4.2 + + + + 985.3 + 2024-04-21T10:58:12Z + 3.8 + + 3 + + + + 984.4 + 2024-04-21T10:58:18Z + 3.8 + + 1.7 + + + + 982.6 + 2024-04-21T10:58:24Z + 3.8 + + 3.3 + + + + 980.2 + 2024-04-21T10:58:29Z + 3.8 + + 5.1 + + + + 976.3 + 2024-04-21T10:58:35Z + 3.8 + + 10.9 + + + + 970.9 + 2024-04-21T10:58:41Z + 3.8 + + 7.6 + + + + 969.7 + 2024-04-21T10:58:47Z + 3.8 + + 0.9 + + + + 969.7 + 2024-04-21T10:58:53Z + 3.8 + + 0.1 + + + + 969.6 + 2024-04-21T10:58:58Z + 3.9 + + 0.7 + + + + 969.7 + 2024-04-21T10:59:04Z + 3.8 + + 0.1 + + + + 969.1 + 2024-04-21T10:59:09Z + 3.8 + + 0 + + + + 969.1 + 2024-04-21T10:59:15Z + 3.8 + + 0 + + + + 969.1 + 2024-04-21T10:59:21Z + 3.8 + + 0 + + + + 969.1 + 2024-04-21T10:59:27Z + 3.8 + + 0 + + + + 969.1 + 2024-04-21T10:59:33Z + 3.8 + + 0 + + + + 968.5 + 2024-04-21T10:59:39Z + 3.8 + + 0.5 + + + + 968.3 + 2024-04-21T10:59:45Z + 3.8 + + 0.2 + + + + 968.7 + 2024-04-21T10:59:50Z + 3.8 + + 0.1 + + + + 969 + 2024-04-21T10:59:56Z + 3.8 + + 0 + + + + 966.7 + 2024-04-21T11:00:02Z + 3.8 + + 1.7 + + + + 966.5 + 2024-04-21T11:00:08Z + 3.8 + + 0.9 + + + + 966.7 + 2024-04-21T11:00:14Z + 3.8 + + 0.4 + + + + 966.7 + 2024-04-21T11:00:20Z + 4.4 + + 0 + + + + 965.3 + 2024-04-21T11:00:25Z + 3.8 + + 2.1 + + + + 962.7 + 2024-04-21T11:00:31Z + 3.8 + + 9 + + + + 962.5 + 2024-04-21T11:00:37Z + 3.8 + + 8.8 + + + + 964.3 + 2024-04-21T11:00:43Z + 3.8 + + 8.3 + + + + 963.8 + 2024-04-21T11:00:48Z + 3.8 + + 7.5 + + + + 965.3 + 2024-04-21T11:00:54Z + 3.8 + + 7 + + + + 964.6 + 2024-04-21T11:01:00Z + 3.8 + + 7.3 + + + + 965.3 + 2024-04-21T11:01:05Z + 3.8 + + 7.5 + + + + 965.9 + 2024-04-21T11:01:11Z + 3.8 + + 7.4 + + + + 965.5 + 2024-04-21T11:01:17Z + 3.8 + + 7.1 + + + + 966 + 2024-04-21T11:01:23Z + 3.8 + + 3.8 + + + + 964.6 + 2024-04-21T11:01:29Z + 3.8 + + 2 + + + + 964.3 + 2024-04-21T11:01:35Z + 3.8 + + 0.1 + + + + 964.5 + 2024-04-21T11:01:41Z + 3.8 + + 0 + + + + 964.5 + 2024-04-21T11:01:47Z + 3.8 + + 0 + + + + 964.5 + 2024-04-21T11:01:53Z + 3.8 + + 0 + + + + 964.5 + 2024-04-21T11:01:59Z + 3.8 + + 0 + + + + 966.5 + 2024-04-21T11:02:05Z + 3.8 + + 0.9 + + + + 966.6 + 2024-04-21T11:02:11Z + 3.8 + + 0.1 + + + + 966 + 2024-04-21T11:02:17Z + 3.8 + + 0.1 + + + + 966.1 + 2024-04-21T11:02:23Z + 3.8 + + 0 + + + + 966 + 2024-04-21T11:02:29Z + 3.8 + + 0 + + + + 965.6 + 2024-04-21T11:02:35Z + 3.8 + + 0.8 + + + + 965.8 + 2024-04-21T11:02:40Z + 3.8 + + 0.4 + + + + 967 + 2024-04-21T11:02:46Z + 3.8 + + 2.5 + + + + 967.4 + 2024-04-21T11:02:52Z + 3.9 + + 0.1 + + + + 967.3 + 2024-04-21T11:02:58Z + 3.8 + + 0 + + + + 967.9 + 2024-04-21T11:03:04Z + 3.8 + + 0 + + + + 967.9 + 2024-04-21T11:03:09Z + 3.8 + + 0 + + + + 967.9 + 2024-04-21T11:03:15Z + 3.8 + + 0 + + + + 967.9 + 2024-04-21T11:03:20Z + 3.8 + + 0 + + + + 967.9 + 2024-04-21T11:03:26Z + 3.8 + + 0 + + + + 967.9 + 2024-04-21T11:03:32Z + 3.8 + + 0 + + + + 967.9 + 2024-04-21T11:03:37Z + 3.8 + + 0 + + + + 967.9 + 2024-04-21T11:03:43Z + 3.8 + + 0 + + + + 967.2 + 2024-04-21T11:03:48Z + 3.8 + + 1.4 + + + + 966.9 + 2024-04-21T11:03:53Z + 3.8 + + 0.1 + + + + 967.1 + 2024-04-21T11:03:59Z + 3.8 + + 0 + + + + 967 + 2024-04-21T11:04:04Z + 3.8 + + 0 + + + + 967 + 2024-04-21T11:04:10Z + 3.8 + + 0 + + + + 967 + 2024-04-21T11:04:15Z + 3.8 + + 0 + + + + 967 + 2024-04-21T11:04:21Z + 3.8 + + 0 + + + + 967 + 2024-04-21T11:04:26Z + 3.8 + + 0 + + + + 967 + 2024-04-21T11:04:32Z + 3.8 + + 0 + + + + 967 + 2024-04-21T11:04:38Z + 3.8 + + 0 + + + + 967.1 + 2024-04-21T11:04:44Z + 3.8 + + 0 + + + + 967.1 + 2024-04-21T11:04:50Z + 3.8 + + 0 + + + + 967.1 + 2024-04-21T11:04:56Z + 3.8 + + 0 + + + + 967.1 + 2024-04-21T11:05:02Z + 3.8 + + 0 + + + + 967.1 + 2024-04-21T11:05:07Z + 3.8 + + 0 + + + + 967.1 + 2024-04-21T11:05:13Z + 3.8 + + 0 + + + + 967.1 + 2024-04-21T11:05:18Z + 3.8 + + 0 + + + + 967 + 2024-04-21T11:05:24Z + 3.8 + + 0 + + + + 967.1 + 2024-04-21T11:05:30Z + 3.8 + + 0 + + + + 967.1 + 2024-04-21T11:05:36Z + 3.8 + + 0 + + + + 967 + 2024-04-21T11:05:42Z + 3.8 + + 0 + + + + 967 + 2024-04-21T11:05:47Z + 3.8 + + 0 + + + + 967 + 2024-04-21T11:05:53Z + 3.8 + + 0 + + + + 967 + 2024-04-21T11:05:59Z + 3.8 + + 0 + + + + 967 + 2024-04-21T11:06:04Z + 3.8 + + 0 + + + + 967 + 2024-04-21T11:06:10Z + 3.8 + + 0 + + + + 967 + 2024-04-21T11:06:16Z + 3.8 + + 0 + + + + 967 + 2024-04-21T11:06:21Z + 3.8 + + 0 + + + + 967 + 2024-04-21T11:06:26Z + 3.8 + + 0 + + + + 967 + 2024-04-21T11:06:32Z + 3.8 + + 0 + + + + 967.1 + 2024-04-21T11:06:37Z + 3.8 + + 0 + + + + 967.1 + 2024-04-21T11:06:43Z + 3.8 + + 0 + + + + 967.1 + 2024-04-21T11:06:48Z + 3.8 + + 0 + + + + 967.1 + 2024-04-21T11:06:54Z + 3.8 + + 0 + + + + 967.1 + 2024-04-21T11:07:00Z + 3.8 + + 0 + + + + 967.1 + 2024-04-21T11:07:05Z + 3.8 + + 0 + + + + 967.1 + 2024-04-21T11:07:11Z + 3.8 + + 0 + + + + 967.1 + 2024-04-21T11:07:17Z + 3.8 + + 0 + + + + 967.1 + 2024-04-21T11:07:23Z + 3.8 + + 0 + + + + 967.1 + 2024-04-21T11:07:29Z + 3.8 + + 0 + + + + 967.1 + 2024-04-21T11:07:35Z + 3.8 + + 0 + + + + 967.1 + 2024-04-21T11:07:40Z + 3.8 + + 0 + + + + 966.9 + 2024-04-21T11:07:45Z + 3.8 + + 0.4 + + + + 967.3 + 2024-04-21T11:07:51Z + 3.8 + + 0.1 + + + + 967.8 + 2024-04-21T11:07:57Z + 3.8 + + 0 + + + + 967.8 + 2024-04-21T11:08:02Z + 3.8 + + 0 + + + + 967.8 + 2024-04-21T11:08:08Z + 3.8 + + 0 + + + + 967.8 + 2024-04-21T11:08:14Z + 3.8 + + 0 + + + + 967.8 + 2024-04-21T11:08:19Z + 3.8 + + 0 + + + + 967.8 + 2024-04-21T11:08:24Z + 3.8 + + 0 + + + + 967.8 + 2024-04-21T11:08:30Z + 3.8 + + 0 + + + + 967.8 + 2024-04-21T11:08:36Z + 3.8 + + 0 + + + + 967.8 + 2024-04-21T11:08:42Z + 3.8 + + 0 + + + + 967.8 + 2024-04-21T11:08:48Z + 3.8 + + 0 + + + + 967.5 + 2024-04-21T11:08:54Z + 3.8 + + 0.6 + + + + 968.5 + 2024-04-21T11:09:00Z + 3.8 + + 0.1 + + + + 967.7 + 2024-04-21T11:09:06Z + 3.8 + + 1.4 + + + + 968.5 + 2024-04-21T11:09:12Z + 3.8 + + 1.4 + + + + 969.3 + 2024-04-21T11:09:17Z + 3.8 + + 2.3 + + + + 970.3 + 2024-04-21T11:09:22Z + 3.8 + + 1.7 + + + + 970.3 + 2024-04-21T11:09:28Z + 3.8 + + 1.4 + + + + 970.7 + 2024-04-21T11:09:33Z + 3.9 + + 1 + + + + 972.4 + 2024-04-21T11:09:38Z + 3.8 + + 0.1 + + + + 973.6 + 2024-04-21T11:09:44Z + 3.8 + + 0 + + + + 973.7 + 2024-04-21T11:09:50Z + 3.8 + + 0 + + + + 974.2 + 2024-04-21T11:09:55Z + 3.8 + + 1.2 + + + + 975.7 + 2024-04-21T11:10:01Z + 3.8 + + 2.8 + + + + 977.4 + 2024-04-21T11:10:07Z + 3.9 + + 3 + + + + 981 + 2024-04-21T11:10:13Z + 3.8 + + 3.1 + + + + 984.9 + 2024-04-21T11:10:18Z + 3.8 + + 2.9 + + + + 987 + 2024-04-21T11:10:24Z + 3.8 + + 1.7 + + + + 988.2 + 2024-04-21T11:10:30Z + 3.8 + + 3.4 + + + + 989.6 + 2024-04-21T11:10:35Z + 3.8 + + 4 + + + + 991.6 + 2024-04-21T11:10:41Z + 3.8 + + 3.3 + + + + 992.5 + 2024-04-21T11:10:46Z + 3.8 + + 4.8 + + + + 995.7 + 2024-04-21T11:10:52Z + 3.8 + + 3 + + + + 999.5 + 2024-04-21T11:10:58Z + 3.8 + + 2.8 + + + + 1002.7 + 2024-04-21T11:11:04Z + 3.8 + + 2.7 + + + + 1005.8 + 2024-04-21T11:11:10Z + 3.8 + + 3.2 + + + + 1008.5 + 2024-04-21T11:11:16Z + 3.8 + + 3.6 + + + + 1012.1 + 2024-04-21T11:11:22Z + 3.8 + + 3.4 + + + + 1015.9 + 2024-04-21T11:11:28Z + 3.8 + + 3.9 + + + + 1019.1 + 2024-04-21T11:11:34Z + 3.8 + + 4.1 + + + + 1021.1 + 2024-04-21T11:11:39Z + 3.8 + + 3.5 + + + + 1021.4 + 2024-04-21T11:11:45Z + 3.8 + + 4.4 + + + + 1023.1 + 2024-04-21T11:11:51Z + 3.8 + + 5.3 + + + + 1022.9 + 2024-04-21T11:11:57Z + 3.8 + + 3.4 + + + + 1025.2 + 2024-04-21T11:12:03Z + 3.8 + + 2.3 + + + + 1023.2 + 2024-04-21T11:12:08Z + 3.8 + + 3.5 + + + + 1023 + 2024-04-21T11:12:14Z + 3.8 + + 0.1 + + + + 1023.1 + 2024-04-21T11:12:20Z + 3.8 + + 0.2 + + + + 1023.8 + 2024-04-21T11:12:26Z + 3.8 + + 0.1 + + + + 1023.6 + 2024-04-21T11:12:32Z + 3.8 + + 0 + + + + 1023.6 + 2024-04-21T11:12:37Z + 3.8 + + 0 + + + + 1023.7 + 2024-04-21T11:12:43Z + 3.8 + + 0 + + + + 1023.6 + 2024-04-21T11:12:49Z + 3.8 + + 0 + + + + 1023.6 + 2024-04-21T11:12:55Z + 3.8 + + 0 + + + + 1023.6 + 2024-04-21T11:13:01Z + 3.8 + + 0 + + + + 1023.6 + 2024-04-21T11:13:07Z + 3.8 + + 0 + + + + 1023.6 + 2024-04-21T11:13:13Z + 3.8 + + 0 + + + + 1023.6 + 2024-04-21T11:13:19Z + 3.8 + + 0 + + + + 1023.6 + 2024-04-21T11:13:25Z + 3.8 + + 0 + + + + 1023.6 + 2024-04-21T11:13:31Z + 3.8 + + 0 + + + + 1023.6 + 2024-04-21T11:13:37Z + 3.8 + + 0 + + + + 1023.6 + 2024-04-21T11:13:43Z + 3.8 + + 0 + + + + 1053.6 + 2024-04-21T11:16:00Z + 10.3 + + 0.7 + + + + 1037.4 + 2024-04-21T11:16:05Z + 4.3 + + 0.2 + + + + 1036.7 + 2024-04-21T11:16:10Z + 3.8 + + 0.1 + + + + 1037.2 + 2024-04-21T11:16:16Z + 3.3 + + 0.1 + + + + 1038 + 2024-04-21T11:16:21Z + 3 + + 0.1 + + + + 1038.2 + 2024-04-21T11:16:27Z + 3 + + 0.1 + + + + 1038.2 + 2024-04-21T11:16:32Z + 3.4 + + 0.1 + + + + 1038.8 + 2024-04-21T11:16:38Z + 3.8 + + 0 + + + + 1039.2 + 2024-04-21T11:16:44Z + 3.8 + + 0.3 + + + + 1038.5 + 2024-04-21T11:16:50Z + 3.8 + + 0.2 + + + + 1038.2 + 2024-04-21T11:17:12Z + 6.9 + + + + + + 1091.2 + 2024-04-21T11:24:23Z + 7.2 + + 0.2 + + + + 1088.4 + 2024-04-21T11:24:28Z + 5 + + 0.1 + + + + 1095.6 + 2024-04-21T11:28:14Z + 8.4 + + 0.2 + + + + 1065.6 + 2024-04-21T11:39:00Z + 4.9 + + 2.9 + + + + 1071.3 + 2024-04-21T11:39:05Z + 5 + + 0.1 + + + + 1070.4 + 2024-04-21T11:39:11Z + 3.8 + + 0.1 + + + + 1070.7 + 2024-04-21T11:39:16Z + 3.8 + + 0 + + + + 1070.7 + 2024-04-21T11:39:22Z + 3.8 + + 0 + + + + 1070.7 + 2024-04-21T11:39:28Z + 3.8 + + 0 + + + + 1070.7 + 2024-04-21T11:39:34Z + 3.8 + + 0 + + + + 1070.6 + 2024-04-21T11:39:40Z + 3.8 + + 0 + + + + 1070.6 + 2024-04-21T11:39:46Z + 3.8 + + 0 + + + + 1070.6 + 2024-04-21T11:39:52Z + 3.8 + + 0 + + + + 1070.4 + 2024-04-21T11:39:58Z + 3.8 + + 0.6 + + + + 1070.8 + 2024-04-21T11:40:04Z + 3.8 + + 0.1 + + + + 1070.7 + 2024-04-21T11:40:09Z + 3.8 + + 0.1 + + + + 1070.7 + 2024-04-21T11:40:14Z + 3.8 + + 0 + + + + + + 975.4 + 2024-04-21T11:49:12Z + 14.5 + + 0.7 + + + + 974.7 + 2024-04-21T11:49:17Z + 4 + + 0.5 + + + + 972.5 + 2024-04-21T11:49:22Z + 3.8 + + 0.1 + + + + 971 + 2024-04-21T11:49:28Z + 3.8 + + 0.9 + + + + 971.1 + 2024-04-21T11:49:33Z + 3.1 + + 0.1 + + + + 971.5 + 2024-04-21T11:49:38Z + 3 + + 0.1 + + + + 928 + 2024-04-21T11:50:07Z + 8.1 + + 0.2 + + + + 928 + 2024-04-21T11:50:12Z + 4.6 + + 0.3 + + + + 973.4 + 2024-04-21T11:50:17Z + 3.7 + + 0.2 + + + + 971.6 + 2024-04-21T11:50:23Z + 3 + + 0 + + + + 971.9 + 2024-04-21T11:50:28Z + 3 + + 0 + + + + 971.9 + 2024-04-21T11:50:34Z + 3.5 + + 0 + + + + 971.7 + 2024-04-21T11:50:40Z + 3.8 + + 0 + + + + 971.4 + 2024-04-21T11:50:45Z + 3.8 + + 0.4 + + + + 971.9 + 2024-04-21T11:50:51Z + 3.8 + + 0.1 + + + + 971.4 + 2024-04-21T11:50:57Z + 3.8 + + 0.4 + + + + 970.6 + 2024-04-21T11:51:02Z + 4.1 + + 0.1 + + + + 971.3 + 2024-04-21T11:51:07Z + 3 + + 0 + + + + 971.4 + 2024-04-21T11:51:13Z + 3 + + 0 + + + + 971.4 + 2024-04-21T11:51:19Z + 3 + + 0 + + + + + + false + true + 0.0 + no_split + none + none + top + #ff0000 + thin + solid + + \ No newline at end of file diff --git a/spec/fixtures/files/gpx/gpx_track_single_segment.gpx b/spec/fixtures/files/gpx/gpx_track_single_segment.gpx new file mode 100644 index 00000000..c7447af0 --- /dev/null +++ b/spec/fixtures/files/gpx/gpx_track_single_segment.gpx @@ -0,0 +1,1239 @@ + + + + La Zubia - balcon + + Garmin Connect + + 2024-03-16T12:30:23.000Z + + + La Zubia - balcon + + + 824.93 + 2024-03-16T12:30:23.000Z + + + 822.91 + 2024-03-16T12:30:23.000Z + + + 819.57 + 2024-03-16T12:30:23.015Z + + + 815.2 + 2024-03-16T12:30:23.046Z + + + 811.41 + 2024-03-16T12:30:23.082Z + + + 808.11 + 2024-03-16T12:30:23.123Z + + + 805.33 + 2024-03-16T12:30:23.166Z + + + 802.85 + 2024-03-16T12:30:23.212Z + + + 800.8 + 2024-03-16T12:30:23.260Z + + + 798.9 + 2024-03-16T12:30:23.313Z + + + 797.19 + 2024-03-16T12:30:23.369Z + + + 795.8 + 2024-03-16T12:30:23.429Z + + + 794.31 + 2024-03-16T12:30:23.497Z + + + 793.25 + 2024-03-16T12:30:23.569Z + + + 792.19 + 2024-03-16T12:30:23.647Z + + + 791.44 + 2024-03-16T12:30:23.728Z + + + 791.24 + 2024-03-16T12:30:23.812Z + + + 791.47 + 2024-03-16T12:30:23.900Z + + + 792.04 + 2024-03-16T12:30:23.990Z + + + 792.18 + 2024-03-16T12:30:24.098Z + + + 793.94 + 2024-03-16T12:30:24.222Z + + + 795.29 + 2024-03-16T12:30:24.348Z + + + 796.89 + 2024-03-16T12:30:24.478Z + + + 798.7 + 2024-03-16T12:30:24.610Z + + + 801.44 + 2024-03-16T12:30:24.757Z + + + 803.97 + 2024-03-16T12:30:24.909Z + + + 806.6 + 2024-03-16T12:30:25.066Z + + + 809.27 + 2024-03-16T12:30:25.226Z + + + 811.96 + 2024-03-16T12:30:25.390Z + + + 814.62 + 2024-03-16T12:30:25.556Z + + + 817.54 + 2024-03-16T12:30:25.734Z + + + 820.18 + 2024-03-16T12:30:25.914Z + + + 822.76 + 2024-03-16T12:30:26.096Z + + + 825.25 + 2024-03-16T12:30:26.280Z + + + 827.89 + 2024-03-16T12:30:26.472Z + + + 830.82 + 2024-03-16T12:30:26.672Z + + + 833.17 + 2024-03-16T12:30:26.873Z + + + 835.42 + 2024-03-16T12:30:27.074Z + + + 837.9 + 2024-03-16T12:30:27.281Z + + + 839.89 + 2024-03-16T12:30:27.490Z + + + 841.98 + 2024-03-16T12:30:27.708Z + + + 844.17 + 2024-03-16T12:30:27.941Z + + + 846.01 + 2024-03-16T12:30:28.184Z + + + 847.32 + 2024-03-16T12:30:28.432Z + + + 848.51 + 2024-03-16T12:30:28.682Z + + + 849.54 + 2024-03-16T12:30:28.937Z + + + 850.3 + 2024-03-16T12:30:29.195Z + + + 850.74 + 2024-03-16T12:30:29.457Z + + + 851.11 + 2024-03-16T12:30:29.719Z + + + 851.31 + 2024-03-16T12:30:29.983Z + + + 851.37 + 2024-03-16T12:30:30.248Z + + + 851.36 + 2024-03-16T12:30:30.518Z + + + 851.21 + 2024-03-16T12:30:30.790Z + + + 851.04 + 2024-03-16T12:30:31.066Z + + + 850.86 + 2024-03-16T12:30:31.347Z + + + 850.41 + 2024-03-16T12:30:31.633Z + + + 849.94 + 2024-03-16T12:30:31.927Z + + + 849.54 + 2024-03-16T12:30:32.224Z + + + 849.08 + 2024-03-16T12:30:32.525Z + + + 848.67 + 2024-03-16T12:30:32.830Z + + + 848.36 + 2024-03-16T12:30:33.136Z + + + 848.08 + 2024-03-16T12:30:33.444Z + + + 847.87 + 2024-03-16T12:30:33.754Z + + + 847.77 + 2024-03-16T12:30:34.066Z + + + 847.74 + 2024-03-16T12:30:34.382Z + + + 847.75 + 2024-03-16T12:30:34.702Z + + + 847.81 + 2024-03-16T12:30:35.022Z + + + 847.96 + 2024-03-16T12:30:35.344Z + + + 848.17 + 2024-03-16T12:30:35.667Z + + + 848.37 + 2024-03-16T12:30:35.990Z + + + 848.68 + 2024-03-16T12:30:36.316Z + + + 849.01 + 2024-03-16T12:30:36.654Z + + + 849.24 + 2024-03-16T12:30:37.003Z + + + 849.47 + 2024-03-16T12:30:37.353Z + + + 849.7 + 2024-03-16T12:30:37.704Z + + + 849.88 + 2024-03-16T12:30:38.058Z + + + 850.1 + 2024-03-16T12:30:38.413Z + + + 850.25 + 2024-03-16T12:30:38.768Z + + + 850.38 + 2024-03-16T12:30:39.124Z + + + 850.47 + 2024-03-16T12:30:39.483Z + + + 850.46 + 2024-03-16T12:30:39.843Z + + + 850.35 + 2024-03-16T12:30:40.204Z + + + 850.35 + 2024-03-16T12:30:40.574Z + + + 850.02 + 2024-03-16T12:30:40.946Z + + + 849.6 + 2024-03-16T12:30:41.319Z + + + 849.05 + 2024-03-16T12:30:41.694Z + + + 848.37 + 2024-03-16T12:30:42.070Z + + + 847.54 + 2024-03-16T12:30:42.448Z + + + 846.57 + 2024-03-16T12:30:42.830Z + + + 845.55 + 2024-03-16T12:30:43.215Z + + + 844.29 + 2024-03-16T12:30:43.606Z + + + 842.85 + 2024-03-16T12:30:44.001Z + + + 841.43 + 2024-03-16T12:30:44.402Z + + + 839.98 + 2024-03-16T12:30:44.810Z + + + 838.63 + 2024-03-16T12:30:45.222Z + + + 837.18 + 2024-03-16T12:30:45.641Z + + + 835.48 + 2024-03-16T12:30:46.063Z + + + 833.92 + 2024-03-16T12:30:46.487Z + + + 832.43 + 2024-03-16T12:30:46.914Z + + + 831.06 + 2024-03-16T12:30:47.345Z + + + 829.84 + 2024-03-16T12:30:47.791Z + + + 829.04 + 2024-03-16T12:30:48.240Z + + + 828.42 + 2024-03-16T12:30:48.695Z + + + 828.15 + 2024-03-16T12:30:49.150Z + + + 828.11 + 2024-03-16T12:30:49.608Z + + + 828.51 + 2024-03-16T12:30:50.069Z + + + 829.55 + 2024-03-16T12:30:50.538Z + + + 830.31 + 2024-03-16T12:30:51.010Z + + + 831.12 + 2024-03-16T12:30:51.486Z + + + 831.93 + 2024-03-16T12:30:51.971Z + + + 832.91 + 2024-03-16T12:30:52.456Z + + + 833.85 + 2024-03-16T12:30:52.947Z + + + 834.91 + 2024-03-16T12:30:53.440Z + + + 836.07 + 2024-03-16T12:30:53.937Z + + + 837.2 + 2024-03-16T12:30:54.434Z + + + 838.38 + 2024-03-16T12:30:54.937Z + + + 839.56 + 2024-03-16T12:30:55.447Z + + + 840.58 + 2024-03-16T12:30:55.964Z + + + 841.58 + 2024-03-16T12:30:56.485Z + + + 842.46 + 2024-03-16T12:30:57.011Z + + + 843.23 + 2024-03-16T12:30:57.543Z + + + 843.46 + 2024-03-16T12:30:58.076Z + + + 843.41 + 2024-03-16T12:30:58.611Z + + + 842.64 + 2024-03-16T12:30:59.156Z + + + 841.84 + 2024-03-16T12:30:59.705Z + + + 840.81 + 2024-03-16T12:31:00.259Z + + + 839.56 + 2024-03-16T12:31:00.824Z + + + 837.86 + 2024-03-16T12:31:01.399Z + + + 836.03 + 2024-03-16T12:31:01.980Z + + + 833.91 + 2024-03-16T12:31:02.570Z + + + 831.55 + 2024-03-16T12:31:03.163Z + + + 828.71 + 2024-03-16T12:31:03.763Z + + + 825.47 + 2024-03-16T12:31:04.371Z + + + 820.96 + 2024-03-16T12:31:05.021Z + + + 817.85 + 2024-03-16T12:31:05.673Z + + + 814.71 + 2024-03-16T12:31:06.325Z + + + 811.52 + 2024-03-16T12:31:06.977Z + + + 808.25 + 2024-03-16T12:31:07.632Z + + + 805.03 + 2024-03-16T12:31:08.287Z + + + 801.68 + 2024-03-16T12:31:08.947Z + + + 798.27 + 2024-03-16T12:31:09.613Z + + + 794.91 + 2024-03-16T12:31:10.284Z + + + 791.73 + 2024-03-16T12:31:10.958Z + + + 788.61 + 2024-03-16T12:31:11.633Z + + + 785.48 + 2024-03-16T12:31:12.311Z + + + 782.4 + 2024-03-16T12:31:12.995Z + + + 779.42 + 2024-03-16T12:31:13.682Z + + + 776.47 + 2024-03-16T12:31:14.376Z + + + 773.67 + 2024-03-16T12:31:15.072Z + + + 770.99 + 2024-03-16T12:31:15.770Z + + + 768.4 + 2024-03-16T12:31:16.468Z + + + 765.66 + 2024-03-16T12:31:17.172Z + + + 763.1 + 2024-03-16T12:31:17.878Z + + + 760.26 + 2024-03-16T12:31:18.597Z + + + 757.88 + 2024-03-16T12:31:19.321Z + + + 755.75 + 2024-03-16T12:31:20.045Z + + + 753.7 + 2024-03-16T12:31:20.771Z + + + 751.75 + 2024-03-16T12:31:21.506Z + + + 749.94 + 2024-03-16T12:31:22.249Z + + + 748.17 + 2024-03-16T12:31:22.997Z + + + 746.34 + 2024-03-16T12:31:23.757Z + + + 744.47 + 2024-03-16T12:31:24.530Z + + + 743.18 + 2024-03-16T12:31:25.305Z + + + 742.0 + 2024-03-16T12:31:26.089Z + + + 741.01 + 2024-03-16T12:31:26.875Z + + + 740.17 + 2024-03-16T12:31:27.663Z + + + 739.53 + 2024-03-16T12:31:28.456Z + + + 738.88 + 2024-03-16T12:31:29.255Z + + + 738.42 + 2024-03-16T12:31:30.058Z + + + 738.16 + 2024-03-16T12:31:30.863Z + + + 738.01 + 2024-03-16T12:31:31.674Z + + + 738.01 + 2024-03-16T12:31:32.485Z + + + 738.11 + 2024-03-16T12:31:33.298Z + + + 738.36 + 2024-03-16T12:31:34.121Z + + + 738.8 + 2024-03-16T12:31:34.952Z + + + 739.13 + 2024-03-16T12:31:35.790Z + + + 739.78 + 2024-03-16T12:31:36.642Z + + + 740.12 + 2024-03-16T12:31:37.494Z + + + 740.55 + 2024-03-16T12:31:38.349Z + + + 740.93 + 2024-03-16T12:31:39.206Z + + + 741.31 + 2024-03-16T12:31:40.077Z + + + 741.6 + 2024-03-16T12:31:40.951Z + + + 741.82 + 2024-03-16T12:31:41.829Z + + + 741.89 + 2024-03-16T12:31:42.710Z + + + 741.94 + 2024-03-16T12:31:43.593Z + + + 741.89 + 2024-03-16T12:31:44.481Z + + + 742.0 + 2024-03-16T12:31:45.371Z + + + 742.05 + 2024-03-16T12:31:46.263Z + + + 742.17 + 2024-03-16T12:31:47.155Z + + + 742.28 + 2024-03-16T12:31:48.048Z + + + 742.49 + 2024-03-16T12:31:48.943Z + + + 742.74 + 2024-03-16T12:31:49.839Z + + + 742.86 + 2024-03-16T12:31:50.744Z + + + 743.34 + 2024-03-16T12:31:51.649Z + + + 744.01 + 2024-03-16T12:31:52.561Z + + + 744.96 + 2024-03-16T12:31:53.479Z + + + 746.14 + 2024-03-16T12:31:54.402Z + + + 747.41 + 2024-03-16T12:31:55.329Z + + + 748.68 + 2024-03-16T12:31:56.258Z + + + 750.03 + 2024-03-16T12:31:57.187Z + + + 751.57 + 2024-03-16T12:31:58.118Z + + + 753.47 + 2024-03-16T12:31:59.052Z + + + 755.4 + 2024-03-16T12:31:59.987Z + + + 757.49 + 2024-03-16T12:32:00.924Z + + + 759.68 + 2024-03-16T12:32:01.861Z + + + 762.09 + 2024-03-16T12:32:02.804Z + + + 764.56 + 2024-03-16T12:32:03.747Z + + + 767.4 + 2024-03-16T12:32:04.692Z + + + 770.3 + 2024-03-16T12:32:05.638Z + + + 773.45 + 2024-03-16T12:32:06.588Z + + + 776.83 + 2024-03-16T12:32:07.542Z + + + 780.51 + 2024-03-16T12:32:08.506Z + + + 783.74 + 2024-03-16T12:32:09.471Z + + + 786.94 + 2024-03-16T12:32:10.436Z + + + 790.76 + 2024-03-16T12:32:11.410Z + + + 794.06 + 2024-03-16T12:32:12.384Z + + + 797.36 + 2024-03-16T12:32:13.358Z + + + 800.75 + 2024-03-16T12:32:14.335Z + + + 804.12 + 2024-03-16T12:32:15.315Z + + + 807.53 + 2024-03-16T12:32:16.298Z + + + 811.02 + 2024-03-16T12:32:17.284Z + + + 814.61 + 2024-03-16T12:32:18.274Z + + + 818.13 + 2024-03-16T12:32:19.267Z + + + 821.6 + 2024-03-16T12:32:20.261Z + + + 825.29 + 2024-03-16T12:32:21.261Z + + + 828.89 + 2024-03-16T12:32:22.276Z + + + 832.37 + 2024-03-16T12:32:23.301Z + + + 836.28 + 2024-03-16T12:32:24.336Z + + + 839.49 + 2024-03-16T12:32:25.387Z + + + 842.19 + 2024-03-16T12:32:26.441Z + + + 844.74 + 2024-03-16T12:32:27.496Z + + + 847.21 + 2024-03-16T12:32:28.559Z + + + 849.34 + 2024-03-16T12:32:29.628Z + + + 851.3 + 2024-03-16T12:32:30.701Z + + + 852.93 + 2024-03-16T12:32:31.775Z + + + 854.35 + 2024-03-16T12:32:32.851Z + + + 855.69 + 2024-03-16T12:32:33.935Z + + + 856.86 + 2024-03-16T12:32:35.022Z + + + 857.72 + 2024-03-16T12:32:36.111Z + + + 858.43 + 2024-03-16T12:32:37.209Z + + + 858.78 + 2024-03-16T12:32:38.309Z + + + 859.01 + 2024-03-16T12:32:39.412Z + + + 859.0 + 2024-03-16T12:32:40.521Z + + + 858.97 + 2024-03-16T12:32:41.637Z + + + 859.21 + 2024-03-16T12:32:42.755Z + + + 859.45 + 2024-03-16T12:32:43.875Z + + + 859.73 + 2024-03-16T12:32:44.998Z + + + 860.06 + 2024-03-16T12:32:46.125Z + + + 860.45 + 2024-03-16T12:32:47.255Z + + + 861.08 + 2024-03-16T12:32:48.392Z + + + 861.61 + 2024-03-16T12:32:49.531Z + + + 862.29 + 2024-03-16T12:32:50.672Z + + + 863.0 + 2024-03-16T12:32:51.813Z + + + 863.9 + 2024-03-16T12:32:52.957Z + + + 864.96 + 2024-03-16T12:32:54.104Z + + + 866.07 + 2024-03-16T12:32:55.253Z + + + 867.3 + 2024-03-16T12:32:56.404Z + + + 869.0 + 2024-03-16T12:32:57.565Z + + + 870.45 + 2024-03-16T12:32:58.729Z + + + 871.97 + 2024-03-16T12:32:59.898Z + + + 873.37 + 2024-03-16T12:33:01.070Z + + + 874.8 + 2024-03-16T12:33:02.244Z + + + 876.17 + 2024-03-16T12:33:03.424Z + + + 877.6 + 2024-03-16T12:33:04.609Z + + + 879.15 + 2024-03-16T12:33:05.801Z + + + 880.87 + 2024-03-16T12:33:07.007Z + + + 882.54 + 2024-03-16T12:33:08.217Z + + + 884.28 + 2024-03-16T12:33:09.430Z + + + 886.01 + 2024-03-16T12:33:10.650Z + + + 887.84 + 2024-03-16T12:33:11.873Z + + + 889.62 + 2024-03-16T12:33:13.124Z + + + 891.29 + 2024-03-16T12:33:14.381Z + + + 892.83 + 2024-03-16T12:33:15.651Z + + + 893.87 + 2024-03-16T12:33:16.925Z + + + 894.78 + 2024-03-16T12:33:18.200Z + + + 895.66 + 2024-03-16T12:33:19.480Z + + + 896.51 + 2024-03-16T12:33:20.765Z + + + 896.83 + 2024-03-16T12:33:22.050Z + + + 896.95 + 2024-03-16T12:33:23.336Z + + + 896.98 + 2024-03-16T12:33:24.626Z + + + 896.67 + 2024-03-16T12:33:25.923Z + + + 896.92 + 2024-03-16T12:33:27.222Z + + + 897.13 + 2024-03-16T12:33:28.522Z + + + 897.08 + 2024-03-16T12:33:29.827Z + + + 897.65 + 2024-03-16T12:33:31.138Z + + + 898.62 + 2024-03-16T12:33:32.453Z + + + 899.59 + 2024-03-16T12:33:33.773Z + + + 900.3 + 2024-03-16T12:33:35.096Z + + + 901.06 + 2024-03-16T12:33:36.421Z + + + 901.98 + 2024-03-16T12:33:37.750Z + + + 902.94 + 2024-03-16T12:33:39.086Z + + + 904.14 + 2024-03-16T12:33:40.428Z + + + 905.06 + 2024-03-16T12:33:41.772Z + + + 905.5 + 2024-03-16T12:33:43.117Z + + + 905.8 + 2024-03-16T12:33:44.464Z + + + 905.47 + 2024-03-16T12:33:45.817Z + + + 905.91 + 2024-03-16T12:33:47.174Z + + + 906.01 + 2024-03-16T12:33:48.536Z + + + 905.66 + 2024-03-16T12:33:49.901Z + + + 904.85 + 2024-03-16T12:33:51.271Z + + + 904.4 + 2024-03-16T12:33:52.644Z + + + 903.49 + 2024-03-16T12:33:54.021Z + + + 903.02 + 2024-03-16T12:33:55.410Z + + + 901.8 + 2024-03-16T12:33:56.805Z + + + 901.42 + 2024-03-16T12:33:58.200Z + + + + diff --git a/spec/models/import_spec.rb b/spec/models/import_spec.rb index f016f8a1..ad449fa1 100644 --- a/spec/models/import_spec.rb +++ b/spec/models/import_spec.rb @@ -7,6 +7,14 @@ RSpec.describe Import, type: :model do end describe 'enums' do - it { is_expected.to define_enum_for(:source).with_values(google_semantic_history: 0, owntracks: 1, google_records: 2, google_phone_takeout: 3) } + it do + is_expected.to define_enum_for(:source).with_values( + google_semantic_history: 0, + owntracks: 1, + google_records: 2, + google_phone_takeout: 3, + gpx: 4 + ) + end end end diff --git a/spec/requests/api/v1/points_spec.rb b/spec/requests/api/v1/points_spec.rb deleted file mode 100644 index cd4c6d72..00000000 --- a/spec/requests/api/v1/points_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe 'Api::V1::Points', type: :request do - describe 'POST /api/v1/points' do - context 'with valid params' do - let(:params) do - { lat: 1.0, lon: 1.0, tid: 'test', tst: Time.current.to_i, topic: 'iPhone 12 pro' } - end - - it 'returns http success' do - post api_v1_points_path, params: params - - expect(response).to have_http_status(:success) - end - - it 'enqueues a job' do - expect do - post api_v1_points_path, params: params - end.to have_enqueued_job(Owntracks::PointCreatingJob) - end - end - end -end diff --git a/spec/requests/imports_spec.rb b/spec/requests/imports_spec.rb index 1dab4432..eebc8325 100644 --- a/spec/requests/imports_spec.rb +++ b/spec/requests/imports_spec.rb @@ -37,22 +37,43 @@ RSpec.describe 'Imports', type: :request do describe 'POST /imports' do context 'when user is logged in' do let(:user) { create(:user) } - let(:file) { fixture_file_upload('owntracks/export.json', 'application/json') } before { sign_in user } - it 'queues import job' do - expect do - post imports_path, params: { import: { source: 'owntracks', files: [file] } } - end.to have_enqueued_job(ImportJob).on_queue('imports').at_least(1).times + context 'when importing owntracks data' do + let(:file) { fixture_file_upload('owntracks/export.json', 'application/json') } + + it 'queues import job' do + expect do + post imports_path, params: { import: { source: 'owntracks', files: [file] } } + end.to have_enqueued_job(ImportJob).on_queue('imports').at_least(1).times + end + + it 'creates a new import' do + expect do + post imports_path, params: { import: { source: 'owntracks', files: [file] } } + end.to change(user.imports, :count).by(1) + + expect(response).to redirect_to(imports_path) + end end - it 'creates a new import' do - expect do - post imports_path, params: { import: { source: 'owntracks', files: [file] } } - end.to change(user.imports, :count).by(1) + context 'when importing gpx data' do + let(:file) { fixture_file_upload('gpx/gpx_track_single_segment.gpx', 'application/gpx+xml') } - expect(response).to redirect_to(imports_path) + it 'queues import job' do + expect do + post imports_path, params: { import: { source: 'gpx', files: [file] } } + end.to have_enqueued_job(ImportJob).on_queue('imports').at_least(1).times + end + + it 'creates a new import' do + expect do + post imports_path, params: { import: { source: 'gpx', files: [file] } } + end.to change(user.imports, :count).by(1) + + expect(response).to redirect_to(imports_path) + end end end end diff --git a/spec/services/gpx/track_parser_spec.rb b/spec/services/gpx/track_parser_spec.rb new file mode 100644 index 00000000..9efb919a --- /dev/null +++ b/spec/services/gpx/track_parser_spec.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Gpx::TrackParser do + describe '#call' do + subject(:parser) { described_class.new(import, user.id).call } + + let(:user) { create(:user) } + let(:file_path) { Rails.root.join('spec/fixtures/files/gpx/gpx_track_single_segment.gpx') } + let(:raw_data) { Hash.from_xml(File.read(file_path)) } + let(:import) { create(:import, user:, name: 'gpx_track.gpx', raw_data:) } + + context 'when file exists' do + context 'when file has a single segment' do + it 'creates points' do + expect { parser }.to change { Point.count }.by(301) + end + end + + context 'when file has multiple segments' do + let(:file_path) { Rails.root.join('spec/fixtures/files/gpx/gpx_track_multiple_segments.gpx') } + + it 'creates points' do + expect { parser }.to change { Point.count }.by(558) + end + end + end + end +end diff --git a/spec/swagger/api/v1/points_controller_spec.rb b/spec/swagger/api/v1/points_controller_spec.rb deleted file mode 100644 index 74f3d504..00000000 --- a/spec/swagger/api/v1/points_controller_spec.rb +++ /dev/null @@ -1,60 +0,0 @@ -# frozen_string_literal: true - -require 'swagger_helper' - -describe 'Points API', type: :request do - path '/api/v1/points' do - post 'Creates a point' do - request_body_example value: { - lat: 52.502397, - lon: 13.356718, - tid: 'Swagger', - tst: Time.current.to_i - } - tags 'Points' - consumes 'application/json' - parameter name: :point, in: :body, schema: { - type: :object, - properties: { - acc: { type: :number }, - alt: { type: :number }, - batt: { type: :number }, - bs: { type: :number }, - cog: { type: :number }, - lat: { type: :string, format: :decimal }, - lon: { type: :string, format: :decimal }, - rad: { type: :number }, - t: { type: :string }, - tid: { type: :string }, - tst: { type: :number }, - vac: { type: :number }, - vel: { type: :number }, - p: { type: :string, format: :decimal }, - poi: { type: :string }, - conn: { type: :string }, - tag: { type: :string }, - topic: { type: :string }, - inregions: { type: :array }, - SSID: { type: :string }, - BSSID: { type: :string }, - created_at: { type: :string }, - inrids: { type: :array }, - m: { type: :number } - }, - required: %w[lat lon tid tst] - } - - response '200', 'point created' do - let(:point) { { lat: 1.0, lon: 2.0, tid: 3, tst: 4 } } - - run_test! - end - - response '200', 'invalid request' do - let(:point) { { lat: 1.0 } } - - run_test! - end - end - end -end diff --git a/swagger/v1/swagger.yaml b/swagger/v1/swagger.yaml index 9fa978fd..a29db3d2 100644 --- a/swagger/v1/swagger.yaml +++ b/swagger/v1/swagger.yaml @@ -102,85 +102,6 @@ paths: wifi: unknown battery_state: unknown battery_level: 0 - "/api/v1/points": - post: - summary: Creates a point - tags: - - Points - parameters: [] - responses: - '200': - description: invalid request - requestBody: - content: - application/json: - schema: - type: object - properties: - acc: - type: number - alt: - type: number - batt: - type: number - bs: - type: number - cog: - type: number - lat: - type: string - format: decimal - lon: - type: string - format: decimal - rad: - type: number - t: - type: string - tid: - type: string - tst: - type: number - vac: - type: number - vel: - type: number - p: - type: string - format: decimal - poi: - type: string - conn: - type: string - tag: - type: string - topic: - type: string - inregions: - type: array - SSID: - type: string - BSSID: - type: string - created_at: - type: string - inrids: - type: array - m: - type: number - required: - - lat - - lon - - tid - - tst - examples: - '0': - summary: Creates a point - value: - lat: 52.502397 - lon: 13.356718 - tid: Swagger - tst: 1718385215 servers: - url: http://{defaultHost} variables: