@camstack/addon-pipeline-orchestrator 1.2.176 → 1.2.179

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -405,7 +405,7 @@ __d(function(g,r,i,_a,m,_e,_d){'use strict';m.exports=function(e,n,o,t,a,f,s,d){
405
405
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t}});var t={}},324,[]);
406
406
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.installOnUIRuntime=function(t){const o=globalThis?.expo?.installOnUIRuntime;if(!o)throw Error("Native method to install Expo Modules on the worklets UI runtime wasn't found in `expo-modules-core`.");o(t)}},325,[]);
407
407
  __d(function(g,r,i,a,m,e,d){"use strict";var t,n,o;Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"AppOwnership",{enumerable:!0,get:function(){return t}}),Object.defineProperty(e,"ExecutionEnvironment",{enumerable:!0,get:function(){return n}}),Object.defineProperty(e,"UserInterfaceIdiom",{enumerable:!0,get:function(){return o}}),(function(t){t.Expo="expo"})(t||(t={})),(function(t){t.Bare="bare",t.Standalone="standalone",t.StoreClient="storeClient"})(n||(n={})),(function(t){t.Handset="handset",t.Tablet="tablet",t.Desktop="desktop",t.TV="tv",t.Unsupported="unsupported"})(o||(o={}))},326,[]);
408
- __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return s}});var t=r(d[0]);const n=(Date.now()+'-'+Math.floor(1e9*Math.random())).toString();function o(){if('undefined'!=typeof navigator&&'string'==typeof navigator.userAgent){const t=navigator.userAgent.toLowerCase();if(t.includes('edge'))return'Edge';if(t.includes('edg'))return'Chromium Edge';if(t.includes('opr')&&'opr'in window&&window.opr)return'Opera';if(t.includes('chrome')&&'chrome'in window&&window.chrome)return'Chrome';if(t.includes('trident'))return'IE';if(t.includes('firefox'))return'Firefox';if(t.includes('safari'))return'Safari'}}var s={get appOwnership(){return null},get executionEnvironment(){return t.ExecutionEnvironment.Bare},get sessionId(){return n},get isHeadless(){return'undefined'==typeof navigator||/\bHeadlessChrome\//.test(navigator.userAgent)},get expoVersion(){return this.manifest.sdkVersion||null},get linkingUri(){return'undefined'!=typeof location?location.origin:''},get expoRuntimeVersion(){return this.expoVersion},get deviceName(){return o()},get systemFonts(){return[]},get statusBarHeight(){return 0},get deviceYearClass(){return null},get manifest(){return"{\"name\":\"CamStack\",\"slug\":\"camstack\",\"version\":\"1.0.476\",\"sdkVersion\":\"57.0.0\",\"platforms\":[\"ios\",\"android\",\"web\"],\"runtimeVersion\":\"1.0.454\",\"orientation\":\"default\",\"icon\":\"./assets/images/icon.png\",\"scheme\":\"camstack\",\"userInterfaceStyle\":\"automatic\",\"web\":{\"output\":\"single\",\"favicon\":\"./assets/images/favicon.png\",\"shortName\":\"CamStack\",\"backgroundColor\":\"#e67e22\",\"name\":\"CamStack\"},\"experiments\":{\"typedRoutes\":true,\"reactCompiler\":true,\"baseUrl\":\"/viewer/camstack\"},\"extra\":{\"router\":{\"root\":\"app\"},\"eas\":{\"projectId\":\"8fb06894-6375-41ff-959f-1a22a03dbd73\"}},\"updates\":{\"url\":\"https://u.expo.dev/8fb06894-6375-41ff-959f-1a22a03dbd73\"},\"owner\":\"zentik-notifier\"}"},get manifest2(){return null},get experienceUrl(){return'undefined'!=typeof location?location.origin:''},get debugMode(){return!1},getWebViewUserAgentAsync:async()=>'undefined'!=typeof navigator?navigator.userAgent:null}},327,[326]);
408
+ __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return s}});var t=r(d[0]);const n=(Date.now()+'-'+Math.floor(1e9*Math.random())).toString();function o(){if('undefined'!=typeof navigator&&'string'==typeof navigator.userAgent){const t=navigator.userAgent.toLowerCase();if(t.includes('edge'))return'Edge';if(t.includes('edg'))return'Chromium Edge';if(t.includes('opr')&&'opr'in window&&window.opr)return'Opera';if(t.includes('chrome')&&'chrome'in window&&window.chrome)return'Chrome';if(t.includes('trident'))return'IE';if(t.includes('firefox'))return'Firefox';if(t.includes('safari'))return'Safari'}}var s={get appOwnership(){return null},get executionEnvironment(){return t.ExecutionEnvironment.Bare},get sessionId(){return n},get isHeadless(){return'undefined'==typeof navigator||/\bHeadlessChrome\//.test(navigator.userAgent)},get expoVersion(){return this.manifest.sdkVersion||null},get linkingUri(){return'undefined'!=typeof location?location.origin:''},get expoRuntimeVersion(){return this.expoVersion},get deviceName(){return o()},get systemFonts(){return[]},get statusBarHeight(){return 0},get deviceYearClass(){return null},get manifest(){return"{\"name\":\"CamStack\",\"slug\":\"camstack\",\"version\":\"1.0.478\",\"sdkVersion\":\"57.0.0\",\"platforms\":[\"ios\",\"android\",\"web\"],\"runtimeVersion\":\"1.0.454\",\"orientation\":\"default\",\"icon\":\"./assets/images/icon.png\",\"scheme\":\"camstack\",\"userInterfaceStyle\":\"automatic\",\"web\":{\"output\":\"single\",\"favicon\":\"./assets/images/favicon.png\",\"shortName\":\"CamStack\",\"backgroundColor\":\"#e67e22\",\"name\":\"CamStack\"},\"experiments\":{\"typedRoutes\":true,\"reactCompiler\":true,\"baseUrl\":\"/viewer/camstack\"},\"extra\":{\"router\":{\"root\":\"app\"},\"eas\":{\"projectId\":\"8fb06894-6375-41ff-959f-1a22a03dbd73\"}},\"updates\":{\"url\":\"https://u.expo.dev/8fb06894-6375-41ff-959f-1a22a03dbd73\"},\"owner\":\"zentik-notifier\"}"},get manifest2(){return null},get experienceUrl(){return'undefined'!=typeof location?location.origin:''},get debugMode(){return!1},getWebViewUserAgentAsync:async()=>'undefined'!=typeof navigator?navigator.userAgent:null}},327,[326]);
409
409
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SITEMAP_ROUTE_NAME=e.NOT_FOUND_ROUTE_NAME=e.INTERNAL_SLOT_NAME=void 0,e.INTERNAL_SLOT_NAME='__root',e.NOT_FOUND_ROUTE_NAME='+not-found',e.SITEMAP_ROUTE_NAME='_sitemap'},328,[]);
410
410
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.useCurrentRouteInfo=function(){const n=(0,u.useStateForPath)();return(0,t.useMemo)(()=>n?(0,o.getCachedRouteInfo)(n):void 0,[n])};const t=r(d[0]),o=r(d[1]),u=r(d[2])},329,[17,330,338]);
411
411
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.routeInfoSubscribe=e.routeInfoSubscribers=void 0,e.getCachedRouteInfo=function(s){let u=o.get(s);if(!u){u=(0,t.getRouteInfoFromState)(s);const f=JSON.stringify(u),c=n.get(f);c?u=c:n.set(f,u),o.set(s,u)}return u},e.setCachedRouteInfo=function(t,s){o.set(t,s),n.set(JSON.stringify(s),s)};const t=r(d[0]),o=new WeakMap,n=new Map;e.routeInfoSubscribers=new Set;e.routeInfoSubscribe=t=>(e.routeInfoSubscribers.add(t),()=>{e.routeInfoSubscribers.delete(t)})},330,[331]);
@@ -3217,7 +3217,7 @@ __d(function(g,r,i,a,m,_e,d){"use strict";function e(e){return e&&e.__esModule?e
3217
3217
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.pendingFlagKey=function(t){return void 0!==t.markForTrain?'markForTrain':void 0!==t.debug?'debug':void 0!==t.debugNote?'debugNote':void 0!==t.favourited?'favourited':null},e.toTrackFlagsResult=s,e.useSetTrackFlags=function(){const f=(0,t.c)(7),{controller:b}=(0,n.useConnection)(),k=(0,o.useQueryClient)();let v,y,F;f[0]!==b?(v=async t=>{const{deviceId:o,trackId:n,flags:c}=t,l=b.getSystem();if(!l)throw new Error("not connected");const f=s(await(0,u.capMutateOrThrow)(l.trpcClient,"pipelineAnalytics","setTrackFlags",{deviceId:o,trackId:n,flags:c}));if(null===f)throw new Error("track flags unreadable");return f},f[0]=b,f[1]=v):v=f[1];f[2]!==k?(y=(t,o)=>{const{deviceId:n,trackId:u}=o,s=(0,c.trackByIdQueryKey)(n,u);k.setQueryData(s,o=>null==o?o:Object.assign({},o,{markForTrain:t.markForTrain,debug:t.debug,debugNote:t.debugNote,favourited:t.favourited})),k.invalidateQueries({queryKey:s}),l.useTrackFlagOverlayStore.getState().apply(u,{debug:t.debug,markForTrain:t.markForTrain,favourited:t.favourited})},f[2]=k,f[3]=y):y=f[3];f[4]!==v||f[5]!==y?(F={mutationFn:v,onSuccess:y},f[4]=v,f[5]=y,f[6]=F):F=f[6];return(0,o.useMutation)(F)};var t=r(d[0]),o=r(d[1]),n=r(d[2]),u=r(d[3]),c=r(d[4]),l=r(d[5]);function s(t){if(!(0,u.isRecord)(t))return null;const{trackId:o,markForTrain:n,debug:c,debugNote:l,favourited:s}=t;return'string'!=typeof o||0===o.length||'boolean'!=typeof n||'boolean'!=typeof c||'boolean'!=typeof s?null:{trackId:o,markForTrain:n,debug:c,debugNote:'string'==typeof l?l:'',favourited:s}}},1842,[15,1513,1130,1572,1666,1683]);
3218
3218
  __d(function(g,_r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.toSessionUser=u,e.useMe=c,e.useIsAdmin=function(){const{data:n}=c();return!0===n?.isAdmin};var n=_r(d[0]),t=_r(d[1]),r=_r(d[2]),s=_r(d[3]),o=_r(d[4]);function u(n){if('object'!=typeof n||null===n)return null;const t=n;return'string'!=typeof t.id||'string'!=typeof t.username?null:{id:t.id,username:t.username,isAdmin:!0===t.isAdmin,scope:(0,s.parseUserScope)(t.scope)}}function c(){const s=(0,n.c)(6),{controller:c,state:l}=(0,r.useConnection)();let f;s[0]===Symbol.for("react.memo_cache_sentinel")?(f=["v2","me"],s[0]=f):f=s[0];const y="connected"===l;let p,I;return s[1]!==c?(p=async()=>{const n=c.getSystem();if(!n)return null;return u(await(0,o.capQuery)(n.trpcClient,"auth","me",void 0,{rethrow:!0}))},s[1]=c,s[2]=p):p=s[2],s[3]!==y||s[4]!==p?(I={queryKey:f,enabled:y,staleTime:Number.POSITIVE_INFINITY,refetchInterval:!1,queryFn:p},s[3]=y,s[4]=p,s[5]=I):I=s[5],(0,t.useQuery)(I)}},1843,[15,1513,1130,1844,1572]);
3219
3219
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"UNKNOWN_SCOPE_VIEW",{enumerable:!0,get:function(){return n}}),e.parseUserScope=function(n){const t=c(n);if(null===t)return null;const l=u(t,'isAdmin'),w=u(t,'allDevicesViewable'),b=s(t,'viewableDeviceCount');if(null===l||null===w||null===b)return null;const A=c(Reflect.get(t,'device'));if(null===A)return null;const D=o(A,'view'),p=o(A,'create'),y=o(A,'delete');return null===D||null===p||null===y?null:{isAdmin:l,allDevicesViewable:w,viewableDeviceCount:b,device:{view:D,create:p,delete:y},system:f(t,'system'),capabilities:v(t,'capabilities'),addons:v(t,'addons')}},e.resolveScopeView=b,e.resolveSessionScopeView=function(l){if(null===l)return n;if(null===l.scope)return l.isAdmin?t:n;const c=b(l.scope);return l.isAdmin&&!c.isAdmin?Object.assign({},c,{isAdmin:!0,canActuate:!0,canDelete:!0,isViewer:!1}):c},e.allowsGrade=function(n,t){switch(t){case'view':return!0;case'actuate':return n.canActuate;case'delete':return n.canDelete;case'admin':return n.isAdmin;default:return t}};const n={known:!1,isAdmin:!1,canActuate:!0,canDelete:!0,isViewer:!1,viewableDeviceCount:0,allDevicesViewable:!0,hasNoViewableDevices:!1},t=Object.assign({},n,{isAdmin:!0});function l(n){return'view'===n||'create'===n||'delete'===n}function c(n){return'object'!=typeof n||null===n||Array.isArray(n)?null:n}function u(n,t){const l=Reflect.get(n,t);return'boolean'==typeof l?l:null}function s(n,t){const l=Reflect.get(n,t);return'number'==typeof l&&Number.isFinite(l)&&l>=0?l:null}function o(n,t){const l=c(Reflect.get(n,t));if(null===l)return null;const o=u(l,'all'),f=s(l,'deviceCount');return null===o||null===f?null:{all:o,deviceCount:f}}function f(n,t){const c=Reflect.get(n,t);return Array.isArray(c)?c.filter(l):[]}function v(n,t){const l=Reflect.get(n,t);if(!Array.isArray(l))return[];const u=[];for(const n of l){const t=c(n);if(null===t)continue;const l=Reflect.get(t,'name');'string'==typeof l&&u.push({name:l,access:f(t,'access')})}return u}function w(n){return n.all||n.deviceCount>0}function b(t){if(null===t)return n;const l=t.isAdmin||w(t.device.create),c=t.isAdmin||w(t.device.delete);return{known:!0,isAdmin:t.isAdmin,canActuate:l,canDelete:c,isViewer:!t.isAdmin&&!l&&!c,viewableDeviceCount:t.viewableDeviceCount,allDevicesViewable:t.allDevicesViewable,hasNoViewableDevices:!t.allDevicesViewable&&0===t.viewableDeviceCount}}},1844,[]);
3220
- __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.debugNotePresets=function(o){return t.map(t=>({id:t,phrase:o(`v2.tracks.debugPreset.${t}`)}))};const t=['noCrop','edgeCropMirror','lateStart','neverDetected','boxPathMismatch','brokenTrack','badThumbnail','falsePositive']},1845,[]);
3220
+ __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.debugNotePresets=function(o){return t.map(t=>({id:t,phrase:o(`v2.tracks.debugPreset.${t}`)}))};const t=['lateStart','betterShotExisted','lastFrameBeforeFirst','riderNotInKeyframe','twoSubjectsOneTrack','brokenTrack','edgeCropMirror','noCrop','neverDetected','falsePositive']},1845,[]);
3221
3221
  __d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"useDebugStatusStore",{enumerable:!0,get:function(){return b}});var e,t=r(d[0]),s=r(d[1]),n=(e=s)&&e.__esModule?e:{default:e},u=r(d[2]);const c='camstack.v2.debug-status';function o(e){return{statuses:e,reviewedIds:(0,u.reuseReviewedIds)(b.getState().reviewedIds,e)}}function f(e){n.default.setItem(c,JSON.stringify(e))}function l(e,t){if(void 0===e[t])return Object.assign({},e);const s=Object.assign({},e);return delete s[t],s}const b=(0,t.create)((e,t)=>({statuses:{},reviewedIds:[],hydrated:!1,hydrate:async()=>{if(!t().hydrated)try{const t=await n.default.getItem(c),s=(0,u.parseDebugStatuses)(null===t?null:JSON.parse(t));e(Object.assign({},o(s),{hydrated:!0}))}catch{e({hydrated:!0})}},markOpen:s=>{if(0===s.length)return;const n=Object.assign({},t().statuses,{[s]:'open'});e(o(n)),f(n)},markReviewed:s=>{if(0===s.length)return;const n=Object.assign({},t().statuses,{[s]:'reviewed'});e(o(n)),f(n)},markNone:s=>{if(0===s.length)return;const n=l(t().statuses,s);e(o(n)),f(n)},statusOf:(e,s)=>(0,u.resolveDebugStatus)(s,t().statuses[e])}))},1846,[1024,783,1847]);
3222
3222
  __d(function(g,r,_i,a,m,e,d){"use strict";function t(t){const n=[];for(const[o,s]of Object.entries(t))'reviewed'===s&&n.push(o);return n}Object.defineProperty(e,'__esModule',{value:!0}),e.resolveDebugStatus=function(t,n){return'reviewed'===n&&!0!==t?'reviewed':!0===t?'open':'none'},e.parseDebugStatuses=function(t){if(n=t,'object'!=typeof n||null===n||Array.isArray(n))return{};var n;const o={};for(const[n,s]of Object.entries(t))0!==n.length&&('open'!==s&&'reviewed'!==s||(o[n]=s));return o},e.reviewedIdsFrom=t,e.reuseReviewedIds=function(n,o){const s=t(o);return s.length===n.length&&s.every((t,o)=>t===n[o])?n:s}},1847,[]);
3223
3223
  __d(function(g,r,_i,a,m,_e,d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(_e,'__esModule',{value:!0}),_e.TrackDetailSkeleton=function(){const e=(0,t.c)(10);let s,l,c,h,y,_,w,p,b,I;e[0]===Symbol.for("react.memo_cache_sentinel")?(s=(0,n.jsx)(x,{}),e[0]=s):s=e[0];e[1]===Symbol.for("react.memo_cache_sentinel")?(l=(0,n.jsx)(i.default,{style:j.hero,children:(0,n.jsx)(o.SkeletonBox,{})}),e[1]=l):l=e[1];e[2]===Symbol.for("react.memo_cache_sentinel")?(c=(0,n.jsx)(i.default,{style:j.shareBtn,children:(0,n.jsx)(o.SkeletonBox,{})}),e[2]=c):c=e[2];e[3]===Symbol.for("react.memo_cache_sentinel")?(h=(0,n.jsxs)(i.default,{style:j.shareRow,children:[c,(0,n.jsx)(i.default,{style:j.shareBtn,children:(0,n.jsx)(o.SkeletonBox,{})})]}),y=(0,n.jsx)(x,{}),e[3]=h,e[4]=y):(h=e[3],y=e[4]);e[5]===Symbol.for("react.memo_cache_sentinel")?(_=(0,n.jsx)(i.default,{style:j.frame,children:(0,n.jsx)(o.SkeletonBox,{})}),e[5]=_):_=e[5];e[6]===Symbol.for("react.memo_cache_sentinel")?(w=(0,n.jsx)(i.default,{style:j.counter,children:(0,n.jsx)(u,{width:30,height:9,radius:4})}),e[6]=w):w=e[6];e[7]===Symbol.for("react.memo_cache_sentinel")?(p=(0,n.jsx)(i.default,{style:j.strip,children:Array.from({length:f},S)}),e[7]=p):p=e[7];e[8]===Symbol.for("react.memo_cache_sentinel")?(b=(0,n.jsxs)(i.default,{style:j.metaRow,children:[(0,n.jsx)(u,{width:72,height:10,radius:4}),(0,n.jsx)(u,{width:"45%",height:10,radius:4})]}),e[8]=b):b=e[8];e[9]===Symbol.for("react.memo_cache_sentinel")?(I=(0,n.jsxs)(i.default,{style:j.root,accessibilityRole:"progressbar",accessibilityLabel:"",children:[s,l,h,y,_,w,p,(0,n.jsxs)(i.default,{style:j.meta,children:[b,(0,n.jsxs)(i.default,{style:j.metaRow,children:[(0,n.jsx)(u,{width:72,height:10,radius:4}),(0,n.jsx)(u,{width:"60%",height:10,radius:4})]})]})]}),e[9]=I):I=e[9];return I};var t=r(d[0]);r(d[1]);var s=e(r(d[2])),i=e(r(d[3])),o=r(d[4]),l=r(d[5]),n=r(d[6]);const c=1.7777777777777777,h=64,f=5;function u(e){const s=(0,t.c)(7),{width:c,height:h,radius:f}=e,u=void 0===f?l.RADIUS.sm:f;let x,S,j;return s[0]!==h||s[1]!==u||s[2]!==c?(x={width:c,height:h,borderRadius:u,overflow:"hidden"},s[0]=h,s[1]=u,s[2]=c,s[3]=x):x=s[3],s[4]===Symbol.for("react.memo_cache_sentinel")?(S=(0,n.jsx)(o.SkeletonBox,{}),s[4]=S):S=s[4],s[5]!==x?(j=(0,n.jsx)(i.default,{style:x,children:S}),s[5]=x,s[6]=j):j=s[6],j}function x(){const e=(0,t.c)(1);let s;return e[0]===Symbol.for("react.memo_cache_sentinel")?(s=(0,n.jsx)(i.default,{style:j.caption,children:(0,n.jsx)(u,{width:78,height:9,radius:4})}),e[0]=s):s=e[0],s}function S(e,t){return(0,n.jsxs)(i.default,{style:j.tileWrap,children:[(0,n.jsx)(u,{width:h,height:h}),(0,n.jsx)(u,{width:40,height:8,radius:4})]},t)}const j=s.default.create({root:{paddingBottom:l.SPACING.md},caption:{marginTop:l.SPACING.sm,marginBottom:l.SPACING.xs},hero:{width:'100%',aspectRatio:c,borderRadius:l.RADIUS.md,overflow:'hidden'},shareRow:{flexDirection:'row',gap:l.SPACING.sm,marginTop:l.SPACING.sm},shareBtn:{flex:1,height:38,borderRadius:l.RADIUS.md,overflow:'hidden'},frame:{width:'100%',aspectRatio:c,borderRadius:l.RADIUS.md,overflow:'hidden'},counter:{alignItems:'center',marginTop:l.SPACING.xs},strip:{flexDirection:'row',gap:l.SPACING.sm,paddingVertical:l.SPACING.sm},tileWrap:{width:h,alignItems:'center',gap:4},meta:{marginTop:l.SPACING.md,gap:l.SPACING.sm},metaRow:{flexDirection:'row',gap:l.SPACING.sm,alignItems:'center'}})},1848,[15,17,33,20,1598,790,10]);
@@ -3438,7 +3438,7 @@ __d(function(g,r,i,a,m,_e,_d){"use strict";Object.defineProperty(_e,'__esModule'
3438
3438
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"CRASH_SCOPE",{enumerable:!0,get:function(){return l}}),e.setRunningBundle=function(t){s=t},e.readErrorUtils=u,e.reportFatal=f,e.installCrashReporter=function(s=(0,o.getExitMarkerRecorder)()){if(b)return!1;const c=u();if(null===c)return!1;b=!0;const k=c.getGlobalHandler?.();return c.setGlobalHandler((o,c)=>{if(!1===c){const s=(0,n.describeThrown)(o);t.log.warn(l,'non-fatal error reached the global handler',{message:s.message,stack:s.stack})}else f('js-fatal',o,s);k?.(o,c)}),!0},e.reportPreviousExit=async function(c=(0,o.getExitMarkerRecorder)()){const u=await c.readPrevious(),f=(0,n.classifyPreviousExit)(u);t.log.info(l,`previous runtime exit: ${f}`,{exit:f,crash:(0,n.isCrashExit)(f),markedAt:u?.at??null,message:u?.message??null,stack:u?.stack??null,version:s?.version??null,bundle:s?.bundle??null}),await c.arm()},e.bindExitMarkerToAppState=function(t,n=(0,o.getExitMarkerRecorder)()){let l=t.currentState;const s=t.addEventListener('change',t=>{const o='background'!==l;l=t,'background'===t&&o?n.record('backgrounded'):'active'===t&&n.arm()});return()=>s.remove()};var t=r(d[0]),n=r(d[1]),o=r(d[2]);const l='crash';let s=null;function c(t){if('object'!=typeof t||null===t)return!1;return'function'==typeof Reflect.get(t,'setGlobalHandler')}function u(){const t=Reflect.get(globalThis,'ErrorUtils');return c(t)?t:null}function f(c,u,f=(0,o.getExitMarkerRecorder)()){const b=(0,n.describeThrown)(u);t.log.error(l,`runtime fatal (${c})`,{kind:c,message:b.message,stack:b.stack,version:s?.version??null,bundle:s?.bundle??null}),f.record(c,b),(0,t.flushLogsNow)()}let b=!1},2063,[1115,2064,2065]);
3439
3439
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"CRASH_STACK_MAX_CHARS",{enumerable:!0,get:function(){return n}}),e.describeThrown=function(t){if(t instanceof Error){const s='string'==typeof t.stack?t.stack:null;return{message:`${t.name}: ${t.message}`,stack:null===s?null:s.slice(0,n)}}try{return{message:String(t),stack:null}}catch{return{message:'unstringifiable thrown value',stack:null}}},e.serializeExitMarker=function(n){try{return JSON.stringify(n)}catch{return JSON.stringify({kind:n.kind,at:n.at})}},e.parseExitMarker=function(n){if(null===n||0===n.length)return null;let s;try{s=JSON.parse(n)}catch{return null}if('object'!=typeof s||null===s||Array.isArray(s))return null;const u=Object.assign({},s),l=u.kind;if(c=l,'running'!==c&&'backgrounded'!==c&&'ota-reload'!==c&&'js-fatal'!==c&&'render-error'!==c)return null;var c;const o=u.at;return{kind:l,at:'number'==typeof o&&Number.isFinite(o)?o:0,message:t(u,'message'),stack:t(u,'stack')}},e.classifyPreviousExit=function(n){return null===n?'first-launch':'running'===n.kind?'vanished':n.kind},e.isCrashExit=function(n){return'js-fatal'===n||'render-error'===n||'vanished'===n};const n=2e3;function t(n,t){const s=n[t];return'string'==typeof s&&s.length>0?s:void 0}},2064,[]);
3440
3440
  __d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"EXIT_MARKER_STORAGE_KEY",{enumerable:!0,get:function(){return s}}),_e.createExitMarkerPort=o,Object.defineProperty(_e,"ExitMarkerRecorder",{enumerable:!0,get:function(){return u}}),_e.getExitMarkerRecorder=function(){return l??=new u(o()),l};var e,t=r(d[0]),n=(e=t)&&e.__esModule?e:{default:e},c=r(d[1]);const s='camstack.runtime.exit-marker.v1';function o(){return{read:()=>n.default.getItem(s),write:e=>n.default.setItem(s,e)}}class u{constructor(e,t=Date.now){this.port=e,this.now=t}readPrevious=async()=>{try{return(0,c.parseExitMarker)(await this.port.read())}catch{return null}};arm=()=>this.record('running');record=async(e,t)=>{const n={kind:e,at:this.now(),message:t?.message,stack:t?.stack??void 0};try{await this.port.write((0,c.serializeExitMarker)(n))}catch{}}}let l},2065,[783,2064]);
3441
- __d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"WHATS_NEW",{enumerable:!0,get:function(){return e}}),_e.whatsNewHistory=function(o){const n=t(o);return{latest:n,past:e.filter(e=>e!==n)}},_e.whatsNewFor=t,_e.whatsNewLines=function(e,t){const o=t.toLowerCase().startsWith('it')?'it':'en',n=e.notes[o];return n.length>0?n:e.notes.en},_e.shouldShowWhatsNew=function(e,o){return!!o&&(e!==o&&null!==t(o))};const e=[{version:'1.0.476',date:'2026-09-08',notes:{en:['Closing the keyboard in the note dialog is the keyboard\u2019s own button now: on iOS a Done bar sits docked to it, drawn by the system above the keys, instead of a button crowding the card.'],it:['Chiudere la tastiera nel dialogo della nota ora \xe8 un pulsante della tastiera stessa: su iOS una barra Fatto le sta agganciata, disegnata dal sistema sopra i tasti, invece di un pulsante che toglie spazio alla scheda.']}},{version:'1.0.475',date:'2026-09-08',notes:{en:['The note dialog was a trap with the keyboard up: its buttons sat behind it, a multiline field has no return key, and tapping outside threw the note away. The card now lifts above the keyboard, a tap outside closes the keyboard first, and there is a Close keyboard button while it is open.'],it:['Il dialogo della nota era una trappola con la tastiera aperta: i pulsanti restavano dietro, un campo multiriga non ha tasto invio, e toccare fuori buttava via la nota. Ora la scheda si solleva sopra la tastiera, un tocco fuori chiude prima la tastiera, e c\u2019\xe8 un pulsante Chiudi tastiera finch\xe9 \xe8 aperta.']}},{version:'1.0.474',date:'2026-09-08',notes:{en:['On a Mac the player still opened the embed page in a browser: the WebView declines that load without reporting an error, so the previous fallback had nothing to react to. The player now watches for silence \u2014 if the bundled page has not spoken within six seconds, it loads the same page from the hub.'],it:['Su Mac il player apriva ancora la pagina dell\u2019embed nel browser: la WebView rifiuta quel caricamento senza segnalare alcun errore, quindi il fallback precedente non aveva nulla a cui reagire. Ora il player sorveglia il silenzio \u2014 se la pagina inclusa non ha parlato entro sei secondi, carica la stessa pagina dall\u2019hub.']}},{version:'1.0.473',date:'2026-09-08',notes:{en:['A sample whose picture is gone now says so, instead of drawing an empty square. Most of the gallery is in that state today \u2014 the crops were lost before the panel existed \u2014 and the scores beside them are unaffected: they come from the stored vector, which is intact.'],it:['Un campione la cui immagine non c\u2019\xe8 pi\xf9 ora lo dice, invece di disegnare un quadrato vuoto. Oggi gran parte della galleria \xe8 in quello stato \u2014 i ritagli erano gi\xe0 andati persi prima che il pannello esistesse \u2014 e i punteggi accanto non ne risentono: vengono dal vettore memorizzato, che \xe8 intatto.']}},{version:'1.0.472',date:'2026-09-08',notes:{en:['Library \u2192 Review can re-analyse one person\u2019s enrolled samples. Worst first, each with its crop and the reason \u2014 \u201clooks like Matthias (61%) more than like this person (12%)\u201d \u2014 and a sample is flagged only when it could actually be auto-assigned to the other person. Remove is one tap, and nothing is removed for you.'],it:['Libreria \u2192 Revisione pu\xf2 rianalizzare i campioni di una persona. Peggiori in cima, ognuno col suo ritaglio e il motivo \u2014 \u201csomiglia a Matthias (61%) pi\xf9 che a questa persona (12%)\u201d \u2014 e un campione \xe8 segnalato solo se potrebbe davvero essere auto-assegnato all\u2019altra persona. Rimuovere \xe8 un tocco, e nessuno rimuove niente al posto tuo.']}},{version:'1.0.471',date:'2026-09-08',notes:{en:['Opening the Cameras page now refreshes every camera\u2019s thumbnail, two at a time, once \u2014 so the tiles below the fold are minutes old instead of hours. It stops when it has been round the list.','What\u2019s new is a panel now, not a one-line dialog: the build that just arrived is at the top, and every earlier update is listed under it by version and date, tap to open. Settings \u2192 Info opens the same panel.'],it:['Aprendo la pagina Telecamere ora si aggiorna la miniatura di ogni camera, due alla volta, una sola volta \u2014 cos\xec i riquadri sotto la piega sono vecchi di minuti e non di ore. Finito il giro, si ferma.','Le novit\xe0 sono un pannello, non pi\xf9 un avviso a una riga: in alto la build appena arrivata, sotto l\u2019elenco di tutti gli aggiornamenti precedenti per versione e data, che si aprono al tocco. Impostazioni \u2192 Info apre lo stesso pannello.']}},{version:'1.0.470',date:'2026-09-08',notes:{en:['The debug checkboxes changed with use: an edge crop that came back mirrored, and a box that does not match the path the track drew \u2014 which usually means two subjects ended up sharing one id. "Wrong class" and "audio-only" left; neither was what anyone was actually reporting.'],it:['Le caselle di debug sono cambiate con l\u2019uso: un ritaglio sul bordo tornato specchiato, e un box che non coincide col percorso disegnato dalla traccia \u2014 che di solito significa due soggetti finiti sullo stesso id. Sono uscite "classe sbagliata" e "solo audio": non era quello che si segnalava davvero.']}},{version:'1.0.469',date:'2026-09-08',notes:{en:['Marking an event for debug now offers the questions that keep coming back as checkboxes, so a mark carries a question without typing one. Ticking one writes its phrase into the note; the field below still takes anything the boxes cannot say.'],it:['Marcando un evento per il debug ora trovi come caselle le domande che ricorrono, cos\xec una marcatura porta con s\xe9 una domanda senza doverla scrivere. Spuntarne una scrive la sua frase nella nota; il campo sotto accetta ancora tutto ci\xf2 che le caselle non dicono.']}},{version:'1.0.468',date:'2026-09-08',notes:{en:['The privacy-mask switch now says what is actually missing: no privacy zone is drawn on the camera. It used to give the same general "nothing is set up yet" sentence as every other control, which left no next step \u2014 and the next step is on the camera, not in this app.'],it:["L'interruttore della maschera privacy ora dice cosa manca davvero: sulla telecamera non \xe8 disegnata nessuna zona di privacy. Prima dava la stessa frase generica di ogni altro controllo, che non indicava alcun passo successivo \u2014 e il passo successivo \xe8 sulla telecamera, non in questa app."]}},{version:'1.0.467',date:'2026-09-08',notes:{en:['Unticking every event kind used to leave invisible leftovers behind, so the list stayed empty and the counters disagreed with the boxes. The leftovers are cleared, and no ticks now means no constraint.','Ticking only Faces or Plates therefore works on its own, across every kind, while narrowing them with a kind still works as before.','A collapsed group now shows a partial mark when something inside it is ticked, so nothing can be on where you cannot see it.'],it:["Togliendo la spunta a tutti i tipi di evento restavano dietro dei residui invisibili, cos\xec la lista restava vuota e i contatori non coincidevano con le caselle. I residui vengono ripuliti, e nessuna spunta adesso vuol dire nessun vincolo.","Spuntare solo Volti o Targhe funziona quindi da solo, su tutti i tipi, mentre restringerli a un tipo continua a funzionare come prima.","Un gruppo chiuso mostra adesso un segno parziale quando qualcosa al suo interno \xe8 spuntato, cos\xec niente pu\xf2 essere attivo dove non lo vedi."]}},{version:'1.0.466',date:'2026-09-08',notes:{en:['A filter that matched nothing on the first page used to stop the list from loading any further, so a narrow choice looked empty even when matches existed further back. The list now keeps reading until it finds them.','Plates were the clearest case: they sat four pages deep and were never reached. Faces happened to match early, which is why the same defect looked intermittent.','An empty list now says which kind of empty it is, and offers to load older events instead of ending the road.'],it:["Un filtro che non trovava nulla nella prima pagina impediva alla lista di caricare oltre, cos\xec una scelta stretta sembrava vuota anche quando i risultati c'erano pi\xf9 indietro. Adesso la lista continua a leggere finch\xe9 li trova.","Le targhe erano il caso pi\xf9 evidente: stavano quattro pagine pi\xf9 in l\xe0 e non venivano mai raggiunte. I volti capitavano presto, ed \xe8 per questo che lo stesso difetto sembrava intermittente.","Una lista vuota adesso dice di che vuoto si tratta, e propone di caricare gli eventi pi\xf9 vecchi invece di finire l\xec."]}},{version:'1.0.465',date:'2026-09-08',notes:{en:['The event kinds you already had \u2014 Audio, Sensor, Control \u2014 now actually filter. Ticking one shows those events, unticking hides them; there is no second filter to find, because the tree you were already using is the one that works.','Audio events start unticked, so the list opens on what you look at. A Default button puts the preset back without re-ticking everything by hand.','The chip counts what you kept in the terms you picked it in, so a default that hides one thing reads as one thing hidden.'],it:["I tipi di evento che avevi gi\xe0 \u2014 Audio, Sensore, Controllo \u2014 adesso filtrano davvero. Spuntandone uno vedi quegli eventi, togliendo la spunta li nascondi, e non c'\xe8 un secondo filtro da cercare: quello che usavi \xe8 quello che funziona.","Gli eventi audio partono senza spunta, cos\xec la lista si apre su quello che guardi. Un pulsante Predefinito rimette il preset senza dover rispuntare tutto a mano.","Il contatore conta quello che hai tenuto nei termini in cui l'hai scelto, cos\xec un default che nasconde una cosa si legge come una cosa nascosta."]}},{version:'1.0.464',date:'2026-09-07',notes:{en:['The events page can now filter by where an event came from, and audio-only events start hidden. The filter sits in More with the others, and the chip counts it, so a shorter list always says why it is shorter.','Picking a class used to drag every sensor and audio event along with it, and picking a sensor selected nothing at all. Provenance is now its own axis, so both do what they say.','The Recent strip on the Cameras screen has its own filter, in the same fan menu, showing detections by default and remembering what you choose.'],it:["La pagina eventi ora filtra anche per provenienza, e gli eventi di solo audio partono nascosti. Il filtro sta in Altro insieme agli altri e il contatore lo conta, cos\xec una lista pi\xf9 corta dice sempre perch\xe9 lo \xe8.","Scegliere una classe si portava dietro ogni evento di sensore e di audio, e scegliere un sensore non selezionava nulla. La provenienza adesso \xe8 un asse suo, quindi entrambi fanno quello che dicono.","La striscia Recenti nella schermata Camere ha un filtro suo, nello stesso menu a ventaglio, che di default mostra le rilevazioni e ricorda quello che scegli."]}},{version:'1.0.463',date:'2026-09-07',notes:{en:['One record button, the same pair of buttons everywhere: press it, then Keep \u2014 with the duration on it \u2014 or Discard. On the live picture it records forward from now; on the recording it anchors a period you draw with the scrub, in either direction.','Pressing it during playback no longer reports that the live view cannot be recorded, and the period you draw stops at the live edge instead of losing itself there.','While you are drawing a period the timeline no longer buzzes at every step: the notch feedback belongs to looking for an event, not to choosing a moment.'],it:["Un solo pulsante di registrazione, e la stessa coppia di pulsanti ovunque: premi, poi Salva \u2014 con la durata sopra \u2014 oppure Scarta. Sull'immagine live registra da adesso in avanti; sul registrato fissa un periodo che disegni con lo scorrimento, in entrambe le direzioni.","Premendolo durante la riproduzione non dice pi\xf9 che non pu\xf2 registrare la vista live, e il periodo che stai disegnando si ferma al bordo live invece di perdersi.","Mentre disegni un periodo la timeline non vibra pi\xf9 a ogni passo: lo scatto delle tacche serve a cercare un evento, non a scegliere un momento."]}},{version:'1.0.462',date:'2026-09-07',notes:{en:['Save a stretch of the recording from the timeline: press the record button during playback to anchor the period, scrub to the other end, then Save or Discard. The selected period is highlighted on the strip.','While you are choosing, the recording does not play \u2014 you see the frame you scrubbed to. Nothing is created on the hub until you press Save, and a period that crosses a stretch with no recording says so before it is exported.'],it:["Salva un tratto di registrato dalla timeline: durante la riproduzione premi il pulsante di registrazione per fissare il periodo, scorri fino all'altro estremo, poi Salva o Scarta. Il periodo selezionato \xe8 evidenziato sulla striscia.","Mentre scegli la registrazione non parte: vedi il fotogramma su cui ti sei fermato. Sull'hub non viene creato nulla finch\xe9 non premi Salva, e un periodo che attraversa un tratto senza registrazione lo dice prima di esportare."]}},{version:'1.0.461',date:'2026-09-07',notes:{en:['A host with nowhere to show a tile\'s linked-devices and view-options panels can now say so, and the embed stops drawing two buttons that would do nothing.'],it:["Un ospite che non ha dove mostrare i pannelli dispositivi collegati e opzioni di vista pu\xf2 dirlo, e l'embed smette di disegnare due pulsanti che non farebbero nulla."]}},{version:'1.0.460',date:'2026-09-06',notes:{en:['Battery and signal icons are now buttons: tapping one opens the figures \u2014 charge, power source, sleeping, link type, signal and Wi-Fi network \u2014 on the stream and in the cameras list.','What the camera does not report is said in words, never as a fabricated 0%.'],it:["Le icone di batteria e segnale sono diventate pulsanti: toccandone una si aprono i numeri \u2014 carica, alimentazione, sospensione, tipo di collegamento, segnale e rete Wi-Fi \u2014 sullo stream e nella lista camere.","Ci\xf2 che la camera non riporta viene detto a parole, mai come uno 0% inventato."]}},{version:'1.0.459',date:'2026-09-06',notes:{en:['Home Assistant cards: the embed no longer needs a viewing token in the page \u2014 Home Assistant carries it, and the events card URL stops carrying a credential.'],it:["Card di Home Assistant: l'embed non ha pi\xf9 bisogno del token nella pagina, lo porta Home Assistant, e l'URL della card eventi smette di trasportare una credenziale."]}},{version:'1.0.458',date:'2026-09-06',notes:{en:['Robot camera in landscape: with the timeline open the drive buttons move onto the visible picture and shrink to fit; the "\u2026" is gone there, the timeline has its own.'],it:['Camera del robot in landscape: con la timeline aperta i pulsanti di guida passano sul video visibile e si rimpiccioliscono; l\xec sparisce il "\u2026", la timeline ha gi\xe0 il suo.']}},{version:'1.0.457',date:'2026-09-06',notes:{en:['A restart for an update waits for the snapshot downloads in flight \u2014 the crash right after an update on build 16.'],it:['Il riavvio per un aggiornamento aspetta i download degli snapshot in corso: il crash subito dopo un aggiornamento sulla build 16.']}},{version:'1.0.456',date:'2026-09-06',notes:{en:['An OTA update asks before restarting the app.','A newer TestFlight / store build is announced, with a button to open it.',"What's new: these notes, once per version and in Settings \u2192 Info."],it:["Un aggiornamento OTA chiede conferma prima di riavviare l'app.",'Una build TestFlight / Store pi\xf9 recente viene segnalata, con il pulsante per aprirla.','Novit\xe0: queste note, una volta per versione e in Impostazioni \u2192 Info.']}},{version:'1.0.455',date:'2026-09-06',notes:{en:['Robot camera: a drive joystick in landscape, with Stop, light, Follow me and Return to dock.','The controls button opens for robot cameras too.','Battery and signal are glyphs in the toolbar; the day arrows fold on a narrow row.','A sleeping camera shows the moon in its name chip.'],it:['Camera del robot: joystick di guida in landscape, con Stop, luce, Seguimi e Torna alla base.','Il pulsante dei controlli si apre anche per le camere del robot.','Batteria e segnale sono glifi nella toolbar; le frecce del giorno si ripiegano su riga stretta.','Una camera dormiente mostra la luna nel chip del nome.']}}];function t(t){return t?e.find(e=>e.version===t)??null:null}},2066,[]);
3441
+ __d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"WHATS_NEW",{enumerable:!0,get:function(){return e}}),_e.whatsNewHistory=function(o){const n=t(o);return{latest:n,past:e.filter(e=>e!==n)}},_e.whatsNewFor=t,_e.whatsNewLines=function(e,t){const o=t.toLowerCase().startsWith('it')?'it':'en',n=e.notes[o];return n.length>0?n:e.notes.en},_e.shouldShowWhatsNew=function(e,o){return!!o&&(e!==o&&null!==t(o))};const e=[{version:'1.0.478',date:'2026-09-09',notes:{en:['Pinch-zoom on the live view is smooth again. The picture box no longer resizes under your fingers frame by frame \u2014 it settles once, after you let go \u2014 the pan no longer springs back at the end of a gesture, and the double tap now runs on the UI thread instead of queueing behind the screen. The gesture feels slightly different on purpose: the panel grows after the pinch, not during it.'],it:['Lo zoom a pinch sulla vista live \xe8 di nuovo fluido. Il riquadro dell\u2019immagine non si ridimensiona pi\xf9 sotto le dita frame per frame \u2014 si assesta una volta sola, dopo che hai lasciato \u2014 la panoramica non torna pi\xf9 indietro a fine gesto, e il doppio tap gira sul thread della UI invece di accodarsi dietro allo schermo. Il gesto si sente un po\u2019 diverso di proposito: il pannello cresce dopo la pinch, non durante.']}},{version:'1.0.477',date:'2026-09-08',notes:{en:['The debug note\u2019s preset reasons now come from the notes actually written, not from guesswork: \u201ctrack started late\u201d leads, the thumbnail entry is reworded as \u201ca better frame existed (face/plate)\u201d \u2014 which is what gets typed by hand every time \u2014 and three reasons that were being typed out are now checkboxes: last frame before the first, two subjects in one track, and a two-wheeler whose rider is outside the keyframe.'],it:['Le ragioni preset della nota di debug ora vengono dalle note davvero scritte, non da supposizioni: \u201ctraccia partita in ritardo\u201d \xe8 la prima, la voce sulla miniatura diventa \u201cc\u2019era un frame migliore (volto/targa)\u201d \u2014 che \xe8 quello che viene digitato ogni volta \u2014 e tre ragioni che venivano scritte a mano sono ora caselle: ultimo frame prima del primo, due soggetti nella stessa traccia, e il conducente di un due ruote fuori dal keyframe.']}},{version:'1.0.476',date:'2026-09-08',notes:{en:['Closing the keyboard in the note dialog is the keyboard\u2019s own button now: on iOS a Done bar sits docked to it, drawn by the system above the keys, instead of a button crowding the card.'],it:['Chiudere la tastiera nel dialogo della nota ora \xe8 un pulsante della tastiera stessa: su iOS una barra Fatto le sta agganciata, disegnata dal sistema sopra i tasti, invece di un pulsante che toglie spazio alla scheda.']}},{version:'1.0.475',date:'2026-09-08',notes:{en:['The note dialog was a trap with the keyboard up: its buttons sat behind it, a multiline field has no return key, and tapping outside threw the note away. The card now lifts above the keyboard, a tap outside closes the keyboard first, and there is a Close keyboard button while it is open.'],it:['Il dialogo della nota era una trappola con la tastiera aperta: i pulsanti restavano dietro, un campo multiriga non ha tasto invio, e toccare fuori buttava via la nota. Ora la scheda si solleva sopra la tastiera, un tocco fuori chiude prima la tastiera, e c\u2019\xe8 un pulsante Chiudi tastiera finch\xe9 \xe8 aperta.']}},{version:'1.0.474',date:'2026-09-08',notes:{en:['On a Mac the player still opened the embed page in a browser: the WebView declines that load without reporting an error, so the previous fallback had nothing to react to. The player now watches for silence \u2014 if the bundled page has not spoken within six seconds, it loads the same page from the hub.'],it:['Su Mac il player apriva ancora la pagina dell\u2019embed nel browser: la WebView rifiuta quel caricamento senza segnalare alcun errore, quindi il fallback precedente non aveva nulla a cui reagire. Ora il player sorveglia il silenzio \u2014 se la pagina inclusa non ha parlato entro sei secondi, carica la stessa pagina dall\u2019hub.']}},{version:'1.0.473',date:'2026-09-08',notes:{en:['A sample whose picture is gone now says so, instead of drawing an empty square. Most of the gallery is in that state today \u2014 the crops were lost before the panel existed \u2014 and the scores beside them are unaffected: they come from the stored vector, which is intact.'],it:['Un campione la cui immagine non c\u2019\xe8 pi\xf9 ora lo dice, invece di disegnare un quadrato vuoto. Oggi gran parte della galleria \xe8 in quello stato \u2014 i ritagli erano gi\xe0 andati persi prima che il pannello esistesse \u2014 e i punteggi accanto non ne risentono: vengono dal vettore memorizzato, che \xe8 intatto.']}},{version:'1.0.472',date:'2026-09-08',notes:{en:['Library \u2192 Review can re-analyse one person\u2019s enrolled samples. Worst first, each with its crop and the reason \u2014 \u201clooks like Matthias (61%) more than like this person (12%)\u201d \u2014 and a sample is flagged only when it could actually be auto-assigned to the other person. Remove is one tap, and nothing is removed for you.'],it:['Libreria \u2192 Revisione pu\xf2 rianalizzare i campioni di una persona. Peggiori in cima, ognuno col suo ritaglio e il motivo \u2014 \u201csomiglia a Matthias (61%) pi\xf9 che a questa persona (12%)\u201d \u2014 e un campione \xe8 segnalato solo se potrebbe davvero essere auto-assegnato all\u2019altra persona. Rimuovere \xe8 un tocco, e nessuno rimuove niente al posto tuo.']}},{version:'1.0.471',date:'2026-09-08',notes:{en:['Opening the Cameras page now refreshes every camera\u2019s thumbnail, two at a time, once \u2014 so the tiles below the fold are minutes old instead of hours. It stops when it has been round the list.','What\u2019s new is a panel now, not a one-line dialog: the build that just arrived is at the top, and every earlier update is listed under it by version and date, tap to open. Settings \u2192 Info opens the same panel.'],it:['Aprendo la pagina Telecamere ora si aggiorna la miniatura di ogni camera, due alla volta, una sola volta \u2014 cos\xec i riquadri sotto la piega sono vecchi di minuti e non di ore. Finito il giro, si ferma.','Le novit\xe0 sono un pannello, non pi\xf9 un avviso a una riga: in alto la build appena arrivata, sotto l\u2019elenco di tutti gli aggiornamenti precedenti per versione e data, che si aprono al tocco. Impostazioni \u2192 Info apre lo stesso pannello.']}},{version:'1.0.470',date:'2026-09-08',notes:{en:['The debug checkboxes changed with use: an edge crop that came back mirrored, and a box that does not match the path the track drew \u2014 which usually means two subjects ended up sharing one id. "Wrong class" and "audio-only" left; neither was what anyone was actually reporting.'],it:['Le caselle di debug sono cambiate con l\u2019uso: un ritaglio sul bordo tornato specchiato, e un box che non coincide col percorso disegnato dalla traccia \u2014 che di solito significa due soggetti finiti sullo stesso id. Sono uscite "classe sbagliata" e "solo audio": non era quello che si segnalava davvero.']}},{version:'1.0.469',date:'2026-09-08',notes:{en:['Marking an event for debug now offers the questions that keep coming back as checkboxes, so a mark carries a question without typing one. Ticking one writes its phrase into the note; the field below still takes anything the boxes cannot say.'],it:['Marcando un evento per il debug ora trovi come caselle le domande che ricorrono, cos\xec una marcatura porta con s\xe9 una domanda senza doverla scrivere. Spuntarne una scrive la sua frase nella nota; il campo sotto accetta ancora tutto ci\xf2 che le caselle non dicono.']}},{version:'1.0.468',date:'2026-09-08',notes:{en:['The privacy-mask switch now says what is actually missing: no privacy zone is drawn on the camera. It used to give the same general "nothing is set up yet" sentence as every other control, which left no next step \u2014 and the next step is on the camera, not in this app.'],it:["L'interruttore della maschera privacy ora dice cosa manca davvero: sulla telecamera non \xe8 disegnata nessuna zona di privacy. Prima dava la stessa frase generica di ogni altro controllo, che non indicava alcun passo successivo \u2014 e il passo successivo \xe8 sulla telecamera, non in questa app."]}},{version:'1.0.467',date:'2026-09-08',notes:{en:['Unticking every event kind used to leave invisible leftovers behind, so the list stayed empty and the counters disagreed with the boxes. The leftovers are cleared, and no ticks now means no constraint.','Ticking only Faces or Plates therefore works on its own, across every kind, while narrowing them with a kind still works as before.','A collapsed group now shows a partial mark when something inside it is ticked, so nothing can be on where you cannot see it.'],it:["Togliendo la spunta a tutti i tipi di evento restavano dietro dei residui invisibili, cos\xec la lista restava vuota e i contatori non coincidevano con le caselle. I residui vengono ripuliti, e nessuna spunta adesso vuol dire nessun vincolo.","Spuntare solo Volti o Targhe funziona quindi da solo, su tutti i tipi, mentre restringerli a un tipo continua a funzionare come prima.","Un gruppo chiuso mostra adesso un segno parziale quando qualcosa al suo interno \xe8 spuntato, cos\xec niente pu\xf2 essere attivo dove non lo vedi."]}},{version:'1.0.466',date:'2026-09-08',notes:{en:['A filter that matched nothing on the first page used to stop the list from loading any further, so a narrow choice looked empty even when matches existed further back. The list now keeps reading until it finds them.','Plates were the clearest case: they sat four pages deep and were never reached. Faces happened to match early, which is why the same defect looked intermittent.','An empty list now says which kind of empty it is, and offers to load older events instead of ending the road.'],it:["Un filtro che non trovava nulla nella prima pagina impediva alla lista di caricare oltre, cos\xec una scelta stretta sembrava vuota anche quando i risultati c'erano pi\xf9 indietro. Adesso la lista continua a leggere finch\xe9 li trova.","Le targhe erano il caso pi\xf9 evidente: stavano quattro pagine pi\xf9 in l\xe0 e non venivano mai raggiunte. I volti capitavano presto, ed \xe8 per questo che lo stesso difetto sembrava intermittente.","Una lista vuota adesso dice di che vuoto si tratta, e propone di caricare gli eventi pi\xf9 vecchi invece di finire l\xec."]}},{version:'1.0.465',date:'2026-09-08',notes:{en:['The event kinds you already had \u2014 Audio, Sensor, Control \u2014 now actually filter. Ticking one shows those events, unticking hides them; there is no second filter to find, because the tree you were already using is the one that works.','Audio events start unticked, so the list opens on what you look at. A Default button puts the preset back without re-ticking everything by hand.','The chip counts what you kept in the terms you picked it in, so a default that hides one thing reads as one thing hidden.'],it:["I tipi di evento che avevi gi\xe0 \u2014 Audio, Sensore, Controllo \u2014 adesso filtrano davvero. Spuntandone uno vedi quegli eventi, togliendo la spunta li nascondi, e non c'\xe8 un secondo filtro da cercare: quello che usavi \xe8 quello che funziona.","Gli eventi audio partono senza spunta, cos\xec la lista si apre su quello che guardi. Un pulsante Predefinito rimette il preset senza dover rispuntare tutto a mano.","Il contatore conta quello che hai tenuto nei termini in cui l'hai scelto, cos\xec un default che nasconde una cosa si legge come una cosa nascosta."]}},{version:'1.0.464',date:'2026-09-07',notes:{en:['The events page can now filter by where an event came from, and audio-only events start hidden. The filter sits in More with the others, and the chip counts it, so a shorter list always says why it is shorter.','Picking a class used to drag every sensor and audio event along with it, and picking a sensor selected nothing at all. Provenance is now its own axis, so both do what they say.','The Recent strip on the Cameras screen has its own filter, in the same fan menu, showing detections by default and remembering what you choose.'],it:["La pagina eventi ora filtra anche per provenienza, e gli eventi di solo audio partono nascosti. Il filtro sta in Altro insieme agli altri e il contatore lo conta, cos\xec una lista pi\xf9 corta dice sempre perch\xe9 lo \xe8.","Scegliere una classe si portava dietro ogni evento di sensore e di audio, e scegliere un sensore non selezionava nulla. La provenienza adesso \xe8 un asse suo, quindi entrambi fanno quello che dicono.","La striscia Recenti nella schermata Camere ha un filtro suo, nello stesso menu a ventaglio, che di default mostra le rilevazioni e ricorda quello che scegli."]}},{version:'1.0.463',date:'2026-09-07',notes:{en:['One record button, the same pair of buttons everywhere: press it, then Keep \u2014 with the duration on it \u2014 or Discard. On the live picture it records forward from now; on the recording it anchors a period you draw with the scrub, in either direction.','Pressing it during playback no longer reports that the live view cannot be recorded, and the period you draw stops at the live edge instead of losing itself there.','While you are drawing a period the timeline no longer buzzes at every step: the notch feedback belongs to looking for an event, not to choosing a moment.'],it:["Un solo pulsante di registrazione, e la stessa coppia di pulsanti ovunque: premi, poi Salva \u2014 con la durata sopra \u2014 oppure Scarta. Sull'immagine live registra da adesso in avanti; sul registrato fissa un periodo che disegni con lo scorrimento, in entrambe le direzioni.","Premendolo durante la riproduzione non dice pi\xf9 che non pu\xf2 registrare la vista live, e il periodo che stai disegnando si ferma al bordo live invece di perdersi.","Mentre disegni un periodo la timeline non vibra pi\xf9 a ogni passo: lo scatto delle tacche serve a cercare un evento, non a scegliere un momento."]}},{version:'1.0.462',date:'2026-09-07',notes:{en:['Save a stretch of the recording from the timeline: press the record button during playback to anchor the period, scrub to the other end, then Save or Discard. The selected period is highlighted on the strip.','While you are choosing, the recording does not play \u2014 you see the frame you scrubbed to. Nothing is created on the hub until you press Save, and a period that crosses a stretch with no recording says so before it is exported.'],it:["Salva un tratto di registrato dalla timeline: durante la riproduzione premi il pulsante di registrazione per fissare il periodo, scorri fino all'altro estremo, poi Salva o Scarta. Il periodo selezionato \xe8 evidenziato sulla striscia.","Mentre scegli la registrazione non parte: vedi il fotogramma su cui ti sei fermato. Sull'hub non viene creato nulla finch\xe9 non premi Salva, e un periodo che attraversa un tratto senza registrazione lo dice prima di esportare."]}},{version:'1.0.461',date:'2026-09-07',notes:{en:['A host with nowhere to show a tile\'s linked-devices and view-options panels can now say so, and the embed stops drawing two buttons that would do nothing.'],it:["Un ospite che non ha dove mostrare i pannelli dispositivi collegati e opzioni di vista pu\xf2 dirlo, e l'embed smette di disegnare due pulsanti che non farebbero nulla."]}},{version:'1.0.460',date:'2026-09-06',notes:{en:['Battery and signal icons are now buttons: tapping one opens the figures \u2014 charge, power source, sleeping, link type, signal and Wi-Fi network \u2014 on the stream and in the cameras list.','What the camera does not report is said in words, never as a fabricated 0%.'],it:["Le icone di batteria e segnale sono diventate pulsanti: toccandone una si aprono i numeri \u2014 carica, alimentazione, sospensione, tipo di collegamento, segnale e rete Wi-Fi \u2014 sullo stream e nella lista camere.","Ci\xf2 che la camera non riporta viene detto a parole, mai come uno 0% inventato."]}},{version:'1.0.459',date:'2026-09-06',notes:{en:['Home Assistant cards: the embed no longer needs a viewing token in the page \u2014 Home Assistant carries it, and the events card URL stops carrying a credential.'],it:["Card di Home Assistant: l'embed non ha pi\xf9 bisogno del token nella pagina, lo porta Home Assistant, e l'URL della card eventi smette di trasportare una credenziale."]}},{version:'1.0.458',date:'2026-09-06',notes:{en:['Robot camera in landscape: with the timeline open the drive buttons move onto the visible picture and shrink to fit; the "\u2026" is gone there, the timeline has its own.'],it:['Camera del robot in landscape: con la timeline aperta i pulsanti di guida passano sul video visibile e si rimpiccioliscono; l\xec sparisce il "\u2026", la timeline ha gi\xe0 il suo.']}},{version:'1.0.457',date:'2026-09-06',notes:{en:['A restart for an update waits for the snapshot downloads in flight \u2014 the crash right after an update on build 16.'],it:['Il riavvio per un aggiornamento aspetta i download degli snapshot in corso: il crash subito dopo un aggiornamento sulla build 16.']}},{version:'1.0.456',date:'2026-09-06',notes:{en:['An OTA update asks before restarting the app.','A newer TestFlight / store build is announced, with a button to open it.',"What's new: these notes, once per version and in Settings \u2192 Info."],it:["Un aggiornamento OTA chiede conferma prima di riavviare l'app.",'Una build TestFlight / Store pi\xf9 recente viene segnalata, con il pulsante per aprirla.','Novit\xe0: queste note, una volta per versione e in Impostazioni \u2192 Info.']}},{version:'1.0.455',date:'2026-09-06',notes:{en:['Robot camera: a drive joystick in landscape, with Stop, light, Follow me and Return to dock.','The controls button opens for robot cameras too.','Battery and signal are glyphs in the toolbar; the day arrows fold on a narrow row.','A sleeping camera shows the moon in its name chip.'],it:['Camera del robot: joystick di guida in landscape, con Stop, luce, Seguimi e Torna alla base.','Il pulsante dei controlli si apre anche per le camere del robot.','Batteria e segnale sono glifi nella toolbar; le frecce del giorno si ripiegano su riga stretta.','Una camera dormiente mostra la luna nel chip del nome.']}}];function t(t){return t?e.find(e=>e.version===t)??null:null}},2066,[]);
3442
3442
  __d(function(g,r,i,a,m,_e,d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(_e,'__esModule',{value:!0}),_e.WhatsNewModal=function(e){const o=(0,t.c)(50),{visible:h,latest:b,past:x,onClose:S}=e,{t:I,i18n:A}=(0,p.useTranslation)(),{colors:G}=(0,y.useTheme)(),w=A.language;let M,T,R,D,z,k,H,W,_,L,V,B,E,U,F,q;o[0]!==I?(M=I("v2.common.close"),o[0]=I,o[1]=M):M=o[1];o[2]!==S||o[3]!==M?(T=(0,C.jsx)(n.default,{style:u.default.absoluteFill,accessibilityRole:"button",accessibilityLabel:M,onPress:S}),o[2]=S,o[3]=M,o[4]=T):T=o[4];o[5]!==G.backgroundElevated||o[6]!==G.border?(R=[P.card,{backgroundColor:G.backgroundElevated,borderColor:G.border}],o[5]=G.backgroundElevated,o[6]=G.border,o[7]=R):R=o[7];o[8]!==G.foreground?(D=[P.title,{color:G.foreground}],o[8]=G.foreground,o[9]=D):D=o[9];o[10]!==I?(z=I("v2.updates.whatsNewHeading"),o[10]=I,o[11]=z):z=o[11];o[12]!==D||o[13]!==z?(k=(0,C.jsx)(c.default,{style:D,children:z}),o[12]=D,o[13]=z,o[14]=k):k=o[14];o[15]!==G.foregroundMuted||o[16]!==G.primary||o[17]!==w||o[18]!==b?(H=null!==b?(0,C.jsxs)(f.default,{style:[P.latest,{borderColor:G.primary}],children:[(0,C.jsxs)(f.default,{style:P.latestHeader,children:[(0,C.jsx)(c.default,{style:[P.latestVersion,{color:G.primary}],children:b.version}),(0,C.jsx)(c.default,{style:[P.pastDate,{color:G.foregroundMuted}],children:j(b.date,w)})]}),(0,C.jsx)(N,{entry:b,language:w})]}):null,o[15]=G.foregroundMuted,o[16]=G.primary,o[17]=w,o[18]=b,o[19]=H):H=o[19];o[20]!==G.foregroundMuted||o[21]!==w||o[22]!==x||o[23]!==I?(W=x.length>0?(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(c.default,{style:[P.pastTitle,{color:G.foregroundMuted}],children:I("v2.updates.whatsNewPrevious")}),x.map(e=>(0,C.jsx)(v,{entry:e,language:w},e.version))]}):null,o[20]=G.foregroundMuted,o[21]=w,o[22]=x,o[23]=I,o[24]=W):W=o[24];o[25]!==H||o[26]!==W?(_=(0,C.jsxs)(s.default,{style:P.scroll,contentContainerStyle:P.scrollContent,children:[H,W]}),o[25]=H,o[26]=W,o[27]=_):_=o[27];o[28]!==G.primary?(L=[P.close,{backgroundColor:G.primary}],o[28]=G.primary,o[29]=L):L=o[29];o[30]!==I?(V=I("v2.common.ok"),o[30]=I,o[31]=V):V=o[31];o[32]!==V?(B=(0,C.jsx)(c.default,{style:P.closeLabel,children:V}),o[32]=V,o[33]=B):B=o[33];o[34]!==S||o[35]!==L||o[36]!==B?(E=(0,C.jsx)(n.default,{accessibilityRole:"button",onPress:S,style:L,children:B}),o[34]=S,o[35]=L,o[36]=B,o[37]=E):E=o[37];o[38]!==E||o[39]!==R||o[40]!==k||o[41]!==_?(U=(0,C.jsxs)(f.default,{style:R,children:[k,_,E]}),o[38]=E,o[39]=R,o[40]=k,o[41]=_,o[42]=U):U=o[42];o[43]!==U||o[44]!==T?(F=(0,C.jsxs)(f.default,{style:P.backdrop,children:[T,U]}),o[43]=U,o[44]=T,o[45]=F):F=o[45];o[46]!==S||o[47]!==F||o[48]!==h?(q=(0,C.jsx)(l.default,{visible:h,transparent:!0,animationType:"fade",onRequestClose:S,children:F}),o[46]=S,o[47]=F,o[48]=h,o[49]=q):q=o[49];return q};var t=r(d[0]),o=r(d[1]),l=e(r(d[2])),n=e(r(d[3])),s=e(r(d[4])),u=e(r(d[5])),c=e(r(d[6])),f=e(r(d[7])),p=r(d[8]),h=r(d[9]),b=r(d[10]),y=r(d[11]),x=r(d[12]),S=r(d[13]),C=r(d[14]);function j(e,t){const o=new Date(e);return Number.isNaN(o.getTime())?e:o.toLocaleDateString(t,{day:'numeric',month:'short',year:'numeric'})}function N(e){const o=(0,t.c)(8),{entry:l,language:n}=e,{colors:s}=(0,y.useTheme)();let u,p;if(o[0]!==s||o[1]!==l||o[2]!==n){let e;o[4]!==s?(e=e=>(0,C.jsxs)(f.default,{style:P.note,children:[(0,C.jsx)(c.default,{style:[P.bullet,{color:s.primary}],children:"\u2022"}),(0,C.jsx)(c.default,{style:[P.noteText,{color:s.foreground}],children:e})]},e),o[4]=s,o[5]=e):e=o[5],u=(0,S.whatsNewLines)(l,n).map(e),o[0]=s,o[1]=l,o[2]=n,o[3]=u}else u=o[3];return o[6]!==u?(p=(0,C.jsx)(f.default,{style:P.notes,children:u}),o[6]=u,o[7]=p):p=o[7],p}function v(e){const l=(0,t.c)(35),{entry:s,language:u}=e,{colors:p}=(0,y.useTheme)(),[x,S]=(0,o.useState)(!1),v=x?h.ChevronDown:h.ChevronRight;let A,G;l[0]!==p.border?(A=[P.pastRow,{borderColor:p.border}],l[0]=p.border,l[1]=A):A=l[1],l[2]!==x?(G={expanded:x},l[2]=x,l[3]=G):G=l[3];const w=s.version;let M,T,R,D,z,k,H,W,_,L;return l[4]===Symbol.for("react.memo_cache_sentinel")?(M=()=>{(0,b.hapticTap)(),S(I)},l[4]=M):M=l[4],l[5]!==v||l[6]!==p.foregroundMuted?(T=(0,C.jsx)(v,{size:14,color:p.foregroundMuted}),l[5]=v,l[6]=p.foregroundMuted,l[7]=T):T=l[7],l[8]!==p.foreground?(R=[P.pastVersion,{color:p.foreground}],l[8]=p.foreground,l[9]=R):R=l[9],l[10]!==s.version||l[11]!==R?(D=(0,C.jsx)(c.default,{style:R,children:s.version}),l[10]=s.version,l[11]=R,l[12]=D):D=l[12],l[13]!==p.foregroundMuted?(z=[P.pastDate,{color:p.foregroundMuted}],l[13]=p.foregroundMuted,l[14]=z):z=l[14],l[15]!==s.date||l[16]!==u?(k=j(s.date,u),l[15]=s.date,l[16]=u,l[17]=k):k=l[17],l[18]!==z||l[19]!==k?(H=(0,C.jsx)(c.default,{style:z,children:k}),l[18]=z,l[19]=k,l[20]=H):H=l[20],l[21]!==s.version||l[22]!==H||l[23]!==G||l[24]!==T||l[25]!==D?(W=(0,C.jsxs)(n.default,{accessibilityRole:"button",accessibilityState:G,accessibilityLabel:w,onPress:M,style:P.pastHeader,children:[T,D,H]}),l[21]=s.version,l[22]=H,l[23]=G,l[24]=T,l[25]=D,l[26]=W):W=l[26],l[27]!==s||l[28]!==u||l[29]!==x?(_=x?(0,C.jsx)(N,{entry:s,language:u}):null,l[27]=s,l[28]=u,l[29]=x,l[30]=_):_=l[30],l[31]!==A||l[32]!==W||l[33]!==_?(L=(0,C.jsxs)(f.default,{style:A,children:[W,_]}),l[31]=A,l[32]=W,l[33]=_,l[34]=L):L=l[34],L}function I(e){return!e}const P=u.default.create({backdrop:{flex:1,alignItems:'center',justifyContent:'center',padding:x.SPACING.lg,backgroundColor:'rgba(0,0,0,0.5)'},card:{width:'100%',maxWidth:460,maxHeight:'80%',borderWidth:1,borderRadius:x.RADIUS.lg,padding:x.SPACING.lg},title:{fontSize:16,fontWeight:'600',marginBottom:x.SPACING.md},scroll:{flexGrow:0},scrollContent:{paddingBottom:x.SPACING.sm},latest:{borderWidth:1,borderRadius:x.RADIUS.md,padding:x.SPACING.md,marginBottom:x.SPACING.lg},latestHeader:{flexDirection:'row',alignItems:'baseline',gap:x.SPACING.sm},latestVersion:{fontSize:15,fontWeight:'700'},notes:{marginTop:x.SPACING.sm,gap:x.SPACING.xs},note:{flexDirection:'row',gap:x.SPACING.xs},bullet:{fontSize:13,lineHeight:19},noteText:{flex:1,fontSize:13,lineHeight:19},pastTitle:{fontSize:11,textTransform:'uppercase',letterSpacing:.6,marginBottom:x.SPACING.xs},pastRow:{borderTopWidth:1,paddingVertical:x.SPACING.sm},pastHeader:{flexDirection:'row',alignItems:'center',gap:x.SPACING.sm},pastVersion:{fontSize:13,fontWeight:'600'},pastDate:{fontSize:11},close:{marginTop:x.SPACING.md,alignSelf:'flex-end',paddingHorizontal:x.SPACING.lg,paddingVertical:x.SPACING.sm,borderRadius:x.RADIUS.md},closeLabel:{color:'#fff',fontSize:13,fontWeight:'600'}})},2067,[15,17,245,252,143,33,198,20,995,794,1022,782,790,2066,10]);
3443
3443
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.useNativeRelease=function(){const c=(0,t.c)(8),{server:o}=(0,s.useServer)(),v=o?.serverUrl??null;let f;c[0]!==v?(f=["v2","native-release",v],c[0]=v,c[1]=f):f=c[1];const y=!1;let _,h;c[2]!==v?(_=async()=>{if(null===v)return null;const t=await fetch((0,l.nativeReleasePath)(v),{cache:"no-store"});if(!t.ok)return null;const n=await t.json();return(0,l.isNativeRelease)(n)?n:null},c[2]=v,c[3]=_):_=c[3];c[4]!==f||c[5]!==y||c[6]!==_?(h={queryKey:f,enabled:y,staleTime:u,queryFn:_},c[4]=f,c[5]=y,c[6]=_,c[7]=h):h=c[7];return(0,n.useQuery)(h)};var t=r(d[0]),n=r(d[1]);r(d[2]);var s=r(d[3]),l=r(d[4]);const u=36e5},2068,[15,1513,131,1575,2061]);
3444
3444
  __d(function(g,r,i,a,m,_e,_d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"RELOAD_DRAIN_TIMEOUT_MS",{enumerable:!0,get:function(){return u}}),_e.reloadRuntimeForUpdate=async function(c){o.runtimeQuiesce.requestQuiesce();const s=o.runtimeQuiesce.inflight(),d=await o.runtimeQuiesce.waitForIdle(u);n.log.info('crash','restarting the runtime to apply an OTA update',{reason:c,inflight:s,drained:d}),await(0,t.getExitMarkerRecorder)().record('ota-reload'),await e.reloadAsync()};var e=(function(e){if(e&&e.__esModule)return e;var t={};return e&&Object.keys(e).forEach(function(n){var o=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,o.get?o:{enumerable:!0,get:function(){return e[n]}})}),t.default=e,t})(r(_d[0])),t=r(_d[1]),n=r(_d[2]),o=r(_d[3]);const u=4e3},2069,[2051,2065,1115,1597]);
@@ -3463,7 +3463,7 @@ __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{v
3463
3463
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.LastCameraWatcher=function(){const o=(0,t.c)(5),u=(0,s.usePathname)(),c=(0,l.useLastCameraStore)(C),f=(0,l.useLastCameraStore)(p);let h,L;o[0]!==f||o[1]!==c||o[2]!==u?(h=()=>{f&&c(u)},L=[u,c,f],o[0]=f,o[1]=c,o[2]=u,o[3]=h,o[4]=L):(h=o[3],L=o[4]);return(0,n.useEffect)(h,L),null},e.ReopenLastCameraBridge=function(){const p=(0,t.c)(13),C=(0,s.useRouter)(),y=(0,s.usePathname)(),{settings:v,hydrated:S}=(0,c.useSettings)(),_=(0,l.useLastCameraStore)(L),R=(0,l.useLastCameraStore)(h);let b;p[0]===Symbol.for("react.memo_cache_sentinel")?(b={includeHidden:!0},p[0]=b):b=p[0];const{data:I}=(0,u.useCameras)(b),H=(0,n.useRef)(!1);let P;p[1]!==I||p[2]!==R||p[3]!==y||p[4]!==v.stream.reopenLastCamera||p[5]!==S||p[6]!==_?(P=(0,f.resolveReopenLastCamera)({enabled:v.stream.reopenLastCamera,settingsHydrated:S,memoryHydrated:R,startupDeviceId:_,cameras:I,pathname:y}),p[1]=I,p[2]=R,p[3]=y,p[4]=v.stream.reopenLastCamera,p[5]=S,p[6]=_,p[7]=P):P=p[7];const k=P;let D,E;p[8]!==k||p[9]!==C||p[10]!==_?(D=()=>{H.current||"wait"===k.action||(H.current=!0,o.log.info("boot","last-camera launch decision",{action:k.action,reason:"skip"===k.action?k.reason:"ok",deviceId:_??-1}),"reopen"===k.action&&C.push((0,f.cameraRoute)(k.deviceId)))},E=[k,C,_],p[8]=k,p[9]=C,p[10]=_,p[11]=D,p[12]=E):(D=p[11],E=p[12]);return(0,n.useEffect)(D,E),null};var t=r(d[0]),n=r(d[1]),s=r(d[2]),o=r(d[3]),u=r(d[4]),c=r(d[5]),l=r(d[6]),f=r(d[7]);function p(t){return t.hydrated}function C(t){return t.note}function h(t){return t.hydrated}function L(t){return t.startupDeviceId}},2088,[15,17,743,1115,1512,1603,1124,1123]);
3464
3464
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return o}});var t=r(d[0]),n=r(d[1]),c=r(d[2]);function o(){const o=(0,t.c)(1);let u;return o[0]===Symbol.for("react.memo_cache_sentinel")?(u=(0,c.jsx)(n.ArtifactsScreen,{}),o[0]=u):u=o[0],u}},2089,[15,1936,10]);
3465
3465
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return u}});var n=r(d[0]),t=r(d[1]),o=r(d[2]),c=r(d[3]);function u(){const u=(0,n.c)(6),{id:l,at:s}=(0,t.useLocalSearchParams)(),b=Number(l),f=void 0!==s?Number(s):Number.NaN;if(!Number.isFinite(b))return null;let S,_,N;return u[0]===Symbol.for("react.memo_cache_sentinel")?(S=(0,c.jsx)(t.Stack.Screen,{options:{gestureEnabled:!1,fullScreenGestureEnabled:!1,presentation:"containedTransparentModal",animation:"slide_from_right",contentStyle:{backgroundColor:"transparent"}}}),u[0]=S):S=u[0],u[1]!==f?(_=Number.isFinite(f)&&f>0?f:void 0,u[1]=f,u[2]=_):_=u[2],u[3]!==b||u[4]!==_?(N=(0,c.jsxs)(c.Fragment,{children:[S,(0,c.jsx)(o.CameraDetailScreen,{deviceId:b,initialSeekMs:_},b)]}),u[3]=b,u[4]=_,u[5]=N):N=u[5],N}},2090,[15,743,2091,10]);
3466
- __d(function(g,r,i,a,_m,_e,_d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}function t(e){if(e&&e.__esModule)return e;var t={};return e&&Object.keys(e).forEach(function(o){var n=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(t,o,n.get?n:{enumerable:!0,get:function(){return e[o]}})}),t.default=e,t}Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"WALL_STAGE_TEST_ID",{enumerable:!0,get:function(){return et}}),_e.CameraDetailScreen=function({deviceId:e,initialSeekMs:t}){const{t:o}=(0,f.useTranslation)(),h=(0,m.useConfirm)(),He=(0,m.useNotice)(),Te=(0,v.useRouter)(),{colors:rt,mode:ut}=(0,R.useTheme)(),dt=(0,p.useSafeAreaInsets)(),{width:ht,height:mt}=(0,d.default)(),{name:gt,features:ft,online:vt,disabled:pt,known:St}=Xe(e),{settings:bt,hydrated:wt}=(0,We.useSettings)(),yt=(0,Ue.useCanActuate)(),_t=yt&&ft.includes(Oe.FEATURE.ptz),kt=ft.includes(Oe.FEATURE.battery),{data:Ct=[]}=(0,J.useDeviceCapNames)(e,!0),xt=Ct.includes('network-link'),Ht=yt&&Ct.includes('navigation'),{data:Tt=null}=(0,Pe.useBattery)(e,kt),Ot=kt&&!0===Tt?.sleeping,Et=ft.includes(Oe.FEATURE.twoWayAudio),Pt=ft.includes(Oe.FEATURE.doorbell),Wt=(0,Ge.useCameraPrefsStore)(t=>t.prefs.byId[e]?.quality),Lt=(0,Ge.useCameraPrefsStore)(e=>e.setCameraQuality),[Dt,It]=(0,n.useState)(Wt??'auto'),jt=(0,n.useRef)(!1);(0,n.useEffect)(()=>{Wt&&!jt.current&&(jt.current=!0,It(Wt))},[Wt]);const At=(0,n.useMemo)(()=>(0,Ve.qualityToTarget)(Dt),[Dt]),Mt=(0,n.useCallback)(t=>{It(t),Lt(e,t)},[e,Lt]);(0,Me.useEventHaptics)([e],!0);const{overlay:Rt,setOverlay:Bt,highlight:zt,setHighlight:Gt}=(0,Ne.useCameraViewOptions)(e),Ft=(0,Ae.useDetections)(e,zt.detection&&!0),Jt=zt.detection&&Ft.boxes.some(e=>0===zt.detectionClasses.length||zt.detectionClasses.includes(e.label)),Nt=(0,ze.useHeld)(Jt,1e3*zt.detectionHoldSec),Ut=(0,Re.useAudioActive)(e,zt.audio,zt.audioDb),Vt=(0,ze.useHeld)('off'!==zt.audio&&Ut,1e3*Be.AUDIO_HIGHLIGHT_HOLD_SEC),[Yt,qt]=(0,n.useState)(0),Zt=`${zt.audio}:${zt.audioDb}`,$t=(0,n.useRef)(!0);(0,n.useEffect)(()=>{if($t.current)return void($t.current=!1);if('off'===zt.audio)return void qt(0);const e=Date.now()+1e3*Be.AUDIO_HIGHLIGHT_HOLD_SEC;qt(e);const t=setTimeout(()=>qt(0),1e3*Be.AUDIO_HIGHLIGHT_HOLD_SEC);return()=>clearTimeout(t)},[Zt,zt.audio]);const Kt=Yt>Date.now(),Qt=(0,n.useMemo)(()=>Object.assign({enabled:Rt.highlightBorder},zt,{audioHoldSec:Be.AUDIO_HIGHLIGHT_HOLD_SEC,appearance:bt.highlight,motionHoldSec:bt.grid.motionHoldSec}),[Rt.highlightBorder,zt,bt.highlight,bt.grid.motionHoldSec]),[Xt,ea]=(0,n.useState)(null),ta={operatorChoice:Xt,cameraKnown:St,batteryPowered:kt},aa=(0,$.resolveLivePaused)(ta),oa=(0,n.useRef)(aa);oa.current=aa;const[ia,na]=(0,n.useState)({state:'connecting'}),la=()=>{ea(e=>!(0,$.resolveLivePaused)({operatorChoice:e,cameraKnown:St,batteryPowered:kt}))},[ra,sa]=(0,n.useState)(1),[ca,ua]=(0,n.useState)(!1),da=(0,n.useRef)(null),[ha,ma]=(0,n.useState)(!1),[ga,fa]=(0,n.useState)(null),[va,pa]=(0,n.useState)(0),Sa=(0,n.useRef)(!1);(0,n.useEffect)(()=>{if(!ha||null===ga)return void pa(0);const e=()=>pa(Math.floor((Date.now()-ga)/1e3));e();const t=setInterval(e,250);return()=>clearInterval(t)},[ha,ga]);const[ba,wa]=(0,n.useState)(0),ya=(0,n.useRef)(t??null),[_a,ka]=(0,n.useState)(t),Ca=(0,n.useMemo)(()=>({scrubStart:e=>{da.current?.scrubStart(e)},scrubTo:(e,t)=>da.current?.scrubTo(e,t?.mode,t?.velocityPxPerS),scrubCommit:(e,t)=>da.current?.scrubCommit(e,t),seek:e=>da.current?.seek(e),goLive:()=>{if(!(0,$.shouldDialLiveOnGoLive)(oa.current))return ya.current=null,ka(void 0),ua(!1),void sa(1);da.current?.goLive(),wa(e=>e+1),ua(!1),sa(1),ya.current=null,ka(void 0)}}),[]),xa=(0,H.usePlaybackMachine)(Ca);(0,n.useEffect)(()=>{const e=[3e3,1e4].map(e=>setTimeout(()=>da.current?.timelineWarm(Date.now()-3e4),e));return()=>{for(const t of e)clearTimeout(t)}},[]);const Ha='live'!==xa.state.mode,Ta=(0,n.useRef)(!1),Oa=(0,$.shouldMountLiveView)({liveHeld:aa,mode:xa.state.mode,playhead:xa.state.playhead,recordedSeekMs:_a??null,keepRecordedSession:Ta.current});Ta.current=Oa;const Ea=e=>{aa&&null==da.current&&(ya.current=e,ka(e))},Pa=(0,n.useCallback)((e,t)=>{Ea(e),xa.seek(e,t)},[aa,xa]),Wa=(0,n.useCallback)((e,t)=>{Ea(e),xa.commitScrub(e,t)},[aa,xa]),La=async()=>{if(!Sa.current)return null;Sa.current=!1,ma(!1),fa(null);try{return await(da.current?.stopLiveCapture())??null}catch{return He({title:o('v2.theater.recordLive'),message:o('v2.theater.recordFailed')}),null}},Da=async t=>{const o=(0,z.captureFileExtension)(t.mime),n=`${_.cacheDirectory}live-${e}-${Date.now()}.${o}`;await _.writeAsStringAsync(n,t.base64,{encoding:_.EncodingType.Base64}),await k.isAvailableAsync()&&await k.shareAsync(n,{mimeType:t.mime||('webm'===o?'video/webm':'video/mp4'),UTI:'webm'===o?'public.movie':'public.mpeg-4'})},Ia=e=>{(async()=>{await h({title:o('v2.theater.keepClipTitle'),confirmLabel:o('v2.theater.shareClip'),cancelLabel:o('v2.theater.discardClip')})&&await Da(e)})()},ja={capturing:ha,elapsedLabel:(0,G.formatSelectionDuration)(1e3*va),onStart:()=>{Sa.current=!0,ma(!0),fa(Date.now()),da.current?.startLiveCapture()},onKeep:()=>{(async()=>{const e=await La();e&&await Da(e)})()},onDiscard:()=>{La()}},Aa=(0,N.useExportSelection)(e,xa);(0,n.useEffect)(()=>{'live'!==xa.state.mode&&Sa.current&&(async()=>{const e=await La();e&&Ia(e)})()},[xa.state.mode]);const Ma=(0,n.useCallback)(()=>{const e=!ca;ua(e),da.current?.setRate(e?0:ra)},[ca,ra]),Ra=(0,n.useCallback)(e=>{sa(e),ca||da.current?.setRate(e)},[ca]),Ba=(0,n.useCallback)(e=>{ca||ua(!0),da.current?.stepFrame(e)},[ca]),za=(0,n.useCallback)(e=>{const t=ya.current;null!==t&&(ya.current=null,ka(void 0),'adopt'===e?xa.adoptSeek(t,'cluster'):xa.seek(t,'cluster'))},[xa]),[Ga,Fa]=(0,n.useState)(null),Ja=(0,n.useCallback)(e=>{xa.reportEmbedState(e),'paused'===e?ua(!0):'playing'===e&&ua(!1),'gap'!==e&&'error'!==e||(ya.current=null,ka(void 0)),za((0,O.resolveInitialSeekAction)(e))},[xa,za]),[Na,Ua]=(0,n.useState)(!0),Va=(0,n.useRef)(!1);(0,n.useEffect)(()=>{wt&&!Va.current&&(Va.current=!0,Ua(!bt.stream.audioOnOpen))},[wt,bt.stream.audioOnOpen]);const Ya=(0,Fe.hasLayer)(Rt,'motion'),qa=(0,Fe.hasLayer)(Rt,'objects'),Za=(0,Fe.hasLayer)(Rt,'discarded'),$a=(0,Fe.hasLayer)(Rt,'stationary'),Ka=Rt.stats,Qa=Rt.audioMeter,[Xa,eo]=(0,n.useState)(!1),[to,ao]=(0,n.useState)(!0),[oo,io]=(0,n.useState)(!1),no=(0,n.useRef)(null),lo=(0,n.useCallback)(()=>{io(!0),no.current?.openControls()},[]),[ro,so]=(0,n.useState)(null),[co,uo]=(0,n.useState)(!1),[ho,mo]=(0,n.useState)(e);ho!==e&&(mo(e),so(null),uo(!1));const go=(0,n.useCallback)(()=>uo(!0),[]),fo=(0,n.useCallback)(()=>so(null),[]),vo=(0,n.useCallback)(e=>{so(e),uo(!1)},[]),po=(0,n.useCallback)(()=>uo(!1),[]),So=(0,n.useRef)(null),bo=(0,n.useCallback)(()=>{(0,l.scrubFramePainted)(e)},[e]),wo=(0,n.useCallback)(t=>{za('adopt'),xa.reportPosition(t);const o=Date.now(),n=(0,T.evaluateDivergence)({indicatorEpoch:(0,H.selectActiveEpoch)(xa.state),playerEpoch:t,nowMs:o,lastReportAt:So.current});null!==n&&(So.current=o,E.log.warn('theater:divergence','indicator and stream disagree',{deviceId:e,deltaMs:n.deltaMs,indicatorAhead:n.indicatorAhead,indicatorEpoch:(0,H.selectActiveEpoch)(xa.state),playerEpoch:t,mode:xa.state.mode,seekAnchor:xa.state.seekAnchor,seekLanded:xa.state.seekLanded}))},[xa,e,za]),yo=(0,n.useCallback)(()=>Ua(e=>!e),[]),_o=(0,n.useCallback)(t=>{t!==e&&Te.replace(`/camera/${t}`)},[Te,e]),[ko,Co]=(0,n.useState)(null),xo=(0,be.useLastCameraStore)(e=>e.forget),Ho=(0,n.useCallback)((e,t)=>{Co({kind:e,deviceId:t})},[]),To=(0,n.useCallback)(()=>Co(null),[]),{data:Oo}=(0,Oe.useCameras)(),Eo=(0,n.useMemo)(()=>(0,we.resolveCellPanel)(ko,(Oo??[]).map(e=>e.id)),[ko,Oo]),Po=(Oo??[]).find(e=>e.id===Eo?.deviceId),Wo=Po?.name??'',Lo=yt&&(Po?.features??[]).includes(Oe.FEATURE.ptz),Do=(0,n.useCallback)(e=>Bt((0,Fe.patchOverlay)(Rt,{audioMeter:e})),[Bt,Rt]),Io=(0,n.useCallback)(()=>ao(e=>!e),[]),jo=(0,n.useCallback)(()=>ao(!1),[]),Ao=(0,n.useRef)(null),Mo=(0,n.useCallback)(()=>new Promise(e=>{Ao.current=e}),[]),Ro=(0,n.useCallback)(()=>{na({state:'connecting'}),xa.goLive()},[xa]),Bo=(0,n.useCallback)(()=>da.current?.startPip()??Promise.resolve('unavailable'),[]),zo=(0,n.useCallback)(()=>({mode:xa.state.mode,goLive:Ro,awaitLive:Mo,startPip:Bo}),[xa.state.mode,Ro,Mo,Bo]),Go=(0,n.useCallback)(()=>{(0,W.requestSystemPip)(zo())},[zo]);(0,n.useEffect)(()=>{const e=Ao.current;if(null!==e)return(0,P.goLiveFailedBeforePip)(ia.state)?(Ao.current=null,void e('failed')):void((0,P.pipReadyAfterGoLive)({pending:!0,mode:xa.state.mode,playerState:ia.state})&&(Ao.current=null,e('live')))},[xa.state.mode,ia.state]);const Fo=(0,n.useCallback)(()=>da.current?.getStats()??Promise.resolve(null),[]),{talking:Jo,error:No,toggle:Uo}=(0,U.useIntercom)(e);(0,n.useEffect)(()=>{No&&He({title:o('v2.cameraDetail.talk'),message:o('v2.cameraDetail.talkFailed')})},[No,o,He]);const Vo=(0,xe.useScreenMinSide)(),{showSidebar:Yo,compact:qo}=(0,xe.useSidebarLayout)(),Zo=(0,v.usePathname)(),$o={width:ht,height:mt,screenMinSide:Vo,isWeb:!0,fullscreen:Xa},Ko=(0,ke.resolveDetailLayoutMode)($o),Qo='wide'===Ko,Xo=(0,ve.useWorkspaceStore)(e=>e.setMembers),ei=(0,ve.useWorkspaceStore)(e=>e.workspace.members),ti=(0,n.useMemo)(()=>(0,he.workspaceOnScreenCameras)(ei,e),[ei,e]),ai=(0,he.shouldShowWorkspaceGrid)(Ko,ei,e);(0,n.useEffect)(()=>{ai&&Sa.current&&(Sa.current=!1,ma(!1),fa(null),E.log.warn('live:lifecycle','live capture dropped: the picture became a wall',{deviceId:e}))},[ai,e]);const oi=(0,fe.cameraSelectionModeFor)(Ko),ii=(0,n.useCallback)(e=>{const t=(0,fe.resolveCameraSelection)(oi,e);switch(t.kind){case'buildView':return void Xo(t.members);case'goTo':return void _o(t.deviceId);case'openGrid':return void Te.push(`/grid/adhoc?devices=${(0,ne.serializeAdhocDeviceIds)(t.deviceIds)}`);case'none':return}},[oi,_o,Te,Xo]),ni=ht>mt,li='fill'===Ko;!li&&oo&&io(!1);const ri=(0,ke.toolbarPlacementFor)(Ko),si=(0,L.shouldShowOverlayPlayPause)({fill:li,landscapeDrawerOpen:oo}),[ci,ui]=(0,n.useState)(null),di=(0,n.useCallback)(e=>{const t=e.nativeEvent.layout.width;(0,ye.isUsableMeasurement)(t)&&ui(e=>null!==e&&e.width===t&&e.windowWidth===ht?e:{width:t,windowWidth:ht})},[ht]),hi=(0,n.useMemo)(()=>({visible:Yo&&!li,compact:qo,insetLeft:dt.left}),[Yo,li,qo,dt.left]),mi=(0,ye.resolveContainerWidth)({measured:ci,windowWidth:ht,sideNav:hi}),gi=(0,pe.shouldShowStreamNavBar)({enabled:bt.stream.navBarOnStream,showSidebar:Yo,fill:li}),fi=(0,M.bottomNavFootprint)({visible:gi,insetBottom:dt.bottom}),vi=(0,pe.streamColumnHeight)({windowHeight:mt,navBarFootprint:fi}),pi=(0,n.useMemo)(()=>(0,re.computeWideDetailSizes)({containerWidth:mi,viewportHeight:vi}),[mi,vi]),Si=(0,Ce.buildDetailLayoutTrace)({deviceId:e,layout:$o,sideNav:hi,measured:ci,containerWidth:mi,railWidth:pi.railWidth,mode:Ko}),bi=(0,Ce.detailLayoutTraceSignature)(Si),wi=(0,n.useRef)(null);(0,n.useEffect)(()=>{wi.current!==bi&&(wi.current=bi,E.log.info(Ce.DETAIL_LAYOUT_SCOPE,'layout decision',Si))},[bi,Si]),(0,n.useEffect)(()=>{E.log.debug('theater','detail geometry',{deviceId:e,winWidth:ht,winHeight:mt,screenMinSide:Vo??-1,isLandscape:ni,layoutMode:Ko,toolbarPlacement:ri,fullscreen:Xa,containerWidth:mi,measuredWidth:ci?.width??-1,railWidth:pi.railWidth,defaultHeight:Math.round(9*ht/16)})},[e,ht,mt,Vo,ni,Ko,ri,Xa,mi,ci,pi.railWidth]),(0,ue.shouldShowCameraShelf)(Ko)||ai||null===ko||Co(null);const yi=(0,ke.isUnexpectedPortraitStack)($o,Ko);(0,n.useEffect)(()=>{yi&&E.log.warn('theater','tablet resolved to the portrait stack',{deviceId:e,winWidth:ht,winHeight:mt,screenMinSide:Vo??-1,isWeb:!0})},[yi,e,ht,mt,Vo]);const _i=(0,n.useMemo)(()=>9*ht/16,[ht]),ki=(0,n.useMemo)(()=>mt*Ke,[mt]),Ci=(0,de.resolvePortraitColumnSplit)({columnHeight:vi,topInset:dt.top,pictureHeight:_i,wallShowing:ai}),xi='stack'===Ko?Math.round(Ci.timelineHeight):-1,Hi=(0,n.useRef)(null);(0,n.useEffect)(()=>{const t=Hi.current;Hi.current={wall:ai,mode:Ko,devices:ti};const o=Ze(t,ai,Ko);if(null===o)return;const n=t?.devices??[];E.log.info('live:lifecycle','theater surface changed',{deviceId:e,direction:o,opening:null===t,before:n,beforeCount:n.length,after:ti,afterCount:ti.length,layoutMode:Ko,beforeLayoutMode:t?.mode??'none',portraitTimelineHeight:xi})},[ai,ti,e,Ko,xi]);const Ti=(0,F.useStreamZoom)(void 0,li||Qo?'contain':'cover'),Oi=Ti.snapZoom;(0,n.useEffect)(()=>{Oi()},[ht,mt,Oi]);const Ei=Ti.resetZoom;(0,n.useEffect)(()=>{Ei()},[li,Ei]);const Pi=(0,n.useCallback)(()=>{(0,W.requestSystemPip)(zo()).then(t=>{E.log.info('live:pip','swipe \u2192 system PiP settled',{deviceId:e,result:t}),'unconfirmed'===t&&E.log.warn('live:pip','PiP never confirmed \u2014 keeping the player',{deviceId:e})})},[zo,e]),Wi=(0,n.useMemo)(()=>{const e=b.Gesture.Tap().numberOfTaps(1).onEnd((function({_worklet_6602635544675_init_data:e,runOnJS:t,onToggleControls:o}){const n=function(){t(o)()};return n.__closure={runOnJS:t,onToggleControls:o},n.__workletHash=6602635544675,n.__initData=e,n})({_worklet_6602635544675_init_data:tt,runOnJS:w.runOnJS,onToggleControls:Io})),t=b.Gesture.Tap().numberOfTaps(2).onEnd((function({_worklet_10416610195513_init_data:e,runOnJS:t,zoom:o}){const n=function(e){t(o.stepZoomAt)(e.x,e.y)};return n.__closure={runOnJS:t,zoom:o},n.__workletHash=0x9794e59b839,n.__initData=e,n})({_worklet_10416610195513_init_data:at,runOnJS:w.runOnJS,zoom:Ti})),o=b.Gesture.Exclusive(t,e),n=b.Gesture.Pan().maxPointers(1).activeOffsetY(40).failOffsetX([-32,32]).onEnd((function({_worklet_7654669870659_init_data:e,shouldStartPipOnSwipe:t,zoom:o,runOnJS:n,onSwipeToPip:l}){const s=function(e){t({translationY:e.translationY,velocityY:e.velocityY,zoomScale:o.scale.value})&&n(l)()};return s.__closure={shouldStartPipOnSwipe:t,zoom:o,runOnJS:n,onSwipeToPip:l},s.__workletHash=7654669870659,s.__initData=e,s})({_worklet_7654669870659_init_data:ot,shouldStartPipOnSwipe:D.shouldStartPipOnSwipe,zoom:Ti,runOnJS:w.runOnJS,onSwipeToPip:Pi}));return b.Gesture.Simultaneous(Ti.composeWith(n),o)},[Ti,Io,Pi]),Li=bt.stream.pinchExpandsHeight,Di=(0,w.useDerivedValue)((function({_worklet_11676630563239_init_data:e,fill:t,winHeight:o,pinchExpandsHeight:n,defaultHeight:l,interpolate:s,zoom:c,HEIGHT_GROW_SCALE:u,maxHeight:d,Extrapolation:h}){const m=function(){return t?o:n?s(c.scale.value,[1,u],[l,d],h.CLAMP):l};return m.__closure={fill:t,winHeight:o,pinchExpandsHeight:n,defaultHeight:l,interpolate:s,zoom:c,HEIGHT_GROW_SCALE:u,maxHeight:d,Extrapolation:h},m.__workletHash=0xa9ead6ab9a7,m.__initData=e,m})({_worklet_11676630563239_init_data:it,fill:li,winHeight:mt,pinchExpandsHeight:Li,defaultHeight:_i,interpolate:w.interpolate,zoom:Ti,HEIGHT_GROW_SCALE:Qe,maxHeight:ki,Extrapolation:w.Extrapolation}),[_i,ki,Li,li,mt]),Ii=(0,w.useAnimatedStyle)((function({_worklet_8575313032359_init_data:e,liveBoxHeight:t}){const o=()=>({height:t.value});return o.__closure={liveBoxHeight:t},o.__workletHash=8575313032359,o.__initData=e,o})({_worklet_8575313032359_init_data:nt,liveBoxHeight:Di})),ji=pi.streamWidth,Ai=pi.streamHeight,Mi=(0,w.useAnimatedStyle)((function({_worklet_15609574238338_init_data:e,fill:t,winWidth:o,winHeight:n,isWideDetail:l,wideStreamW:s,wideStreamH:c,liveBoxHeight:u}){const d=function(){if(t)return{position:'absolute',top:0,left:0,width:o,height:n};if(l)return{position:'absolute',top:0,left:0,width:s,height:c};const e=u.value,d=Math.max(o,16*e/9);return{position:'absolute',top:0,left:(o-d)/2,width:d,height:e}};return d.__closure={fill:t,winWidth:o,winHeight:n,isWideDetail:l,wideStreamW:s,wideStreamH:c,liveBoxHeight:u},d.__workletHash=0xe326320a882,d.__initData=e,d})({_worklet_15609574238338_init_data:lt,fill:li,winWidth:ht,winHeight:mt,isWideDetail:Qo,wideStreamW:ji,wideStreamH:Ai,liveBoxHeight:Di}),[ht,mt,li,Qo,ji,Ai]),{ref:Ri,isFullscreen:Bi,supported:zi,toggle:Gi}=(0,C.useWebFullscreen)(),Fi=(0,n.useCallback)(()=>{zi?Gi():eo(e=>!e)},[Gi,zi]);(0,n.useEffect)(()=>{zi&&eo(Bi)},[Bi,zi]),(0,x.useTheaterOrientation)(Xa);const Ji=(0,H.selectPlaybackStatus)(xa.state),Ni=Ji.isLive&&!aa,Ui=Ni&&'playing'===ia.state,Vi=(0,Le.useMotionHighlight)(e,Ni),Yi=Nt?'detection':Vt||Kt?'audio':zt.motion&&Vi?'motion':null,qi=(0,n.useMemo)(()=>Ni?Qt:Object.assign({},Qt,{enabled:!1,motion:!1,detection:!1,audio:'off'}),[Qt,Ni]),Zi=Ha?ca:aa,$i=()=>{!Sa.current||Ha?Ha?Ma():la():(async()=>{const e=await La();la(),e&&Ia(e)})()},Ki=Ha?'seeking'===xa.state.mode:!ai&&!aa&&'connecting'===ia.state,Qi=(0,n.useCallback)(()=>{da.current?.retry()},[]),Xi='error'===ia.state||'error'===xa.state.mode,en=ia.reason,tn=ia.state,an=(0,n.useMemo)(()=>ai?qe:{failed:Xi,fetching:'connecting'===tn,reason:'error'===tn?en??null:null,onRetry:Qi},[ai,Xi,tn,en,Qi]),on=(0,n.useCallback)(()=>{const e=(0,H.selectActiveEpoch)(xa.state),t=(0,O.resolveJogBase)(xa.state.playhead,e),o=(0,O.jogTarget)(t,-1);E.log.debug('playback:jog','jogBack',{playhead:xa.state.playhead,active:e,base:t,target:o,mode:xa.state.mode}),null!=o&&Pa(o,'timeline')},[xa,Pa]),nn=(0,n.useCallback)(()=>{const e=(0,H.selectActiveEpoch)(xa.state),t=(0,O.resolveJogBase)(xa.state.playhead,e),o=(0,O.jogTarget)(t,1);E.log.debug('playback:jog','jogForward',{playhead:xa.state.playhead,active:e,base:t,target:o,mode:xa.state.mode}),null!=o&&Pa(o,'timeline')},[xa,Pa]),ln=(0,Ye.jsx)(y.default.View,{style:li?[ct.videoWrapFull,Ii]:Qo?[ct.videoWrap,{width:pi.streamWidth,height:pi.streamHeight}]:Li?[ct.videoWrap,Ii]:[ct.videoWrap,{height:_i}],children:(0,Ye.jsxs)(s.default,{style:ct.videoContent,children:[(0,Ye.jsxs)(y.default.View,{style:[Mi,Ti.videoStyle],children:[pt?(0,Ye.jsxs)(s.default,{style:ct.disabledStage,children:[(0,Ye.jsx)(Ee.PowerOff,{size:34,color:"#9aa0a6"}),(0,Ye.jsx)(c.default,{style:ct.disabledTitle,children:o('v2.cameras.disabledTitle')}),(0,Ye.jsx)(c.default,{style:ct.disabledHint,children:o('v2.cameras.disabledHint')})]}):Oa?(0,Ye.jsx)(B.LiveView,{ref:da,deviceId:e,muted:Na,target:At,showStats:Ka&&!1,highlight:void 0,initialSeekMs:_a,onPlaybackState:Ja,onPlayerState:na,onPosition:wo,onLiveCaptureError:()=>{Sa.current=!1,ma(!1),fa(null),He({title:o('v2.theater.recordLive'),message:o('v2.theater.recordFailed')})},onScrubDrawn:bo,onServedProfile:Fa},ba):(0,Ye.jsx)(st,{deviceId:e,fill:li,enabled:Ji.isLive}),Ya&&Ni?(0,Ye.jsx)(ee.MotionRegionsOverlay,{deviceId:e,enabled:Ya}):null,qa&&Ni?(0,Ye.jsx)(Q.MotionBoxesOverlay,{deviceId:e,enabled:qa}):null,$a&&Ni?(0,Ye.jsx)(X.StationaryBoxesOverlay,{deviceId:e,enabled:$a}):null,Za&&Ni?(0,Ye.jsx)(te.DiscardedBoxesOverlay,{deviceId:e,enabled:Za}):null]}),(0,Ye.jsx)(b.GestureDetector,{gesture:Wi,children:(0,Ye.jsx)(y.default.View,{style:u.default.absoluteFill,onLayout:Ti.onLayout})}),'off'!==Qa&&Ni?(0,Ye.jsx)(ae.AudioLevelMeter,{deviceId:e,position:Qa,onSetPosition:Do}):null,null===ro||co?null:(0,Ye.jsx)(ie.ZoneActiveOverlay,{zone:ro}),'gap'===xa.state.mode?(0,Ye.jsxs)(s.default,{pointerEvents:"none",style:[u.default.absoluteFill,ct.noRecOverlay],children:[(0,Ye.jsx)(Ee.VideoOff,{size:28,color:"#9aa0a6"}),(0,Ye.jsx)(c.default,{style:ct.noRecTitle,children:o('v2.theater.noRecording')}),(0,Ye.jsx)(c.default,{style:ct.noRecHint,children:o('v2.theater.noRecordingHint')})]}):null,Yi&&Ni&&Rt.highlightBorder?(0,Ye.jsx)(s.default,{pointerEvents:"none",style:[u.default.absoluteFill,{borderWidth:bt.highlight.thickness,borderColor:'motion'===Yi?bt.highlight.motionColor:'audio'===Yi?bt.highlight.audioColor:bt.highlight.detectionColor}]}):null,to?(0,Ye.jsxs)(s.default,{style:ct.nameTag,pointerEvents:"none",children:[Ot&&!pt?(0,Ye.jsx)(Ee.Moon,{size:12,color:"#fafaf9"}):(0,Ye.jsx)(De.CameraStatusDot,{deviceId:e,online:vt,disabled:pt,size:9}),(0,Ye.jsx)(c.default,{style:ct.nameText,numberOfLines:1,children:gt})]}):null,(0,Ye.jsx)(je.DoorbellBadge,{deviceId:e,enabled:Pt&&Ni}),(0,Ye.jsx)(Ie.OccupancyBadge,{deviceId:e,enabled:'off'!==Rt.occupancy&&Ji.isLive&&!aa,corner:'off'===Rt.occupancy?'bottom-left':Rt.occupancy}),(0,Ye.jsx)(Je.OverlayReadouts,{deviceId:e,config:Rt,enabled:Ni&&Ji.isLive}),Ka?(0,Ye.jsx)(K.StreamStatsOverlay,{getStats:Fo}):null,(0,Ye.jsx)(V.StreamOverlayControls,{visible:to,onRequestHide:jo,paused:Zi,onTogglePause:$i,showPlayPause:si,muted:Na,onToggleMute:yo,hasTwoWayAudio:Et,talking:Jo,onToggleTalk:Uo,onStartSystemPip:Go,fullscreen:Xa,onToggleFullscreen:Fi,edgePad:li?{left:dt.left,right:dt.right,bottom:dt.bottom}:void 0,timelineToggle:li?{expanded:oo,onToggle:()=>io(e=>!e)}:void 0}),li&&Ht&&Ui?(0,Ye.jsx)(Y.DriveOverlay,{deviceId:e,visible:to,edgePad:{left:dt.left,right:dt.right,bottom:dt.bottom},onOpenControls:lo,drawer:{open:oo,width:(0,q.drawerWidth)(ht)}}):null,co?(0,Ye.jsx)(oe.ZoneDrawOverlay,{zone:ro,onConfirm:vo,onCancel:po}):null]})}),rn=[{id:'back',icon:Ee.ArrowLeft,label:o('v2.common.back'),active:!1,onPress:()=>(0,I.backToCameras)(Te,xo),cluster:'left'},{id:'timeline',icon:Ee.History,label:o(oo?'v2.timeline.hideTimeline':'v2.timeline.showTimeline'),active:oo,onPress:()=>io(e=>!e),cluster:'left'},{id:'fullscreen',icon:Xa?Ee.Minimize2:Ee.Maximize2,label:o(Xa?'v2.streamBar.exitFullscreen':'v2.streamBar.fullscreen'),active:Xa,onPress:Fi,cluster:'right'}],sn=ai?(0,Ye.jsxs)(s.default,{testID:et,style:[ct.wallWrap,(0,de.wallBoxStyle)({mode:Ko,wideStreamWidth:pi.streamWidth,portraitStreamHeight:Ci.streamHeight})],children:[(0,Ye.jsx)(ce.WorkspaceStage,{devices:ti,quality:Dt,highlight:qi,showBoxes:qa,onGoTo:_o,onCellPanel:Ho}),li?(0,Ye.jsx)(Z.OverlayDiscGroup,{visible:!0,holdOpen:!0,onRequestHide:$e,items:rn,edgePad:{left:dt.left,right:dt.right,bottom:dt.bottom}}):null]}):null,cn=(0,me.fanOutPlaybackToWall)({primary:{onSeek:Pa,onScrubBegin:xa.beginScrub,onScrubMove:xa.moveScrub,onScrubCommit:Wa,onGoLive:xa.goLive,onTogglePlayPause:$i,onSelectRate:Ra},broadcast:ge.gridPlaybackBus.broadcast,paused:Zi});return(0,Ye.jsxs)(s.default,{style:ct.screenRow,children:[Yo&&!li?(0,Ye.jsx)(j.SideNavRail,{pathname:Zo,compact:qo}):null,(0,Ye.jsxs)(s.default,{ref:Ri,onLayout:di,style:{flex:1,minWidth:0,backgroundColor:rt.background,paddingTop:li?0:dt.top},children:[(0,Ye.jsx)(S.StatusBar,{hidden:li,style:li||'dark'===ut?'light':'dark'}),(0,Ye.jsx)(le.TheaterTimeline,{ref:no,layoutMode:Ko,railWidth:pi.railWidth,stream:sn??ln,belowStream:(0,ue.shouldShowCameraShelf)(Ko)?(0,Ye.jsx)(se.BelowStreamArea,{width:pi.streamWidth,currentDeviceId:e,wallShowing:ai,onGoTo:_o,onCellPanel:Ho}):null,deviceId:e,scopeIds:ti,hideBack:Qo,drawerExpanded:oo,name:gt,onBack:()=>(0,I.backToCameras)(Te,xo),deviceBinding:{cameraName:gt,hasPtz:_t,hasBattery:kt,hasNetworkLink:xt,hasNavigation:Ht,cameraJump:{onSwitchCamera:_o,onOpenAdhocGrid:ii,cameraSelection:oi}},singleCamera:Object.assign({streamBinding:{quality:Dt,onSelectQuality:Mt},viewOptionsBinding:{highlight:zt,onSetHighlight:Gt},overlayBinding:{config:Rt,onChange:Bt},onOpenLinkedDevices:()=>{Ho('devices',e)},linkedDevicesOpen:'devices'===Eo?.kind&&Eo.deviceId===e},ai?{}:{zone:{zoneRect:ro,onRequestZoneDraw:go,onClearZone:fo}}),mode:xa.state.mode,activeEpoch:(0,H.selectActiveEpoch)(xa.state),seekAnchor:xa.state.seekAnchor,onSeek:cn.onSeek,onScrubBegin:cn.onScrubBegin,onScrubMove:cn.onScrubMove,onScrubCommit:cn.onScrubCommit,onGoLive:cn.onGoLive,liveLocked:xa.state.liveLocked,onToggleLiveLock:xa.toggleLiveLock,liveCapture:ai?void 0:ja,exportSelection:ai?void 0:Aa,playbackRate:ra,paused:Zi,servedTier:Ga,onTogglePlayPause:cn.onTogglePlayPause,loading:Ki,streamFault:an,scrubDirection:(0,H.selectScrubDirection)(xa.state),onJogBack:on,onJogForward:nn,onStepFrame:Ba,onSelectRate:cn.onSelectRate}),gi?(0,Ye.jsx)(A.BottomNavBar,{pathname:Zo,insetBottom:dt.bottom}):null,(0,Ye.jsx)(Se.GridCellPanelOverlay,{panel:Eo,cameraName:Wo,hasPtz:Lo,onSelect:t=>Co({kind:t,deviceId:Eo?.deviceId??e}),onClose:To})]})]})};var o=r(_d[0]),n=r(_d[1]),l=r(_d[2]),s=e(r(_d[3])),c=e(r(_d[4])),u=e(r(_d[5])),d=e(r(_d[6]));r(_d[7]);var h=r(_d[8]),m=r(_d[9]),f=r(_d[10]),v=r(_d[11]),p=r(_d[12]),S=r(_d[13]),b=r(_d[14]),w=r(_d[15]),y=e(w),_=t(r(_d[16])),k=t(r(_d[17])),C=r(_d[18]),x=r(_d[19]),H=r(_d[20]),T=r(_d[21]),O=r(_d[22]),E=r(_d[23]),P=r(_d[24]),W=r(_d[25]),L=r(_d[26]),D=r(_d[27]),I=r(_d[28]),j=r(_d[29]),A=r(_d[30]),M=r(_d[31]),R=r(_d[32]),B=r(_d[33]),z=r(_d[34]),G=r(_d[35]),F=r(_d[36]),J=r(_d[37]),N=r(_d[38]),U=r(_d[39]),V=r(_d[40]),Y=r(_d[41]),q=r(_d[42]),Z=r(_d[43]),$=r(_d[44]),K=r(_d[45]),Q=r(_d[46]),X=r(_d[47]),ee=r(_d[48]),te=r(_d[49]),ae=r(_d[50]),oe=r(_d[51]),ie=r(_d[52]),ne=r(_d[53]),le=r(_d[54]),re=r(_d[55]),se=r(_d[56]),ce=r(_d[57]),ue=r(_d[58]),de=r(_d[59]),he=r(_d[60]),me=r(_d[61]),ge=r(_d[62]),fe=r(_d[63]),ve=r(_d[64]),pe=r(_d[65]),Se=r(_d[66]),be=r(_d[67]),we=r(_d[68]),ye=r(_d[69]),ke=r(_d[70]),Ce=r(_d[71]),xe=r(_d[72]),He=r(_d[73]),Te=r(_d[74]),Oe=r(_d[75]),Ee=r(_d[76]),Pe=r(_d[77]),We=r(_d[78]),Le=r(_d[79]),De=r(_d[80]),Ie=r(_d[81]),je=r(_d[82]),Ae=r(_d[83]),Me=r(_d[84]),Re=r(_d[85]),Be=r(_d[86]),ze=r(_d[87]),Ge=r(_d[88]),Fe=r(_d[89]),Je=r(_d[90]),Ne=r(_d[91]),Ue=r(_d[92]),Ve=r(_d[93]),Ye=r(_d[94]);const qe={failed:!1,fetching:!1,reason:null,onRetry:()=>{}};function Ze(e,t,o){return null===e||e.wall!==t?t?'pictureToWall':'wallToPicture':t&&e.mode!==o?'wallReshaped':null}const $e=()=>{},Ke=.5,Qe=2.5;function Xe(e){const t=(0,o.c)(19),{t:n}=(0,f.useTranslation)(),{data:l}=(0,Oe.useCameras)();let s;t[0]!==l?(s=void 0===l?[]:l,t[0]=l,t[1]=s):s=t[1];const c=s;let u;if(t[2]!==c||t[3]!==e){let o;t[5]!==e?(o=t=>t.id===e,t[5]=e,t[6]=o):o=t[6],u=c.find(o),t[2]=c,t[3]=e,t[4]=u}else u=t[4];const d=u;let h,m;t[7]!==d?.name||t[8]!==e||t[9]!==n?(h=d?.name??n("v2.cameraDetail.fallbackName",{id:e}),t[7]=d?.name,t[8]=e,t[9]=n,t[10]=h):h=t[10],t[11]!==d?.features?(m=d?.features??[],t[11]=d?.features,t[12]=m):m=t[12];const v=d?.online??!1,p=d?.disabled??!1,S=void 0!==d;let b;return t[13]!==h||t[14]!==m||t[15]!==v||t[16]!==p||t[17]!==S?(b={name:h,features:m,online:v,disabled:p,known:S},t[13]=h,t[14]=m,t[15]=v,t[16]=p,t[17]=S,t[18]=b):b=t[18],b}const et='wall-stage',tt={code:"function CameraDetailScreenTsx1(){const{runOnJS,onToggleControls}=this.__closure;runOnJS(onToggleControls)();}"},at={code:"function CameraDetailScreenTsx2(e_0){const{runOnJS,zoom}=this.__closure;runOnJS(zoom.stepZoomAt)(e_0.x,e_0.y);}"},ot={code:"function CameraDetailScreenTsx3(e_1){const{shouldStartPipOnSwipe,zoom,runOnJS,onSwipeToPip}=this.__closure;if(shouldStartPipOnSwipe({translationY:e_1.translationY,velocityY:e_1.velocityY,zoomScale:zoom.scale.value})){runOnJS(onSwipeToPip)();}}"},it={code:"function CameraDetailScreenTsx4(){const{fill,winHeight,pinchExpandsHeight,defaultHeight,interpolate,zoom,HEIGHT_GROW_SCALE,maxHeight,Extrapolation}=this.__closure;if(fill)return winHeight;if(!pinchExpandsHeight)return defaultHeight;return interpolate(zoom.scale.value,[1,HEIGHT_GROW_SCALE],[defaultHeight,maxHeight],Extrapolation.CLAMP);}"},nt={code:"function CameraDetailScreenTsx5(){const{liveBoxHeight}=this.__closure;return{height:liveBoxHeight.value};}"},lt={code:"function CameraDetailScreenTsx6(){const{fill,winWidth,winHeight,isWideDetail,wideStreamW,wideStreamH,liveBoxHeight}=this.__closure;if(fill){return{position:'absolute',top:0,left:0,width:winWidth,height:winHeight};}if(isWideDetail){return{position:'absolute',top:0,left:0,width:wideStreamW,height:wideStreamH};}const h=liveBoxHeight.value;const coverWidth=Math.max(winWidth,h*16/9);return{position:'absolute',top:0,left:(winWidth-coverWidth)/2,width:coverWidth,height:h};}"};const rt=960;function st(e){const t=(0,o.c)(9),{deviceId:n,fill:l,enabled:c}=e,d=(0,He.useSnapshot)(n,c,rt);let m;t[0]!==d.uri?(m=null===d.uri?(0,Ye.jsx)(h.SkeletonBox,{}):null,t[0]=d.uri,t[1]=m):m=t[1];const f=l?"contain":"cover";let v,p;return t[2]!==n||t[3]!==d||t[4]!==f?(v=(0,Ye.jsx)(Te.SnapshotImage,{source:d,deviceId:n,style:u.default.absoluteFill,contentFit:f}),t[2]=n,t[3]=d,t[4]=f,t[5]=v):v=t[5],t[6]!==m||t[7]!==v?(p=(0,Ye.jsxs)(s.default,{style:ct.poster,children:[m,v]}),t[6]=m,t[7]=v,t[8]=p):p=t[8],p}const ct=u.default.create({screenRow:{flex:1,flexDirection:'row'},videoWrap:{position:'relative',width:'100%',overflow:'hidden',backgroundColor:'#000'},wallWrap:{overflow:'hidden'},videoWrapFull:Object.assign({},u.default.absoluteFill,{backgroundColor:'#000'}),videoContent:{flex:1,overflow:'hidden'},disabledStage:{flex:1,alignItems:'center',justifyContent:'center',gap:4,backgroundColor:'#000'},disabledTitle:{color:'#e8eaed',fontSize:15,fontWeight:'700'},disabledHint:{color:'#9aa0a6',fontSize:12},noRecOverlay:{alignItems:'center',justifyContent:'center',gap:6,backgroundColor:'rgba(0,0,0,0.55)'},noRecTitle:{color:'#e8eaed',fontSize:15,fontWeight:'600'},noRecHint:{color:'#9aa0a6',fontSize:12},poster:{flex:1,backgroundColor:'#000'},nameTag:{position:'absolute',top:8,left:8,maxWidth:'70%',flexDirection:'row',alignItems:'center',gap:6,paddingHorizontal:8,paddingVertical:4,borderRadius:6,backgroundColor:'#00000080'},nameText:{color:'#fafaf9',fontSize:13,fontWeight:'600'}})},2091,[15,17,2092,20,198,33,277,131,1598,1815,995,743,466,2093,1685,1173,1591,1959,2095,2096,2100,2105,2102,1115,2106,2107,2108,2109,1121,990,1126,1127,782,2110,2121,2122,2123,1893,2125,2126,2127,2129,2131,2128,2132,2133,2134,2136,2137,2138,2140,2142,2143,2144,2145,2148,2221,2230,2228,2245,2229,2246,2237,2192,2222,2247,2248,1124,2227,2249,2150,2250,791,1574,1611,1512,794,1602,1603,1608,1641,1650,2251,2135,2253,2141,1822,2254,1565,1567,2255,2240,1881,2241,10]);
3466
+ __d(function(g,r,i,a,_m,_e,_d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}function t(e){if(e&&e.__esModule)return e;var t={};return e&&Object.keys(e).forEach(function(o){var n=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(t,o,n.get?n:{enumerable:!0,get:function(){return e[o]}})}),t.default=e,t}Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"WALL_STAGE_TEST_ID",{enumerable:!0,get:function(){return et}}),_e.CameraDetailScreen=function({deviceId:e,initialSeekMs:t}){const{t:o}=(0,f.useTranslation)(),h=(0,m.useConfirm)(),xe=(0,m.useNotice)(),Te=(0,p.useRouter)(),{colors:st,mode:dt}=(0,M.useTheme)(),ht=(0,v.useSafeAreaInsets)(),{width:mt,height:gt}=(0,d.default)(),{name:ft,features:pt,online:vt,disabled:St,known:bt}=Xe(e),{settings:wt,hydrated:_t}=(0,De.useSettings)(),yt=(0,Ue.useCanActuate)(),kt=yt&&pt.includes(Ee.FEATURE.ptz),Ct=pt.includes(Ee.FEATURE.battery),{data:Ht=[]}=(0,J.useDeviceCapNames)(e,!0),xt=Ht.includes('network-link'),Tt=yt&&Ht.includes('navigation'),{data:Et=null}=(0,Oe.useBattery)(e,Ct),Wt=Ct&&!0===Et?.sleeping,Ot=pt.includes(Ee.FEATURE.twoWayAudio),Dt=pt.includes(Ee.FEATURE.doorbell),Pt=(0,Fe.useCameraPrefsStore)(t=>t.prefs.byId[e]?.quality),Lt=(0,Fe.useCameraPrefsStore)(e=>e.setCameraQuality),[It,jt]=(0,n.useState)(Pt??'auto'),At=(0,n.useRef)(!1);(0,n.useEffect)(()=>{Pt&&!At.current&&(At.current=!0,jt(Pt))},[Pt]);const Bt=(0,n.useMemo)(()=>(0,Ve.qualityToTarget)(It),[It]),Mt=(0,n.useCallback)(t=>{jt(t),Lt(e,t)},[e,Lt]);(0,Be.useEventHaptics)([e],!0);const{overlay:Rt,setOverlay:zt,highlight:Ft,setHighlight:Gt}=(0,Ne.useCameraViewOptions)(e),Jt=(0,Ae.useDetections)(e,Ft.detection&&!0),Nt=Ft.detection&&Jt.boxes.some(e=>0===Ft.detectionClasses.length||Ft.detectionClasses.includes(e.label)),Ut=(0,ze.useHeld)(Nt,1e3*Ft.detectionHoldSec),Vt=(0,Me.useAudioActive)(e,Ft.audio,Ft.audioDb),Yt=(0,ze.useHeld)('off'!==Ft.audio&&Vt,1e3*Re.AUDIO_HIGHLIGHT_HOLD_SEC),[qt,Zt]=(0,n.useState)(0),$t=`${Ft.audio}:${Ft.audioDb}`,Kt=(0,n.useRef)(!0);(0,n.useEffect)(()=>{if(Kt.current)return void(Kt.current=!1);if('off'===Ft.audio)return void Zt(0);const e=Date.now()+1e3*Re.AUDIO_HIGHLIGHT_HOLD_SEC;Zt(e);const t=setTimeout(()=>Zt(0),1e3*Re.AUDIO_HIGHLIGHT_HOLD_SEC);return()=>clearTimeout(t)},[$t,Ft.audio]);const Qt=qt>Date.now(),Xt=(0,n.useMemo)(()=>Object.assign({enabled:Rt.highlightBorder},Ft,{audioHoldSec:Re.AUDIO_HIGHLIGHT_HOLD_SEC,appearance:wt.highlight,motionHoldSec:wt.grid.motionHoldSec}),[Rt.highlightBorder,Ft,wt.highlight,wt.grid.motionHoldSec]),[ei,ti]=(0,n.useState)(null),ii={operatorChoice:ei,cameraKnown:bt,batteryPowered:Ct},ai=(0,$.resolveLivePaused)(ii),oi=(0,n.useRef)(ai);oi.current=ai;const[ni,li]=(0,n.useState)({state:'connecting'}),ri=()=>{ti(e=>!(0,$.resolveLivePaused)({operatorChoice:e,cameraKnown:bt,batteryPowered:Ct}))},[si,ci]=(0,n.useState)(1),[ui,di]=(0,n.useState)(!1),hi=(0,n.useRef)(null),[mi,gi]=(0,n.useState)(!1),[fi,pi]=(0,n.useState)(null),[vi,Si]=(0,n.useState)(0),bi=(0,n.useRef)(!1);(0,n.useEffect)(()=>{if(!mi||null===fi)return void Si(0);const e=()=>Si(Math.floor((Date.now()-fi)/1e3));e();const t=setInterval(e,250);return()=>clearInterval(t)},[mi,fi]);const[wi,_i]=(0,n.useState)(0),yi=(0,n.useRef)(t??null),[ki,Ci]=(0,n.useState)(t),Hi=(0,n.useMemo)(()=>({scrubStart:e=>{hi.current?.scrubStart(e)},scrubTo:(e,t)=>hi.current?.scrubTo(e,t?.mode,t?.velocityPxPerS),scrubCommit:(e,t)=>hi.current?.scrubCommit(e,t),seek:e=>hi.current?.seek(e),goLive:()=>{if(!(0,$.shouldDialLiveOnGoLive)(oi.current))return yi.current=null,Ci(void 0),di(!1),void ci(1);hi.current?.goLive(),_i(e=>e+1),di(!1),ci(1),yi.current=null,Ci(void 0)}}),[]),xi=(0,x.usePlaybackMachine)(Hi);(0,n.useEffect)(()=>{const e=[3e3,1e4].map(e=>setTimeout(()=>hi.current?.timelineWarm(Date.now()-3e4),e));return()=>{for(const t of e)clearTimeout(t)}},[]);const Ti='live'!==xi.state.mode,Ei=(0,n.useRef)(!1),Wi=(0,$.shouldMountLiveView)({liveHeld:ai,mode:xi.state.mode,playhead:xi.state.playhead,recordedSeekMs:ki??null,keepRecordedSession:Ei.current});Ei.current=Wi;const Oi=e=>{ai&&null==hi.current&&(yi.current=e,Ci(e))},Di=(0,n.useCallback)((e,t)=>{Oi(e),xi.seek(e,t)},[ai,xi]),Pi=(0,n.useCallback)((e,t)=>{Oi(e),xi.commitScrub(e,t)},[ai,xi]),Li=async()=>{if(!bi.current)return null;bi.current=!1,gi(!1),pi(null);try{return await(hi.current?.stopLiveCapture())??null}catch{return xe({title:o('v2.theater.recordLive'),message:o('v2.theater.recordFailed')}),null}},Ii=async t=>{const o=(0,z.captureFileExtension)(t.mime),n=`${y.cacheDirectory}live-${e}-${Date.now()}.${o}`;await y.writeAsStringAsync(n,t.base64,{encoding:y.EncodingType.Base64}),await k.isAvailableAsync()&&await k.shareAsync(n,{mimeType:t.mime||('webm'===o?'video/webm':'video/mp4'),UTI:'webm'===o?'public.movie':'public.mpeg-4'})},ji=e=>{(async()=>{await h({title:o('v2.theater.keepClipTitle'),confirmLabel:o('v2.theater.shareClip'),cancelLabel:o('v2.theater.discardClip')})&&await Ii(e)})()},Ai={capturing:mi,elapsedLabel:(0,F.formatSelectionDuration)(1e3*vi),onStart:()=>{bi.current=!0,gi(!0),pi(Date.now()),hi.current?.startLiveCapture()},onKeep:()=>{(async()=>{const e=await Li();e&&await Ii(e)})()},onDiscard:()=>{Li()}},Bi=(0,N.useExportSelection)(e,xi);(0,n.useEffect)(()=>{'live'!==xi.state.mode&&bi.current&&(async()=>{const e=await Li();e&&ji(e)})()},[xi.state.mode]);const Mi=(0,n.useCallback)(()=>{const e=!ui;di(e),hi.current?.setRate(e?0:si)},[ui,si]),Ri=(0,n.useCallback)(e=>{ci(e),ui||hi.current?.setRate(e)},[ui]),zi=(0,n.useCallback)(e=>{ui||di(!0),hi.current?.stepFrame(e)},[ui]),Fi=(0,n.useCallback)(e=>{const t=yi.current;null!==t&&(yi.current=null,Ci(void 0),'adopt'===e?xi.adoptSeek(t,'cluster'):xi.seek(t,'cluster'))},[xi]),[Gi,Ji]=(0,n.useState)(null),Ni=(0,n.useCallback)(e=>{xi.reportEmbedState(e),'paused'===e?di(!0):'playing'===e&&di(!1),'gap'!==e&&'error'!==e||(yi.current=null,Ci(void 0)),Fi((0,E.resolveInitialSeekAction)(e))},[xi,Fi]),[Ui,Vi]=(0,n.useState)(!0),Yi=(0,n.useRef)(!1);(0,n.useEffect)(()=>{_t&&!Yi.current&&(Yi.current=!0,Vi(!wt.stream.audioOnOpen))},[_t,wt.stream.audioOnOpen]);const qi=(0,Ge.hasLayer)(Rt,'motion'),Zi=(0,Ge.hasLayer)(Rt,'objects'),$i=(0,Ge.hasLayer)(Rt,'discarded'),Ki=(0,Ge.hasLayer)(Rt,'stationary'),Qi=Rt.stats,Xi=Rt.audioMeter,[ea,ta]=(0,n.useState)(!1),[ia,aa]=(0,n.useState)(!0),[oa,na]=(0,n.useState)(!1),la=(0,n.useRef)(null),ra=(0,n.useCallback)(()=>{na(!0),la.current?.openControls()},[]),[sa,ca]=(0,n.useState)(null),[ua,da]=(0,n.useState)(!1),[ha,ma]=(0,n.useState)(e);ha!==e&&(ma(e),ca(null),da(!1));const ga=(0,n.useCallback)(()=>da(!0),[]),fa=(0,n.useCallback)(()=>ca(null),[]),pa=(0,n.useCallback)(e=>{ca(e),da(!1)},[]),va=(0,n.useCallback)(()=>da(!1),[]),Sa=(0,n.useRef)(null),ba=(0,n.useCallback)(()=>{(0,l.scrubFramePainted)(e)},[e]),wa=(0,n.useCallback)(t=>{Fi('adopt'),xi.reportPosition(t);const o=Date.now(),n=(0,T.evaluateDivergence)({indicatorEpoch:(0,x.selectActiveEpoch)(xi.state),playerEpoch:t,nowMs:o,lastReportAt:Sa.current});null!==n&&(Sa.current=o,W.log.warn('theater:divergence','indicator and stream disagree',{deviceId:e,deltaMs:n.deltaMs,indicatorAhead:n.indicatorAhead,indicatorEpoch:(0,x.selectActiveEpoch)(xi.state),playerEpoch:t,mode:xi.state.mode,seekAnchor:xi.state.seekAnchor,seekLanded:xi.state.seekLanded}))},[xi,e,Fi]),_a=(0,n.useCallback)(()=>Vi(e=>!e),[]),ya=(0,n.useCallback)(t=>{t!==e&&Te.replace(`/camera/${t}`)},[Te,e]),[ka,Ca]=(0,n.useState)(null),Ha=(0,be.useLastCameraStore)(e=>e.forget),xa=(0,n.useCallback)((e,t)=>{Ca({kind:e,deviceId:t})},[]),Ta=(0,n.useCallback)(()=>Ca(null),[]),{data:Ea}=(0,Ee.useCameras)(),Wa=(0,n.useMemo)(()=>(0,we.resolveCellPanel)(ka,(Ea??[]).map(e=>e.id)),[ka,Ea]),Oa=(Ea??[]).find(e=>e.id===Wa?.deviceId),Da=Oa?.name??'',Pa=yt&&(Oa?.features??[]).includes(Ee.FEATURE.ptz),La=(0,n.useCallback)(e=>zt((0,Ge.patchOverlay)(Rt,{audioMeter:e})),[zt,Rt]),Ia=(0,n.useCallback)(()=>aa(e=>!e),[]),ja=(0,n.useCallback)(()=>aa(!1),[]),Aa=(0,n.useRef)(null),Ba=(0,n.useCallback)(()=>new Promise(e=>{Aa.current=e}),[]),Ma=(0,n.useCallback)(()=>{li({state:'connecting'}),xi.goLive()},[xi]),Ra=(0,n.useCallback)(()=>hi.current?.startPip()??Promise.resolve('unavailable'),[]),za=(0,n.useCallback)(()=>({mode:xi.state.mode,goLive:Ma,awaitLive:Ba,startPip:Ra}),[xi.state.mode,Ma,Ba,Ra]),Fa=(0,n.useCallback)(()=>{(0,D.requestSystemPip)(za())},[za]);(0,n.useEffect)(()=>{const e=Aa.current;if(null!==e)return(0,O.goLiveFailedBeforePip)(ni.state)?(Aa.current=null,void e('failed')):void((0,O.pipReadyAfterGoLive)({pending:!0,mode:xi.state.mode,playerState:ni.state})&&(Aa.current=null,e('live')))},[xi.state.mode,ni.state]);const Ga=(0,n.useCallback)(()=>hi.current?.getStats()??Promise.resolve(null),[]),{talking:Ja,error:Na,toggle:Ua}=(0,U.useIntercom)(e);(0,n.useEffect)(()=>{Na&&xe({title:o('v2.cameraDetail.talk'),message:o('v2.cameraDetail.talkFailed')})},[Na,o,xe]);const Va=(0,He.useScreenMinSide)(),{showSidebar:Ya,compact:qa}=(0,He.useSidebarLayout)(),Za=(0,p.usePathname)(),$a={width:mt,height:gt,screenMinSide:Va,isWeb:!0,fullscreen:ea},Ka=(0,ke.resolveDetailLayoutMode)($a),Qa='wide'===Ka,Xa=(0,pe.useWorkspaceStore)(e=>e.setMembers),eo=(0,pe.useWorkspaceStore)(e=>e.workspace.members),to=(0,n.useMemo)(()=>(0,he.workspaceOnScreenCameras)(eo,e),[eo,e]),io=(0,he.shouldShowWorkspaceGrid)(Ka,eo,e);(0,n.useEffect)(()=>{io&&bi.current&&(bi.current=!1,gi(!1),pi(null),W.log.warn('live:lifecycle','live capture dropped: the picture became a wall',{deviceId:e}))},[io,e]);const ao=(0,fe.cameraSelectionModeFor)(Ka),oo=(0,n.useCallback)(e=>{const t=(0,fe.resolveCameraSelection)(ao,e);switch(t.kind){case'buildView':return void Xa(t.members);case'goTo':return void ya(t.deviceId);case'openGrid':return void Te.push(`/grid/adhoc?devices=${(0,ne.serializeAdhocDeviceIds)(t.deviceIds)}`);case'none':return}},[ao,ya,Te,Xa]),no=mt>gt,lo='fill'===Ka;!lo&&oa&&na(!1);const ro=(0,ke.toolbarPlacementFor)(Ka),so=(0,P.shouldShowOverlayPlayPause)({fill:lo,landscapeDrawerOpen:oa}),[co,uo]=(0,n.useState)(null),ho=(0,n.useCallback)(e=>{const t=e.nativeEvent.layout.width;(0,ye.isUsableMeasurement)(t)&&uo(e=>null!==e&&e.width===t&&e.windowWidth===mt?e:{width:t,windowWidth:mt})},[mt]),mo=(0,n.useMemo)(()=>({visible:Ya&&!lo,compact:qa,insetLeft:ht.left}),[Ya,lo,qa,ht.left]),go=(0,ye.resolveContainerWidth)({measured:co,windowWidth:mt,sideNav:mo}),fo=(0,ve.shouldShowStreamNavBar)({enabled:wt.stream.navBarOnStream,showSidebar:Ya,fill:lo}),po=(0,B.bottomNavFootprint)({visible:fo,insetBottom:ht.bottom}),vo=(0,ve.streamColumnHeight)({windowHeight:gt,navBarFootprint:po}),So=(0,n.useMemo)(()=>(0,re.computeWideDetailSizes)({containerWidth:go,viewportHeight:vo}),[go,vo]),bo=(0,Ce.buildDetailLayoutTrace)({deviceId:e,layout:$a,sideNav:mo,measured:co,containerWidth:go,railWidth:So.railWidth,mode:Ka}),wo=(0,Ce.detailLayoutTraceSignature)(bo),_o=(0,n.useRef)(null);(0,n.useEffect)(()=>{_o.current!==wo&&(_o.current=wo,W.log.info(Ce.DETAIL_LAYOUT_SCOPE,'layout decision',bo))},[wo,bo]),(0,n.useEffect)(()=>{W.log.debug('theater','detail geometry',{deviceId:e,winWidth:mt,winHeight:gt,screenMinSide:Va??-1,isLandscape:no,layoutMode:Ka,toolbarPlacement:ro,fullscreen:ea,containerWidth:go,measuredWidth:co?.width??-1,railWidth:So.railWidth,defaultHeight:Math.round(9*mt/16)})},[e,mt,gt,Va,no,Ka,ro,ea,go,co,So.railWidth]),(0,ue.shouldShowCameraShelf)(Ka)||io||null===ka||Ca(null);const yo=(0,ke.isUnexpectedPortraitStack)($a,Ka);(0,n.useEffect)(()=>{yo&&W.log.warn('theater','tablet resolved to the portrait stack',{deviceId:e,winWidth:mt,winHeight:gt,screenMinSide:Va??-1,isWeb:!0})},[yo,e,mt,gt,Va]);const ko=(0,n.useMemo)(()=>9*mt/16,[mt]),Co=(0,n.useMemo)(()=>gt*Ke,[gt]),Ho=(0,de.resolvePortraitColumnSplit)({columnHeight:vo,topInset:ht.top,pictureHeight:ko,wallShowing:io}),xo='stack'===Ka?Math.round(Ho.timelineHeight):-1,To=(0,n.useRef)(null);(0,n.useEffect)(()=>{const t=To.current;To.current={wall:io,mode:Ka,devices:to};const o=Ze(t,io,Ka);if(null===o)return;const n=t?.devices??[];W.log.info('live:lifecycle','theater surface changed',{deviceId:e,direction:o,opening:null===t,before:n,beforeCount:n.length,after:to,afterCount:to.length,layoutMode:Ka,beforeLayoutMode:t?.mode??'none',portraitTimelineHeight:xo})},[io,to,e,Ka,xo]);const Eo=wt.stream.pinchExpandsHeight,Wo=So.streamWidth,Oo=So.streamHeight,Do=(0,n.useCallback)((function({_worklet_13748050360162_init_data:e,fill:t,winHeight:o,isWideDetail:n,wideStreamH:l,pinchExpandsHeight:s,defaultHeight:c,interpolate:u,HEIGHT_GROW_SCALE:d,maxHeight:h,Extrapolation:m}){const f=function(e){return t?o:n?l:s?u(e,[1,d],[c,h],m.CLAMP):c};return f.__closure={fill:t,winHeight:o,isWideDetail:n,wideStreamH:l,pinchExpandsHeight:s,defaultHeight:c,interpolate:u,HEIGHT_GROW_SCALE:d,maxHeight:h,Extrapolation:m},f.__workletHash=0xc80f7a87762,f.__initData=e,f})({_worklet_13748050360162_init_data:tt,fill:lo,winHeight:gt,isWideDetail:Qa,wideStreamH:Oo,pinchExpandsHeight:Eo,defaultHeight:ko,interpolate:w.interpolate,HEIGHT_GROW_SCALE:Qe,maxHeight:Co,Extrapolation:w.Extrapolation}),[lo,gt,Qa,Oo,Eo,ko,Co]),Po=(0,G.useStreamZoom)({fit:lo||Qa?'contain':'cover',viewport:{width:Qa?Wo:mt,heightFor:Do}}),Lo=Po.snapZoom;(0,n.useEffect)(()=>{Lo()},[mt,gt,Lo]);const Io=Po.resetZoom;(0,n.useEffect)(()=>{Io()},[lo,Io]);const jo=(0,n.useCallback)(()=>{(0,D.requestSystemPip)(za()).then(t=>{W.log.info('live:pip','swipe \u2192 system PiP settled',{deviceId:e,result:t}),'unconfirmed'===t&&W.log.warn('live:pip','PiP never confirmed \u2014 keeping the player',{deviceId:e})})},[za,e]),Ao=(0,n.useMemo)(()=>{const e=b.Gesture.Tap().numberOfTaps(1).onEnd((function({_worklet_11665093317600_init_data:e,runOnJS:t,onToggleControls:o}){const n=function(){t(o)()};return n.__closure={runOnJS:t,onToggleControls:o},n.__workletHash=0xa9bfdbe53e0,n.__initData=e,n})({_worklet_11665093317600_init_data:it,runOnJS:w.runOnJS,onToggleControls:Ia})),t=b.Gesture.Tap().numberOfTaps(2).onEnd((function({_worklet_9839485935477_init_data:e,zoom:t}){const o=function(e){t.stepZoomAt(e.x,e.y)};return o.__closure={zoom:t},o.__workletHash=9839485935477,o.__initData=e,o})({_worklet_9839485935477_init_data:at,zoom:Po})),o=b.Gesture.Exclusive(t,e),n=b.Gesture.Pan().maxPointers(1).activeOffsetY(40).failOffsetX([-32,32]).onEnd((function({_worklet_582557902532_init_data:e,shouldStartPipOnSwipe:t,zoom:o,runOnJS:n,onSwipeToPip:l}){const s=function(e){t({translationY:e.translationY,velocityY:e.velocityY,zoomScale:o.scale.value})&&n(l)()};return s.__closure={shouldStartPipOnSwipe:t,zoom:o,runOnJS:n,onSwipeToPip:l},s.__workletHash=582557902532,s.__initData=e,s})({_worklet_582557902532_init_data:ot,shouldStartPipOnSwipe:L.shouldStartPipOnSwipe,zoom:Po,runOnJS:w.runOnJS,onSwipeToPip:jo}));return b.Gesture.Simultaneous(Po.composeWith(n),o)},[Po,Ia,jo]),Bo=(0,w.useDerivedValue)((function({_worklet_4404797918166_init_data:e,zoomBoxHeightFor:t,zoom:o,fill:n,isWideDetail:l,pinchExpandsHeight:s,withTiming:c}){const u=function(){const e=t(o.committedScale.value);return n||l||!s?e:c(e)};return u.__closure={zoomBoxHeightFor:t,zoom:o,fill:n,isWideDetail:l,pinchExpandsHeight:s,withTiming:c},u.__workletHash=4404797918166,u.__initData=e,u})({_worklet_4404797918166_init_data:nt,zoomBoxHeightFor:Do,zoom:Po,fill:lo,isWideDetail:Qa,pinchExpandsHeight:Eo,withTiming:w.withTiming}),[Do,Po.committedScale,lo,Qa,Eo]),Mo=(0,w.useAnimatedStyle)((function({_worklet_143406318116_init_data:e,liveBoxHeight:t}){const o=()=>({height:t.value});return o.__closure={liveBoxHeight:t},o.__workletHash=143406318116,o.__initData=e,o})({_worklet_143406318116_init_data:lt,liveBoxHeight:Bo})),Ro=(0,w.useAnimatedStyle)((function({_worklet_7907918882307_init_data:e,fill:t,winWidth:o,winHeight:n,isWideDetail:l,wideStreamW:s,wideStreamH:c,liveBoxHeight:u}){const d=function(){if(t)return{position:'absolute',top:0,left:0,width:o,height:n};if(l)return{position:'absolute',top:0,left:0,width:s,height:c};const e=u.value,d=Math.max(o,16*e/9);return{position:'absolute',top:0,left:(o-d)/2,width:d,height:e}};return d.__closure={fill:t,winWidth:o,winHeight:n,isWideDetail:l,wideStreamW:s,wideStreamH:c,liveBoxHeight:u},d.__workletHash=7907918882307,d.__initData=e,d})({_worklet_7907918882307_init_data:rt,fill:lo,winWidth:mt,winHeight:gt,isWideDetail:Qa,wideStreamW:Wo,wideStreamH:Oo,liveBoxHeight:Bo}),[mt,gt,lo,Qa,Wo,Oo]),{ref:zo,isFullscreen:Fo,supported:Go,toggle:Jo}=(0,C.useWebFullscreen)(),No=(0,n.useCallback)(()=>{Go?Jo():ta(e=>!e)},[Jo,Go]);(0,n.useEffect)(()=>{Go&&ta(Fo)},[Fo,Go]),(0,H.useTheaterOrientation)(ea);const Uo=(0,x.selectPlaybackStatus)(xi.state),Vo=Uo.isLive&&!ai,Yo=Vo&&'playing'===ni.state,qo=(0,Pe.useMotionHighlight)(e,Vo),Zo=Ut?'detection':Yt||Qt?'audio':Ft.motion&&qo?'motion':null,$o=(0,n.useMemo)(()=>Vo?Xt:Object.assign({},Xt,{enabled:!1,motion:!1,detection:!1,audio:'off'}),[Xt,Vo]),Ko=Ti?ui:ai,Qo=()=>{!bi.current||Ti?Ti?Mi():ri():(async()=>{const e=await Li();ri(),e&&ji(e)})()},Xo=Ti?'seeking'===xi.state.mode:!io&&!ai&&'connecting'===ni.state,en=(0,n.useCallback)(()=>{hi.current?.retry()},[]),tn='error'===ni.state||'error'===xi.state.mode,an=ni.reason,on=ni.state,nn=(0,n.useMemo)(()=>io?qe:{failed:tn,fetching:'connecting'===on,reason:'error'===on?an??null:null,onRetry:en},[io,tn,on,an,en]),ln=(0,n.useCallback)(()=>{const e=(0,x.selectActiveEpoch)(xi.state),t=(0,E.resolveJogBase)(xi.state.playhead,e),o=(0,E.jogTarget)(t,-1);W.log.debug('playback:jog','jogBack',{playhead:xi.state.playhead,active:e,base:t,target:o,mode:xi.state.mode}),null!=o&&Di(o,'timeline')},[xi,Di]),rn=(0,n.useCallback)(()=>{const e=(0,x.selectActiveEpoch)(xi.state),t=(0,E.resolveJogBase)(xi.state.playhead,e),o=(0,E.jogTarget)(t,1);W.log.debug('playback:jog','jogForward',{playhead:xi.state.playhead,active:e,base:t,target:o,mode:xi.state.mode}),null!=o&&Di(o,'timeline')},[xi,Di]),sn=(0,Ye.jsx)(_.default.View,{style:lo?[ut.videoWrapFull,Mo]:Qa?[ut.videoWrap,{width:So.streamWidth,height:So.streamHeight}]:Eo?[ut.videoWrap,Mo]:[ut.videoWrap,{height:ko}],children:(0,Ye.jsxs)(s.default,{style:ut.videoContent,children:[(0,Ye.jsxs)(_.default.View,{style:[Ro,Po.videoStyle],children:[St?(0,Ye.jsxs)(s.default,{style:ut.disabledStage,children:[(0,Ye.jsx)(We.PowerOff,{size:34,color:"#9aa0a6"}),(0,Ye.jsx)(c.default,{style:ut.disabledTitle,children:o('v2.cameras.disabledTitle')}),(0,Ye.jsx)(c.default,{style:ut.disabledHint,children:o('v2.cameras.disabledHint')})]}):Wi?(0,Ye.jsx)(R.LiveView,{ref:hi,deviceId:e,muted:Ui,target:Bt,showStats:Qi&&!1,highlight:void 0,initialSeekMs:ki,onPlaybackState:Ni,onPlayerState:li,onPosition:wa,onLiveCaptureError:()=>{bi.current=!1,gi(!1),pi(null),xe({title:o('v2.theater.recordLive'),message:o('v2.theater.recordFailed')})},onScrubDrawn:ba,onServedProfile:Ji},wi):(0,Ye.jsx)(ct,{deviceId:e,fill:lo,enabled:Uo.isLive}),qi&&Vo?(0,Ye.jsx)(ee.MotionRegionsOverlay,{deviceId:e,enabled:qi}):null,Zi&&Vo?(0,Ye.jsx)(Q.MotionBoxesOverlay,{deviceId:e,enabled:Zi}):null,Ki&&Vo?(0,Ye.jsx)(X.StationaryBoxesOverlay,{deviceId:e,enabled:Ki}):null,$i&&Vo?(0,Ye.jsx)(te.DiscardedBoxesOverlay,{deviceId:e,enabled:$i}):null]}),(0,Ye.jsx)(b.GestureDetector,{gesture:Ao,children:(0,Ye.jsx)(_.default.View,{style:u.default.absoluteFill})}),'off'!==Xi&&Vo?(0,Ye.jsx)(ie.AudioLevelMeter,{deviceId:e,position:Xi,onSetPosition:La}):null,null===sa||ua?null:(0,Ye.jsx)(oe.ZoneActiveOverlay,{zone:sa}),'gap'===xi.state.mode?(0,Ye.jsxs)(s.default,{pointerEvents:"none",style:[u.default.absoluteFill,ut.noRecOverlay],children:[(0,Ye.jsx)(We.VideoOff,{size:28,color:"#9aa0a6"}),(0,Ye.jsx)(c.default,{style:ut.noRecTitle,children:o('v2.theater.noRecording')}),(0,Ye.jsx)(c.default,{style:ut.noRecHint,children:o('v2.theater.noRecordingHint')})]}):null,Zo&&Vo&&Rt.highlightBorder?(0,Ye.jsx)(s.default,{pointerEvents:"none",style:[u.default.absoluteFill,{borderWidth:wt.highlight.thickness,borderColor:'motion'===Zo?wt.highlight.motionColor:'audio'===Zo?wt.highlight.audioColor:wt.highlight.detectionColor}]}):null,ia?(0,Ye.jsxs)(s.default,{style:ut.nameTag,pointerEvents:"none",children:[Wt&&!St?(0,Ye.jsx)(We.Moon,{size:12,color:"#fafaf9"}):(0,Ye.jsx)(Le.CameraStatusDot,{deviceId:e,online:vt,disabled:St,size:9}),(0,Ye.jsx)(c.default,{style:ut.nameText,numberOfLines:1,children:ft})]}):null,(0,Ye.jsx)(je.DoorbellBadge,{deviceId:e,enabled:Dt&&Vo}),(0,Ye.jsx)(Ie.OccupancyBadge,{deviceId:e,enabled:'off'!==Rt.occupancy&&Uo.isLive&&!ai,corner:'off'===Rt.occupancy?'bottom-left':Rt.occupancy}),(0,Ye.jsx)(Je.OverlayReadouts,{deviceId:e,config:Rt,enabled:Vo&&Uo.isLive}),Qi?(0,Ye.jsx)(K.StreamStatsOverlay,{getStats:Ga}):null,(0,Ye.jsx)(V.StreamOverlayControls,{visible:ia,onRequestHide:ja,paused:Ko,onTogglePause:Qo,showPlayPause:so,muted:Ui,onToggleMute:_a,hasTwoWayAudio:Ot,talking:Ja,onToggleTalk:Ua,onStartSystemPip:Fa,fullscreen:ea,onToggleFullscreen:No,edgePad:lo?{left:ht.left,right:ht.right,bottom:ht.bottom}:void 0,timelineToggle:lo?{expanded:oa,onToggle:()=>na(e=>!e)}:void 0}),lo&&Tt&&Yo?(0,Ye.jsx)(Y.DriveOverlay,{deviceId:e,visible:ia,edgePad:{left:ht.left,right:ht.right,bottom:ht.bottom},onOpenControls:ra,drawer:{open:oa,width:(0,q.drawerWidth)(mt)}}):null,ua?(0,Ye.jsx)(ae.ZoneDrawOverlay,{zone:sa,onConfirm:pa,onCancel:va}):null]})}),cn=[{id:'back',icon:We.ArrowLeft,label:o('v2.common.back'),active:!1,onPress:()=>(0,I.backToCameras)(Te,Ha),cluster:'left'},{id:'timeline',icon:We.History,label:o(oa?'v2.timeline.hideTimeline':'v2.timeline.showTimeline'),active:oa,onPress:()=>na(e=>!e),cluster:'left'},{id:'fullscreen',icon:ea?We.Minimize2:We.Maximize2,label:o(ea?'v2.streamBar.exitFullscreen':'v2.streamBar.fullscreen'),active:ea,onPress:No,cluster:'right'}],un=io?(0,Ye.jsxs)(s.default,{testID:et,style:[ut.wallWrap,(0,de.wallBoxStyle)({mode:Ka,wideStreamWidth:So.streamWidth,portraitStreamHeight:Ho.streamHeight})],children:[(0,Ye.jsx)(ce.WorkspaceStage,{devices:to,quality:It,highlight:$o,showBoxes:Zi,onGoTo:ya,onCellPanel:xa}),lo?(0,Ye.jsx)(Z.OverlayDiscGroup,{visible:!0,holdOpen:!0,onRequestHide:$e,items:cn,edgePad:{left:ht.left,right:ht.right,bottom:ht.bottom}}):null]}):null,dn=(0,me.fanOutPlaybackToWall)({primary:{onSeek:Di,onScrubBegin:xi.beginScrub,onScrubMove:xi.moveScrub,onScrubCommit:Pi,onGoLive:xi.goLive,onTogglePlayPause:Qo,onSelectRate:Ri},broadcast:ge.gridPlaybackBus.broadcast,paused:Ko});return(0,Ye.jsxs)(s.default,{style:ut.screenRow,children:[Ya&&!lo?(0,Ye.jsx)(j.SideNavRail,{pathname:Za,compact:qa}):null,(0,Ye.jsxs)(s.default,{ref:zo,onLayout:ho,style:{flex:1,minWidth:0,backgroundColor:st.background,paddingTop:lo?0:ht.top},children:[(0,Ye.jsx)(S.StatusBar,{hidden:lo,style:lo||'dark'===dt?'light':'dark'}),(0,Ye.jsx)(le.TheaterTimeline,{ref:la,layoutMode:Ka,railWidth:So.railWidth,stream:un??sn,belowStream:(0,ue.shouldShowCameraShelf)(Ka)?(0,Ye.jsx)(se.BelowStreamArea,{width:So.streamWidth,currentDeviceId:e,wallShowing:io,onGoTo:ya,onCellPanel:xa}):null,deviceId:e,scopeIds:to,hideBack:Qa,drawerExpanded:oa,name:ft,onBack:()=>(0,I.backToCameras)(Te,Ha),deviceBinding:{cameraName:ft,hasPtz:kt,hasBattery:Ct,hasNetworkLink:xt,hasNavigation:Tt,cameraJump:{onSwitchCamera:ya,onOpenAdhocGrid:oo,cameraSelection:ao}},singleCamera:Object.assign({streamBinding:{quality:It,onSelectQuality:Mt},viewOptionsBinding:{highlight:Ft,onSetHighlight:Gt},overlayBinding:{config:Rt,onChange:zt},onOpenLinkedDevices:()=>{xa('devices',e)},linkedDevicesOpen:'devices'===Wa?.kind&&Wa.deviceId===e},io?{}:{zone:{zoneRect:sa,onRequestZoneDraw:ga,onClearZone:fa}}),mode:xi.state.mode,activeEpoch:(0,x.selectActiveEpoch)(xi.state),seekAnchor:xi.state.seekAnchor,onSeek:dn.onSeek,onScrubBegin:dn.onScrubBegin,onScrubMove:dn.onScrubMove,onScrubCommit:dn.onScrubCommit,onGoLive:dn.onGoLive,liveLocked:xi.state.liveLocked,onToggleLiveLock:xi.toggleLiveLock,liveCapture:io?void 0:Ai,exportSelection:io?void 0:Bi,playbackRate:si,paused:Ko,servedTier:Gi,onTogglePlayPause:dn.onTogglePlayPause,loading:Xo,streamFault:nn,scrubDirection:(0,x.selectScrubDirection)(xi.state),onJogBack:ln,onJogForward:rn,onStepFrame:zi,onSelectRate:dn.onSelectRate}),fo?(0,Ye.jsx)(A.BottomNavBar,{pathname:Za,insetBottom:ht.bottom}):null,(0,Ye.jsx)(Se.GridCellPanelOverlay,{panel:Wa,cameraName:Da,hasPtz:Pa,onSelect:t=>Ca({kind:t,deviceId:Wa?.deviceId??e}),onClose:Ta})]})]})};var o=r(_d[0]),n=r(_d[1]),l=r(_d[2]),s=e(r(_d[3])),c=e(r(_d[4])),u=e(r(_d[5])),d=e(r(_d[6]));r(_d[7]);var h=r(_d[8]),m=r(_d[9]),f=r(_d[10]),p=r(_d[11]),v=r(_d[12]),S=r(_d[13]),b=r(_d[14]),w=r(_d[15]),_=e(w),y=t(r(_d[16])),k=t(r(_d[17])),C=r(_d[18]),H=r(_d[19]),x=r(_d[20]),T=r(_d[21]),E=r(_d[22]),W=r(_d[23]),O=r(_d[24]),D=r(_d[25]),P=r(_d[26]),L=r(_d[27]),I=r(_d[28]),j=r(_d[29]),A=r(_d[30]),B=r(_d[31]),M=r(_d[32]),R=r(_d[33]),z=r(_d[34]),F=r(_d[35]),G=r(_d[36]),J=r(_d[37]),N=r(_d[38]),U=r(_d[39]),V=r(_d[40]),Y=r(_d[41]),q=r(_d[42]),Z=r(_d[43]),$=r(_d[44]),K=r(_d[45]),Q=r(_d[46]),X=r(_d[47]),ee=r(_d[48]),te=r(_d[49]),ie=r(_d[50]),ae=r(_d[51]),oe=r(_d[52]),ne=r(_d[53]),le=r(_d[54]),re=r(_d[55]),se=r(_d[56]),ce=r(_d[57]),ue=r(_d[58]),de=r(_d[59]),he=r(_d[60]),me=r(_d[61]),ge=r(_d[62]),fe=r(_d[63]),pe=r(_d[64]),ve=r(_d[65]),Se=r(_d[66]),be=r(_d[67]),we=r(_d[68]),ye=r(_d[69]),ke=r(_d[70]),Ce=r(_d[71]),He=r(_d[72]),xe=r(_d[73]),Te=r(_d[74]),Ee=r(_d[75]),We=r(_d[76]),Oe=r(_d[77]),De=r(_d[78]),Pe=r(_d[79]),Le=r(_d[80]),Ie=r(_d[81]),je=r(_d[82]),Ae=r(_d[83]),Be=r(_d[84]),Me=r(_d[85]),Re=r(_d[86]),ze=r(_d[87]),Fe=r(_d[88]),Ge=r(_d[89]),Je=r(_d[90]),Ne=r(_d[91]),Ue=r(_d[92]),Ve=r(_d[93]),Ye=r(_d[94]);const qe={failed:!1,fetching:!1,reason:null,onRetry:()=>{}};function Ze(e,t,o){return null===e||e.wall!==t?t?'pictureToWall':'wallToPicture':t&&e.mode!==o?'wallReshaped':null}const $e=()=>{},Ke=.5,Qe=2.5;function Xe(e){const t=(0,o.c)(19),{t:n}=(0,f.useTranslation)(),{data:l}=(0,Ee.useCameras)();let s;t[0]!==l?(s=void 0===l?[]:l,t[0]=l,t[1]=s):s=t[1];const c=s;let u;if(t[2]!==c||t[3]!==e){let o;t[5]!==e?(o=t=>t.id===e,t[5]=e,t[6]=o):o=t[6],u=c.find(o),t[2]=c,t[3]=e,t[4]=u}else u=t[4];const d=u;let h,m;t[7]!==d?.name||t[8]!==e||t[9]!==n?(h=d?.name??n("v2.cameraDetail.fallbackName",{id:e}),t[7]=d?.name,t[8]=e,t[9]=n,t[10]=h):h=t[10],t[11]!==d?.features?(m=d?.features??[],t[11]=d?.features,t[12]=m):m=t[12];const p=d?.online??!1,v=d?.disabled??!1,S=void 0!==d;let b;return t[13]!==h||t[14]!==m||t[15]!==p||t[16]!==v||t[17]!==S?(b={name:h,features:m,online:p,disabled:v,known:S},t[13]=h,t[14]=m,t[15]=p,t[16]=v,t[17]=S,t[18]=b):b=t[18],b}const et='wall-stage',tt={code:"function CameraDetailScreenTsx1(committedScale){const{fill,winHeight,isWideDetail,wideStreamH,pinchExpandsHeight,defaultHeight,interpolate,HEIGHT_GROW_SCALE,maxHeight,Extrapolation}=this.__closure;if(fill)return winHeight;if(isWideDetail)return wideStreamH;if(!pinchExpandsHeight)return defaultHeight;return interpolate(committedScale,[1,HEIGHT_GROW_SCALE],[defaultHeight,maxHeight],Extrapolation.CLAMP);}"},it={code:"function CameraDetailScreenTsx2(){const{runOnJS,onToggleControls}=this.__closure;runOnJS(onToggleControls)();}"},at={code:"function CameraDetailScreenTsx3(e_0){const{zoom}=this.__closure;zoom.stepZoomAt(e_0.x,e_0.y);}"},ot={code:"function CameraDetailScreenTsx4(e_1){const{shouldStartPipOnSwipe,zoom,runOnJS,onSwipeToPip}=this.__closure;if(shouldStartPipOnSwipe({translationY:e_1.translationY,velocityY:e_1.velocityY,zoomScale:zoom.scale.value})){runOnJS(onSwipeToPip)();}}"},nt={code:"function CameraDetailScreenTsx5(){const{zoomBoxHeightFor,zoom,fill,isWideDetail,pinchExpandsHeight,withTiming}=this.__closure;const target=zoomBoxHeightFor(zoom.committedScale.value);if(fill||isWideDetail||!pinchExpandsHeight)return target;return withTiming(target);}"},lt={code:"function CameraDetailScreenTsx6(){const{liveBoxHeight}=this.__closure;return{height:liveBoxHeight.value};}"},rt={code:"function CameraDetailScreenTsx7(){const{fill,winWidth,winHeight,isWideDetail,wideStreamW,wideStreamH,liveBoxHeight}=this.__closure;if(fill){return{position:'absolute',top:0,left:0,width:winWidth,height:winHeight};}if(isWideDetail){return{position:'absolute',top:0,left:0,width:wideStreamW,height:wideStreamH};}const h=liveBoxHeight.value;const coverWidth=Math.max(winWidth,h*16/9);return{position:'absolute',top:0,left:(winWidth-coverWidth)/2,width:coverWidth,height:h};}"};const st=960;function ct(e){const t=(0,o.c)(9),{deviceId:n,fill:l,enabled:c}=e,d=(0,xe.useSnapshot)(n,c,st);let m;t[0]!==d.uri?(m=null===d.uri?(0,Ye.jsx)(h.SkeletonBox,{}):null,t[0]=d.uri,t[1]=m):m=t[1];const f=l?"contain":"cover";let p,v;return t[2]!==n||t[3]!==d||t[4]!==f?(p=(0,Ye.jsx)(Te.SnapshotImage,{source:d,deviceId:n,style:u.default.absoluteFill,contentFit:f}),t[2]=n,t[3]=d,t[4]=f,t[5]=p):p=t[5],t[6]!==m||t[7]!==p?(v=(0,Ye.jsxs)(s.default,{style:ut.poster,children:[m,p]}),t[6]=m,t[7]=p,t[8]=v):v=t[8],v}const ut=u.default.create({screenRow:{flex:1,flexDirection:'row'},videoWrap:{position:'relative',width:'100%',overflow:'hidden',backgroundColor:'#000'},wallWrap:{overflow:'hidden'},videoWrapFull:Object.assign({},u.default.absoluteFill,{backgroundColor:'#000'}),videoContent:{flex:1,overflow:'hidden'},disabledStage:{flex:1,alignItems:'center',justifyContent:'center',gap:4,backgroundColor:'#000'},disabledTitle:{color:'#e8eaed',fontSize:15,fontWeight:'700'},disabledHint:{color:'#9aa0a6',fontSize:12},noRecOverlay:{alignItems:'center',justifyContent:'center',gap:6,backgroundColor:'rgba(0,0,0,0.55)'},noRecTitle:{color:'#e8eaed',fontSize:15,fontWeight:'600'},noRecHint:{color:'#9aa0a6',fontSize:12},poster:{flex:1,backgroundColor:'#000'},nameTag:{position:'absolute',top:8,left:8,maxWidth:'70%',flexDirection:'row',alignItems:'center',gap:6,paddingHorizontal:8,paddingVertical:4,borderRadius:6,backgroundColor:'#00000080'},nameText:{color:'#fafaf9',fontSize:13,fontWeight:'600'}})},2091,[15,17,2092,20,198,33,277,131,1598,1815,995,743,466,2093,1685,1173,1591,1959,2095,2096,2100,2105,2102,1115,2106,2107,2108,2109,1121,990,1126,1127,782,2110,2121,2122,2123,1893,2125,2126,2127,2129,2131,2128,2132,2133,2134,2136,2137,2138,2140,2142,2143,2144,2145,2148,2221,2230,2228,2245,2229,2246,2237,2192,2222,2247,2248,1124,2227,2249,2150,2250,791,1574,1611,1512,794,1602,1603,1608,1641,1650,2251,2135,2253,2141,1822,2254,1565,1567,2255,2240,1881,2241,10]);
3467
3467
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"idleScrubFirstFrame",{enumerable:!0,get:function(){return n}}),e.markScrubStart=s,e.noteScrubDrawn=u,e.scrubDragStarted=function(){c=s(Date.now())},e.scrubFramePainted=function(n){const s=u(c,Date.now());if(c=s.state,null===s.firstFrameMs)return;t.log.info('scrub:first-frame','first scrub frame painted',{deviceId:n,ms:s.firstFrameMs})};var t=r(d[0]);const n={startedAtMs:null,drawn:!1};function s(t){return{startedAtMs:t,drawn:!1}}function u(t,n){return null===t.startedAtMs||t.drawn?{state:t,firstFrameMs:null}:{state:{startedAtMs:t.startedAtMs,drawn:!0},firstFrameMs:Math.max(0,Math.round(n-t.startedAtMs))}}let c=n},2092,[1115]);
3468
3468
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"StatusBar",{enumerable:!0,get:function(){return t.StatusBar}}),Object.defineProperty(e,"setStatusBarStyle",{enumerable:!0,get:function(){return t.setStatusBarStyle}}),Object.defineProperty(e,"setStatusBarHidden",{enumerable:!0,get:function(){return t.setStatusBarHidden}});var t=r(d[0])},2093,[2094]);
3469
3469
  __d(function(g,r,i,a,m,_e,d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(_e,'__esModule',{value:!0}),_e.StatusBar=s,Object.defineProperty(_e,"setStatusBarStyle",{enumerable:!0,get:function(){return c}}),Object.defineProperty(_e,"setStatusBarHidden",{enumerable:!0,get:function(){return f}});var t=e(r(d[0])),n=e(r(d[1])),u=e(r(d[2])),l=e(r(d[3])),o=r(d[4]);function s({style:e,hideTransitionAnimation:n,animated:s,hidden:c}){const f=(0,l.default)(),y=t.default.useMemo(()=>h(e,f),[e,f]);return(0,o.jsx)(u.default,{animated:s,hidden:c,barStyle:y,showHideTransition:'none'===n?void 0:n})}s.setStyle=(e,t)=>u.default.setBarStyle(h(e),t);const c=s.setStyle;s.setHidden=(e,t)=>u.default.setHidden(e,t);const f=s.setHidden;function h(e="auto",t=n.default?.getColorScheme()??'light'){t||(t='light');let u=e;return'auto'===e?u='light'===t?'dark':'light':'inverted'===e&&(u='light'===t?'light':'dark'),'light'===u?'light-content':'dark-content'}},2094,[17,219,259,275,10]);
@@ -3495,7 +3495,7 @@ __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{v
3495
3495
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.playbackCommandToScript=function(t){return`try{${(()=>{switch(t.kind){case'playRecorded':return`window.__camstackEmbed.playRecorded(${t.deviceId},${t.epochMs},${JSON.stringify(t.profile)})`;case'seek':return`window.__camstackEmbed.seek(${t.epochMs})`;case'scrubStart':return void 0!==t.dragId?`window.__camstackEmbed.scrubStart(${JSON.stringify(t.dragId)})`:"window.__camstackEmbed.scrubStart()";case'scrubTo':return void 0!==t.m&&void 0!==t.v?`window.__camstackEmbed.scrubTo(${t.epochMs},${JSON.stringify(t.m)},${Math.round(t.v)})`:`window.__camstackEmbed.scrubTo(${t.epochMs})`;case'scrubEnd':return`window.__camstackEmbed.scrubEnd(${t.epochMs})`;case'timelineWarm':return`window.__camstackEmbed.timelineWarm(${t.epochMs})`;case'scrubCommit':return void 0!==t.dragId?`window.__camstackEmbed.scrubCommit(${t.epochMs},${JSON.stringify(t.dragId)})`:`window.__camstackEmbed.scrubCommit(${t.epochMs})`;case'setRate':return`window.__camstackEmbed.setRate(${t.rate})`;case'stepFrame':return`window.__camstackEmbed.stepFrame(${t.dir})`;case'goLive':return"window.__camstackEmbed.goLive()";case'startLiveCapture':return"window.__camstackEmbed.startLiveCapture()";case'stopLiveCapture':return"window.__camstackEmbed.stopLiveCapture()"}})()}}catch(e){}; true;`},e.playbackCommandToMessage=function(t){switch(t.kind){case'playRecorded':return{kind:'playRecorded',deviceId:t.deviceId,epochMs:t.epochMs,profile:t.profile};case'seek':return{kind:'seek',value:t.epochMs};case'scrubStart':return void 0!==t.dragId?{kind:'scrubStart',dragId:t.dragId}:{kind:'scrubStart'};case'scrubTo':return void 0!==t.m&&void 0!==t.v?{kind:'scrubTo',value:t.epochMs,m:t.m,v:Math.round(t.v)}:{kind:'scrubTo',value:t.epochMs};case'scrubEnd':return{kind:'scrubEnd',value:t.epochMs};case'timelineWarm':return{kind:'timelineWarm',value:t.epochMs};case'scrubCommit':return void 0!==t.dragId?{kind:'scrubCommit',value:t.epochMs,dragId:t.dragId}:{kind:'scrubCommit',value:t.epochMs};case'setRate':return{kind:'setRate',value:t.rate};case'stepFrame':return{kind:'stepFrame',dir:t.dir};case'goLive':return{kind:'goLive'};case'startLiveCapture':return{kind:'startLiveCapture'};case'stopLiveCapture':return{kind:'stopLiveCapture'}}}},2120,[]);
3496
3496
  __d(function(g,r,_i,a,_m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"LIVE_CAPTURE_CHUNK_CHARS",{enumerable:!0,get:function(){return t}}),e.splitBase64Chunks=function(n,i=t){if(i<=0)return[n];const p=[];for(let t=0;t<n.length;t+=i)p.push(n.slice(t,t+i));return 0===p.length?['']:p},e.parseLiveCaptureMessage=n,e.parseLiveCapturePayload=function(t){if('string'==typeof t)try{return n(JSON.parse(t))}catch{return null}return n(t)},Object.defineProperty(e,"LiveCaptureAssembler",{enumerable:!0,get:function(){return i}}),e.captureFileExtension=function(t){return t.includes('webm')?'webm':'mp4'};const t=24e4;function n(t){if('object'!=typeof t||null===t)return null;const n=t;return'liveCaptureStart'===n.type?'string'!=typeof n.id||'string'!=typeof n.mime?null:{type:'liveCaptureStart',id:n.id,mime:n.mime}:'liveCaptureChunk'===n.type?'string'!=typeof n.id||'string'!=typeof n.data||'number'!=typeof n.index||'number'!=typeof n.total?null:{type:'liveCaptureChunk',id:n.id,index:n.index,total:n.total,data:n.data}:'liveCaptureDone'===n.type?'string'!=typeof n.id?null:{type:'liveCaptureDone',id:n.id}:'liveCaptureError'===n.type?'string'!=typeof n.message?null:{type:'liveCaptureError',message:n.message}:null}class i{pending=new Map;push(t){if('liveCaptureError'===t.type)return this.pending.clear(),{kind:'error',message:t.message};if('liveCaptureStart'===t.type)return this.pending.set(t.id,{mime:t.mime,total:0,parts:[]}),null;if('liveCaptureChunk'===t.type){let n=this.pending.get(t.id);return n||(n={mime:'video/mp4',total:t.total,parts:[]},this.pending.set(t.id,n)),n.total=t.total,n.parts[t.index]=t.data,null}const n=this.pending.get(t.id);if(this.pending.delete(t.id),!n||n.total<=0)return{kind:'error',message:'incomplete capture'};const i=[];for(let t=0;t<n.total;t++){const p=n.parts[t];if('string'!=typeof p)return{kind:'error',message:'incomplete capture'};i.push(p)}return{kind:'complete',mime:n.mime,base64:i.join('')}}}},2121,[]);
3497
3497
  __d(function(g,_r,i,_a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"MIN_EXPORT_SELECTION_MS",{enumerable:!0,get:function(){return n}}),Object.defineProperty(e,"EXPORT_SELECTION_PROFILE",{enumerable:!0,get:function(){return t}}),Object.defineProperty(e,"EXPORT_SELECTION_LIFE_MS",{enumerable:!0,get:function(){return r}}),e.resolveExportSelection=o,e.isSavableSelection=u,e.missingMsInSelection=function(n,t){return t.durationMs-a(n,t)},e.selectionCoverage=c,e.formatSelectionDuration=s,e.describeExportSelection=function(n,t,r,a,l,f){const M=o(n,t,f),h=null===M?'unknown':c(r,a,l,M);return{armed:null!==n,range:M,coverage:h,durationLabel:s(M?.durationMs??0),canSave:u(M)&&'absent'!==h,warn:'partial'===h}};const n=1e3,t='high',r=6048e5;function o(n,t,r){if(null===n||null===t)return null;const o=Math.min(n,r),u=Math.min(t,r),a=Math.min(o,u),c=Math.max(o,u);return{fromMs:a,toMs:c,durationMs:c-a}}function u(t){return null!==t&&t.durationMs>=n}function a(n,t){let r=0;for(const o of n){const n=Math.max(o.startMs,t.fromMs),u=Math.min(o.endMs,t.toMs);u>n&&(r+=u-n)}return r}function c(n,t,r,o){if(0===n.length)return'unknown';if(o.fromMs<t||o.toMs>r)return'unknown';const u=a(n,o);return u<=0?'absent':u>=o.durationMs?'covered':'partial'}function l(n){return n<10?`0${n}`:String(n)}function s(n){const t=Math.max(0,Math.floor(n/1e3)),r=t%60,o=Math.floor(t/60)%60,u=Math.floor(t/3600);return u>0?`${u}:${l(o)}:${l(r)}`:`${o}:${l(r)}`}},2122,[]);
3498
- __d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),_e.useStreamZoom=function(l=h,A="contain"){const T=(0,c.useSharedValue)(0),E=(0,c.useSharedValue)(0),P=(0,c.useSharedValue)(1),H=(0,c.useSharedValue)(1),X=(0,c.useSharedValue)(0),Y=(0,c.useSharedValue)(0),W=(0,c.useSharedValue)(0),V=(0,c.useSharedValue)(0),k=(0,c.useSharedValue)(1),L=(0,c.useSharedValue)(0),C=(0,c.useSharedValue)(0),O=(0,c.useSharedValue)(0),N=(0,c.useSharedValue)(0),Z=(0,c.useSharedValue)(!1),F=(0,t.useCallback)(()=>{P.value=1,H.value=1,X.value=0,Y.value=0,W.value=0,V.value=0},[P,H,X,Y,W,V]),b=(0,t.useCallback)(()=>{if(Z.value)return;const t=T.value,n=E.value;if(t<v||n<v)return;const o=(0,e.clampPan)({tx:W.value,ty:V.value,w:t,h:n,aspect:l,scale:H.value,fit:A});o.x===W.value&&o.y===V.value||(W.value=o.x,V.value=o.y,X.value=(0,c.withTiming)(o.x),Y.value=(0,c.withTiming)(o.y))},[Z,T,E,W,V,H,X,Y,l,A]),I=(0,t.useCallback)(t=>{T.value=t.nativeEvent.layout.width,E.value=t.nativeEvent.layout.height,b()},[T,E,b]),J=(0,t.useMemo)(()=>o.Gesture.Pinch().onStart((function({_worklet_565117421853_init_data:t,pinchActive:e,pinchStartScale:n,savedScale:l,pinchViewportW:o,layoutWidth:c,pinchViewportH:u,layoutHeight:s,pinchFocalX:v,pinchFocalY:h}){const _=function(t){e.value=!0,n.value=l.value,o.value=c.value,u.value=s.value,v.value=t.focalX,h.value=t.focalY};return _.__closure={pinchActive:e,pinchStartScale:n,savedScale:l,pinchViewportW:o,layoutWidth:c,pinchViewportH:u,layoutHeight:s,pinchFocalX:v,pinchFocalY:h},_.__workletHash=565117421853,_.__initData=t,_})({_worklet_565117421853_init_data:f,pinchActive:Z,pinchStartScale:k,savedScale:H,pinchViewportW:O,layoutWidth:T,pinchViewportH:N,layoutHeight:E,pinchFocalX:L,pinchFocalY:C})).onUpdate((function({_worklet_5172111017037_init_data:t,pinchViewportW:e,layoutWidth:n,pinchViewportH:l,layoutHeight:o,MIN_LAYOUT:c,pinchStartScale:u,MIN_SCALE:s,MAX_SCALE:v,scale:h,tx:_,ty:p,focalPan:y,pinchFocalX:x,savedTx:f,pinchFocalY:S,savedTy:M,streamPanExtent:w,contentAspect:A,fit:T}){const E=function(t){if(t.numberOfPointers<2)return;const E=e.value||n.value,P=l.value||o.value;if(E<c||P<c)return;const H=u.value,X=Math.max(s,Math.min(v,H*t.scale));if(h.value=X,X<=s)_.value=0,p.value=0;else{const e=y({focalNow:t.focalX,focalStart:x.value,center:E/2,panStart:f.value,scaleStart:H,scaleAfter:X}),n=y({focalNow:t.focalY,focalStart:S.value,center:P/2,panStart:M.value,scaleStart:H,scaleAfter:X}),{x:l,y:o}=w(E,P,A,X,T);_.value=Math.max(-l,Math.min(l,e)),p.value=Math.max(-o,Math.min(o,n))}};return E.__closure={pinchViewportW:e,layoutWidth:n,pinchViewportH:l,layoutHeight:o,MIN_LAYOUT:c,pinchStartScale:u,MIN_SCALE:s,MAX_SCALE:v,scale:h,tx:_,ty:p,focalPan:y,pinchFocalX:x,savedTx:f,pinchFocalY:S,savedTy:M,streamPanExtent:w,contentAspect:A,fit:T},E.__workletHash=5172111017037,E.__initData=t,E})({_worklet_5172111017037_init_data:x,pinchViewportW:O,layoutWidth:T,pinchViewportH:N,layoutHeight:E,MIN_LAYOUT:v,pinchStartScale:k,MIN_SCALE:u,MAX_SCALE:s,scale:P,tx:X,ty:Y,focalPan:n.focalPan,pinchFocalX:L,savedTx:W,pinchFocalY:C,savedTy:V,streamPanExtent:e.streamPanExtent,contentAspect:l,fit:A})).onEnd((function({_worklet_6369229637434_init_data:t,pinchActive:e,savedScale:n,scale:l,layoutWidth:o,layoutHeight:c,clampPan:u,tx:s,ty:v,contentAspect:h,fit:_,savedTx:p,savedTy:y,withTiming:x,streamPanExtent:f,runOnJS:S,reportZoom:M}){const w=function(){e.value=!1,n.value=l.value;const t=o.value,w=c.value,A=u({tx:s.value,ty:v.value,w:t,h:w,aspect:h,scale:l.value,fit:_});p.value=A.x,y.value=A.y,A.x!==s.value&&(s.value=x(A.x)),A.y!==v.value&&(v.value=x(A.y));const{x:T,y:E}=f(t,w,h,l.value,_);S(M)('pinch',{viewportW:Math.round(t),viewportH:Math.round(w),viewportAspect:w>0?Math.round(t/w*100)/100:0,contentAspect:Math.round(100*h)/100,fitCover:'cover'===_?1:0,scale:Math.round(100*l.value)/100,panExtentX:Math.round(T),panExtentY:Math.round(E),tx:Math.round(A.x),ty:Math.round(A.y)})};return w.__closure={pinchActive:e,savedScale:n,scale:l,layoutWidth:o,layoutHeight:c,clampPan:u,tx:s,ty:v,contentAspect:h,fit:_,savedTx:p,savedTy:y,withTiming:x,streamPanExtent:f,runOnJS:S,reportZoom:M},w.__workletHash=6369229637434,w.__initData=t,w})({_worklet_6369229637434_init_data:y,pinchActive:Z,savedScale:H,scale:P,layoutWidth:T,layoutHeight:E,clampPan:e.clampPan,tx:X,ty:Y,contentAspect:l,fit:A,savedTx:W,savedTy:V,withTiming:c.withTiming,streamPanExtent:e.streamPanExtent,runOnJS:c.runOnJS,reportZoom:_})).onFinalize((function({_worklet_7265965810878_init_data:t,pinchActive:e}){const n=function(){e.value=!1};return n.__closure={pinchActive:e},n.__workletHash=7265965810878,n.__initData=t,n})({_worklet_7265965810878_init_data:p,pinchActive:Z})),[Z,k,H,T,E,P,X,Y,W,V,l,A,L,C,O,N]),D=(0,t.useMemo)(()=>o.Gesture.Pan().maxPointers(1).minDistance(4).onUpdate((function({_worklet_17099716300035_init_data:t,scale:e,MIN_SCALE:n,layoutWidth:l,layoutHeight:o,streamPanExtent:c,contentAspect:u,fit:s,tx:v,savedTx:h,ty:_,savedTy:p}){const y=function(t){if(e.value<=n)return;const y=l.value,x=o.value,f=e.value,{x:S,y:M}=c(y,x,u,f,s);v.value=Math.max(-S,Math.min(S,h.value+t.translationX)),_.value=Math.max(-M,Math.min(M,p.value+t.translationY))};return y.__closure={scale:e,MIN_SCALE:n,layoutWidth:l,layoutHeight:o,streamPanExtent:c,contentAspect:u,fit:s,tx:v,savedTx:h,ty:_,savedTy:p},y.__workletHash=0xf8d56840d03,y.__initData=t,y})({_worklet_17099716300035_init_data:M,scale:P,MIN_SCALE:u,layoutWidth:T,layoutHeight:E,streamPanExtent:e.streamPanExtent,contentAspect:l,fit:A,tx:X,savedTx:W,ty:Y,savedTy:V})).onEnd((function({_worklet_5096944522217_init_data:t,savedTx:e,tx:n,savedTy:l,ty:o,layoutWidth:c,layoutHeight:u,streamPanExtent:s,contentAspect:v,scale:h,fit:_,runOnJS:p,reportZoom:y}){const x=function(){e.value=n.value,l.value=o.value;const t=c.value,x=u.value,{x:f,y:S}=s(t,x,v,h.value,_);p(y)('pan',{viewportW:Math.round(t),viewportH:Math.round(x),viewportAspect:x>0?Math.round(t/x*100)/100:0,contentAspect:Math.round(100*v)/100,fitCover:'cover'===_?1:0,scale:Math.round(100*h.value)/100,panExtentX:Math.round(f),panExtentY:Math.round(S),tx:Math.round(n.value),ty:Math.round(o.value),atLimitX:Math.abs(Math.abs(n.value)-f)<1?1:0,atLimitY:Math.abs(Math.abs(o.value)-S)<1?1:0})};return x.__closure={savedTx:e,tx:n,savedTy:l,ty:o,layoutWidth:c,layoutHeight:u,streamPanExtent:s,contentAspect:v,scale:h,fit:_,runOnJS:p,reportZoom:y},x.__workletHash=5096944522217,x.__initData=t,x})({_worklet_5096944522217_init_data:S,savedTx:W,tx:X,savedTy:V,ty:Y,layoutWidth:T,layoutHeight:E,streamPanExtent:e.streamPanExtent,contentAspect:l,scale:P,fit:A,runOnJS:c.runOnJS,reportZoom:_})),[P,T,E,X,Y,W,V,l,A]),U=(0,c.useAnimatedStyle)((function({_worklet_9422712524641_init_data:t,tx:e,ty:n,scale:l}){const o=()=>({transform:[{translateX:e.value},{translateY:n.value},{scale:l.value}]});return o.__closure={tx:e,ty:n,scale:l},o.__workletHash=9422712524641,o.__initData=t,o})({_worklet_9422712524641_init_data:w,tx:X,ty:Y,scale:P})),z=(0,t.useCallback)(()=>{P.value=(0,c.withTiming)(1),H.value=1,X.value=(0,c.withTiming)(0),Y.value=(0,c.withTiming)(0),W.value=0,V.value=0},[P,H,X,Y,W,V]),G=(0,t.useCallback)((t,o)=>{const s=T.value,h=E.value,_=P.value,p=(0,n.nextZoomStep)(_);if(p<=u||s<v||h<v)return void z();const y=(0,n.focalPan)({focalNow:t,focalStart:t,center:s/2,panStart:X.value,scaleStart:_,scaleAfter:p}),x=(0,n.focalPan)({focalNow:o,focalStart:o,center:h/2,panStart:Y.value,scaleStart:_,scaleAfter:p}),{x:f,y:S}=(0,e.streamPanExtent)(s,h,l,p,A),M=Math.max(-f,Math.min(f,y)),w=Math.max(-S,Math.min(S,x));P.value=(0,c.withTiming)(p),H.value=p,X.value=(0,c.withTiming)(M),W.value=M,Y.value=(0,c.withTiming)(w),V.value=w},[T,E,P,H,X,Y,W,V,l,A,z]),j=(0,t.useCallback)((...t)=>o.Gesture.Simultaneous(J,D,...t),[J,D]);return{scale:P,videoStyle:U,onLayout:I,resetZoom:z,stepZoomAt:G,snapZoom:F,composeWith:j}};var t=r(d[0]),e=r(d[1]),n=r(d[2]),l=r(d[3]),o=r(d[4]),c=r(d[5]);const u=n.ZOOM_MIN,s=n.ZOOM_MAX,v=10,h=1.7777777777777777;function _(t,e){l.log.debug('live:zoom',`zoom ${t} end`,e)}const p={code:"function useStreamZoomTs1(){const{pinchActive}=this.__closure;pinchActive.value=false;}"},y={code:"function useStreamZoomTs2(){const{pinchActive,savedScale,scale,layoutWidth,layoutHeight,clampPan,tx,ty,contentAspect,fit,savedTx,savedTy,withTiming,streamPanExtent,runOnJS,reportZoom}=this.__closure;pinchActive.value=false;savedScale.value=scale.value;const w_1=layoutWidth.value;const h_1=layoutHeight.value;const settled_0=clampPan({tx:tx.value,ty:ty.value,w:w_1,h:h_1,aspect:contentAspect,scale:scale.value,fit:fit});savedTx.value=settled_0.x;savedTy.value=settled_0.y;if(settled_0.x!==tx.value)tx.value=withTiming(settled_0.x);if(settled_0.y!==ty.value)ty.value=withTiming(settled_0.y);const{x:limX_0,y:limY_0}=streamPanExtent(w_1,h_1,contentAspect,scale.value,fit);runOnJS(reportZoom)('pinch',{viewportW:Math.round(w_1),viewportH:Math.round(h_1),viewportAspect:h_1>0?Math.round(w_1/h_1*100)/100:0,contentAspect:Math.round(contentAspect*100)/100,fitCover:fit==='cover'?1:0,scale:Math.round(scale.value*100)/100,panExtentX:Math.round(limX_0),panExtentY:Math.round(limY_0),tx:Math.round(settled_0.x),ty:Math.round(settled_0.y)});}"},x={code:"function useStreamZoomTs3(e_1){const{pinchViewportW,layoutWidth,pinchViewportH,layoutHeight,MIN_LAYOUT,pinchStartScale,MIN_SCALE,MAX_SCALE,scale,tx,ty,focalPan,pinchFocalX,savedTx,pinchFocalY,savedTy,streamPanExtent,contentAspect,fit}=this.__closure;if(e_1.numberOfPointers<2)return;const w_0=pinchViewportW.value||layoutWidth.value;const h_0=pinchViewportH.value||layoutHeight.value;if(w_0<MIN_LAYOUT||h_0<MIN_LAYOUT)return;const s0=pinchStartScale.value;const s1=Math.max(MIN_SCALE,Math.min(MAX_SCALE,s0*e_1.scale));scale.value=s1;if(s1<=MIN_SCALE){tx.value=0;ty.value=0;}else{const ptx=focalPan({focalNow:e_1.focalX,focalStart:pinchFocalX.value,center:w_0/2,panStart:savedTx.value,scaleStart:s0,scaleAfter:s1});const pty=focalPan({focalNow:e_1.focalY,focalStart:pinchFocalY.value,center:h_0/2,panStart:savedTy.value,scaleStart:s0,scaleAfter:s1});const{x:limX,y:limY}=streamPanExtent(w_0,h_0,contentAspect,s1,fit);tx.value=Math.max(-limX,Math.min(limX,ptx));ty.value=Math.max(-limY,Math.min(limY,pty));}}"},f={code:"function useStreamZoomTs4(e_0){const{pinchActive,pinchStartScale,savedScale,pinchViewportW,layoutWidth,pinchViewportH,layoutHeight,pinchFocalX,pinchFocalY}=this.__closure;pinchActive.value=true;pinchStartScale.value=savedScale.value;pinchViewportW.value=layoutWidth.value;pinchViewportH.value=layoutHeight.value;pinchFocalX.value=e_0.focalX;pinchFocalY.value=e_0.focalY;}"},S={code:"function useStreamZoomTs5(){const{savedTx,tx,savedTy,ty,layoutWidth,layoutHeight,streamPanExtent,contentAspect,scale,fit,runOnJS,reportZoom}=this.__closure;savedTx.value=tx.value;savedTy.value=ty.value;const w_3=layoutWidth.value;const h_3=layoutHeight.value;const{x:limX_2,y:limY_2}=streamPanExtent(w_3,h_3,contentAspect,scale.value,fit);runOnJS(reportZoom)('pan',{viewportW:Math.round(w_3),viewportH:Math.round(h_3),viewportAspect:h_3>0?Math.round(w_3/h_3*100)/100:0,contentAspect:Math.round(contentAspect*100)/100,fitCover:fit==='cover'?1:0,scale:Math.round(scale.value*100)/100,panExtentX:Math.round(limX_2),panExtentY:Math.round(limY_2),tx:Math.round(tx.value),ty:Math.round(ty.value),atLimitX:Math.abs(Math.abs(tx.value)-limX_2)<1?1:0,atLimitY:Math.abs(Math.abs(ty.value)-limY_2)<1?1:0});}"},M={code:"function useStreamZoomTs6(e_2){const{scale,MIN_SCALE,layoutWidth,layoutHeight,streamPanExtent,contentAspect,fit,tx,savedTx,ty,savedTy}=this.__closure;if(scale.value<=MIN_SCALE)return;const w_2=layoutWidth.value;const h_2=layoutHeight.value;const s=scale.value;const{x:limX_1,y:limY_1}=streamPanExtent(w_2,h_2,contentAspect,s,fit);tx.value=Math.max(-limX_1,Math.min(limX_1,savedTx.value+e_2.translationX));ty.value=Math.max(-limY_1,Math.min(limY_1,savedTy.value+e_2.translationY));}"},w={code:"function useStreamZoomTs7(){const{tx,ty,scale}=this.__closure;return{transform:[{translateX:tx.value},{translateY:ty.value},{scale:scale.value}]};}"}},2123,[17,2124,1825,1115,1685,1173]);
3498
+ __d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),_e.useStreamZoom=function({contentAspect:o=_,fit:A,viewport:E}){const{width:P,heightFor:F}=E,X=(0,l.useSharedValue)(1),W=(0,l.useSharedValue)(1),I=(0,l.useSharedValue)(0),Y=(0,l.useSharedValue)(0),N=(0,l.useSharedValue)(0),Z=(0,l.useSharedValue)(0),O=(0,l.useSharedValue)(1),C=(0,l.useSharedValue)(0),k=(0,l.useSharedValue)(0),L=(0,t.useCallback)(()=>{X.value=1,W.value=1,I.value=0,Y.value=0,N.value=0,Z.value=0},[X,W,I,Y,N,Z]),V=(0,t.useCallback)((function({_worklet_486812392033_init_data:t,scale:e,withTiming:n,committedScale:o,tx:c,ty:l,savedTx:s,savedTy:u}){const h=function(){e.value=n(1),o.value=1,c.value=n(0),l.value=n(0),s.value=0,u.value=0};return h.__closure={scale:e,withTiming:n,committedScale:o,tx:c,ty:l,savedTx:s,savedTy:u},h.__workletHash=486812392033,h.__initData=t,h})({_worklet_486812392033_init_data:x,scale:X,withTiming:l.withTiming,committedScale:W,tx:I,ty:Y,savedTx:N,savedTy:Z}),[X,W,I,Y,N,Z]),b=(0,t.useMemo)(()=>c.Gesture.Pinch().onStart((function({_worklet_12657623867115_init_data:t,pinchStartScale:e,committedScale:n,pinchFocalX:o,pinchFocalY:c}){const l=function(t){e.value=n.value,o.value=t.focalX,c.value=t.focalY};return l.__closure={pinchStartScale:e,committedScale:n,pinchFocalX:o,pinchFocalY:c},l.__workletHash=0xb83152c9eeb,l.__initData=t,l})({_worklet_12657623867115_init_data:f,pinchStartScale:O,committedScale:W,pinchFocalX:C,pinchFocalY:k})).onUpdate((function({_worklet_13028127801442_init_data:t,viewportWidth:e,heightFor:n,committedScale:o,MIN_VIEWPORT:c,pinchStartScale:l,MIN_SCALE:s,MAX_SCALE:u,scale:h,tx:_,ty:v,focalPan:x,pinchFocalX:p,savedTx:S,pinchFocalY:f,savedTy:w,streamPanExtent:M,contentAspect:y,fit:T}){const A=function(t){if(t.numberOfPointers<2)return;const A=e,E=n(o.value);if(A<c||E<c)return;const P=l.value,F=Math.max(s,Math.min(u,P*t.scale));if(h.value=F,F<=s)return _.value=0,void(v.value=0);const X=x({focalNow:t.focalX,focalStart:p.value,center:A/2,panStart:S.value,scaleStart:P,scaleAfter:F}),W=x({focalNow:t.focalY,focalStart:f.value,center:E/2,panStart:w.value,scaleStart:P,scaleAfter:F}),{x:I,y:Y}=M(A,E,y,F,T);_.value=Math.max(-I,Math.min(I,X)),v.value=Math.max(-Y,Math.min(Y,W))};return A.__closure={viewportWidth:e,heightFor:n,committedScale:o,MIN_VIEWPORT:c,pinchStartScale:l,MIN_SCALE:s,MAX_SCALE:u,scale:h,tx:_,ty:v,focalPan:x,pinchFocalX:p,savedTx:S,pinchFocalY:f,savedTy:w,streamPanExtent:M,contentAspect:y,fit:T},A.__workletHash=0xbd958ee0062,A.__initData=t,A})({_worklet_13028127801442_init_data:S,viewportWidth:P,heightFor:F,committedScale:W,MIN_VIEWPORT:h,pinchStartScale:O,MIN_SCALE:s,MAX_SCALE:u,scale:X,tx:I,ty:Y,focalPan:n.focalPan,pinchFocalX:C,savedTx:N,pinchFocalY:k,savedTy:Z,streamPanExtent:e.streamPanExtent,contentAspect:o,fit:A})).onEnd((function({_worklet_5718581511833_init_data:t,scale:e,committedScale:n,viewportWidth:o,heightFor:c,clampPan:l,tx:s,ty:u,contentAspect:h,fit:_,savedTx:v,savedTy:x,withTiming:p,streamPanExtent:S,runOnJS:f,reportZoom:w}){const M=function(){const t=e.value;n.value=t;const M=o,y=c(t),T=l({tx:s.value,ty:u.value,w:M,h:y,aspect:h,scale:t,fit:_});v.value=T.x,x.value=T.y,T.x!==s.value&&(s.value=p(T.x)),T.y!==u.value&&(u.value=p(T.y));const{x:A,y:E}=S(M,y,h,t,_);f(w)('pinch',{viewportW:Math.round(M),viewportH:Math.round(y),viewportAspect:y>0?Math.round(M/y*100)/100:0,contentAspect:Math.round(100*h)/100,fitCover:'cover'===_?1:0,scale:Math.round(100*t)/100,panExtentX:Math.round(A),panExtentY:Math.round(E),tx:Math.round(T.x),ty:Math.round(T.y)})};return M.__closure={scale:e,committedScale:n,viewportWidth:o,heightFor:c,clampPan:l,tx:s,ty:u,contentAspect:h,fit:_,savedTx:v,savedTy:x,withTiming:p,streamPanExtent:S,runOnJS:f,reportZoom:w},M.__workletHash=5718581511833,M.__initData=t,M})({_worklet_5718581511833_init_data:p,scale:X,committedScale:W,viewportWidth:P,heightFor:F,clampPan:e.clampPan,tx:I,ty:Y,contentAspect:o,fit:A,savedTx:N,savedTy:Z,withTiming:l.withTiming,streamPanExtent:e.streamPanExtent,runOnJS:l.runOnJS,reportZoom:v})),[O,W,P,F,X,I,Y,N,Z,o,A,C,k]),H=(0,t.useMemo)(()=>c.Gesture.Pan().maxPointers(1).minDistance(4).onUpdate((function({_worklet_1239274184488_init_data:t,scale:e,MIN_SCALE:n,viewportWidth:o,heightFor:c,committedScale:l,streamPanExtent:s,contentAspect:u,fit:h,tx:_,savedTx:v,ty:x,savedTy:p}){const S=function(t){if(e.value<=n)return;const S=o,f=c(l.value),w=e.value,{x:M,y:y}=s(S,f,u,w,h);_.value=Math.max(-M,Math.min(M,v.value+t.translationX)),x.value=Math.max(-y,Math.min(y,p.value+t.translationY))};return S.__closure={scale:e,MIN_SCALE:n,viewportWidth:o,heightFor:c,committedScale:l,streamPanExtent:s,contentAspect:u,fit:h,tx:_,savedTx:v,ty:x,savedTy:p},S.__workletHash=1239274184488,S.__initData=t,S})({_worklet_1239274184488_init_data:M,scale:X,MIN_SCALE:s,viewportWidth:P,heightFor:F,committedScale:W,streamPanExtent:e.streamPanExtent,contentAspect:o,fit:A,tx:I,savedTx:N,ty:Y,savedTy:Z})).onEnd((function({_worklet_3600135705664_init_data:t,savedTx:e,tx:n,savedTy:o,ty:c,viewportWidth:l,heightFor:s,committedScale:u,streamPanExtent:h,contentAspect:_,scale:v,fit:x,runOnJS:p,reportZoom:S}){const f=function(){e.value=n.value,o.value=c.value;const t=l,f=s(u.value),{x:w,y:M}=h(t,f,_,v.value,x);p(S)('pan',{viewportW:Math.round(t),viewportH:Math.round(f),viewportAspect:f>0?Math.round(t/f*100)/100:0,contentAspect:Math.round(100*_)/100,fitCover:'cover'===x?1:0,scale:Math.round(100*v.value)/100,panExtentX:Math.round(w),panExtentY:Math.round(M),tx:Math.round(n.value),ty:Math.round(c.value),atLimitX:Math.abs(Math.abs(n.value)-w)<1?1:0,atLimitY:Math.abs(Math.abs(c.value)-M)<1?1:0})};return f.__closure={savedTx:e,tx:n,savedTy:o,ty:c,viewportWidth:l,heightFor:s,committedScale:u,streamPanExtent:h,contentAspect:_,scale:v,fit:x,runOnJS:p,reportZoom:S},f.__workletHash=3600135705664,f.__initData=t,f})({_worklet_3600135705664_init_data:w,savedTx:N,tx:I,savedTy:Z,ty:Y,viewportWidth:P,heightFor:F,committedScale:W,streamPanExtent:e.streamPanExtent,contentAspect:o,scale:X,fit:A,runOnJS:l.runOnJS,reportZoom:v})),[X,W,P,F,I,Y,N,Z,o,A]),J=(0,l.useAnimatedStyle)((function({_worklet_9422712524641_init_data:t,tx:e,ty:n,scale:o}){const c=()=>({transform:[{translateX:e.value},{translateY:n.value},{scale:o.value}]});return c.__closure={tx:e,ty:n,scale:o},c.__workletHash=9422712524641,c.__initData=t,c})({_worklet_9422712524641_init_data:y,tx:I,ty:Y,scale:X})),R=(0,t.useCallback)((function({_worklet_673077652428_init_data:t,scale:e,nextZoomStep:n,viewportWidth:o,heightFor:c,committedScale:l,MIN_SCALE:s,MIN_VIEWPORT:u,resetZoom:h,focalPan:_,tx:v,ty:x,streamPanExtent:p,contentAspect:S,fit:f,withTiming:w,savedTx:M,savedTy:y}){const T=function(t,T){const A=e.value,E=n(A),P=o,F=c(l.value);if(E<=s||P<u||F<u)return void h();const X=c(E),W=_({focalNow:t,focalStart:t,center:P/2,panStart:v.value,scaleStart:A,scaleAfter:E}),I=_({focalNow:T,focalStart:T,center:F/2,panStart:x.value,scaleStart:A,scaleAfter:E}),{x:Y,y:N}=p(P,X,S,E,f),Z=Math.max(-Y,Math.min(Y,W)),O=Math.max(-N,Math.min(N,I));e.value=w(E),l.value=E,v.value=w(Z),M.value=Z,x.value=w(O),y.value=O};return T.__closure={scale:e,nextZoomStep:n,viewportWidth:o,heightFor:c,committedScale:l,MIN_SCALE:s,MIN_VIEWPORT:u,resetZoom:h,focalPan:_,tx:v,ty:x,streamPanExtent:p,contentAspect:S,fit:f,withTiming:w,savedTx:M,savedTy:y},T.__workletHash=673077652428,T.__initData=t,T})({_worklet_673077652428_init_data:T,scale:X,nextZoomStep:n.nextZoomStep,viewportWidth:P,heightFor:F,committedScale:W,MIN_SCALE:s,MIN_VIEWPORT:h,resetZoom:V,focalPan:n.focalPan,tx:I,ty:Y,streamPanExtent:e.streamPanExtent,contentAspect:o,fit:A,withTiming:l.withTiming,savedTx:N,savedTy:Z}),[X,W,P,F,I,Y,N,Z,o,A,V]),D=(0,t.useCallback)((...t)=>c.Gesture.Simultaneous(b,H,...t),[b,H]);return(0,t.useMemo)(()=>({scale:X,committedScale:W,videoStyle:J,resetZoom:V,stepZoomAt:R,snapZoom:L,composeWith:D}),[X,W,J,V,R,L,D])};var t=r(d[0]),e=r(d[1]),n=r(d[2]),o=r(d[3]),c=r(d[4]),l=r(d[5]);const s=n.ZOOM_MIN,u=n.ZOOM_MAX,h=10,_=1.7777777777777777;function v(t,e){o.log.debug('live:zoom',`zoom ${t} end`,e)}const x={code:"function useStreamZoomTs1(){const{scale,withTiming,committedScale,tx,ty,savedTx,savedTy}=this.__closure;scale.value=withTiming(1);committedScale.value=1;tx.value=withTiming(0);ty.value=withTiming(0);savedTx.value=0;savedTy.value=0;}"},p={code:"function useStreamZoomTs2(){const{scale,committedScale,viewportWidth,heightFor,clampPan,tx,ty,contentAspect,fit,savedTx,savedTy,withTiming,streamPanExtent,runOnJS,reportZoom}=this.__closure;const s=scale.value;committedScale.value=s;const w_0=viewportWidth;const h_0=heightFor(s);const settled=clampPan({tx:tx.value,ty:ty.value,w:w_0,h:h_0,aspect:contentAspect,scale:s,fit:fit});savedTx.value=settled.x;savedTy.value=settled.y;if(settled.x!==tx.value)tx.value=withTiming(settled.x);if(settled.y!==ty.value)ty.value=withTiming(settled.y);const{x:limX_0,y:limY_0}=streamPanExtent(w_0,h_0,contentAspect,s,fit);runOnJS(reportZoom)('pinch',{viewportW:Math.round(w_0),viewportH:Math.round(h_0),viewportAspect:h_0>0?Math.round(w_0/h_0*100)/100:0,contentAspect:Math.round(contentAspect*100)/100,fitCover:fit==='cover'?1:0,scale:Math.round(s*100)/100,panExtentX:Math.round(limX_0),panExtentY:Math.round(limY_0),tx:Math.round(settled.x),ty:Math.round(settled.y)});}"},S={code:"function useStreamZoomTs3(e_0){const{viewportWidth,heightFor,committedScale,MIN_VIEWPORT,pinchStartScale,MIN_SCALE,MAX_SCALE,scale,tx,ty,focalPan,pinchFocalX,savedTx,pinchFocalY,savedTy,streamPanExtent,contentAspect,fit}=this.__closure;if(e_0.numberOfPointers<2)return;const w=viewportWidth;const h=heightFor(committedScale.value);if(w<MIN_VIEWPORT||h<MIN_VIEWPORT)return;const s0=pinchStartScale.value;const s1=Math.max(MIN_SCALE,Math.min(MAX_SCALE,s0*e_0.scale));scale.value=s1;if(s1<=MIN_SCALE){tx.value=0;ty.value=0;return;}const ptx=focalPan({focalNow:e_0.focalX,focalStart:pinchFocalX.value,center:w/2,panStart:savedTx.value,scaleStart:s0,scaleAfter:s1});const pty=focalPan({focalNow:e_0.focalY,focalStart:pinchFocalY.value,center:h/2,panStart:savedTy.value,scaleStart:s0,scaleAfter:s1});const{x:limX,y:limY}=streamPanExtent(w,h,contentAspect,s1,fit);tx.value=Math.max(-limX,Math.min(limX,ptx));ty.value=Math.max(-limY,Math.min(limY,pty));}"},f={code:"function useStreamZoomTs4(e){const{pinchStartScale,committedScale,pinchFocalX,pinchFocalY}=this.__closure;pinchStartScale.value=committedScale.value;pinchFocalX.value=e.focalX;pinchFocalY.value=e.focalY;}"},w={code:"function useStreamZoomTs5(){const{savedTx,tx,savedTy,ty,viewportWidth,heightFor,committedScale,streamPanExtent,contentAspect,scale,fit,runOnJS,reportZoom}=this.__closure;savedTx.value=tx.value;savedTy.value=ty.value;const w_2=viewportWidth;const h_2=heightFor(committedScale.value);const{x:limX_2,y:limY_2}=streamPanExtent(w_2,h_2,contentAspect,scale.value,fit);runOnJS(reportZoom)('pan',{viewportW:Math.round(w_2),viewportH:Math.round(h_2),viewportAspect:h_2>0?Math.round(w_2/h_2*100)/100:0,contentAspect:Math.round(contentAspect*100)/100,fitCover:fit==='cover'?1:0,scale:Math.round(scale.value*100)/100,panExtentX:Math.round(limX_2),panExtentY:Math.round(limY_2),tx:Math.round(tx.value),ty:Math.round(ty.value),atLimitX:Math.abs(Math.abs(tx.value)-limX_2)<1?1:0,atLimitY:Math.abs(Math.abs(ty.value)-limY_2)<1?1:0});}"},M={code:"function useStreamZoomTs6(e_1){const{scale,MIN_SCALE,viewportWidth,heightFor,committedScale,streamPanExtent,contentAspect,fit,tx,savedTx,ty,savedTy}=this.__closure;if(scale.value<=MIN_SCALE)return;const w_1=viewportWidth;const h_1=heightFor(committedScale.value);const s_0=scale.value;const{x:limX_1,y:limY_1}=streamPanExtent(w_1,h_1,contentAspect,s_0,fit);tx.value=Math.max(-limX_1,Math.min(limX_1,savedTx.value+e_1.translationX));ty.value=Math.max(-limY_1,Math.min(limY_1,savedTy.value+e_1.translationY));}"},y={code:"function useStreamZoomTs7(){const{tx,ty,scale}=this.__closure;return{transform:[{translateX:tx.value},{translateY:ty.value},{scale:scale.value}]};}"},T={code:"function useStreamZoomTs8(x,y){const{scale,nextZoomStep,viewportWidth,heightFor,committedScale,MIN_SCALE,MIN_VIEWPORT,resetZoom,focalPan,tx,ty,streamPanExtent,contentAspect,fit,withTiming,savedTx,savedTy}=this.__closure;const s0_0=scale.value;const s1_0=nextZoomStep(s0_0);const w_3=viewportWidth;const h0=heightFor(committedScale.value);if(s1_0<=MIN_SCALE||w_3<MIN_VIEWPORT||h0<MIN_VIEWPORT){resetZoom();return;}const h1=heightFor(s1_0);const ptx_0=focalPan({focalNow:x,focalStart:x,center:w_3/2,panStart:tx.value,scaleStart:s0_0,scaleAfter:s1_0});const pty_0=focalPan({focalNow:y,focalStart:y,center:h0/2,panStart:ty.value,scaleStart:s0_0,scaleAfter:s1_0});const{x:limX_3,y:limY_3}=streamPanExtent(w_3,h1,contentAspect,s1_0,fit);const nx=Math.max(-limX_3,Math.min(limX_3,ptx_0));const ny=Math.max(-limY_3,Math.min(limY_3,pty_0));scale.value=withTiming(s1_0);committedScale.value=s1_0;tx.value=withTiming(nx);savedTx.value=nx;ty.value=withTiming(ny);savedTy.value=ny;}"}},2123,[17,2124,1825,1115,1685,1173]);
3499
3499
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"containBox",{enumerable:!0,get:function(){return t}}),Object.defineProperty(e,"coverBox",{enumerable:!0,get:function(){return n}}),Object.defineProperty(e,"panExtent",{enumerable:!0,get:function(){return o}}),Object.defineProperty(e,"streamPanExtent",{enumerable:!0,get:function(){return c}}),Object.defineProperty(e,"clampPan",{enumerable:!0,get:function(){return _}});const t=(function({_worklet_16403026519218_init_data:t}){const n=function(t,n,o){return!Number.isFinite(o)||o<=0?{width:t,height:n}:{width:Math.min(t,n*o),height:Math.min(n,t/o)}};return n.__closure={},n.__workletHash=0xeeb2091a4b2,n.__initData=t,n})({_worklet_16403026519218_init_data:{code:"function containBox_streamZoomClampTs1(w,h,aspect){if(!Number.isFinite(aspect)||aspect<=0)return{width:w,height:h};return{width:Math.min(w,h*aspect),height:Math.min(h,w/aspect)};}"}}),n=(function({_worklet_12373137558124_init_data:t}){const n=function(t,n,o){return!Number.isFinite(o)||o<=0?{width:t,height:n}:{width:Math.max(t,n*o),height:Math.max(n,t/o)}};return n.__closure={},n.__workletHash=0xb40d8780a6c,n.__initData=t,n})({_worklet_12373137558124_init_data:{code:"function coverBox_streamZoomClampTs2(w,h,aspect){if(!Number.isFinite(aspect)||aspect<=0)return{width:w,height:h};return{width:Math.max(w,h*aspect),height:Math.max(h,w/aspect)};}"}}),o=(function({_worklet_7793081511060_init_data:t}){const n=function(t,n,o){return Number.isFinite(t)&&Number.isFinite(n)&&Number.isFinite(o)?Math.max(0,(o*n-t)/2):0};return n.__closure={},n.__workletHash=7793081511060,n.__initData=t,n})({_worklet_7793081511060_init_data:{code:"function panExtent_streamZoomClampTs3(containerDim,contentDim,scale){if(!Number.isFinite(containerDim)||!Number.isFinite(contentDim)||!Number.isFinite(scale)){return 0;}return Math.max(0,(scale*contentDim-containerDim)/2);}"}}),c=(function({_worklet_17001621453331_init_data:t,coverBox:n,containBox:o,panExtent:c}){const _=function(t,_,s,u,h="contain"){const x='cover'===h?n(t,_,s):o(t,_,s);return{x:c(t,x.width,u),y:c(_,x.height,u)}};return _.__closure={coverBox:n,containBox:o,panExtent:c},_.__workletHash=0xf767f9b7a13,_.__initData=t,_})({_worklet_17001621453331_init_data:{code:"function streamPanExtent_streamZoomClampTs4(w,h,aspect,scale,fit='contain'){const{coverBox,containBox,panExtent}=this.__closure;const box=fit==='cover'?coverBox(w,h,aspect):containBox(w,h,aspect);return{x:panExtent(w,box.width,scale),y:panExtent(h,box.height,scale)};}"},coverBox:n,containBox:t,panExtent:o}),_=(function({_worklet_11264439652914_init_data:t,streamPanExtent:n}){const o=function(t){if(t.scale<=1)return{x:0,y:0};const{x:o,y:c}=n(t.w,t.h,t.aspect,t.scale,t.fit);return{x:Math.max(-o,Math.min(o,t.tx)),y:Math.max(-c,Math.min(c,t.ty))}};return o.__closure={streamPanExtent:n},o.__workletHash=0xa3eb4ec9232,o.__initData=t,o})({_worklet_11264439652914_init_data:{code:"function clampPan_streamZoomClampTs5(input){const{streamPanExtent}=this.__closure;if(input.scale<=1)return{x:0,y:0};const{x:limX,y:limY}=streamPanExtent(input.w,input.h,input.aspect,input.scale,input.fit);return{x:Math.max(-limX,Math.min(limX,input.tx)),y:Math.max(-limY,Math.min(limY,input.ty))};}"},streamPanExtent:c})},2124,[]);
3500
3500
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.buildExportSelectionInput=p,e.useExportSelection=function(S,v){const{t:M}=(0,o.useTranslation)(),x=(0,n.useConfirm)(),E=(0,n.useNotice)(),C=(0,l.useCreateExport)(),{state:_}=(0,c.useConnection)(),b=(0,t.useCallback)(()=>{const t=(0,f.selectActiveEpoch)(v.state);null!==t&&v.beginSelection(t)},[v]),A=(0,t.useCallback)(()=>{v.endSelection()},[v]),I=(0,t.useCallback)((t,o)=>{(async()=>{if('partial'===o){if(!await x({title:M('v2.exportSelection.gapTitle'),message:M('v2.exportSelection.gapMessage',{duration:(0,u.formatSelectionDuration)(t.durationMs)}),confirmLabel:M('v2.exportSelection.gapConfirm'),cancelLabel:M('common.cancel')}))return}try{const n=p(S,t);s.log.info('exports','createExport from timeline selection',{deviceId:S,fromMs:n.fromMs,toMs:n.toMs,coverage:o});const c=await C.mutateAsync(n);E({title:M('v2.exportSelection.title'),message:M(null===c?'v2.exportSelection.failed':'v2.exportSelection.queued')})}catch{E({title:M('v2.exportSelection.title'),message:M('v2.exportSelection.failed')})}finally{v.endSelection()}})()},[x,C,S,E,v,M]);return(0,t.useEffect)(()=>{'connected'!==_&&null!==v.state.selectionAnchor&&v.endSelection()},[_,v]),(0,t.useMemo)(()=>({anchorMs:v.state.selectionAnchor,onBegin:b,onSave:I,onDiscard:A,saving:C.isPending}),[v.state.selectionAnchor,b,I,A,C.isPending])};var t=r(d[0]),o=r(d[1]),n=r(d[2]),c=r(d[3]),l=r(d[4]),s=r(d[5]),u=r(d[6]),f=r(d[7]);function p(t,o){return{deviceId:t,profiles:[u.EXPORT_SELECTION_PROFILE],fromMs:o.fromMs,toMs:o.toMs,options:{includeAudio:!0,maxLifeMs:u.EXPORT_SELECTION_LIFE_MS,deleteAfterDownload:!1}}}},2125,[17,995,1815,1130,1967,1115,2122,2100]);
3501
3501
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.useIntercom=function(s){const o=(0,t.c)(10),[u,l]=(0,n.useState)("idle");let f,b,M;o[0]!==s?(f=()=>{const t=(0,c.getEmbedChannel)(s);if(t)return l(t.getMicState()),t.subscribeMicState(l)},b=[s],o[0]=s,o[1]=f,o[2]=b):(f=o[1],b=o[2]);(0,n.useEffect)(f,b),o[3]!==s?(M=()=>{const t=(0,c.getEmbedChannel)(s);if(!t)return;const n=t.getMicState();"starting"!==n&&t.postCommand({kind:"setMic",value:"talking"!==n})},o[3]=s,o[4]=M):M=o[4];const k=M,S="talking"===u,_="starting"===u,v="error"===u?"intercom error":null;let C;o[5]!==S||o[6]!==_||o[7]!==v||o[8]!==k?(C={talking:S,busy:_,error:v,toggle:k},o[5]=S,o[6]=_,o[7]=v,o[8]=k,o[9]=C):C=o[9];return C};var t=r(d[0]),n=r(d[1]),c=r(d[2])},2126,[15,17,2118]);
@@ -3671,8 +3671,8 @@ __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{v
3671
3671
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return o}});var t=r(d[0]),n=r(d[1]),c=r(d[2]);function o(){const o=(0,t.c)(1);let u;return o[0]===Symbol.for("react.memo_cache_sentinel")?(u=(0,c.jsx)(n.NotificationCenterScreen,{}),o[0]=u):u=o[0],u}},2296,[15,2004,10]);
3672
3672
  __d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return s}});var t=r(d[0]);r(d[1]),r(d[2]),r(d[3]);var n=r(d[4]),o=r(d[5]),c=r(d[6]);function s(){const s=(0,t.c)(1);let u;return s[0]===Symbol.for("react.memo_cache_sentinel")?(u=(0,c.jsx)(o.RootProviders,{children:(0,c.jsx)(n.Stack,{screenOptions:{headerShown:!1}})}),s[0]=u):u=s[0],u}},2297,[15,2298,2301,2302,743,2303,10]);
3673
3673
  __d(function(g,r,i,a,m,_e,_d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"default",{enumerable:!0,get:function(){return b}});var t=e(r(_d[0])),n=r(_d[1]),u=(function(e){if(e&&e.__esModule)return e;var t={};return e&&Object.keys(e).forEach(function(n){var u=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,u.get?u:{enumerable:!0,get:function(){return e[n]}})}),t.default=e,t})(r(_d[2])),l=e(r(_d[3])),c=e(r(_d[4])),o=e(r(_d[5]));const f={en:{translation:c.default},it:{translation:o.default}},d=u.getLocales()[0]?.languageCode?.slice(0,2)??"en",s=Object.keys(f).includes(d)?d:"en";t.default.use(n.initReactI18next).init({resources:f,lng:s,fallbackLng:"en",interpolation:{escapeValue:!1}}),l.default.getItem("v2.language").then(e=>{"it"!==e&&"en"!==e||t.default.changeLanguage(e)});var b=t.default},2298,[998,995,2072,783,2299,2300]);
3674
- __d(function(e,t,a,o,i,n,s){i.exports={devices:{editDevice:"Edit device",originalName:"Original name",customName:"Custom name",customNamePlaceholder:"Leave empty to use original",icon:"Icon",typeLight:"Light",typeSwitch:"Switch",typeCover:"Cover",typeLock:"Lock",typeAlarm:"Alarm",typeButton:"Button",typeSelect:"Select",typeSiren:"Siren",typeSensor:"Sensor",typeEntry:"Entry",typeMediaPlayer:"Media Player",typeScript:"Script",run:"Run",sourceHA:"Home Assistant",sourceScrypted:"Scrypted",off:"Off",on:"On",mute:"Mute",unmute:"Unmute",stop:"Stop",locked:"Locked",unlocked:"Unlocked",open:"Open",closed:"Closed",disarmed:"Disarmed",disarm:"Disarm"},common:{error:"Error",save:"Save",cancel:"Cancel",loading:"Loading...",comingSoon:"Coming soon",back:"Back",fullscreen:"Fullscreen",exitFullscreen:"Exit fullscreen",reset:"Reset",selectAll:"Select all",deselectAll:"Deselect all",delete:"Delete",retry:"Retry"},grids:{newGrid:"New grid",deleteConfirm:"Delete this grid?",noGrids:"No grids yet. Create one to arrange cameras in a mosaic view.",createGrid:"Create grid",cameras:"cameras",notFound:"Grid not found.",noCameras:"No cameras in this grid. Edit the grid to add some.",edit:"Edit",addCamera:"Add camera",presets:"Presets",auto:"Auto",manual:"Manual",gridName:"Grid name",view:"View",addCameraHint:"Add at least one camera from the button above.",allCamerasAdded:"All cameras already in grid",cameraUnavailable:"Camera unavailable",camerasInGrid:"Cameras in grid",addAll:"Add all",addCameras:"Add Cameras",backToGrid:"Back to Grid",timelineNotSupported:"Timeline not supported"},nav:{cameras:"Cameras",grids:"Grids",library:"Library",notifications:"Notifications",events:"Events",videoclips:"Videoclips",list:"List",settings:"Settings"},cameras:{addCamera:"Add camera",pipActive:"PiP active",reorderEnable:"Reorder",reorderDisable:"Unlock",live:"Live",noCameras:"No cameras configured",noIntegrations:"No integrations configured. Add a system to get started.",createSystem:"Create system",importFrom:"Import cameras from",importSuccess:"Import complete",importCount:"{{count}} cameras imported",selectCamerasToImport:"Select cameras to import",selectAll:"Select all",deselectAll:"Deselect all",importSelected:"Import {{count}} selected",noCamerasFound:"No cameras found",play:"\u25b6 Play",paused:"Paused",noDataForDate:"No data for this date",recordingNotAvailable:"Recording not available",noEventsReel:"No recent events",settings:"Settings",highlightMotion:"Motion Highlight",highlightOnMotion:"Highlight on motion",highlightAudio:"Audio Highlight",audioMode:"Mode",audioModeOff:"Off",audioModeSensor:"Sensor",audioModeLevel:"Level",audioPreset:"Audio Preset",audioPresetCustom:"Custom",audioPresetCrying:"Crying / baby",audioPresetAlarm:"Alarm / siren",audioPresetDog:"Dog barking",audioPresetDoorbell:"Doorbell / knock",audioPresetGlass:"Glass break",audioWindow:"Window (s)",audioThreshold:"Threshold (dB)",audioHitPercentage:"Hit (%)",audioHoldSeconds:"Hold (s)",highlightDetection:"Object Detection Highlight",highlightOnDetection:"Highlight on detection",detectionClasses:"Classes",holdSeconds:"Hold (s)",rtspNotSupportedWeb:"RTSP streams are not supported on web. Use the mobile app.",liveDetections:"Live detections",filterTimeline:"Filter timeline",filterClasses:"Filter classes...",filterBySeverity:"Filter by severity",severityAlert:"Alert",severityDetection:"Detection",statusPosition:"Status Indicators Position",today:"Today",yesterday:"Yesterday",timeline:"Timeline",timelineEventsClusterEvents:"Events",selectDate:"Select a date",videoclipsNotSupported:"Videoclips not supported for this camera",noVideoclipsForDate:"No videoclips for this date",endOfList:"End of list",backToLive:"Back to live",goLive:"Go live",loadingClip:"Loading clip...",clusterDetailShowBbox:"Show bounding box on image",clusterDetailOpenVideoclip:"Open videoclip",clusterDetailLoadingEvents:"Loading events...",devices:"Devices",noAssociatedDevices:"No devices linked. Configure in Settings > Cameras.",timelineData:"Timeline data",timelineDataHint:"What to show on the timeline.",timelineDataVideoclips:"Videoclips",timelineDataAdvancedNotifier:"Advanced Notifier",timelineDataEvents:"Events",timelineEvents:"Timeline events",timelineEventsHint:"Which event types to show on the timeline, by severity.",timelinePresetAll:"All",timelinePresetImportant:"Important",timelinePresetCritical:"Critical",timelinePresetCustom:"Custom",statusBlock:"Status Block",sensorsBlock:"Sensors Block",position:"Position",indicators:"Indicators",downloadSnapshot:"Download Snapshot",exportDownloadClip:"Download Clip",exportRecordingWebOnly:"Recording export (web only)",exportSnapshot:"Export Snapshot",intercomError:"Intercom error",multiCam:"Multi-Camera",ptzNotSupported:"PTZ not supported",ptzSelectPreset:"Select PTZ Preset",snapshotFailed:"Snapshot failed"},events:{loading:"Loading events...",filterByLabel:"Filter by label",filterByLabelPlaceholder:"e.g. person, doorbell",filterByCamera:"Filter by camera",date:"Date",detectionTypes:"Detection types",source:"Source",cameras:"Cameras",groupingRange:"Grouping",groupingPresetMinutes:"{{m}} min",groupingCustom:"Custom",groupingCustomMinutes:"Minutes",groupingCustomApply:"Apply",today:"Today",noCamerasFromConfig:"Cameras loaded from EventsApp config",all:"All",typesCount:"{{count}} types",camerasCount:"{{count}} cameras",cols:"cols",sourceAuto:"Auto",sourceNVR:"NVR",sourceFrigate:"Frigate",sourceVideoClips:"VideoClips API",sourceRawDetection:"Raw",sourceAdvancedNotifier:"Advanced Notifier",detectionPerson:"Person",detectionVehicle:"Vehicle",detectionAnimal:"Animal",detectionAudio:"Audio",detectionFace:"Face",detectionPlate:"Plate",detectionPackage:"Package",detectionDoorbell:"Doorbell",detectionSensor:"Sensor",detectionMotion:"Motion",detectionRules:"Rules",noScryptedIntegration:"Add a Scrypted integration in Settings to view events.",frigateNoEvents:"Events are only available for Scrypted. Select a Scrypted instance in Settings.",noSource:"Add a Scrypted or Frigate integration in Settings, then select it as the Events/Videoclips source.",loadError:"Error loading events",noEvents:"No events for this date. Try changing the date or filters.",clearCacheTitle:"Clear cache",clearCacheMessage:"Clear all cached events and videoclips data? This will force a fresh fetch on next load.",clearCacheConfirm:"Clear",columnsPerRow:"Columns per row",onlyWithClips:"Only with clips",relatedClip:"Related Clip"},settings:{integrations:"Integrations",camstackProxy:"CamStack Proxy",scrypted:"Scrypted",frigate:"Frigate",rtsp:"RTSP",homeAssistant:"Home Assistant",name:"Name",baseUrl:"Base URL",urlLocal:"Local URL",urlPublic:"Public URL",username:"Username",password:"Password",token:"Token (optional)",frigateTokenHint:"Token (optional): JWT from browser",tokenRequired:"Token",testConnection:"Test connection",testLocal:"Test Local",testPublic:"Test Public",testMqtt:"Test MQTT",connectionOk:"Connection successful",connectionError:"Connection failed",scryptedCredentialsPromptTitle:"Scrypted login",scryptedCredentialsPromptSubtitle:"Enter your Scrypted username and password to connect.",scryptedCredentialsPromptSkip:"Skip for now",usernamePlaceholder:"admin",save:"Save",tabStream:"Stream & playback",tabGeneral:"General",data:"Data",clearCacheEventsClips:"Clear events & videoclips cache",eventsClipsSourceHint:"Source for Events and Videoclips tabs.",hubReelTitle:"Hub & Reel",reelIntegrationsHint:"Choose which integrations to use for the reel.",reelScryptedSourceHint:"When using Scrypted: event source for reel.",eventsClipsAuto:"Auto",eventsClipsNoInstance:"Add a Scrypted or Frigate integration first.",exportBackup:"Export backup",exportError:"Export failed",importBackup:"Import backup",importConfirm:"This will replace all cameras, integrations and settings with the backup data. Continue?",importSuccess:"Backup restored successfully",importError:"Import failed",uiPrototypes:"UI Prototypes",uiPrototypesHint:"Explore experimental timeline designs",versions:"Versions",appVersion:"App",nativeVersion:"Native",updateNow:"Update now",updateError:"Update failed",updateAvailableTitle:"Update Available",updateAvailableMessage:"A new version of CamStack has been downloaded and is ready to install. The app will restart to apply the update.",updateInstall:"Install & Restart",updateLater:"Later",tabIntegrations:"Integrations",tabCameras:"Camera settings",theme:"Theme",themeSystem:"System",themeLight:"Light",themeDark:"Dark",language:"Language",languageSystem:"System",languageEn:"English",languageIt:"Italiano",timelineMode:"Timeline Mode",timelineModeClassic:"Classic",timelineModeTheater:"Theater",timeline:"Timeline",timelineVisible:"Show detection timeline",timelineVisibleDescription:"Display the detection timeline panel in the camera view.",clusterSize:"Cluster card size",snapshotInterval:"Snapshot refresh interval",clusterSizeXS:"XS",clusterSizeS:"S",clusterSizeM:"M",clusterSizeL:"L",clusterSizeXL:"XL",highlightAppearance:"Highlight appearance",highlightAppearanceHint:"Color and border thickness for motion, audio, and detection highlights on camera streams.",highlightMotion:"Motion",highlightAudio:"Audio",highlightDetection:"Detection",highlightColor:"Color",highlightThickness:"Thickness",selectSection:"Select section",addSystem:"Add system",selectPlatform:"Select platform",deleteInstance:"Delete instance",deleteInstanceConfirm:"Are you sure you want to delete this instance?",delete:"Delete",mqttEvents:"MQTT - Real-time events",mqttBrokerUrl:"MQTT broker URL",mqttUsername:"MQTT username",mqttPassword:"MQTT password",mqttTopicPrefix:"Topic prefix (default: frigate)",mqttOptional:"Optional",scryptedAddressAlreadyUsed:"This Scrypted address is already configured. Only one instance per address is allowed.",scryptedAdvancedNotifierRequired:"The Advanced Notifier plugin is required for the connection.",scryptedCorsTitle:"CORS configuration required (Web)",scryptedCorsBody:"In Scrypted, open the Cloud plugin settings and add your domain ({{domain}}) to the CORS Allowed Origins list. Without this, the browser will block requests to your Scrypted server.",scryptedUrlHint:"Local URL is tried first (e.g. on LAN), then public URL. At least one required.",gridLayout:"Grid layout",gridLayoutHint:"Display options for the cameras grid.",gridColumns:"Grid columns",gridColumnsHint:"Number of cameras per row. Auto = 1 on mobile, 4 on tablet.",gridShowName:"Show camera name",gridShowState:"Show state (battery, recording, sleeping)",reorderCameras:"Reorder cameras",reorderCamerasHint:"Drag to reorder cameras",reorderDone:"Done",manageCameras:"Manage cameras",manageCamerasHint:"Remove cameras from the app.",downloadSnapshot:"Download snapshot",snapshotFailed:"Could not fetch snapshot",exportSnapshot:"Snapshot",exportDownloadClip:"Download clip",exportStartRecording:"Start recording",exportStopRecording:"Stop recording",exportRecordingWebOnly:"Recording available on web",intercomError:"Intercom unavailable. Check camera credentials in Scrypted.",deleteCamera:"Remove camera",deleteCameraConfirm:"Remove {{name}} from the app?",streamPlayback:"Stream & playback",playOnOpen:"Start stream when opening camera",playOnOpenHint:"Automatically load the live stream when you open a camera.",audioOnOpen:"Unmute audio when opening",audioOnOpenHint:"Play audio when opening a camera (if supported).",streamWatchdog:"Stream watchdog",streamWatchdogHint:"Restart stream when no data received (helps with stalled connections).",cameraPlayer:"Camera player",webViewCameraDetail:"Use WebView player",webViewCameraDetailHint:"Use WebView for Scrypted cameras (faster first frame, more stable). PiP, fullscreen and intercom work. Default: native player.",streamQuality:"Stream quality",streamQualitySingle:"Single camera quality",streamQualityGrid:"Grid quality",qualityAuto:"Auto",qualityHigh:"High",qualityMedium:"Mid",qualityLow:"Sub",auto:"Auto",associatedDevices:"Associated devices",associatedDevicesHint:"Add actuators (lights, switches, covers, etc.) to control from the camera view.",linkedDevices:"Linked",reorderHint:"Use arrows to reorder",addDevice:"Add device",noEligibleDevices:"No Scrypted or Home Assistant configured. Add an integration first.",configureDevices:"Configure devices",cameraSettingsHint:"Choose a camera to configure its specific options.",noCamerasConfigured:"No cameras configured.",searchDevices:"Search devices...",source:"Source",type:"Type",all:"All",noMatchingDevices:"No devices match the filters.",frigateStream:"Frigate Stream",frigateStreamSourceHint:"Stream source: WebRTC (default), RTSP, or MJPEG.",frigateStreamMapping:"Stream mapping (go2rtc names from config)",frigateStreamMappingHint:"Select from available go2rtc streams. Order: Main, Sub, Low.",frigateSelectStream:"Select stream",frigateAddStream:"Add stream",frigateInfo:"Camera info",frigateShowConfig:"Show config",frigateShowGo2rtc:"Show go2rtc",frigateMissingConfig:"Missing baseUrl or cameraName in camera config.",tabLogs:"Logs",logsCount:"{{count}} entries",logsDownload:"Download",logsClear:"Clear",logsEmpty:"No logs yet. Console output will appear here.",logsExportError:"Export failed",logsExportTitle:"Export logs",logsClearConfirmTitle:"Clear logs",logsClearConfirmMessage:"Remove all log entries?",hubAppearanceTitle:"Appearance",hubAppearanceDesc:"Theme, language, timeline and highlights",hubCamerasTitle:"Cameras",hubCamerasDesc:"Grid layout, stream quality and camera management",hubIntegrationsTitle:"Integrations",hubIntegrationsDesc:"Manage Scrypted, Frigate and other systems",hubAdvancedTitle:"Advanced",hubAdvancedDesc:"Data backup and cache management",hubLogsTitle:"Logs",hubLogsDesc:"View and export application logs",hubCacheTitle:"Cache",frigateAutoSnap:"Auto Snapshot",frigateSegmentNav:"Segment Navigation",frigateShowGo:"Show Go2RTC",frigateTimeline:"Timeline",reelCameras:"Reel Cameras",reelCamerasHint:"Select which cameras appear in the events reel",reelDeselectAll:"Deselect All",reelDetectionClasses:"Detection Classes",reelDetectionClassesHint:"Filter events by detection class",reelIncludeRuleArtifacts:"Include Rule Artifacts",reelIncludeRuleArtifactsHint:"Show rule-based events in the reel",reelRuleArtifacts:"Rule Artifacts",reelSelectAll:"Select All",reelBadgeContent:"Badge content",reelBadgePosition:"Badge position",reelBadgeSize:"Badge size",reelBadgeBoth:"Time + Class",reelBadgeTime:"Time only",reelBadgeClass:"Class only",reelBadgeNone:"Hidden",reelBadgeSmall:"Small",reelBadgeMedium:"Medium",reelBadgeLarge:"Large"},reel:{filterMotion:"Motion",filterOnlyRules:"Only rules",filterOnlySensors:"Only sensors",goToMostRecent:"Go to most recent"},v2:{common:{connecting:"Connecting\u2026",online:"Online",offline:"Offline",loadError:"Loading error",create:"Create",back:"Back",on:"On",off:"Off",confirm:"Confirm",cancel:"Cancel",ok:"OK",done:"Done"},cameras:{empty:"No cameras",hubNotAnswering:"The hub isn't answering. Some cameras may belong to a node that is currently offline \u2014 pull to retry.",statusOnline:" \xb7 online",statusOffline:" \xb7 offline",motion:"Motion",doorbell:"Doorbell",doorbellRinging:"Ringing",doorbellLastRing:"Ring {{time}} ago",snapshotLoading:"Loading\u2026",refreshing:"Updating\u2026",stationaryFor:"stationary {{min}}m",manage:"Manage cameras",manageHint:"Drag to reorder. Rename inline. Toggle to show or hide a camera from the list.",reorderHandle:"Drag to reorder",appearance:"Appearance",editList:"Edit list",listOptions:"Camera list options",controlsA11y:"Camera controls",disabledTitle:"Out of service",disabledHint:"Disabled by an administrator",emptyOutOfScope:"No cameras in your access profile",emptyOutOfScopeHint:"Your account has no cameras assigned to it yet. Ask whoever administers this hub to grant you access.",snapshotStale:"Snapshot {{age}} old",hubNotProvisioning:"Hub not answering",reelFilter:"Recent events",reelFilterAll:"Showing every event",reelFilterDefaultHint:"Showing detection events only \u2014 audio and sensor events are hidden",reelFilterCount:"{{count}} event types shown",reelFilterUseDefault:"Default",reelFilterShowAll:"Everything",reelFilterDefaultTag:"Detections",reelFilterCountTag:"{{count}} types"},cameraDetail:{fallbackName:"Camera #{{id}}",mute:"Mute",unmute:"Unmute",snapshot:"Snapshot",snapshotFailed:"Could not capture a snapshot.",ptz:"PTZ controls",talk:"Talk",fullscreen:"Fullscreen",talkFailed:"Could not start talk-back. Check microphone access.",pip:"Picture in Picture",exitFullscreen:"Exit fullscreen",devices:"Devices",devicesEmpty:"No connected devices.",linkedModeAuto:"Link: Auto (same location)",linkedModeManual:"Link: Manual",close:"Close",deviceOnline:"Online",deviceOffline:"Offline"},grids:{createA11y:"Create grid",empty:"No grids",emptyHint:"Tap + to create your first grid",countNone:"No cameras",countOne:"1 camera",countOther:"{{count}} cameras",defaultName:"New grid",deleteTitle:"Delete grid",deleteConfirm:"Delete \"{{name}}\"? This cannot be undone.",export:"Export",exportAllA11y:"Export all grids",shareA11y:"Share grid",editA11y:"Edit grid",deleteA11y:"Delete grid",linkCopied:"Grid link copied to clipboard",layoutAuto:"Auto",layoutColumns:"{{count}} cols"},gridView:{editA11y:"Edit grid",fallbackTitle:"Grid",notFound:"Grid not found",emptyGrid:"This grid is empty",addCameras:"Add cameras",reorderTitle:"Reorder cameras",reorderA11y:"Reorder cameras",reorderDoneA11y:"Done reordering",allHidden:"All cameras are hidden. Use reorder mode to show some.",dragA11y:"Drag to reorder",hideA11y:"Hide from grid",showA11y:"Show in grid",removeA11y:"Remove from grid",adhocTitle:"Quick grid",cellActions:"Camera actions",cellActionsA11y:"More actions for this camera",cellDevicesA11y:"Linked devices",cellMenuA11y:"View options"},gridBuilder:{title:"Edit grid",nameLabel:"Name",namePlaceholder:"Grid name",camerasSelected:"Cameras ({{count}} selected)",optionsTitle:"Options",showName:"Show camera name",export:"Export grid",orderSection:"In the grid",orderHint:"Drag to reorder",emptyOrder:"No cameras yet \u2014 add some below.",addSection:"Add cameras",removeA11y:"Remove from grid",addA11y:"Add to grid",highlightMotion:"On motion",highlightAudio:"On audio",highlightAudioOff:"Off",highlightAudioLow:"Low",highlightAudioMid:"Mid",highlightAudioHigh:"High",highlightAudioSensor:"Presence",highlightAudioLevel:"Level",highlightThreshold:"Threshold",highlightHold:"Hold",highlightDetection:"On detection",clusterLabel:"Cluster label",clusterLabelIcon:"Icon",clusterLabelText:"Text"},gridBar:{back:"Back",pauseAll:"Pause all",playAll:"Play all",audio:"Audio",quality:"Stream quality",layout:"Layout",timeline:"Timeline",highlightMenu:"Highlight & overlays",activeOnly:"Active only",share:"Share grid",edit:"Edit grid",hide:"Hide controls",show:"Show controls",muteAll:"Mute all",unmuteAll:"Unmute all"},gridMenu:{highlightMaster:"Highlight borders"},gridShare:{title:"Share \"{{name}}\"",quality:"Stream quality",layout:"Layout",showNames:"Show camera names",activeOnly:"Active cameras only",boxes:"Bounding boxes",highlightEnable:"Highlight",audioSummary:"Audio starts on for {{count}} camera(s)",ttlTitle:"Link expires",ttl_1d:"1 day",ttl_7d:"7 days",ttl_30d:"30 days",ttl_never:"Forever",tokenNotice:"The link includes a view-only access token limited to these cameras. Anyone with the link can watch until it expires or is revoked.",copyLink:"Copy link",creating:"Creating link\u2026",copiedExpires:"Link copied \u2014 expires {{date}}",copiedNever:"Link copied \u2014 never expires",error:"Could not create the share link. Check the connection and try again.",optionAuto:"Auto"},gridControls:{play:"Play",pause:"Pause",mute:"Mute",unmute:"Unmute",quality:"Quality",layout:"Layout",layoutAuto:"Auto"},events:{comingSoon:"Events \u2014 coming soon",searchLabel:"Search label\u2026",searchSubmit:"Search",searchClear:"Clear search",empty:"No events",today:"Today",yesterday:"Yesterday",weekdayShort:{sun:"Sun",mon:"Mon",tue:"Tue",wed:"Wed",thu:"Thu",fri:"Fri",sat:"Sat"},filteredEmpty:"No matches in the loaded range",loadOlder:"Load older",selectPrompt:"Select an event to see its detail",filters:"Filters",more:"More",all:"All",day:"Day",sort:"Sort",sortTime:"Newest",sortImportance:"Importance",flaggedOnly:"Flagged",flaggedOnlyHint:"Favourited, debug, or marked for training",parked:"Parked",showStationary:"Show stationary",showStationaryHint:"Off = hide parked promotions",cameras:"Cameras",classes:"Classes",attributes:"Detected",attrFaces:"Faces",attrPlates:"Plates",attributesHint:"None = all",search:"Search",searchCameras:"Search cameras\u2026",searchClasses:"Search classes\u2026",allCamerasHint:"None = all",allClassesHint:"None = all",done:"Done",density:"Density",selectHint:"Select an event",unrecognizedFace:"Face detected, not recognised",eventKinds:"Event types",displayOptions:"Display",displayTitle:"Display options",useDefaultClasses:"Default"},settings:{themeSystem:"System",themeDark:"Dark",themeLight:"Light",server:"Server",account:"Signed in as",accountUnknown:"Loading\u2026",roleAdmin:"Admin",roleViewer:"Viewer",hubActive:"Active hub",changeServer:"Change server",signOut:"Sign out",network:"Network",networkNone:"No routes probed yet",endpointUnlikely:"Unlikely usable",activeRoute:"Route in use",routeChannelLan:"LAN (direct)",routeChannelPublic:"Public tunnel",routeChannelLoopback:"Local (loopback)",routeChannelUnknown:"Unrecognised",routeReasonInitial:"configured, not yet raced",routeReasonRaceWon:"fastest in the route race",routeReasonNoWinner:"fallback \u2014 no candidate answered",routeReasonUnchanged:"unchanged since the last probe",routeReasonDisposed:"no transport",reprobe:"Re-probe routes",reprobing:"Probing\u2026",diagnoseNetwork:"Diagnose LAN routes",diagnosingNetwork:"Diagnosing\u2026",diagnoseNetworkDone:"{{ok}}/{{total}} answered /health. Open Logs and share them \u2014 look for ipv4/ipv6 http FAIL.",preferredRoute:"Preferred route",routeAuto:"Automatic",routeReasonPinned:"forced in Settings",appearance:"Appearance",theme:"Theme",info:"Info",app:"App",version:"Version",noServer:"No server",footerNote:"CamStack Viewer connects to a single camstack hub. Cameras, grids and events are managed by the server.",language:"Language",langSystem:"System",gridDefaults:"Grid defaults",showName:"Show camera name",showNameHint:"Overlay the camera name on each tile",showState:"Show status badge",showStateHint:"Show online / recording state on each tile",columns:"Columns",cameraOrder:"Camera order",orderName:"By name",orderCustom:"Custom",motionHold:"Motion highlight linger",motionHoldHint:"Keep a tile's motion highlight lit this long after motion stops.",motionHoldOff:"Off",streamQuality:"Stream quality",streamDefaults:"Stream defaults",playOnOpen:"Play on open",playOnOpenHint:"Start the live stream when a camera opens",audioOnOpen:"Audio on open",audioOnOpenHint:"Unmute audio when a camera opens",snapshotInterval:"Snapshot refresh",highlightAppearance:"Highlight appearance",highlightMotionColor:"Motion color",highlightAudioColor:"Audio color",highlightDetectionColor:"Detection color",highlightThickness:"Border thickness",qualityAuto:"Auto",qualityHigh:"High",qualityMid:"Medium",qualityLow:"Low",secondsValue:"{{count}}s",advanced:"Advanced",clearCache:"Clear cache",clearCacheHint:"Free up snapshots and cached data (keeps your server and settings)",clearCacheConfirmTitle:"Clear cache?",clearCacheConfirmBody:"This removes cached images and query data. Your server, sign-in and settings are kept.",clearCacheDone:"Cache cleared",exportSettings:"Export settings",exportSettingsHint:"Copy your settings as JSON",exportSettingsDone:"Settings copied as JSON",shareTitle:"Share settings",shareHint:"Save a named snapshot of this device's settings, grids and camera prefs on the hub. Anyone signed in can import it \u2014 it replaces what is on this device.",shareNamePlaceholder:"Snapshot name",shareSave:"Save",shareEmpty:"No snapshots yet",shareImportTitle:"Import this snapshot?",shareImportBody:"\"{{name}}\" will replace settings, grids and camera prefs on this device.",shareDeleteTitle:"Delete this snapshot?",shareDeleteBody:"\"{{name}}\" will be removed from the hub.",shareFailed:"Could not share settings",shareInvalid:"That snapshot is not a valid settings document.",shareMissing:"That snapshot is no longer on the hub.",viewLogs:"View logs",viewLogsHint:"Recent in-app log messages",logsEmpty:"No logs recorded yet",keepLogs:"Keep logs",keepLogsHint:"Record a rolling buffer of in-app log messages",debugMode:"Debug mode",debugModeHint:"Verbose logs across live, playback and scrub \u2014 sent to the server",logsClear:"Clear",resetSettings:"Reset settings",resetSettingsHint:"Restore all defaults",resetConfirmTitle:"Reset settings?",resetConfirmBody:"This restores all settings to their defaults.",cancel:"Cancel",confirm:"Confirm",timeline:"Timeline",reel:"Event reel",reelThumbSize:"Reel thumbnail size",reelThumbSizeHint:"Size of the tiles in the Recent events reel.",reelSizeSmall:"Small",reelSizeMedium:"Medium",reelSizeLarge:"Large",reelShowLabels:"Show labels",reelShowLabelsHint:"Show the class/identity label on reel items.",reelLabelStyle:"Class display",reelLabelStyleHint:"Show the detection class as an icon or as text on reel items.",reelShowImportance:"Show importance",reelShowImportanceHint:"Show the importance badge on reel items.",events:"Events",eventsPage:"Events page",minImportance:"Minimum importance",minImportanceHint:"Hide events scored below this across the events page and the camera timeline.",minImportanceOff:"Off",tileShowLabels:"Show labels",tileShowLabelsHint:"Show the class / identity / audio labels on event cards.",tileShowImportance:"Show importance",tileShowImportanceHint:"Show the importance badge on event cards (when scored).",tileShowCameraName:"Show camera name",tileShowCameraNameHint:"Show the camera name in the event card footer.",tileLabelStyle:"Class display",tileLabelStyleHint:"Show the detection class as an icon or as text.",tileLabelStyleIcon:"Icon",tileLabelStyleText:"Text",comingSoon:"Coming soon",cameras:"Cameras",manageCameras:"Manage cameras",manageCamerasHint:"Rename, hide, reorder",notifications:"Notifications",notificationsManage:"Manage notifications",pinchExpandsHeight:"Pinch enlarges the view",pinchExpandsHeightHint:"Pinching to zoom also grows the video taller (crops the side edges on 16:9 cameras).",navBarOnStream:"Navigation bar on a single camera",navBarOnStreamHint:"Keep the main navigation visible while watching one camera. On wide windows the side navigation is already there.",reopenLastCamera:"Reopen the last camera",reopenLastCameraHint:"Start on the camera you were watching. Only if watching it was the last thing you did \u2014 going to another page clears it.","timeline.gapPercent":"Cluster gap (%)","timeline.sizePercent":"Cluster size (%)","timeline.indicatorPositionPct":"Indicator position (%)","timeline.showImportance":"Show importance on items","timeline.showClass":"Show detection class on items","timeline.cardWidthPct":"Card width (%)",haptics:"Vibration",hapticsUiFeedback:"Vibrate on press",hapticsUiFeedbackHint:"A short buzz confirms buttons, switches, PTZ and player controls. Native only (iOS/Android).",hapticsEnabled:"Vibrate on events",hapticsEnabledHint:"Small vibration pulses for key events on the camera you're watching. Native only (iOS/Android).",hapticsMotion:"Motion",hapticsDetection:"Detection",hapticsPerson:"Person / recognized",buildNumber:"Build",runtimeVersion:"Runtime",runningBundle:"Running bundle",checkUpdates:"Check for updates",checkingUpdates:"Checking\u2026",updateUpToDate:"You're on the latest version.",updatesDisabled:"Updates are disabled in this build.",updateReadyTitle:"Update downloaded",updateReadyBody:"Restart the app now to apply it?",updateCheckFailed:"Could not check for updates",listOverlays:"Camera cards",listMotionBorder:"Motion ring",listMotionBorderHint:"Pulse a ring around a card while the camera sees motion.",listMotionBadge:"Motion badge position",listOccupancy:"Occupancy position",useNativeRenderer:"Use the built-in renderer",useNativeRendererHint:"Render Recent and Events inside the app instead of loading the hub-hosted embed.",toolbarDensity:"Toolbar height","toolbarDensity.small":"Small","toolbarDensity.medium":"Medium","toolbarDensity.large":"Large"},nc:{title:"Notifications",tabs:{rules:"Rules",targets:"Targets",snooze:"Snooze"},rulesPlaceholder:"Notification rules will appear here.",targetsPlaceholder:"Delivery targets will appear here.",rules:{add:"New rule",empty:"No rules yet.",loadError:"Couldn't load rules. Pull to retry.",mine:"My rules",admin:"Admin rules",system:"System events",personalBadge:"Personal",adminBadge:"Admin",edit:"Edit",delete:"Delete",cancel:"Cancel",deleteConfirmTitle:"Delete rule",deleteConfirmMessage:"Delete \"{{name}}\"? This can't be undone.",receiveOn:"Receive on {{name}}",noOwnedTargets:"This rule doesn't deliver to any of your targets.",section:{all:"All",detection:"Detections",occupancy:"Occupancy",audio:"Sound",empty:{all:"No rules yet. Create one to be told what your cameras see.",detection:"No detection rules yet. Create one to be told what your cameras see.",occupancy:"No occupancy rules yet. A new one opens on the occupancy condition \u2014 pick the camera first, then the zone and the count.",audio:"No sound rules yet. A new one opens with a level threshold already set, so you only have to name the sounds and the targets.",timelapse:"No timelapses yet. A timelapse turns a night of recorded footage into a short video and sends it when the window closes \u2014 pick the cameras and the hours.",summary:"No summaries yet. A summary collects the best shot of everything that passed in front of several cameras and sends one image."},create:{detection:"New detection rule",occupancy:"New occupancy rule",audio:"New sound rule",timelapse:"New timelapse",summary:"New summary"},timelapse:"Timelapse",summary:"Summary"},mediaBadge:{attach:{"best-matching":"Matching image",keyFrame:"Key frame",none:"No image"},frame:{full:"Whole scene",boxed:"Boxed scene"},zoneCrop:"Zone crop",gif:"GIF",clip:"Clip",profile:"{{profile}} quality"},editor:{createTitle:"New rule",editTitle:"Edit \"{{name}}\"",basics:"Basics",nameLabel:"Name",namePlaceholder:"e.g. Front door people",triggerLabel:"Trigger",priorityLabel:"Priority",targetsLabel:"Deliver to",noTargets:"You have no targets yet. Add one under the Targets tab first.",pickTarget:"Pick at least one target.",conditionsLabel:"Conditions",section:{rule:"Rule",devices:"Cameras",conditions:"Conditions",notification:"Notification",advanced:"Advanced"},kindSection:{detection:"Conditions",sensor:"Conditions",occupancy:"Occupancy",sound:"Sound",system:"Events"},kindBlurb:{sensor:"A doorbell press or a linked sensor changing state. The picture comes from the camera the sensor is attributed to.",occupancy:"Fires when the count in a camera frame or a zone crosses your threshold and holds. Pick the camera first \u2014 the zone list is that camera's.",sound:"Fires on a confirmed window of audio, never on a picture. Name the sounds and/or keep a level threshold \u2014 with neither it can never match.",system:"The installation itself: a camera or stream dropping, a node leaving, an update landing. There is no detection behind it and no frame to attach."},dropTitle:"These will be removed when you save",dropHint:"This kind of rule can't use them, so keeping them would leave the rule silent.",condition:{systemEvent:"System event",sensorKinds:"Sensor kinds",eventTypeTokens:"Event-type tokens",source:"Detection source",classes:"Object classes",classesExclude:"Excluded classes",minConfidence:"Minimum confidence",zones:"Zones",zonesExclude:"Excluded zones",customZones:"Custom zones",crossing:"Zone crossing",labelEquals:"Label equals",identities:"Known faces",identitiesExclude:"Excluded faces",plates:"Known plates"},moreConditionsLabel:"More conditions",showAdvanced:"Show advanced",noConditions:"No conditions available.",notForTrigger:"Not for this trigger",notForTriggerHint:"Not evaluated for the selected trigger \u2014 switch the trigger to use it.",mediaLabel:"Media",attachLabel:"Attachment",frameLabel:"Picture shows",frame:{cropped:"The subject",full:"The whole scene",boxed:"The scene, with boxes"},zoneCropLabel:"Crop to the zone",zoneCropHint:"Crop the picture to the rule's zone instead of the subject or the whole scene.",gifLabel:"Attach a GIF",gifHint:"A short animation cut from the live buffer around the moment \u2014 the camera does not have to be recording.",clipLabel:"Attach a video clip",clipHint:"An MP4 of the same cut. Destinations that take no video still get the picture.",preRollLabel:"Seconds before",postRollLabel:"Seconds after",profileLabel:"Footage quality",profile:{auto:"Automatic",high:"High",mid:"Medium",low:"Low"},templateLabel:"Message (optional)",templateTitleLabel:"Title",templateBodyLabel:"Body",templatePlaceholder:"Supports {{var}} placeholders",save:"Save changes",create:"Create rule",addValue:"Add value\u2026",removeTag:"Remove {{value}}",clear:"Clear",noCameras:"No cameras available \u2014 the rule applies to all devices.",plateText:"Plate text\u2026",maxDistance:"Max distance",waitForEnhancementLabel:"Wait for recognition",waitForEnhancementHint:"On: one notification at the end of the track, with the name. Off: one straight away without the name, plus a second one if the name arrives before the track ends.",recognition:{noIdentities:"No people saved yet. Add one from an event's face.",unknownIdentities:"Selected but not in the gallery (a deleted person, or an old rule saved by name). Remove what no longer applies.",identities:{off:"Anyone",anyKnown:"Known",specific:"These people",offHint:"The rule does not care who it is \u2014 someone unrecognised matches too.",anyKnownHint:"Only people saved in the gallery, whoever they are. A stranger does not match.",specificHint:"Only the people selected here. Matched on the saved person, so renaming them does not break the rule."},plates:{off:"Any vehicle",anyKnown:"Any plate",specific:"These plates",offHint:"The rule does not care about the plate \u2014 a vehicle whose plate could not be read matches too.",anyKnownHint:"Only vehicles whose plate was actually read, whatever it said.",specificHint:"Only these plates, matched tolerantly \u2014 plate reading is never perfect."}},customZones:{empty:"No custom zones yet. Pick a camera and draw one.",pickCamera:"Camera to draw over",noCameras:"No online cameras to draw over.",draw:"Draw zone",zoneLabel:"Zone {{index}} ({{count}} pts)",remove:"Remove zone {{index}}",title:"Draw zone \u2014 {{name}}",hint:"Tap to add points, drag a point to move. Tap the first point to close.",loading:"Loading frame\u2026",cancel:"Cancel",clear:"Clear",close:"Close",confirm:"Confirm"},addWindow:"Add window",scheduleAlways:"Always active \u2014 add a window to restrict when the rule fires.",scheduleInvert:"Active outside the windows",delivery:{immediate:"Immediate",trackEnd:"Track end",deviceEvent:"Device event",packageEvent:"Package event",systemEvent:"System event"},systemKinds:{"device-online":"Device online","device-offline":"Device offline","device-disabled":"Device switched off","device-enabled":"Device switched on","camera-online":"Camera online","camera-offline":"Camera offline","camera-disabled":"Camera switched off","camera-enabled":"Camera switched on","stream-online":"Stream online","stream-offline":"Stream offline","node-online":"Node online","node-offline":"Node offline","node-inference-unavailable":"Node has no usable inference device","detection-blind":"Camera detecting nothing","addon-crash-loop":"Addon crash loop (runner gave up)","alarm-arm-refused":"Alarm arming refused","alarm-arming":"Alarm arming","alarm-triggered":"Alarm triggered","alarm-armed":"Alarm armed","alarm-disarmed":"Alarm disarmed","addon-update-available":"Addon update available","server-update-available":"Server update available","addon-updated":"Addons updated","server-updated":"Server updated","export-completed":"Export completed","device-battery-low":"Battery low","device-battery-normal":"Battery recovered"},systemFilters:{cameras:"Only these cameras (optional)",deviceTypes:"Only these device types (optional)",nodes:"Only these node IDs (optional)",packages:"Only these addon packages (optional)",addNode:"Add node ID\u2026",addPackage:"Add package name\u2026"},media:{best:"Best image",bestMatching:"Best matching",keyFrame:"Key frame",none:"No attachment"},source:{any:"Any",pipeline:"Pipeline",onboard:"Onboard",sensor:"Sensor",audio:"Audio"},phase:{delivered:"Delivered","picked-up":"Picked up",both:"Both"},zoneMatch:{any:"Any of",all:"All of"},group:{scope:"Scope",class:"Classes",zones:"Zones",quality:"Quality",label:"Identity & plates",device:"Device event",package:"Package",system:"System events",schedule:"Schedule",occupancy:"Occupancy",audio:"Sound"},taxonomy:{person:"People",vehicle:"Vehicles",animal:"Animals",audio:"Audio",sensor:"Sensors",control:"Controls",custom:"Custom values",addCustom:"Add a custom value\u2026"},weekday:{mon:"Mon",tue:"Tue",wed:"Wed",thu:"Thu",fri:"Fri",sat:"Sat",sun:"Sun"},crossing:{unset:"Entering",exit:"Leaving",any:"Either"},deviceStateNone:"Not set \u2014 this rule is never gated on another device.",deviceStateSet:"Only while device {{deviceId}} is: {{states}}. Change it from the admin UI \u2014 this app cannot list every device.",sceneGateNone:"Not set \u2014 this rule is never gated on a scene.",sceneGateSet:"Only while scene {{sceneId}} is {{state}}, reading {{read}}. Pick the scene from the admin UI \u2014 this app cannot list them.",sceneReadDefault:"whichever boolean the scene itself uses",sceneReadLatched:"the latch (since it was armed)",sceneReadLive:"the live verdict",sceneState:{matched:"matched (as captured)",diverged:"diverged (changed)"},occupancy:{zoneLabel:"Zone",wholeFrame:"\u2014 whole frame \u2014",zonesLoading:"Loading zones\u2026",zonesNeedCamera:"Pick the cameras above to choose one of their zones.",zonesNone:"These cameras have no zones \u2014 the count covers the whole frame.",zoneMissing:"Zone \"{{id}}\" no longer exists on these cameras. The rule still stores it and will never fire until you pick another scope.",classLabel:"Class",anyClass:"\u2014 any class \u2014",classesNone:"The hub sent no class vocabulary \u2014 the count covers every class.",classMissing:"\"{{name}}\" is not a class these cameras report. The rule still stores it and will never fire until you pick another one.",opLabel:"Fires when",op:{"became-occupied":"Became occupied","became-free":"Became free",">=":"Count \u2265","<=":"Count \u2264"},thresholdLabel:"Threshold",countLabel:"Count",sustainLabel:"Hold for (seconds)",sustainInstantHint:"A 0-second hold fires on the very first frame that crosses \u2014 expect repeat notifications from a subject that walks the edge of the zone. 15 seconds is the usual choice.",hint:"Counts confirmed tracked objects from zone analytics. The change must hold for the whole window before it fires; with no snapshot for the camera or zone the rule never fires.",classesDropped:"The class filter ({{classes}}) is dropped on save: an occupancy edge carries one class, so it would only stop this rule from ever firing. Scope the class above instead."},audio:{modeLabel:"How it fires",modeLabelOption:"\ud83d\udd0e Sounds",modeLevelOption:"\ud83d\udcc8 Volume",modeLabelHint:"Fires when enough labelled frames land inside a short window (default 2 in 5 seconds). A single-frame false positive never reaches 2; a real episode usually labels two or three frames. The rule's cooldown is the other throttle.",modeLevelHint:"Fires when the sound stays loud enough for long enough: the window below is the whole condition.",labelsLabel:"Sounds",labelsHint:"Pick at least one. The classifier labels only a frame or two per episode, so a percentage of a window could never confirm them \u2014 this mode counts those frames instead.",confirmHitsLabel:"Confirm after (frames)",confirmHitsHint:"How many labelled frames must land inside the window before a notification is sent. Default 2 \u2014 a single-frame false positive never reaches it.",confirmWindowLabel:"within (seconds)",confirmWindowHint:"The window those frames must share. Default 5 s. Two frames six seconds apart do not confirm.",labelsUnknown:"This rule stores {{labels}}, which this hub does not classify. It is kept as-is; tap it to drop it.",dbLabel:"Louder than (dBFS)",dbHint:"dBFS is negative-going: 0 is full scale, \u221296 is silence \u2014 so a HIGHER number is a NARROWER filter. Measured on this hub, a baby crying reads \u221255 to \u221226 dBFS, so a floor above \u221255 excludes most of it.",hitPercentLabel:"Hits in the window (%)",hitPercentHint:"How much of the window must match before it fires. Default 60%.",samplingLabel:"Window (seconds)",samplingHint:"The window must be FULL before it can match \u2014 a half-open window never fires. Default 10s.",failClosedHint:"Pick at least one sound or set a level floor. With neither, every sample is a hit and the hub refuses the rule rather than notifying on silence.",hint:"Fires on sustained SOUND, not on a picture: a rule with this condition is evaluated only on a confirmed audio window, never on a detection or a track. The cameras it covers need audio analysis enabled."},zonePicker:{needCamera:"Select a camera first \u2014 zones belong to a camera.",loading:"Loading zones\u2026",none:"The selected cameras have no zones.",missing:"Zone {{id}} no longer exists on the selected cameras"},dropReason:{occupancy:{sensorKinds:"An occupancy edge is not a sensor event: it carries no sensor kind, so this condition can never match one.",eventTypeTokens:"An occupancy edge carries no device event-type token \u2014 that comes from an event emitter, which a count crossing has none of.",source:"An occupancy edge is always produced by the pipeline, so any other source can never match and \u201cpipeline\u201d narrows nothing."},sound:{classes:"A sound rule fires on what the camera HEARD. Its subject carries no detection, so this condition can never match one \u2014 name the sounds in the Sound condition instead.",classesExclude:"A sound rule fires on what the camera HEARD. Its subject carries no detection, so there is nothing here to exclude \u2014 name the sounds in the Sound condition instead.",minConfidence:"A sound window\u2019s evidence is a percentage of samples, not a detector score, so a confidence threshold can never be satisfied.",zones:"A sound has no position in the frame, so a zone can never match it.",zonesExclude:"A sound has no position in the frame, so a zone can never exclude it.",customZones:"A sound has no position in the frame, so a drawn area can never match it.",crossing:"A sound has no position in the frame, so it can never cross a zone boundary.",labelEquals:"A sound rule fires on what the camera HEARD. Its subject carries no detection and therefore no label \u2014 name the sounds in the Sound condition instead.",identities:"A sound rule fires on what the camera HEARD. Its subject carries no detection, so there is no face to recognise.",identitiesExclude:"A sound rule fires on what the camera HEARD. Its subject carries no detection, so there is no face to exclude.",plates:"A sound rule fires on what the camera HEARD. Its subject carries no detection, so there is no plate to read.",source:"A confirmed sound window is always stamped as an audio subject, so any other source can never match."}},ai:{sectionLabel:"AI description",enabledLabel:"Describe with AI",enabledHint:"Adds one sentence written by a vision model to this notification. It never withholds the notification \u2014 if the model is cold or unreachable, the alert is delivered without the sentence.",blurb:{occupancy:"The model is shown the still and told the count this rule claims, and answers whether that count holds. Your question guides what it looks at; the verdict sentence is written by the hub, so a disagreement always says so.","detection-immediate":"The model is shown the still taken at the moment this rule fired and answers your question about it.","detection-track":"The model is shown the beginning, the best moment and the end of the passage, and answers your question about what happened across them."},profileLabel:"Model",profileAuto:"Automatic",noProfiles:"No vision-capable model is configured on this hub. Add one from the admin Settings before switching this on.",profilesUnavailable:"This hub cannot list its vision models. The section still saves; the hub picks its own default model.",languageLabel:"Answer language",languageAuto:"Hub default",language:{en:"English",it:"Italian"},maxWordsLabel:"Length",maxWordsHint:"About how many words to ask for. It is an instruction to the model, not a cut \u2014 expect roughly this length, occasionally a word or two over. Unset, this rule's targets give {{words}}.",maxWordsVaries:"About how many words to ask for. It is an instruction to the model, not a cut. Your targets do not agree on a default; the strictest of them gives {{words}}, and unset each target gets its own.",promptLabel:"Your question",occupancyContract:"The answer stays a verdict: the hub asks for the count, compares it with this rule's, and writes the confirmation or the refutation itself. Your question guides the model \u2014 it cannot change the answer's format."}}},targets:{add:"Add target",empty:"No targets yet. Add one to start receiving notifications.",loadError:"Couldn't load your targets. Pull to retry.",pickKind:"Choose a notification kind",noKinds:"No notification kinds are available.",kindUnavailable:"unavailable",test:"Send test",testing:"Sending\u2026",testOk:"Test delivered",testFail:"Test failed",edit:"Edit",delete:"Delete",cancel:"Cancel",save:"Save changes",create:"Create target",addTitle:"Add {{kind}} target",editTitle:"Edit {{name}}",deleteConfirmTitle:"Delete target",deleteConfirmMessage:"Delete \"{{name}}\"? This can't be undone.",form:{details:"Details",config:"Configuration",nameLabel:"Name",nameHint:"A label to recognize this target.",secretHint:"Leave blank to keep the saved value."}},snooze:{title:"Snooze",intro:"A snooze silences YOU, not the household \u2014 unless a rule says otherwise. It ends by itself.",activeNone:"Nothing is snoozed.",active:"Silenced now",past:"Recently ended",openTitle:"Silence for",scopeLabel:"What to silence",everything:"Everything",aRule:"One rule",aCamera:"One camera",chooseRule:"Choose a rule",chooseCamera:"Choose a camera",camerasLoading:"Loading your cameras\u2026",noCameras:"No cameras to silence.",globalLabel:"Silence it for everyone",globalHelp:"Other people stop being notified too.",globalNotAllowed:"This rule can only be silenced for you.",summaryLabel:"Tell me what I missed",summaryHelp:"A summary arrives when the window ends.",endNow:"End now",endsIn:"ends in {{label}}",everyone:"for everyone",loadError:"Couldn't load your snoozes.",createError:"Couldn't start that snooze.",classesTitle:"Only these",classesHelp:"Leave this alone and the window covers everything. Pick classes to silence only those \u2014 the rest still reaches you.",everyClass:"Everything",durations:{m10:"10 min",m30:"30 min",h1:"1 hour"},scope:{rule:"One rule",device:"One camera",all:"Everything"},remaining:{ended:"over",minutes:"{{minutes}} min",hours:"{{hours}}h",hoursMinutes:"{{hours}}h {{minutes}}m"},viewOnly:"Your account can see snoozes but not open one."},timelapse:{createTitle:"New timelapse",editTitle:"Edit \u201c{{name}}\u201d",namePlaceholder:"Driveway overnight",enabledLabel:"Active",camerasHint:"One video per camera. A camera that is not recording cannot produce a timelapse \u2014 the hub refuses the save and says which one.",windowLabel:"Window",windowHint:"The hours this covers. The window is the rule: it starts collecting when the window opens and sends the video when it closes.",samplingLabel:"Sampling",cadenceLabel:"One frame every (s)",framerateLabel:"Playback (fps)",denseHint:"Around detections the hub samples faster on its own. Set that rate by hand in the web admin if you need to.",previewHint:"What the notification shows before you open the video.",preview:{image:"Still",gif:"GIF"},problem:{devices:"Pick at least one camera.",schedule:"Add at least one window \u2014 a timelapse with no hours never runs."}},summary:{createTitle:"New summary",editTitle:"Edit \u201c{{name}}\u201d",namePlaceholder:"Overnight round-up",enabledLabel:"Active",camerasHint:"One image covering all of them \u2014 the best shot of everything that passed.",windowLabel:"Window",window:{motion:"On motion",schedule:"On a schedule"},motionHint:"Opens on the first movement at any of these cameras and stays open while more keeps arriving.",scheduleHint:"Fixed hours. The summary is sent when the window closes.",quietLabel:"Close after quiet (s)",maxWindowLabel:"Never longer than (s)",advancedHint:"How many pictures go in, how they are chosen and what the AI is asked are set in the web admin.",hubTooOld:"This hub only lets an administrator create summaries. You can see them here; update the hub to edit them from the app.",problem:{devices:"Pick at least one camera.",window:"Check the window \u2014 a scheduled summary needs hours, and \u201cnever longer than\u201d has to be greater than the quiet period."}},family:{cameras_one:"{{count}} camera",cameras_other:"{{count}} cameras",never:"Nothing sent yet.",last:"Last sent {{when}}.",off:"Switched off \u2014 it will not run.",readOnly:"Created by an administrator. You can see it here but not change it."}},login:{loginFailed:"Login failed",verifyFailed:"Verification failed",serverUrl:"Server URL",username:"Username",password:"Password",showPassword:"Show password",hidePassword:"Hide password",signIn:"Sign in",signingIn:"Signing in\u2026",twoFactor:"Two-factor authentication",totpHint:"Enter the 6-digit code from your authenticator app to sign in as ",verificationCode:"Verification code",verifyAndSignIn:"Verify and sign in",verifying:"Verifying\u2026",back:"Back",or:"or",signInWithCamStack:"Sign in with CamStack",hubSignInHint:"Opens your hub\u2019s login page and links this app without typing your password here.",handoffFailed:"Sign-in with CamStack failed \u2014 try again or use username and password",invalidServerUrl:"Enter a valid server URL (https://\u2026) first"},live:{webUnsupported:"Live view is not available on the web version yet.",connecting:"Connecting to live stream\u2026",error:"Unable to load the live stream.",retry:"Retry",noConnection:"No connection to the server",failed:"Connection failed",errorPageLoad:"The player page failed to load."},ptz:{title:"PTZ",notAvailable:"PTZ controls are not available for this camera.",zoom:"Zoom",home:"Home position",presets:"Presets",noPresets:"No presets saved."},navigation:{title:"Navigation",notAvailable:"Navigation controls are not available for this device.",drive:"Drive",forward:"Forward",left:"Turn left",right:"Turn right",turnAround:"Turn around",stop:"Stop",actions:"Actions",sounds:"Sounds",light:"Fill light",lightOn:"Light on",lightOff:"Light off",auto:"Auto",manual:"Manual",levelUp:"Brighter",levelDown:"Dimmer",following:"following",joystick:"Drive joystick",joystickHint:"Drag to drive the robot; release to stop.",followMe:"Follow me",returnToDock:"Return to dock",moreControls:"More controls",mode:{idle:"Idle",cleaning:"Cleaning",spot:"Spot cleaning",following:"Following",goto:"Going to point",returning:"Returning to dock",paused:"Paused",unknown:"Unknown"}},timeline:{activityTitle:"Activity",last24h:"Last 24h",loading:"Loading activity\u2026",noActivity:"No activity in the last 24 hours.",legendRecording:"Recorded",legendMotion:"Motion",legendAudio:"Audio",showTimeline:"Show timeline",hideTimeline:"Hide timeline",faultStream:"The video stream is unavailable.",faultRecordings:"Couldn't load the recordings for this day.",faultEvents:"Couldn't load this day's events.",faultDismiss:"Dismiss",loadRetry:"Retry",loadRetrying:"Retrying\u2026",moreHistory:"There is older history not shown yet.",scopeUnreadable_one:"One camera in this view could not be read \u2014 its events and footage are missing here.",scopeUnreadable_other:"{{count}} cameras in this view could not be read \u2014 their events and footage are missing here.",scopeOverflow_one:"This view has one camera more than the timeline can read at once.",scopeOverflow_other:"This view has {{count}} cameras more than the timeline can read at once.",scopeUnreadableAndOverflow:"{{unreadable}} cameras could not be read and {{overflow}} more than the timeline can read at once are not shown.",loadMoreHistory:"Load more",loadingMoreHistory:"Loading\u2026"},theater:{back:"Back",today:"Today",yesterday:"Yesterday",prevDay:"Previous day",nextDay:"Next day",selectDate:"Pick a date",live:"LIVE",now:"NOW",auto:"Auto",quality:"Stream quality",filterAll:"All",filter_motion:"Motion",filter_audio:"Audio",goToLive:"Go to live",liveLockOn:"Live lock on \u2014 browsing keeps the picture live",liveLockOff:"Live lock off \u2014 browsing plays the recording",recordLive:"Record live",keepClip:"Keep the recording",keepClipTitle:"Keep this clip?",discardClip:"Discard",saveToGallery:"Save to Photos",shareClip:"Share",recordFailed:"Could not record the live view",noRecording:"No recording",noRecordingHint:"No footage at this time",detailCount:"{{frames}} frames \xb7 {{count}} detections",detailTracks:"{{tracks}} tracks \xb7 {{count}} detections",detailEmpty:"No detail images for this moment",detailSeek:"Go to this moment",zoneHint:"Drag a rectangle over the video to filter events by zone",zoneConfirm:"Confirm",zoneCancel:"Cancel",playbackBar:"Playback controls",footerBar:"Timeline tools",filterTitle:"Filters",zoomRange:"Time range",zoomSpanMinutes:"{{count}}m",zoomSpanHours:"{{count}}h",zoneFilter:"Zone filter",detailSubjects_one:"{{count}} subject",detailSubjects_other:"{{count}} subjects",zoneModeRect:"Rectangle",zoneModePolygon:"Polygon",zoneClearPoints:"Clear",zoneHintPolygon:"Tap to add points \u2014 3 or more",selectTime:"Time",goSameTime:"Go \u2014 same time of day",recordingDaysFailed:"Couldn't read which days have recordings.",recordingDaysPartial:"Some cameras in this view could not be read \u2014 days without a dot may still have footage on them.",clusterOpenDetail:"Open event detail",clusterCarouselShow:"Open the cluster carousel",clusterCarouselHide:"Close the cluster carousel",clusterPrevImage:"Previous image",clusterNextImage:"Next image",clusterCameras_one:"{{count}} camera",clusterCameras_other:"{{count}} cameras",clipStartsAtSubjectAt:"Clip starts at {{start}}, subject at {{subject}}",clipEndsAt:"Clip ends at {{end}}",legend:{open:"Heatmap and timeline legend",title:"Legend",heatmapTitle:"24-hour heatmap",heatmapRecordingTitle:"Recording",heatmapRecordingBody:"Red hairline along the top of the tape \u2014 coverage for that stretch of the day.",heatmapAudioTitle:"Audio",heatmapAudioBody:"Peaks hanging from the top. Quiet is green, loud is red \u2014 the same six rungs as the live meter.",heatmapBottomTitle:"Motion and detections",heatmapBottomBody:"The bottom of each slot fills with green motion, or with the prominent object class when a detection is in that slot.",timelineTitle:"Activity column",timelineRecordingTitle:"Recording",timelineRecordingBody:"Continuous red line on the far right.",timelineMotionTitle:"Motion",timelineMotionBody:"Green line down the centre.",timelineDetectionTitle:"Object detection",timelineDetectionBody:"Dot sitting on the motion line, coloured as the prominent class at that moment.",timelineAudioTitle:"Audio level",timelineAudioBody:"Line on the far left. Same green-to-red scale as the heatmap and the live meter.",classesTitle:"Detection classes",classPerson:"Person",classPersonBody:"People and faces.",classVehicle:"Vehicle",classVehicleBody:"Cars, trucks, bikes and the rest of the vehicle family.",classAnimal:"Animal",classAnimalBody:"Dogs, cats, birds and other animals."}},mediaKind:{crop:"Object crop",thumbnail:"Best shot",faceCrop:"Face",plateCrop:"Plate",fullFrame:"Frame",fullFrameBoxed:"Boxed",keyFrame:"Key frame",firstFrame:"First",lastFrame:"Last",snapshot:"Snapshot"},tracks:{crop:"Crop",fullFrame:"Full frame",bestShot:"Best shot",media:"Media",noMedia:"No media stored for this track",mediaLoadError:"Media could not be loaded",mediaEntryLoading:"Loading this media\u2026",mediaEntryError:"This media is indexed but could not be read",mediaEntryAbsent:"Not stored for this track",path:"Path",pathSummary:"{{count}} points \xb7 {{seconds}}s",pathNoLocalization:"no precise position",share:"Share",copyLink:"Copy link",linkCopied:"Link copied",shareImage:"Share image",viewFullRes:"Full resolution",fullResBadge:"Full",zones:"Zones",audio:"Audio",prevTrack:"Previous event",nextTrack:"Next event",reason:"Why notable",empty:"No tracks",recent:"Recent",searchPlaceholder:"Search events (e.g. \"person in red\")",searchSubmit:"Search",searchClear:"Clear search",noMatches:"No matching events",person:"Person",assignPerson:"Assign to person",changePerson:"Change",notAssigned:"Not assigned",matchConfidence:"Match confidence",suggested:"Suggested",suggestedUnknown:"Suggested person",suggestedConfirm:"Confirm",suggestedDismiss:"Dismiss",assignFaceTitle:"Assign face",newPersonPlaceholder:"New person name\u2026",createAndAssign:"Create & assign",assignFailed:"Couldn't assign the face",removePerson:"Remove person",removePersonConfirmTitle:"Remove person?",removePersonConfirmBody:"This unlinks the person from this face. The face returns to the unassigned buffer and can be reassigned later.",disassociateFailed:"Couldn't remove the person",removePersonAll:"Remove from all events",removePersonAllConfirmTitle:"Remove from all events?",removePersonAllConfirmBody:"This unlinks this person from EVERY event. All faces currently recognized as this person return to the unassigned buffer and can be reassigned later. The person is kept.",disassociateAllFailed:"Couldn't remove the person from all events",existingPersons:"People",noPersons:"No people yet",metadata:"Metadata",markForTraining:"Mark for training",markForTrainingHint:"Keeps this track and its media past retention",debugFlag:"Debug",debugFlagHint:"Flag this track for diagnostic attention. Hold to edit what should be checked.",debugNotePromptTitle:"What should we check?",debugNotePromptBody:"Describe what looks wrong on this event, in your own words. It stays on the track, so whoever reviews the debug set reads the question with it.",debugNotePlaceholder:"e.g. the box jumps to the fence when the car passes",debugPreset:{noCrop:"No crop of the subject",edgeCropMirror:"Edge crop came out mirrored",lateStart:"Track started late",neverDetected:"Subject never detected",boxPathMismatch:"Box does not match the path",brokenTrack:"Track broke into pieces",badThumbnail:"Bad thumbnail",falsePositive:"Nothing was there"},debugReviewed:"Analyzed",debugReviewedHint:"Mark this debug track as analyzed so it drops out of the debug filter and export",favourited:"Favourited",favouritedHint:"Keeps this track and its media past retention",copy:"Copy",copied:"Copied","meta.trackId":"Track ID","meta.eventId":"Best event ID","meta.deviceId":"Device ID","meta.camera":"Camera","meta.className":"Class","meta.label":"Label","meta.firstSeen":"First seen","meta.lastSeen":"Last seen","meta.state":"State","meta.importance":"Importance","meta.confidence":"Confidence","meta.mediaKeys":"Media keys",rescore:{button:"Recompute matches",failed:"Couldn't recompute the matches",params:"Threshold {{threshold}} \xb7 margin {{margin}}",needsSamples:"{{count}} samples \u2014 needs {{min}}",reembed:"Re-embed this face and retry",reembedFailed:"Re-embed failed: {{reason}}",verdict:{"auto-assignable":"Would be assigned to {{name}}",ambiguous:"Two people score too close to call \u2014 the margin blocks it",suggestion:"Plausible, but below the auto-assign threshold","below-threshold":"No match in the gallery as it stands","no-eligible-identity":"No person has enough samples yet ({{min}} needed)","empty-gallery":"Nothing in the gallery is comparable to this face","model-mismatch":"This face was embedded with an older model \u2014 its scores cannot be compared"}}},accessories:{on:"On",off:"Off",dimUp:"Brighter",dimDown:"Dimmer",lock:"Lock",unlock:"Unlock",open:"Open",close:"Close",stop:"Stop",arm:"Arm",disarm:"Disarm",onMotion:"On motion",openPercent:"Open {{percent}}",warmer:"Warmer",cooler:"Cooler",speedUp:"Faster",speedDown:"Slower",oscillate:"Oscillate",press:"Press",play:"Play",pause:"Pause",previous:"Previous",next:"Next",start:"Start",dock:"Dock",locate:"Locate",feed:"Feed",feeding:"Feeding\u2026",install:"Install",installing:"Installing\u2026",upToDate:"Up to date",increase:"Increase",decrease:"Decrease",select:"Select",noEvent:"No events yet",buttonIndex:"Button {{index}}",mode:"Mode",fanMode:"Fan mode",preset:"Preset",direction:"Direction",forward:"Forward",reverse:"Reverse",away:"Away",humidityUp:"Increase humidity",humidityDown:"Decrease humidity",swingVertical:"Vertical swing",swingHorizontal:"Horizontal swing",setTemperature:"Set temperature",currentTemperature:"Current temperature",climateModes:{off:"Off",heat:"Heat",cool:"Cool",auto:"Auto",heat_cool:"Heat/Cool",fan_only:"Fan",dry:"Dry"}},updates:{otaReadyTitle:"Update downloaded",otaReadyBody:"Restart the app now to apply it? Later applies it at the next start.",install:"Restart now",later:"Later",whatsNewTitle:"What's new in {{version}}",whatsNewHeading:"What's new",whatsNewPrevious:"Previous updates",whatsNewRow:"What's new",whatsNewNone:"No notes for this version.",nativeRow:"App build",nativeUpToDate:"Up to date",nativeUnknown:"\u2014",nativeNewer:"{{version}} ({{build}}) available",nativeNewerTitle:"A newer app build is available",nativeNewerBody:"Version {{version}} (build {{build}}) is available. Updates from now on need it.",openTestFlight:"Open TestFlight",openStore:"Open the store"},cameraMenu:{title:"View options",gridCommonHint:"Overlays shared by the whole wall \u2014 boxes, highlight border and its triggers, cluster labels \u2014 are set once for the grid, in the grid bar.",streamStats:"Stream stats",audioLevel:"Audio level",densityTitle:"Timeline density",density_compact:"Compact",density_medium:"Medium",density_wide:"Wide",densityCustom:"Custom",showImportance:"Show importance",showClass:"Show detection class",timelineSection:"Timeline",managementTitle:"Management"},viewOptions:{groupDetection:"Detection overlays"},cameraShelf:{goTo:"Go to this camera",addToView:"Add to view",closeView:"Close view"},cameraSwitches:{title:"Camera functions",loading:"Reading camera functions\u2026",readFailed:"Camera functions could not be read. Nothing has changed \u2014 they are not shown rather than shown with a guessed state.",writeFailed:"That change was refused and has been undone. {{reason}}",offBadge:"OFF",badgeLabel_one:"{{count}} function switched off",badgeLabel_other:"{{count}} functions switched off",unavailableNoProvider:"Not available \u2014 nothing in this installation provides it.",unavailableUnreachable:"Unknown \u2014 the service that owns this did not answer.",unavailableNotConfigured:"Not offered \u2014 nothing is set up for it to act on yet.",unavailableNoPrivacyZones:"Not offered \u2014 no privacy zone is drawn on the camera yet. Draw one in the camera\u2019s own app, then this switch appears.",unavailableDeviceDisabled:"Not offered while the camera is switched off.",unavailableUnknown:"Not available on this camera."},stats:{title:"Stream stats",resolution:"Resolution",fps:"FPS",bitrate:"Bitrate",packetLoss:"Packet loss",jitter:"Jitter",codec:"Codec",frames:"Frames (dropped/total)",waiting:"Measuring\u2026",playbackHint:"Full WebRTC stats need the native player."},exportActions:{title:"Capture",recordingExport:"Recording export"},exportSelection:{start:"Select a period to export",discard:"Discard the selection",save:"Save the selected period",savePartial:"Save the selected period \u2014 part of it was not recorded",title:"Export",queued:"The export was queued. You will find it under Exports when it is ready.",failed:"The export could not be queued.",gapTitle:"Part of this period was not recorded",gapMessage:"The selected {{duration}} crosses a stretch with no recording. The export will contain only the recorded parts.",gapConfirm:"Export anyway"},exports:{title:"Exports",empty:"No exports yet.",settingsHint:"Download recorded clips",range:"Range",rangeStart:"Start",rangeEnd:"End",profile:"Profile",noFootage:"No footage in this range.",speed:"Speed",timelapse:"Timelapse",cadence:"Frame every",audio:"Audio",includeAudio:"Include audio",audioUnavailable:"Audio is only available at 0.5\u20132\xd7 speed.",retention:"Keep for",life24h:"24 hours",life7d:"7 days",life30d:"30 days",deleteAfterDownload:"Delete after download",deleteAfterDownloadHint:"Remove the file once downloaded.",notify:"Notify when ready",creating:"Creating\u2026",createAction:"Export",createFailed:"Could not create the export.",withAudio:"with audio",variantRegular:"1\xd7",variantAccelerated:"Accelerated {{speed}}\xd7",variantSlow:"Slow {{speed}}\xd7",variantTimelapse:"Timelapse",expired:"Expired",expiresInDays:"Expires in {{count}}d",expiresInHours:"Expires in {{count}}h",expiresInMinutes:"Expires in {{count}}m",downloadAction:"Download",downloadUnavailable:"Download not available.",downloadFailed:"Download failed.",cancelAction:"Cancel",cancelConfirmTitle:"Cancel export?",cancelConfirmBody:"This stops rendering and discards the partial file.",deleteAction:"Delete",deleteConfirmTitle:"Delete export?",deleteConfirmBody:"This removes the file. The history entry is kept.",dismiss:"Dismiss",state:{queued:"Queued",rendering:"Rendering",ready:"Ready",failed:"Failed",expired:"Expired",deleted:"Deleted"}},library:{title:"Library",sections:{events:"Events",artifacts:"Artifacts",exports:"Exports",review:"Review"}},artifacts:{title:"Artifacts",settingsHint:"Timelapses, clips and summaries",empty:"No artifacts yet.",emptyFiltered:"No artifacts match these filters.",loadError:"Could not load the artifacts.",gone:"This artifact is no longer on the hub.",expired:"Expired",expiredBody:"The retention window closed and the file was removed.",expiresInDays:"Expires in {{count}}d",expiresInHours:"Expires in {{count}}h",expiresInMinutes:"Expires in {{count}}m",retentionHint:"Kept for up to 14 days. Files may be removed sooner when the hub reaches its storage limits.",byRule:"Rule: {{name}}",allCameras:"All cameras",cameraPlus:"{{name}} +{{count}}",close:"Close",downloadAction:"Download",downloadUnavailable:"Download not available.",downloadFailed:"Download failed.",kind:{timelapse:"Timelapse","timelapse-preview":"Timelapse preview","summary-mosaic":"Summary mosaic","event-gif":"GIF","event-clip":"MP4","event-still":"Still"},time:{now:"Just now",minutesAgo:"{{count}}m ago",hoursAgo:"{{count}}h ago",daysAgo:"{{count}}d ago"},range:{all:"All",day:"24h",week:"7d",month:"30d"},filters:{toggle:"Filters",kind:"Type",camera:"Camera",range:"Period",clear:"Clear filters"},detail:{kind:"Type",cameras:"Cameras",rule:"Rule",captured:"Captured",created:"Produced",size:"Size",format:"Format",expiry:"Expires"}},streamBar:{play:"Play",pause:"Pause",scrubForward:"Scrubbing forward",scrubBackward:"Scrubbing backward",mute:"Mute",unmute:"Unmute",talkStart:"Start talking",talkStop:"Stop talking",quality:"Stream quality",menu:"View options",snapshot:"Snapshot",pip:"Picture in picture",fullscreen:"Fullscreen",exitFullscreen:"Exit fullscreen"},playback:{servedTier:"Playing {{tier}}",servedTierDegraded:"{{requested}} not available here \u2014 playing {{served}}",tier:{high:"High",mid:"Mid",low:"Low"},prevFrame:"Previous frame",nextFrame:"Next frame",speed:"Playback speed",audioMuted:"Audio off at \u2260 1\xd7",audioOn:"Audio on"},cameraSwitcher:{title:"Switch camera",empty:"No cameras available",openGrid:"Open grid ({{n}})",selectA11y:"Select {{name}}",buildView_one:"Show this camera",buildView_other:"Show these {{count}} cameras"},storage:{title:"Storage",usageTitle:"Usage",nodeTotal:"Node total",defaultLocation:"Default location",locationFree:"{{free}} free",retentionTitle:"Retention",pruneAction:"Apply retention now",pruneConfirmTitle:"Apply retention?",pruneConfirmBody:"Delete footage on {{name}} that exceeds its retention policy.",pruneResult:"Reclaimed {{bytes}} ({{buckets}} segments).",deleteTitle:"Delete footage",deleteAction:"Delete",deleteConfirmTitle:"Delete footage?",deleteConfirmBody:"Permanently delete {{range}} of footage on {{name}}. This cannot be undone.",deleteResult:"Reclaimed {{bytes}} ({{buckets}} segments).",cancel:"Cancel",window24h:"Last 24h",window7d:"Last 7 days",window30d:"Last 30 days",windowAll:"Everything"},eventsMgmt:{title:"Events",footprintTitle:"Footprint",rowsBytes:"{{rows}} events \xb7 {{bytes}}",clusterTotal:"Cluster total",pruneTitle:"Prune older than",pruneHint:"Applies to all cameras.",pruneAction:"Prune",pruneConfirmTitle:"Prune old events?",pruneConfirmBody:"Delete events older than {{range}} across ALL cameras. This cannot be undone.",pruneResult:"Deleted {{count}} events.",deleteTitle:"Delete camera events",deleteAction:"Delete all events for this camera",deleteConfirmTitle:"Delete all events?",deleteConfirmBody:"Permanently delete every event for {{name}}. This cannot be undone.",deleteResult:"Deleted {{count}} events.",cancel:"Cancel",older24h:"24 hours",older7d:"7 days",older30d:"30 days"},overlay:{title:"Overlay",liveSection:"Live indicators",readoutsSection:"Sensors & values",layersLabel:"Boxes on the picture",layerMotion:"Motion",layerObjects:"Objects",layerDiscarded:"Discarded",layerStationary:"Stationary",layerDiscardedHint:"Also draws, as dashed outlines, the near-miss and out-of-zone detections of the classes you enabled \u2014 subjects that fell just under the confidence threshold, or stood outside a zone rule. Use it when boxes flicker on a moving subject. The count pill compares what the model saw with what was kept.",layerStationaryHint:"Draws objects that have stopped and are no longer tracked \u2014 a parked car, a bin left out. The hub suppresses their detections, so they can never appear under Objects or Discarded.",diagCounts:"model {{saw}} \xb7 kept {{kept}}",diagHidden:"{{hidden}} hidden",diagOffTopic:"{{offTopic}} off-topic",diagShed:"frame shed \xb7 {{reason}}",reasonThreshold:"below threshold",reasonFullFrame:"full-frame guard",reasonNms:"suppressed by NMS",reasonClassFilter:"class filter",reasonZoneGate:"zone rule",motionBadge:"Motion badge",highlightBorder:"Highlight border",occupancy:"Occupancy",addReadout:"Add a readout",removeReadout:"Remove readout",readoutsHint:"Pin a live value over the picture \u2014 the audio level, or any sensor linked to this camera.",noFields:"This device publishes no live values.",thisCamera:"This camera",audioDbfs:"Audio level",liveOnlyHint:"These draw on the live picture only \u2014 not during playback or while paused.",positions:{off:"Off","top-left":"Top left","top-center":"Top center","top-right":"Top right","left-center":"Left center","right-center":"Right center","bottom-left":"Bottom left","bottom-center":"Bottom center","bottom-right":"Bottom right"}},clips:{title:"Clips",loading:"Loading clips\u2026",empty:"No clips for this camera in the loaded window.",summary_one:"{{count}} clip",summary_other:"{{count}} clips",collapsedHint:"{{duration}} skipped",hiddenHint_one:"{{count}} hidden by source",hiddenHint_other:"{{count}} hidden by source",segmentLabel:"Clip at {{time}}, {{duration}} long",gapLabel:"Gap of {{duration}}",notPlayable:"not playable yet",kind_motion:"Motion",kind_object:"Object",kind_audio:"Audio",kind_native:"Camera",sourceAnalytics:"Recording",sourceOnboard:"Camera ({{vendor}})",sourceHksv:"HomeKit",sourceUnknown:"{{vendor}}",unitDay:"d",unitHour:"h",unitMinute:"m",unitSecond:"s"},eventsEmbed:{section:"Hub embed (preview)",title:"Events embed",count:"{{count}} shown",openPreview:"Embed preview",openPreviewHint:"Open the hub-hosted events surface next to this page. Nothing is replaced.",view_reel:"Reel",view_gallery:"Gallery",error:"Couldn't load events",retry:"Retry",empty:"No events",emptyFiltered:"No events match this filter",end:"\xb7 end \xb7"},eventsShare:{title:"Events embed link",openBuilder:"Create embed link",openBuilderHint:"Build a standalone URL for a dashboard or an iframe.",view:"View",viewReel:"Reel",viewGallery:"Gallery",columns:"Columns",rows:"Rows",auto:"Auto",thumb:"Thumbnail size",thumbSmall:"Small",thumbMedium:"Medium",thumbLarge:"Large",theme:"Theme",themeAuto:"Auto",themeDark:"Dark",themeLight:"Light",fields:"Card text",field_label:"Title",field_sublabel:"Class",field_camera:"Camera",field_time:"Time",field_badges:"Badges",cameras:"Cameras",camerasAll:"All cameras the link can see",camerasCount:"{{count}} selected",preview:"Link preview",shareMediaNotice:"A share link cannot load thumbnails. Share tokens have no access to the media endpoint at all \u2014 the shared page lists its events, without their images.",copyLink:"Create link",chip:"Embed link",semanticScopeNotice:"Semantic search runs across every camera and is trimmed to this link afterwards, so a link with few cameras can return sparse results on a large cluster."},eventsCard:{unassignedFace:"unassigned face",reviewed:"reviewed",debug:"debug",train:"train",favourite:"favourite",active:"active",loadingMore:"Loading more events"},gridTile:{play:"Play",pause:"Pause",listen:"Listen",mute:"Mute",talk:"Talk",stopTalk:"Stop talk",ptz:"PTZ",linkedDevices:"Linked devices",viewOptions:"View options",moreActions:"More actions",open:"Open",removeFromView:"Remove from view",resizeWidth:"Resize width",resizeHeight:"Resize height",noActiveCameras:"No active cameras",camera:"Camera"},battery:{holdHint:"This camera runs on battery \u2014 press play to start the stream and wake it.",startStreamA11y:"Start the stream and wake the battery camera"},faceReview:{loading:"Loading faces\u2026",loadError:"Could not load faces.",empty:"No faces to review right now.",previewClose:"Close",pickIdentityTitle:"Assign to\u2026",assignFailed:"Could not assign this face.",assign:"Assign",assignedSuccess:"Assigned to {{name}}.",confirmAssignTitle:"Assign faces",confidence:"Confidence",groupSize:"{{count}} faces in this group",filterAssigned:"Assigned",filterSuggested:"Suggested",filterUnassigned:"Unassigned",certaintyCertain:"near-certain",certaintyProbable:"probable",certaintyUncertain:"uncertain",analyzeButton:"Analyze last {{count}} unassigned",analyzeModalTitle:"Look-alike groups",analyzeLoading:"Looking for look-alike groups\u2026",analyzeEmpty:"No look-alike groups found.",analyzeConfirmBody:"Assign {{count}} face(s) across {{groups}} group(s)?",analyzeResult:"Assigned {{assigned}} of {{count}} face(s).",analyzeAssignFailed:"Some faces were refused and are still unassigned.",recomputeButton:"Recompute suggestions",recomputeProgress:"Recomputing {{done}}/{{total}}\u2026",recomputeDone:"Recomputed {{count}} face(s).",analyzeCoverage:"{{grouped}} of {{pool}} faces fall into {{groups}} look-alike group(s). The rest of the {{requested}} analysed have no look-alike here.",groupExcludeFace:"Exclude this face from the group",groupIncludeFace:"Put this face back in the group",groupPickPerson:"Assign this group to",groupShowDetail:"Show this face larger",groupDetailExclude:"Exclude from group",groupDetailInclude:"Put back in the group",assignedManySuccess:"Assigned {{count}} face(s) to {{name}}.",detailTitleMany:"Assign {{count}} selected face(s) to\u2026",knownPeople:"Known people",filtersButton:"Filters",filtersButtonActive:"Filters ({{count}})",sortLabel:"Sort by",sortByCertainty:"Certainty",sortByDate:"Date",sortAscending:"Sorting ascending \u2014 tap for descending",sortDescending:"Sorting descending \u2014 tap for ascending",dateLabel:"Date range",rangeAll:"All",rangeToday:"Today",rangeYesterday:"Yesterday",rangeLast7:"7 days",rangeLast30:"30 days",cameraLabel:"Camera",cameraNone:"No cameras in the loaded faces yet.",selectButton:"Select",selectDone:"Done",selectionCount:"{{count}} selected",applySuggestions:"Apply {{count}} suggestion(s)",applySuggestionsBlocked:"{{count}} of the selected face(s) have no suggestion \u2014 deselect them, or use Assign.",applySuggestionsResult:"Applied {{count}} of {{total}} suggestion(s) across {{groups}} person(s).",emptyFiltered:"No faces match these filters.",partialWindowHint:"Filtering the {{count}} faces loaded so far \u2014 scroll down to load older ones.",auditTitle:"Re-analyse {{name}}\u2019s samples",auditSummary:"{{flagged}} of {{total}} samples worth a look",auditLooksLike:"Looks like {{name}} ({{foreign}}) more than like this person ({{self}})",auditSelfOnly:"Agrees with this person\u2019s other samples: {{self}}",auditNotComparable:"Enrolled with a different face model \u2014 it cannot be compared, not even to say it is fine.",auditFromPhoto:"photo",auditRemoveTitle:"Remove this sample",auditRemoveBody:"The sample stops teaching recognition. Nothing else changes, and the face it came from stays where it is.",auditUnavailable:"This hub cannot re-analyse a gallery yet.",auditOpen:"Re-analyse samples"},statusDetail:{batteryTitle:"Battery",linkTitle:"Connection",openBatteryA11y:"Battery details",openLinkA11y:"Connection details",close:"Close",label:{charge:"Charge",charging:"Power",state:"State",linkType:"Link",signal:"Signal",ssid:"Network"},value:{unknown:"Not known",notApplicable:"Not applicable",binary:"Low / ok only, no percentage",sleeping:"Sleeping",chargingDc:"Charging (mains)",chargingSolar:"Charging (solar)",chargingNone:"Not charging",wifi:"Wi-Fi",ethernet:"Wired (Ethernet)",cellular:"Cellular",linkUnknown:"Not known"}}},prototype:{today:"Today",yesterday:"Yesterday",now:"NOW",endOfDay:"END OF DAY",loading:"Loading...",timeline:"Timeline",events:"Events",playClip:"Play clip",goToNow:"NOW",noEvents:"No events"},eventKind:{motion:"Motion",audio:"Audio",person:"Person",vehicle:"Vehicle",animal:"Animal",package:"Package",sensor:"Sensor",control:"Control",car:"Car",truck:"Truck",bus:"Bus",motorcycle:"Motorcycle",bicycle:"Bicycle",airplane:"Airplane",boat:"Boat",train:"Train",bird:"Bird",cat:"Cat",dog:"Dog",horse:"Horse",sheep:"Sheep",cow:"Cow",elephant:"Elephant",bear:"Bear",zebra:"Zebra",giraffe:"Giraffe",contact:"Contact","motion-sensor":"Motion sensor",smoke:"Smoke",flood:"Water leak",gas:"Gas","carbon-monoxide":"Carbon monoxide",vibration:"Vibration",tamper:"Tamper",presence:"Presence","enum-sensor":"Sensor state","device-event":"Device event",lock:"Lock",switch:"Switch",siren:"Siren",button:"Button",doorbell:"Doorbell","package-delivered":"Package delivered","package-picked-up":"Package picked up","audio-speech":"Speech","audio-music":"Music","audio-dog":"Dog","audio-doorbell":"Doorbell","audio-siren":"Siren","audio-alarm":"Alarm","audio-animal":"Animal (other)","audio-bird":"Bird","audio-cat":"Cat","audio-crowd":"Crowd / Chatter","audio-crying":"Crying / Baby","audio-door":"Door","audio-engine":"Engine / Motor","audio-fire":"Fire / Smoke","audio-footsteps":"Footsteps","audio-glass_breaking":"Glass Breaking","audio-gunshot":"Gunshot / Explosion","audio-laughter":"Laughter","audio-scream":"Scream / Shout","audio-silence":"Silence","audio-telephone":"Telephone","audio-tools":"Tools / Construction","audio-vehicle":"Vehicle","audio-water":"Water","audio-wind":"Wind / Weather"}}},2299,[]);
3675
- __d(function(e,i,a,o,t,n,r){t.exports={devices:{editDevice:"Modifica dispositivo",originalName:"Nome originale",customName:"Nome personalizzato",customNamePlaceholder:"Lascia vuoto per usare l'originale",icon:"Icona",typeLight:"Luce",typeSwitch:"Interruttore",typeCover:"Tapparella",typeLock:"Serratura",typeAlarm:"Allarme",typeButton:"Pulsante",typeSelect:"Selezione",typeSiren:"Sirena",typeSensor:"Sensore",typeEntry:"Ingresso",typeMediaPlayer:"Media Player",typeScript:"Script",run:"Esegui",sourceHA:"Home Assistant",sourceScrypted:"Scrypted",off:"Off",on:"On",mute:"Muto",unmute:"Audio",stop:"Stop",locked:"Chiusa",unlocked:"Aperta",open:"Aperta",closed:"Chiusa",disarmed:"Disinserito",disarm:"Disinserisci"},common:{error:"Errore",save:"Salva",cancel:"Annulla",loading:"Caricamento...",comingSoon:"In arrivo",back:"Indietro",fullscreen:"Schermo intero",exitFullscreen:"Esci da schermo intero",reset:"Reimposta",selectAll:"Seleziona tutte",deselectAll:"Deseleziona tutte",delete:"Elimina",retry:"Riprova"},grids:{newGrid:"Nuova griglia",deleteConfirm:"Eliminare questa griglia?",noGrids:"Nessuna griglia. Creane una per disporre le telecamere in vista mosaico.",createGrid:"Crea griglia",cameras:"telecamere",notFound:"Griglia non trovata.",noCameras:"Nessuna telecamera in questa griglia. Modifica per aggiungerne.",edit:"Modifica",addCamera:"Aggiungi telecamera",presets:"Preset",auto:"Auto",manual:"Manuale",gridName:"Nome griglia",view:"Visualizza",addCameraHint:"Aggiungi almeno una telecamera dal pulsante sopra.",allCamerasAdded:"Tutte le telecamere sono gi\xe0 in griglia",cameraUnavailable:"Telecamera non disponibile",camerasInGrid:"Telecamere nella griglia",addAll:"Aggiungi tutte",addCameras:"Aggiungi Telecamere",backToGrid:"Torna alla Griglia",timelineNotSupported:"Timeline non supportata"},nav:{cameras:"Telecamere",grids:"Griglie",library:"Libreria",notifications:"Notifiche",events:"Eventi",videoclips:"Videoclip",list:"Lista",settings:"Impostazioni"},cameras:{addCamera:"Aggiungi telecamera",pipActive:"PiP attivo",reorderEnable:"Riordina",reorderDisable:"Sblocca",live:"Live",noCameras:"Nessuna telecamera configurata",noIntegrations:"Nessuna integrazione configurata. Aggiungi un sistema per iniziare.",createSystem:"Crea sistema",importFrom:"Importa telecamere da",importSuccess:"Importazione completata",importCount:"{{count}} telecamere importate",selectCamerasToImport:"Seleziona telecamere da importare",selectAll:"Seleziona tutte",deselectAll:"Deseleziona tutte",importSelected:"Importa {{count}} selezionate",noCamerasFound:"Nessuna telecamera trovata",play:"\u25b6 Riproduci",paused:"In pausa",noDataForDate:"Nessun dato per questa data",recordingNotAvailable:"Registrazione non disponibile",noEventsReel:"Nessun evento recente",settings:"Impostazioni",highlightMotion:"Evidenza movimento",highlightOnMotion:"Evidenzia al movimento",highlightAudio:"Evidenza audio",audioMode:"Modalit\xe0",audioModeOff:"Off",audioModeSensor:"Sensore",audioModeLevel:"Livello",audioPreset:"Preset audio",audioPresetCustom:"Personalizzato",audioPresetCrying:"Pianto / neonato",audioPresetAlarm:"Allarme / sirena",audioPresetDog:"Abbaio cane",audioPresetDoorbell:"Campanello / bussata",audioPresetGlass:"Rottura vetro",audioWindow:"Finestra (s)",audioThreshold:"Soglia (dB)",audioHitPercentage:"Percentuale (%)",audioHoldSeconds:"Mantenimento (s)",highlightDetection:"Evidenza rilevamento oggetti",highlightOnDetection:"Evidenzia al rilevamento",detectionClasses:"Classi",holdSeconds:"Mantenimento (s)",rtspNotSupportedWeb:"Gli stream RTSP non sono supportati sul web. Usa l'app mobile.",liveDetections:"Detections live",filterTimeline:"Filtra timeline",filterClasses:"Filtra classi...",filterBySeverity:"Filtra per severit\xe0",severityAlert:"Allarme",severityDetection:"Rilevamento",statusPosition:"Posizione indicatori di stato",today:"Oggi",yesterday:"Ieri",timeline:"Timeline",timelineEventsClusterEvents:"Eventi",selectDate:"Seleziona una data",videoclipsNotSupported:"Videoclip non supportati per questa telecamera",noVideoclipsForDate:"Nessun videoclip per questa data",endOfList:"Fine elenco",backToLive:"Torna al live",goLive:"Vai al live",loadingClip:"Caricamento clip...",clusterDetailShowBbox:"Mostra bounding box sull'immagine",clusterDetailOpenVideoclip:"Apri videoclip",clusterDetailLoadingEvents:"Caricamento eventi...",devices:"Dispositivi",noAssociatedDevices:"Nessun dispositivo collegato. Configura in Impostazioni > Telecamere.",timelineData:"Dati timeline",timelineDataHint:"Cosa mostrare sulla timeline.",timelineDataVideoclips:"Videoclip",timelineDataAdvancedNotifier:"Advanced Notifier",timelineDataEvents:"Eventi",timelineEvents:"Eventi timeline",timelineEventsHint:"Quali tipi di eventi mostrare sulla timeline, in base alla severit\xe0.",timelinePresetAll:"Tutti",timelinePresetImportant:"Importanti",timelinePresetCritical:"Critici",timelinePresetCustom:"Personalizzato",statusBlock:"Blocco stato",sensorsBlock:"Blocco sensori",position:"Posizione",indicators:"Indicatori",downloadSnapshot:"Scarica Istantanea",exportDownloadClip:"Scarica Clip",exportRecordingWebOnly:"Esporta registrazione (solo web)",exportSnapshot:"Esporta Istantanea",intercomError:"Errore interfono",multiCam:"Multi-Camera",ptzNotSupported:"PTZ non supportato",ptzSelectPreset:"Seleziona Preset PTZ",snapshotFailed:"Istantanea fallita"},events:{loading:"Caricamento eventi...",filterByLabel:"Filtra per etichetta",filterByLabelPlaceholder:"es. person, doorbell",filterByCamera:"Filtra per telecamera",date:"Data",detectionTypes:"Tipi di rilevamento",source:"Sorgente",cameras:"Telecamere",groupingRange:"Raggruppamento",groupingPresetMinutes:"{{m}} min",groupingCustom:"Personalizzato",groupingCustomMinutes:"Minuti",groupingCustomApply:"Applica",today:"Oggi",noCamerasFromConfig:"Telecamere caricate dalla config EventsApp",all:"Tutti",typesCount:"{{count}} tipi",camerasCount:"{{count}} telecamere",cols:"col",sourceAuto:"Auto",sourceNVR:"NVR",sourceFrigate:"Frigate",sourceVideoClips:"API VideoClips",sourceRawDetection:"Raw",sourceAdvancedNotifier:"Advanced Notifier",detectionPerson:"Persona",detectionVehicle:"Veicolo",detectionAnimal:"Animale",detectionAudio:"Audio",detectionFace:"Volto",detectionPlate:"Targa",detectionPackage:"Pacco",detectionDoorbell:"Campanello",detectionSensor:"Sensore",detectionMotion:"Motion",detectionRules:"Regole",noScryptedIntegration:"Aggiungi un'integrazione Scrypted in Impostazioni per vedere gli eventi.",frigateNoEvents:"Gli eventi sono disponibili solo per Scrypted. Seleziona un'istanza Scrypted in Impostazioni.",noSource:"Aggiungi un'integrazione Scrypted o Frigate in Impostazioni, poi selezionala come sorgente per Eventi e Videoclip.",loadError:"Errore nel caricamento degli eventi",noEvents:"Nessun evento per questa data. Prova a cambiare data o filtri.",clearCacheTitle:"Svuota cache",clearCacheMessage:"Svuotare tutti i dati in cache di eventi e videoclip? Verr\xe0 effettuato un nuovo caricamento al prossimo accesso.",clearCacheConfirm:"Svuota",columnsPerRow:"Colonne per riga",onlyWithClips:"Solo con clip",relatedClip:"Clip Correlata"},settings:{integrations:"Integrazioni",camstackProxy:"CamStack Proxy",scrypted:"Scrypted",frigate:"Frigate",rtsp:"RTSP",homeAssistant:"Home Assistant",name:"Nome",baseUrl:"URL base",urlLocal:"URL locale",urlPublic:"URL pubblico",username:"Username",password:"Password",token:"Token (opzionale)",frigateTokenHint:"Token (opzionale): JWT dal browser",tokenRequired:"Token",testConnection:"Test connessione",testLocal:"Test Local",testPublic:"Test Public",testMqtt:"Test MQTT",connectionOk:"Connessione riuscita",connectionError:"Connessione fallita",scryptedCredentialsPromptTitle:"Accesso Scrypted",scryptedCredentialsPromptSubtitle:"Inserisci username e password Scrypted per connettere.",scryptedCredentialsPromptSkip:"Salta per ora",usernamePlaceholder:"admin",save:"Salva",tabStream:"Stream e riproduzione",tabGeneral:"Generale",data:"Dati",clearCacheEventsClips:"Svuota cache eventi e videoclip",eventsClipsSourceHint:"Sorgente per le schede Eventi e Videoclip.",hubReelTitle:"Hub & Reel",reelIntegrationsHint:"Scegli quali integrazioni usare per il reel.",reelScryptedSourceHint:"Con Scrypted: sorgente eventi per il reel.",eventsClipsAuto:"Auto",eventsClipsNoInstance:"Aggiungi prima un'integrazione Scrypted o Frigate.",exportBackup:"Esporta backup",exportError:"Esportazione fallita",importBackup:"Importa backup",importConfirm:"Questo sostituir\xe0 tutte le telecamere, integrazioni e impostazioni con i dati del backup. Continuare?",importSuccess:"Backup ripristinato con successo",importError:"Importazione fallita",uiPrototypes:"Prototipi UI",uiPrototypesHint:"Esplora design sperimentali della timeline",versions:"Versioni",appVersion:"App",nativeVersion:"Nativa",updateNow:"Aggiorna ora",updateError:"Aggiornamento fallito",updateAvailableTitle:"Aggiornamento disponibile",updateAvailableMessage:"Una nuova versione di CamStack \xe8 stata scaricata ed \xe8 pronta per l'installazione. L'app verr\xe0 riavviata per applicare l'aggiornamento.",updateInstall:"Installa e riavvia",updateLater:"Pi\xf9 tardi",tabIntegrations:"Integrazioni",tabCameras:"Telecamere",theme:"Tema",themeSystem:"Sistema",themeLight:"Chiaro",themeDark:"Scuro",language:"Lingua",languageSystem:"Sistema",languageEn:"English",languageIt:"Italiano",timelineMode:"Modalit\xe0 timeline",timelineModeClassic:"Classica",timelineModeTheater:"Theater",timeline:"Timeline",timelineVisible:"Mostra timeline rilevamenti",timelineVisibleDescription:"Visualizza il pannello della timeline nella vista telecamera.",clusterSize:"Dimensione cluster",snapshotInterval:"Intervallo aggiornamento snapshot",clusterSizeXS:"Molto piccola",clusterSizeS:"Piccola",clusterSizeM:"Normale",clusterSizeL:"Grande",clusterSizeXL:"Molto grande",highlightAppearance:"Aspetto evidenze",highlightAppearanceHint:"Colore e spessore del bordo per evidenze movimento, audio e rilevamento sugli stream delle telecamere.",highlightMotion:"Movimento",highlightAudio:"Audio",highlightDetection:"Rilevamento",highlightColor:"Colore",highlightThickness:"Spessore",selectSection:"Seleziona sezione",addSystem:"Aggiungi sistema",selectPlatform:"Seleziona piattaforma",deleteInstance:"Elimina istanza",deleteInstanceConfirm:"Vuoi eliminare questa istanza?",delete:"Elimina",mqttEvents:"MQTT - Eventi in tempo reale",mqttBrokerUrl:"URL broker MQTT",mqttUsername:"Username MQTT",mqttPassword:"Password MQTT",mqttTopicPrefix:"Prefisso topic (default: frigate)",mqttOptional:"Opzionale",scryptedAddressAlreadyUsed:"Questo indirizzo Scrypted \xe8 gi\xe0 configurato. \xc8 consentita una sola istanza per indirizzo.",scryptedAdvancedNotifierRequired:"Il plugin Advanced Notifier \xe8 richiesto per la connessione.",scryptedCorsTitle:"Configurazione CORS richiesta (Web)",scryptedCorsBody:"In Scrypted, apri le impostazioni del plugin Cloud e aggiungi il tuo dominio ({{domain}}) alla lista CORS Allowed Origins. Senza questa configurazione, il browser bloccher\xe0 le richieste verso il server Scrypted.",scryptedUrlHint:"L'URL locale viene provato per primo (es. in LAN), poi quello pubblico. Ne serve almeno uno.",gridLayout:"Layout griglia",gridLayoutHint:"Opzioni di visualizzazione per la griglia telecamere.",gridColumns:"Colonne griglia",gridColumnsHint:"Numero di telecamere per riga. Auto = 1 su mobile, 4 su tablet.",gridShowName:"Mostra nome telecamera",gridShowState:"Mostra stato (batteria, registrazione, sleep)",reorderCameras:"Riordina telecamere",reorderCamerasHint:"Trascina per riordinare le telecamere",reorderDone:"Fatto",manageCameras:"Gestisci telecamere",manageCamerasHint:"Rimuovi telecamere dall'app.",downloadSnapshot:"Scarica snapshot",snapshotFailed:"Impossibile recuperare lo snapshot",exportSnapshot:"Snapshot",exportDownloadClip:"Scarica clip",exportStartRecording:"Avvia registrazione",exportStopRecording:"Ferma registrazione",exportRecordingWebOnly:"Registrazione disponibile su web",intercomError:"Intercom non disponibile. Verifica le credenziali della telecamera su Scrypted.",deleteCamera:"Rimuovi telecamera",deleteCameraConfirm:"Rimuovere {{name}} dall'app?",streamPlayback:"Stream e riproduzione",playOnOpen:"Avvia stream all'apertura telecamera",playOnOpenHint:"Carica automaticamente lo stream live quando apri una telecamera.",audioOnOpen:"Audio attivo all'apertura",audioOnOpenHint:"Riproduci audio quando apri una telecamera (se supportato).",streamWatchdog:"Stream watchdog",streamWatchdogHint:"Riavvia lo stream quando non arrivano dati (aiuta con connessioni bloccate).",cameraPlayer:"Player telecamera",webViewCameraDetail:"Usa player WebView",webViewCameraDetailHint:"Usa WebView per le telecamere Scrypted (primo frame pi\xf9 veloce, pi\xf9 stabile). PiP, fullscreen e intercom funzionano. Default: player nativo.",streamQuality:"Qualit\xe0 stream",streamQualitySingle:"Qualit\xe0 singola telecamera",streamQualityGrid:"Qualit\xe0 griglia",qualityAuto:"Auto",qualityHigh:"High",qualityMedium:"Mid",qualityLow:"Sub",auto:"Auto",associatedDevices:"Dispositivi associati",associatedDevicesHint:"Aggiungi attuatori (luci, interruttori, tapparelle, ecc.) per controllarli dalla vista telecamera.",linkedDevices:"Collegati",reorderHint:"Usa le frecce per riordinare",addDevice:"Aggiungi dispositivo",noEligibleDevices:"Nessun Scrypted o Home Assistant configurato. Aggiungi prima un'integrazione.",configureDevices:"Configura dispositivi",cameraSettingsHint:"Scegli una telecamera per configurarne le opzioni.",noCamerasConfigured:"Nessuna telecamera configurata.",searchDevices:"Cerca dispositivi...",source:"Sorgente",type:"Tipo",all:"Tutti",noMatchingDevices:"Nessun dispositivo corrisponde ai filtri.",frigateStream:"Stream Frigate",frigateStreamSourceHint:"Sorgente stream: WebRTC (default), RTSP o MJPEG.",frigateStreamMapping:"Mappatura stream (nomi go2rtc da config)",frigateStreamMappingHint:"Seleziona dagli stream go2rtc disponibili. Ordine: High, Mid, Sub.",frigateSelectStream:"Seleziona stream",frigateAddStream:"Aggiungi stream",frigateInfo:"Info telecamera",frigateShowConfig:"Mostra config",frigateShowGo2rtc:"Mostra go2rtc",frigateMissingConfig:"Mancano baseUrl o cameraName nella config della telecamera.",tabLogs:"Log",logsCount:"{{count}} voci",logsDownload:"Scarica",logsClear:"Svuota",logsEmpty:"Nessun log. L'output della console apparir\xe0 qui.",logsExportError:"Esportazione fallita",logsExportTitle:"Esporta log",logsClearConfirmTitle:"Svuota log",logsClearConfirmMessage:"Rimuovere tutte le voci di log?",hubAppearanceTitle:"Aspetto",hubAppearanceDesc:"Tema, lingua, timeline e evidenze",hubCamerasTitle:"Telecamere",hubCamerasDesc:"Layout griglia, qualit\xe0 stream e gestione telecamere",hubIntegrationsTitle:"Integrazioni",hubIntegrationsDesc:"Gestisci Scrypted, Frigate e altri sistemi",hubAdvancedTitle:"Avanzato",hubAdvancedDesc:"Backup dati e gestione cache",hubLogsTitle:"Log",hubLogsDesc:"Visualizza ed esporta i log dell'applicazione",hubCacheTitle:"Cache",frigateAutoSnap:"Istantanea Automatica",frigateSegmentNav:"Navigazione Segmenti",frigateShowGo:"Mostra Go2RTC",frigateTimeline:"Timeline",reelCameras:"Telecamere Reel",reelCamerasHint:"Seleziona quali telecamere appaiono nel reel eventi",reelDeselectAll:"Deseleziona Tutto",reelDetectionClasses:"Classi di Rilevamento",reelDetectionClassesHint:"Filtra gli eventi per classe di rilevamento",reelIncludeRuleArtifacts:"Includi Artefatti Regole",reelIncludeRuleArtifactsHint:"Mostra gli eventi basati su regole nel reel",reelRuleArtifacts:"Artefatti Regole",reelSelectAll:"Seleziona Tutto",reelBadgeContent:"Contenuto badge",reelBadgePosition:"Posizione badge",reelBadgeSize:"Dimensione badge",reelBadgeBoth:"Ora + Classe",reelBadgeTime:"Solo ora",reelBadgeClass:"Solo classe",reelBadgeNone:"Nascosto",reelBadgeSmall:"Piccolo",reelBadgeMedium:"Medio",reelBadgeLarge:"Grande"},reel:{filterMotion:"Motion",filterOnlyRules:"Solo rule",filterOnlySensors:"Solo sensori",goToMostRecent:"Vai al pi\xf9 recente"},v2:{common:{connecting:"Connessione\u2026",online:"Online",offline:"Offline",loadError:"Errore di caricamento",create:"Crea",back:"Indietro",on:"On",off:"Off",confirm:"Conferma",cancel:"Annulla",ok:"OK",done:"Fatto"},cameras:{empty:"Nessuna telecamera",hubNotAnswering:"L'hub non risponde. Alcune telecamere potrebbero appartenere a un nodo attualmente offline \u2014 trascina per riprovare.",statusOnline:" \xb7 online",statusOffline:" \xb7 offline",motion:"Movimento",doorbell:"Campanello",doorbellRinging:"Sta suonando",doorbellLastRing:"Suonato {{time}} fa",snapshotLoading:"Caricamento\u2026",refreshing:"Aggiornamento\u2026",stationaryFor:"stazionario {{min}}m",manage:"Gestisci telecamere",manageHint:"Trascina per riordinare. Rinomina al volo. Usa lo switch per mostrare o nascondere una telecamera dall\u2019elenco.",reorderHandle:"Trascina per riordinare",appearance:"Aspetto",editList:"Modifica elenco",listOptions:"Opzioni elenco telecamere",controlsA11y:"Controlli telecamera",disabledTitle:"Fuori servizio",disabledHint:"Disattivata da un amministratore",emptyOutOfScope:"Nessuna telecamera nel tuo profilo di accesso",emptyOutOfScopeHint:"Al tuo account non \xe8 ancora assegnata nessuna telecamera. Chiedi a chi amministra questo hub di darti accesso.",snapshotStale:"Snapshot di {{age}} fa",hubNotProvisioning:"L'hub non risponde",reelFilter:"Eventi recenti",reelFilterAll:"Mostra tutti gli eventi",reelFilterDefaultHint:"Solo eventi di rilevamento \u2014 audio e sensori sono nascosti",reelFilterCount:"{{count}} tipi di evento mostrati",reelFilterUseDefault:"Predefinito",reelFilterShowAll:"Tutto",reelFilterDefaultTag:"Rilevamenti",reelFilterCountTag:"{{count}} tipi"},cameraDetail:{fallbackName:"Camera #{{id}}",mute:"Disattiva audio",unmute:"Attiva audio",snapshot:"Istantanea",snapshotFailed:"Impossibile acquisire l'istantanea.",ptz:"Controlli PTZ",talk:"Parla",fullscreen:"Schermo intero",talkFailed:"Impossibile avviare la comunicazione. Verifica l'accesso al microfono.",pip:"Picture in Picture",exitFullscreen:"Esci da schermo intero",devices:"Dispositivi",devicesEmpty:"Nessun dispositivo collegato.",linkedModeAuto:"Collegamento: Auto (posizione)",linkedModeManual:"Collegamento: Manuale",close:"Chiudi",deviceOnline:"Online",deviceOffline:"Offline"},grids:{createA11y:"Crea griglia",empty:"Nessuna griglia",emptyHint:"Tocca + per creare la tua prima griglia",countNone:"Nessuna telecamera",countOne:"1 telecamera",countOther:"{{count}} telecamere",defaultName:"Nuova griglia",deleteTitle:"Elimina griglia",deleteConfirm:"Eliminare \"{{name}}\"? L'operazione non \xe8 reversibile.",export:"Esporta",exportAllA11y:"Esporta tutte le griglie",shareA11y:"Condividi griglia",editA11y:"Modifica griglia",deleteA11y:"Elimina griglia",linkCopied:"Link della griglia copiato negli appunti",layoutAuto:"Auto",layoutColumns:"{{count}} col"},gridView:{editA11y:"Modifica griglia",fallbackTitle:"Griglia",notFound:"Griglia non trovata",emptyGrid:"Questa griglia \xe8 vuota",addCameras:"Aggiungi telecamere",reorderTitle:"Riordina telecamere",reorderA11y:"Riordina telecamere",reorderDoneA11y:"Fine riordino",allHidden:"Tutte le telecamere sono nascoste. Usa la modalit\xe0 riordino per mostrarne alcune.",dragA11y:"Trascina per riordinare",hideA11y:"Nascondi dalla griglia",showA11y:"Mostra nella griglia",removeA11y:"Rimuovi dalla griglia",adhocTitle:"Griglia rapida",cellActions:"Azioni telecamera",cellActionsA11y:"Altre azioni per questa telecamera",cellDevicesA11y:"Dispositivi collegati",cellMenuA11y:"Opzioni di visualizzazione"},gridBuilder:{title:"Modifica griglia",nameLabel:"Nome",namePlaceholder:"Nome griglia",camerasSelected:"Telecamere ({{count}} selezionate)",optionsTitle:"Opzioni",showName:"Mostra nome telecamera",export:"Esporta griglia",orderSection:"Nella griglia",orderHint:"Trascina per riordinare",emptyOrder:"Nessuna telecamera \u2014 aggiungine qui sotto.",addSection:"Aggiungi telecamere",removeA11y:"Rimuovi dalla griglia",addA11y:"Aggiungi alla griglia",highlightMotion:"Su movimento",highlightAudio:"Su audio",highlightAudioOff:"Off",highlightAudioLow:"Basso",highlightAudioMid:"Medio",highlightAudioHigh:"Alto",highlightThreshold:"Soglia",highlightHold:"Mantieni",highlightDetection:"Su rilevamento",clusterLabel:"Etichetta cluster",clusterLabelIcon:"Icona",clusterLabelText:"Testo"},gridBar:{back:"Indietro",pauseAll:"Metti tutto in pausa",playAll:"Riproduci tutto",audio:"Audio",quality:"Qualit\xe0 stream",layout:"Layout",timeline:"Timeline",highlightMenu:"Evidenziazione e overlay",activeOnly:"Solo attive",share:"Condividi griglia",edit:"Modifica griglia",hide:"Nascondi controlli",show:"Mostra controlli",muteAll:"Silenzia tutte",unmuteAll:"Riattiva audio"},gridMenu:{highlightMaster:"Bordi di evidenziazione"},gridShare:{title:"Condividi \"{{name}}\"",quality:"Qualit\xe0 stream",layout:"Layout",showNames:"Mostra nomi delle camere",activeOnly:"Solo camere attive",boxes:"Bounding box",highlightEnable:"Evidenziazione",audioSummary:"Audio attivo all\u2019apertura per {{count}} camera/e",ttlTitle:"Scadenza del link",ttl_1d:"1 giorno",ttl_7d:"7 giorni",ttl_30d:"30 giorni",ttl_never:"Per sempre",tokenNotice:"Il link include un token di sola visualizzazione limitato a queste camere. Chiunque abbia il link pu\xf2 guardare finch\xe9 non scade o viene revocato.",copyLink:"Copia link",creating:"Creazione link\u2026",copiedExpires:"Link copiato \u2014 scade il {{date}}",copiedNever:"Link copiato \u2014 non scade mai",error:"Impossibile creare il link di condivisione. Controlla la connessione e riprova.",optionAuto:"Auto"},gridControls:{play:"Riproduci",pause:"Pausa",mute:"Muto",unmute:"Riattiva audio",quality:"Qualit\xe0",layout:"Layout",layoutAuto:"Auto"},events:{comingSoon:"Eventi \u2014 in arrivo",searchLabel:"Cerca etichetta\u2026",searchSubmit:"Cerca",searchClear:"Cancella ricerca",empty:"Nessun evento",today:"Oggi",yesterday:"Ieri",weekdayShort:{sun:"Dom",mon:"Lun",tue:"Mar",wed:"Mer",thu:"Gio",fri:"Ven",sat:"Sab"},filteredEmpty:"Nessuna corrispondenza nell'intervallo caricato",loadOlder:"Carica meno recenti",selectPrompt:"Seleziona un evento per vederne i dettagli",filters:"Filtri",more:"Altro",all:"Tutte",day:"Giorno",sort:"Ordina",sortTime:"Recenti",sortImportance:"Importanza",flaggedOnly:"Contrassegnate",flaggedOnlyHint:"Preferite, debug o da addestrare",parked:"Stazionari",showStationary:"Mostra stazionari",showStationaryHint:"Spento = nascondi le promozioni parcheggiate",cameras:"Telecamere",classes:"Classi",attributes:"Rilevati",attrFaces:"Volti",attrPlates:"Targhe",attributesHint:"Nessuno = tutti",search:"Cerca",searchCameras:"Cerca telecamere\u2026",searchClasses:"Cerca classi\u2026",allCamerasHint:"Nessuna = tutte",allClassesHint:"Nessuna = tutte",done:"Fatto",density:"Densit\xe0",selectHint:"Seleziona un evento",unrecognizedFace:"Volto rilevato, non riconosciuto",eventKinds:"Tipi di evento",displayOptions:"Aspetto",displayTitle:"Opzioni di visualizzazione",useDefaultClasses:"Predefinito"},settings:{themeSystem:"Sistema",themeDark:"Scuro",themeLight:"Chiaro",server:"Server",account:"Accesso come",accountUnknown:"Caricamento\u2026",roleAdmin:"Admin",roleViewer:"Viewer",hubActive:"Hub attivo",changeServer:"Cambia server",signOut:"Esci",network:"Rete",networkNone:"Nessuna rotta ancora rilevata",endpointUnlikely:"Probabilmente non utilizzabile",activeRoute:"Rotta in uso",routeChannelLan:"LAN (diretta)",routeChannelPublic:"Tunnel pubblico",routeChannelLoopback:"Locale (loopback)",routeChannelUnknown:"Non riconosciuta",routeReasonInitial:"configurata, gara non ancora conclusa",routeReasonRaceWon:"la pi\xf9 veloce nella gara delle rotte",routeReasonNoWinner:"ripiego \u2014 nessun candidato ha risposto",routeReasonUnchanged:"invariata dall'ultimo rilevamento",routeReasonDisposed:"nessun trasporto",reprobe:"Ri-rileva rotte",reprobing:"Rilevamento\u2026",diagnoseNetwork:"Diagnostica rotte LAN",diagnosingNetwork:"Diagnostica in corso\u2026",diagnoseNetworkDone:"{{ok}}/{{total}} hanno risposto a /health. Apri i log e condividili \u2014 cerca ipv4/ipv6 http FAIL.",preferredRoute:"Rotta preferita",routeAuto:"Automatica",routeReasonPinned:"forzata dalle Impostazioni",appearance:"Aspetto",theme:"Tema",info:"Info",app:"App",version:"Versione",noServer:"Nessun server",footerNote:"CamStack Viewer si connette a un singolo hub camstack. Telecamere, griglie ed eventi sono gestiti dal server.",language:"Lingua",langSystem:"Sistema",gridDefaults:"Impostazioni griglia",showName:"Mostra nome telecamera",showNameHint:"Sovrapponi il nome della telecamera su ogni riquadro",showState:"Mostra stato",showStateHint:"Mostra lo stato online / registrazione su ogni riquadro",columns:"Colonne",cameraOrder:"Ordine telecamere",orderName:"Per nome",orderCustom:"Personalizzato",motionHold:"Persistenza evidenziazione movimento",motionHoldHint:"Mantieni accesa l'evidenziazione del movimento su una tile per questo tempo dopo che il movimento si ferma.",motionHoldOff:"Off",streamQuality:"Qualit\xe0 stream",streamDefaults:"Impostazioni stream",playOnOpen:"Riproduci all'apertura",playOnOpenHint:"Avvia lo stream live quando apri una telecamera",audioOnOpen:"Audio all'apertura",audioOnOpenHint:"Attiva l'audio quando apri una telecamera",snapshotInterval:"Aggiornamento snapshot",highlightAppearance:"Aspetto evidenziazione",highlightMotionColor:"Colore movimento",highlightAudioColor:"Colore audio",highlightDetectionColor:"Colore rilevamento",highlightThickness:"Spessore bordo",qualityAuto:"Auto",qualityHigh:"Alta",qualityMid:"Media",qualityLow:"Bassa",secondsValue:"{{count}}s",advanced:"Avanzate",clearCache:"Svuota cache",clearCacheHint:"Libera snapshot e dati in cache (mantiene server e impostazioni)",clearCacheConfirmTitle:"Svuotare la cache?",clearCacheConfirmBody:"Rimuove immagini e dati in cache. Server, accesso e impostazioni vengono mantenuti.",clearCacheDone:"Cache svuotata",exportSettings:"Esporta impostazioni",exportSettingsHint:"Copia le impostazioni in formato JSON",exportSettingsDone:"Impostazioni copiate in JSON",shareTitle:"Condividi impostazioni",shareHint:"Salva uno snapshot nominato di impostazioni, griglie e preferenze telecamere sul hub. Chiunque sia connesso pu\xf2 importarlo \u2014 sostituisce quanto c'\xe8 su questo dispositivo.",shareNamePlaceholder:"Nome snapshot",shareSave:"Salva",shareEmpty:"Nessuno snapshot",shareImportTitle:"Importare questo snapshot?",shareImportBody:"\"{{name}}\" sostituir\xe0 impostazioni, griglie e preferenze telecamere su questo dispositivo.",shareDeleteTitle:"Eliminare questo snapshot?",shareDeleteBody:"\"{{name}}\" verr\xe0 rimosso dal hub.",shareFailed:"Impossibile condividere le impostazioni",shareInvalid:"Questo snapshot non \xe8 un documento di impostazioni valido.",shareMissing:"Questo snapshot non \xe8 pi\xf9 sul hub.",viewLogs:"Visualizza log",viewLogsHint:"Messaggi di log recenti dell'app",logsEmpty:"Nessun log registrato",keepLogs:"Mantieni log",keepLogsHint:"Registra un buffer dei messaggi di log dell'app",debugMode:"Modalit\xe0 debug",debugModeHint:"Log verbosi su live, playback e scrub \u2014 inviati al server",logsClear:"Pulisci",resetSettings:"Ripristina impostazioni",resetSettingsHint:"Ripristina tutti i valori predefiniti",resetConfirmTitle:"Ripristinare le impostazioni?",resetConfirmBody:"Ripristina tutte le impostazioni ai valori predefiniti.",cancel:"Annulla",confirm:"Conferma",timeline:"Timeline",reel:"Sequenza eventi",reelThumbSize:"Dimensione miniature",reelThumbSizeHint:"Dimensione delle miniature nella sequenza eventi recenti.",reelSizeSmall:"Piccola",reelSizeMedium:"Media",reelSizeLarge:"Grande",reelShowLabels:"Mostra etichette",reelShowLabelsHint:"Mostra l'etichetta classe/identit\xe0 sugli elementi della sequenza.",reelLabelStyle:"Visualizzazione classe",reelLabelStyleHint:"Mostra la classe di rilevamento come icona o come testo negli elementi della sequenza.",reelShowImportance:"Mostra importanza",reelShowImportanceHint:"Mostra il badge di importanza sugli elementi della sequenza.",events:"Eventi",eventsPage:"Pagina eventi",minImportance:"Importanza minima",minImportanceHint:"Nascondi gli eventi con punteggio inferiore, nella pagina eventi e nella timeline della telecamera.",minImportanceOff:"Off",tileShowLabels:"Mostra etichette",tileShowLabelsHint:"Mostra le etichette classe / identit\xe0 / audio sulle schede evento.",tileShowImportance:"Mostra importanza",tileShowImportanceHint:"Mostra il badge di importanza sulle schede evento (se valutato).",tileShowCameraName:"Mostra nome telecamera",tileShowCameraNameHint:"Mostra il nome della telecamera nel pi\xe8 di pagina della scheda evento.",tileLabelStyle:"Visualizzazione classe",tileLabelStyleHint:"Mostra la classe di rilevamento come icona o come testo.",tileLabelStyleIcon:"Icona",tileLabelStyleText:"Testo",comingSoon:"Prossimamente",cameras:"Telecamere",manageCameras:"Gestisci telecamere",manageCamerasHint:"Rinomina, nascondi, riordina",notifications:"Notifiche",notificationsManage:"Gestisci notifiche",pinchExpandsHeight:"Il pizzico ingrandisce la vista",pinchExpandsHeightHint:"Pizzicando per lo zoom il video cresce in altezza (ritaglia i bordi laterali sulle camere 16:9).",navBarOnStream:"Barra di navigazione sulla singola camera",navBarOnStreamHint:"Mantiene visibile la navigazione principale mentre guardi una camera. Sulle finestre larghe la navigazione laterale c'\xe8 gi\xe0.",reopenLastCamera:"Riapri l'ultima camera",reopenLastCameraHint:"All'avvio riapre la camera che stavi guardando. Solo se guardarla \xe8 stata l'ultima cosa che hai fatto \u2014 cambiare pagina la dimentica.","timeline.gapPercent":"Gap cluster (%)","timeline.sizePercent":"Dimensione cluster (%)","timeline.indicatorPositionPct":"Posizione indicatore (%)","timeline.showImportance":"Mostra importanza sugli elementi","timeline.showClass":"Mostra classe di rilevamento sugli elementi","timeline.cardWidthPct":"Larghezza card (%)",haptics:"Vibrazione",hapticsUiFeedback:"Vibra alla pressione",hapticsUiFeedbackHint:"Una breve vibrazione conferma pulsanti, interruttori, PTZ e comandi del player. Solo su dispositivo (iOS/Android).",hapticsEnabled:"Vibra sugli eventi",hapticsEnabledHint:"Brevi vibrazioni per gli eventi chiave sulla telecamera che stai guardando. Solo su dispositivo (iOS/Android).",hapticsMotion:"Movimento",hapticsDetection:"Rilevamento",hapticsPerson:"Persona / riconosciuta",buildNumber:"Build",runtimeVersion:"Runtime",runningBundle:"Bundle in esecuzione",checkUpdates:"Controlla aggiornamenti",checkingUpdates:"Controllo\u2026",updateUpToDate:"Sei gi\xe0 all'ultima versione.",updatesDisabled:"Gli aggiornamenti sono disattivati in questa build.",updateReadyTitle:"Aggiornamento scaricato",updateReadyBody:"Riavviare l'app ora per applicarlo?",updateCheckFailed:"Impossibile controllare gli aggiornamenti",listOverlays:"Schede videocamere",listMotionBorder:"Anello movimento",listMotionBorderHint:"Pulsa un anello attorno alla scheda mentre la videocamera vede movimento.",listMotionBadge:"Posizione badge movimento",listOccupancy:"Posizione occupazione",useNativeRenderer:"Usa il renderer integrato",useNativeRendererHint:"Disegna Recenti ed Eventi dentro l\u2019app invece di caricare l\u2019embed ospitato dall\u2019hub.",toolbarDensity:"Altezza barra strumenti","toolbarDensity.small":"Piccola","toolbarDensity.medium":"Media","toolbarDensity.large":"Grande"},nc:{title:"Notifiche",tabs:{rules:"Regole",targets:"Targets",snooze:"Silenzia"},rulesPlaceholder:"Le regole di notifica appariranno qui.",targetsPlaceholder:"Le destinazioni di consegna appariranno qui.",rules:{add:"Nuova regola",empty:"Nessuna regola.",loadError:"Impossibile caricare le regole. Riprova.",mine:"Le mie regole",admin:"Regole admin",system:"Eventi di sistema",personalBadge:"Personale",adminBadge:"Admin",edit:"Modifica",delete:"Elimina",cancel:"Annulla",deleteConfirmTitle:"Elimina regola",deleteConfirmMessage:"Eliminare \"{{name}}\"? L'operazione non \xe8 reversibile.",receiveOn:"Ricevi su {{name}}",noOwnedTargets:"Questa regola non invia ad alcuna delle tue destinazioni.",section:{all:"Tutte",detection:"Rilevamenti",occupancy:"Occupazione",audio:"Suoni",empty:{all:"Nessuna regola. Creane una per sapere cosa vedono le telecamere.",detection:"Nessuna regola di rilevamento. Creane una per sapere cosa vedono le telecamere.",occupancy:"Nessuna regola di occupazione. Una nuova regola parte dalla condizione di occupazione: scegli prima la telecamera, poi la zona e il conteggio.",audio:"Nessuna regola sui suoni. Una nuova regola parte gi\xe0 con una soglia di livello: ti resta solo da indicare i suoni e le destinazioni.",timelapse:"Nessun timelapse. Un timelapse trasforma una notte di registrazioni in un video breve e lo invia alla chiusura della finestra \u2014 scegli le telecamere e le ore.",summary:"Nessun riepilogo. Un riepilogo raccoglie lo scatto migliore di tutto ci\xf2 che \xe8 passato davanti a pi\xf9 telecamere e invia una sola immagine."},create:{detection:"Nuova regola di rilevamento",occupancy:"Nuova regola di occupazione",audio:"Nuova regola sui suoni",timelapse:"Nuovo timelapse",summary:"Nuovo riepilogo"},timelapse:"Timelapse",summary:"Riepilogo"},mediaBadge:{attach:{"best-matching":"Immagine pertinente",keyFrame:"Fotogramma chiave",none:"Nessuna immagine"},frame:{full:"Tutta la scena",boxed:"Scena con riquadri"},zoneCrop:"Ritaglio zona",gif:"GIF",clip:"Video",profile:"Qualit\xe0 {{profile}}"},editor:{createTitle:"Nuova regola",editTitle:"Modifica \"{{name}}\"",basics:"Generali",nameLabel:"Nome",namePlaceholder:"es. Persone al portone",triggerLabel:"Attivazione",priorityLabel:"Priorit\xe0",targetsLabel:"Invia a",noTargets:"Non hai ancora destinazioni. Aggiungine una nella scheda Destinazioni.",pickTarget:"Seleziona almeno una destinazione.",conditionsLabel:"Condizioni",section:{rule:"Regola",devices:"Telecamere",conditions:"Condizioni",notification:"Notifica",advanced:"Avanzate"},kindSection:{detection:"Condizioni",sensor:"Condizioni",occupancy:"Occupazione",sound:"Suono",system:"Eventi"},kindBlurb:{sensor:"Un campanello premuto o un sensore collegato che cambia stato. L'immagine arriva dalla telecamera a cui il sensore \xe8 attribuito.",occupancy:"Scatta quando il conteggio nell'inquadratura o in una zona supera la tua soglia e la mantiene. Scegli prima la telecamera: l'elenco delle zone \xe8 quello di quella telecamera.",sound:"Scatta su una finestra audio confermata, mai su un'immagine. Indica i suoni e/o mantieni una soglia di livello: senza nessuno dei due non pu\xf2 mai scattare.",system:"L'impianto stesso: una telecamera o uno stream che cade, un nodo che esce, un aggiornamento disponibile. Non c'\xe8 un rilevamento dietro e non c'\xe8 un fotogramma da allegare."},dropTitle:"Verranno rimossi al salvataggio",dropHint:"Questo tipo di regola non pu\xf2 usarli, e tenerli la lascerebbe silenziosa.",condition:{systemEvent:"Evento di sistema",sensorKinds:"Tipi di sensore",eventTypeTokens:"Token del tipo di evento",source:"Origine del rilevamento",classes:"Classi di oggetti",classesExclude:"Classi escluse",minConfidence:"Affidabilit\xe0 minima",zones:"Zone",zonesExclude:"Zone escluse",customZones:"Zone personalizzate",crossing:"Attraversamento zona",labelEquals:"Etichetta uguale a",identities:"Volti noti",identitiesExclude:"Volti esclusi",plates:"Targhe note"},moreConditionsLabel:"Altre condizioni",showAdvanced:"Mostra avanzate",noConditions:"Nessuna condizione disponibile.",notForTrigger:"Non per questa attivazione",notForTriggerHint:"Non valutata per l'attivazione scelta \u2014 cambia attivazione per usarla.",mediaLabel:"Media",attachLabel:"Allegato",frameLabel:"L'immagine mostra",frame:{cropped:"Il soggetto",full:"Tutta la scena",boxed:"La scena, con i riquadri"},zoneCropLabel:"Ritaglia sulla zona",zoneCropHint:"Ritaglia l'immagine sulla zona della regola invece che sul soggetto o sull'intera scena.",gifLabel:"Allega una GIF",gifHint:"Una breve animazione ritagliata dal buffer live attorno al momento \u2014 la telecamera non deve essere in registrazione.",clipLabel:"Allega un video",clipHint:"Un MP4 dello stesso spezzone. Le destinazioni che non accettano video ricevono comunque l'immagine.",preRollLabel:"Secondi prima",postRollLabel:"Secondi dopo",profileLabel:"Qualit\xe0 del video",profile:{auto:"Automatica",high:"Alta",mid:"Media",low:"Bassa"},templateLabel:"Messaggio (facoltativo)",templateTitleLabel:"Titolo",templateBodyLabel:"Testo",templatePlaceholder:"Supporta i segnaposto {{var}}",save:"Salva modifiche",create:"Crea regola",addValue:"Aggiungi valore\u2026",removeTag:"Rimuovi {{value}}",clear:"Azzera",noCameras:"Nessuna telecamera disponibile \u2014 la regola vale per tutti i dispositivi.",plateText:"Testo targa\u2026",maxDistance:"Distanza massima",waitForEnhancementLabel:"Attendi il riconoscimento",waitForEnhancementHint:"Attivo: una sola notifica a fine traccia, con il nome. Disattivo: una subito senza nome, pi\xf9 una seconda se il nome arriva prima che la traccia si chiuda.",recognition:{noIdentities:"Nessuna persona salvata. Aggiungine una dal volto di un evento.",unknownIdentities:"Selezionati ma non presenti in galleria (una persona eliminata, o una regola vecchia salvata per nome). Rimuovi ci\xf2 che non vale pi\xf9.",identities:{off:"Chiunque",anyKnown:"Conosciuti",specific:"Queste persone",offHint:"Alla regola non importa chi sia: corrisponde anche una persona non riconosciuta.",anyKnownHint:"Solo le persone salvate in galleria, chiunque siano. Uno sconosciuto non corrisponde.",specificHint:"Solo le persone selezionate qui. La corrispondenza usa la persona salvata, quindi rinominarla non rompe la regola."},plates:{off:"Qualsiasi veicolo",anyKnown:"Targa letta",specific:"Queste targhe",offHint:"Alla regola non importa la targa: corrisponde anche un veicolo di cui non \xe8 stata letta.",anyKnownHint:"Solo i veicoli di cui la targa \xe8 stata effettivamente letta, qualunque essa sia.",specificHint:"Solo queste targhe, con corrispondenza tollerante \u2014 la lettura della targa non \xe8 mai perfetta."}},customZones:{empty:"Nessuna zona personalizzata. Scegli una camera e disegnane una.",pickCamera:"Camera su cui disegnare",noCameras:"Nessuna camera online su cui disegnare.",draw:"Disegna zona",zoneLabel:"Zona {{index}} ({{count}} punti)",remove:"Rimuovi zona {{index}}",title:"Disegna zona \u2014 {{name}}",hint:"Tocca per aggiungere punti, trascina un punto per spostarlo. Tocca il primo punto per chiudere.",loading:"Caricamento frame\u2026",cancel:"Annulla",clear:"Cancella",close:"Chiudi",confirm:"Conferma"},addWindow:"Aggiungi finestra",scheduleAlways:"Sempre attiva \u2014 aggiungi una finestra per limitare quando scatta.",scheduleInvert:"Attiva fuori dalle finestre",delivery:{immediate:"Immediata",trackEnd:"Fine traccia",deviceEvent:"Evento dispositivo",packageEvent:"Evento pacco",systemEvent:"Evento di sistema"},systemKinds:{"device-online":"Dispositivo online","device-offline":"Dispositivo offline","device-disabled":"Dispositivo spento","device-enabled":"Dispositivo acceso","camera-online":"Videocamera online","camera-offline":"Videocamera offline","camera-disabled":"Videocamera spenta","camera-enabled":"Videocamera accesa","stream-online":"Flusso online","stream-offline":"Flusso offline","node-online":"Nodo online","node-offline":"Nodo offline","node-inference-unavailable":"Nodo senza dispositivi di inferenza utilizzabili","detection-blind":"Telecamera che non rileva nulla","addon-crash-loop":"Crash loop addon (runner arreso)","alarm-arm-refused":"Inserimento allarme rifiutato","alarm-arming":"Allarme in inserimento","alarm-triggered":"Allarme scattato","alarm-armed":"Allarme inserito","alarm-disarmed":"Allarme disinserito","addon-update-available":"Aggiornamento addon disponibile","server-update-available":"Aggiornamento server disponibile","addon-updated":"Addon aggiornati","server-updated":"Server aggiornato","export-completed":"Export completato","device-battery-low":"Batteria scarica","device-battery-normal":"Batteria ripristinata"},systemFilters:{cameras:"Solo queste videocamere (facoltativo)",deviceTypes:"Solo questi tipi di dispositivo (facoltativo)",nodes:"Solo questi ID nodo (facoltativo)",packages:"Solo questi pacchetti addon (facoltativo)",addNode:"Aggiungi ID nodo\u2026",addPackage:"Aggiungi nome pacchetto\u2026"},media:{best:"Immagine migliore",bestMatching:"Migliore corrispondente",keyFrame:"Fotogramma chiave",none:"Nessun allegato"},source:{any:"Qualsiasi",pipeline:"Pipeline",onboard:"A bordo",sensor:"Sensore",audio:"Audio"},phase:{delivered:"Consegnato","picked-up":"Ritirato",both:"Entrambi"},zoneMatch:{any:"Almeno una",all:"Tutte"},group:{scope:"Ambito",class:"Classi",zones:"Zone",quality:"Qualit\xe0",label:"Identit\xe0 e targhe",device:"Evento dispositivo",package:"Pacco",system:"Eventi di sistema",schedule:"Programmazione",occupancy:"Occupazione",audio:"Suono"},taxonomy:{person:"Persone",vehicle:"Veicoli",animal:"Animali",audio:"Audio",sensor:"Sensori",control:"Comandi",custom:"Valori personalizzati",addCustom:"Aggiungi un valore\u2026"},weekday:{mon:"Lun",tue:"Mar",wed:"Mer",thu:"Gio",fri:"Ven",sat:"Sab",sun:"Dom"},crossing:{unset:"In entrata",exit:"In uscita",any:"Entrambe"},deviceStateNone:"Non impostato \u2014 questa regola non dipende da nessun altro dispositivo.",deviceStateSet:"Solo mentre il dispositivo {{deviceId}} \xe8: {{states}}. Si modifica dall'admin \u2014 questa app non pu\xf2 elencare tutti i dispositivi.",sceneGateNone:"Non impostato \u2014 questa regola non dipende da nessuna scena.",sceneGateSet:"Solo mentre la scena {{sceneId}} \xe8 {{state}}, leggendo {{read}}. La scena si sceglie dall'admin \u2014 questa app non pu\xf2 elencarle.",sceneReadDefault:"il booleano scelto dalla scena stessa",sceneReadLatched:"il latch (dall'ultimo riarmo)",sceneReadLive:"il verdetto attuale",sceneState:{matched:"coincidente (come catturata)",diverged:"divergente (cambiata)"},occupancy:{zoneLabel:"Zona",wholeFrame:"\u2014 intero fotogramma \u2014",zonesLoading:"Caricamento zone\u2026",zonesNeedCamera:"Scegli le telecamere qui sopra per selezionare una delle loro zone.",zonesNone:"Queste telecamere non hanno zone \u2014 il conteggio copre l\u2019intero fotogramma.",zoneMissing:"La zona \"{{id}}\" non esiste pi\xf9 su queste telecamere. La regola la conserva e non scatter\xe0 finch\xe9 non scegli un altro ambito.",classLabel:"Classe",anyClass:"\u2014 qualsiasi classe \u2014",classesNone:"L\u2019hub non ha inviato un vocabolario di classi \u2014 il conteggio copre ogni classe.",classMissing:"\"{{name}}\" non \xe8 una classe segnalata da queste telecamere. La regola la conserva e non scatter\xe0 finch\xe9 non ne scegli un\u2019altra.",opLabel:"Scatta quando",op:{"became-occupied":"Diventa occupata","became-free":"Diventa libera",">=":"Conteggio \u2265","<=":"Conteggio \u2264"},thresholdLabel:"Soglia",countLabel:"Conteggio",sustainLabel:"Mantieni per (secondi)",sustainInstantHint:"Con 0 secondi scatta al primo fotogramma che supera la soglia \u2014 aspettati notifiche ripetute da un soggetto che cammina sul bordo della zona. Di solito si usano 15 secondi.",hint:"Conta gli oggetti tracciati confermati dall\u2019analisi delle zone. Il cambiamento deve durare per tutta la finestra prima di scattare; senza uno snapshot per la telecamera o la zona la regola non scatta mai.",classesDropped:"Il filtro classi ({{classes}}) viene rimosso al salvataggio: un evento di occupazione porta una sola classe, quindi impedirebbe soltanto alla regola di scattare. Imposta invece la classe qui sopra."},audio:{modeLabel:"Come scatta",modeLabelOption:"\ud83d\udd0e Suoni",modeLevelOption:"\ud83d\udcc8 Volume",modeLabelHint:"Scatta quando abbastanza fotogrammi etichettati cadono in una finestra breve (predefinito 2 in 5 secondi). Un falso positivo di un solo fotogramma non arriva a 2; un episodio vero di solito ne etichetta due o tre. L\u2019altro freno \xe8 la pausa della regola.",modeLevelHint:"Scatta quando il suono resta abbastanza forte abbastanza a lungo: la finestra qui sotto \xe8 tutta la condizione.",labelsLabel:"Suoni",labelsHint:"Scegline almeno uno. Il classificatore etichetta solo uno o due fotogrammi per episodio, quindi una percentuale su una finestra non potrebbe mai confermarli \u2014 questo modo conta quei fotogrammi.",confirmHitsLabel:"Conferma dopo (fotogrammi)",confirmHitsHint:"Quanti fotogrammi etichettati devono cadere nella finestra prima di notificare. Predefinito 2 \u2014 un falso positivo di un solo fotogramma non ci arriva.",confirmWindowLabel:"entro (secondi)",confirmWindowHint:"La finestra che quei fotogrammi devono condividere. Predefinito 5 s. Due fotogrammi a sei secondi di distanza non confermano.",labelsUnknown:"Questa regola conserva {{labels}}, che questo hub non classifica. Resta com\u2019\xe8; toccalo per rimuoverlo.",dbLabel:"Pi\xf9 forte di (dBFS)",dbHint:"I dBFS sono negativi: 0 \xe8 il fondo scala, \u221296 \xe8 il silenzio \u2014 quindi un numero PI\xd9 ALTO \xe8 un filtro PI\xd9 STRETTO. Misurato su questo hub, un bambino che piange sta fra \u221255 e \u221226 dBFS: una soglia sopra \u221255 ne esclude la maggior parte.",hitPercentLabel:"Rilevamenti nella finestra (%)",hitPercentHint:"Quanta parte della finestra deve corrispondere prima di scattare. Predefinito 60%.",samplingLabel:"Finestra (secondi)",samplingHint:"La finestra deve essere PIENA prima di poter corrispondere \u2014 una finestra a met\xe0 non scatta mai. Predefinito 10s.",failClosedHint:"Scegli almeno un suono oppure imposta una soglia di livello. Senza nessuno dei due ogni campione conta come rilevamento e l\u2019hub rifiuta la regola invece di notificare sul silenzio.",hint:"Scatta sul SUONO prolungato, non su un\u2019immagine: una regola con questa condizione viene valutata solo su una finestra audio confermata, mai su un rilevamento o una traccia. Le telecamere coinvolte devono avere l\u2019analisi audio attiva."},zonePicker:{needCamera:"Seleziona prima una camera \u2014 le zone appartengono a una camera.",loading:"Caricamento zone\u2026",none:"Le camere selezionate non hanno zone.",missing:"La zona {{id}} non esiste pi\xf9 sulle camere selezionate"},dropReason:{occupancy:{sensorKinds:"Un cambio di occupazione non \xe8 un evento di un sensore: non porta con s\xe9 alcun tipo di sensore, quindi questa condizione non potr\xe0 mai corrispondere.",eventTypeTokens:"Un cambio di occupazione non porta con s\xe9 alcun token di evento del dispositivo \u2014 quello arriva da un emettitore di eventi, che il superamento di una soglia di conteggio non ha.",source:"Un cambio di occupazione \xe8 sempre prodotto dalla pipeline, quindi qualsiasi altra origine non potr\xe0 mai corrispondere e \xabpipeline\xbb non restringe nulla."},sound:{classes:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento, quindi questa condizione non potr\xe0 mai corrispondere \u2014 indica invece i suoni nella condizione Suono.",classesExclude:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento, quindi qui non c'\xe8 nulla da escludere \u2014 indica invece i suoni nella condizione Suono.",minConfidence:"La prova di una finestra audio \xe8 una percentuale di campioni, non il punteggio di un rilevatore: una soglia di affidabilit\xe0 non potr\xe0 mai essere soddisfatta.",zones:"Un suono non ha una posizione nell'inquadratura, quindi una zona non potr\xe0 mai corrispondere.",zonesExclude:"Un suono non ha una posizione nell'inquadratura, quindi una zona non potr\xe0 mai escluderlo.",customZones:"Un suono non ha una posizione nell'inquadratura, quindi un'area disegnata non potr\xe0 mai corrispondere.",crossing:"Un suono non ha una posizione nell'inquadratura, quindi non potr\xe0 mai attraversare il bordo di una zona.",labelEquals:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento e quindi nessuna etichetta \u2014 indica invece i suoni nella condizione Suono.",identities:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento, quindi non c'\xe8 alcun volto da riconoscere.",identitiesExclude:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento, quindi non c'\xe8 alcun volto da escludere.",plates:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento, quindi non c'\xe8 alcuna targa da leggere.",source:"Una finestra audio confermata \xe8 sempre marcata come soggetto audio, quindi qualsiasi altra origine non potr\xe0 mai corrispondere."}},ai:{sectionLabel:"Descrizione AI",enabledLabel:"Descrivi con l'AI",enabledHint:"Aggiunge a questa notifica una frase scritta da un modello di visione. Non trattiene mai la notifica: se il modello \xe8 freddo o irraggiungibile, l'avviso arriva senza la frase.",blurb:{occupancy:"Al modello vengono mostrati il fermo immagine e il conteggio che questa regola dichiara, e risponde se quel conteggio regge. La tua domanda guida ci\xf2 che guarda; la frase del verdetto la scrive l'hub, cos\xec un disaccordo lo dice sempre.","detection-immediate":"Al modello viene mostrato il fermo immagine preso nell'istante in cui la regola \xe8 scattata, e risponde alla tua domanda su di esso.","detection-track":"Al modello vengono mostrati l'inizio, il momento migliore e la fine del passaggio, e risponde alla tua domanda su cosa \xe8 successo."},profileLabel:"Modello",profileAuto:"Automatico",noProfiles:"Su questo hub non \xe8 configurato nessun modello con visione. Aggiungine uno dalle impostazioni admin prima di attivare questa sezione.",profilesUnavailable:"Questo hub non riesce a elencare i suoi modelli di visione. La sezione si salva lo stesso; l'hub sceglie il proprio modello predefinito.",languageLabel:"Lingua della risposta",languageAuto:"Predefinita dell'hub",language:{en:"Inglese",it:"Italiano"},maxWordsLabel:"Lunghezza",maxWordsHint:"Quante parole chiedere, all'incirca. \xc8 un'istruzione al modello, non un taglio: aspettati pi\xf9 o meno questa lunghezza, ogni tanto una parola in pi\xf9. Senza impostarla, i destinatari di questa regola danno {{words}}.",maxWordsVaries:"Quante parole chiedere, all'incirca. \xc8 un'istruzione al modello, non un taglio. I tuoi destinatari non concordano su un valore predefinito; il pi\xf9 stretto d\xe0 {{words}}, e senza impostarla ognuno usa il proprio.",promptLabel:"La tua domanda",occupancyContract:"La risposta resta un verdetto: l'hub chiede il conteggio, lo confronta con quello della regola e scrive da s\xe9 la conferma o la smentita. La tua domanda guida il modello, non pu\xf2 cambiare il formato della risposta."}}},targets:{add:"Aggiungi destinazione",empty:"Nessuna destinazione. Aggiungine una per ricevere notifiche.",loadError:"Impossibile caricare le destinazioni. Riprova.",pickKind:"Scegli un tipo di notifica",noKinds:"Nessun tipo di notifica disponibile.",kindUnavailable:"non disponibile",test:"Invia test",testing:"Invio\u2026",testOk:"Test consegnato",testFail:"Test fallito",edit:"Modifica",delete:"Elimina",cancel:"Annulla",save:"Salva modifiche",create:"Crea destinazione",addTitle:"Aggiungi destinazione {{kind}}",editTitle:"Modifica {{name}}",deleteConfirmTitle:"Elimina destinazione",deleteConfirmMessage:"Eliminare \"{{name}}\"? L'operazione non \xe8 reversibile.",form:{details:"Dettagli",config:"Configurazione",nameLabel:"Nome",nameHint:"Un'etichetta per riconoscere questa destinazione.",secretHint:"Lascia vuoto per mantenere il valore salvato."}},snooze:{title:"Silenzia",intro:"Silenzia TE, non tutta la casa \u2014 a meno che una regola non dica il contrario. Finisce da sola.",activeNone:"Non c'\xe8 niente in silenzio.",active:"In silenzio ora",past:"Finiti da poco",openTitle:"Silenzia per",scopeLabel:"Cosa silenziare",everything:"Tutto",aRule:"Una regola",aCamera:"Una telecamera",chooseRule:"Scegli una regola",chooseCamera:"Scegli una telecamera",camerasLoading:"Sto caricando le telecamere\u2026",noCameras:"Nessuna telecamera da silenziare.",globalLabel:"Silenzia per tutti",globalHelp:"Anche le altre persone smettono di ricevere le notifiche.",globalNotAllowed:"Questa regola si pu\xf2 silenziare solo per te.",summaryLabel:"Dimmi cosa ho perso",summaryHelp:"Alla fine della finestra arriva un riepilogo.",endNow:"Termina ora",endsIn:"finisce tra {{label}}",everyone:"per tutti",loadError:"Non riesco a caricare i silenzi.",createError:"Non riesco ad avviare il silenzio.",classesTitle:"Solo questi",classesHelp:"Se non tocchi nulla la finestra copre tutto. Scegli delle classi per silenziare solo quelle \u2014 il resto continua ad arrivarti.",everyClass:"Tutto",durations:{m10:"10 min",m30:"30 min",h1:"1 ora"},scope:{rule:"Una regola",device:"Una telecamera",all:"Tutto"},remaining:{ended:"finito",minutes:"{{minutes}} min",hours:"{{hours}}h",hoursMinutes:"{{hours}}h {{minutes}}m"},viewOnly:"Il tuo account pu\xf2 vedere le pause ma non aprirne una."},timelapse:{createTitle:"Nuovo timelapse",editTitle:"Modifica \xab{{name}}\xbb",namePlaceholder:"Vialetto di notte",enabledLabel:"Attivo",camerasHint:"Un video per telecamera. Una telecamera che non registra non pu\xf2 produrre un timelapse \u2014 l\u2019hub rifiuta il salvataggio e indica quale.",windowLabel:"Finestra",windowHint:"Le ore coperte. La finestra \xe8 la regola: inizia a raccogliere quando si apre e invia il video quando si chiude.",samplingLabel:"Campionamento",cadenceLabel:"Un fotogramma ogni (s)",framerateLabel:"Riproduzione (fps)",denseHint:"In prossimit\xe0 dei rilevamenti l\u2019hub campiona pi\xf9 fitto da solo. Se serve, imposta quel ritmo a mano nell\u2019amministrazione web.",previewHint:"Cosa mostra la notifica prima che tu apra il video.",preview:{image:"Immagine",gif:"GIF"},problem:{devices:"Scegli almeno una telecamera.",schedule:"Aggiungi almeno una finestra \u2014 un timelapse senza ore non parte mai."}},summary:{createTitle:"Nuovo riepilogo",editTitle:"Modifica \xab{{name}}\xbb",namePlaceholder:"Riepilogo della notte",enabledLabel:"Attivo",camerasHint:"Una sola immagine per tutte \u2014 lo scatto migliore di tutto ci\xf2 che \xe8 passato.",windowLabel:"Finestra",window:{motion:"Al movimento",schedule:"A orario"},motionHint:"Si apre al primo movimento su una qualsiasi di queste telecamere e resta aperta finch\xe9 ne arriva altro.",scheduleHint:"Orari fissi. Il riepilogo viene inviato alla chiusura della finestra.",quietLabel:"Chiudi dopo quiete (s)",maxWindowLabel:"Mai pi\xf9 lunga di (s)",advancedHint:"Quante immagini entrano, come vengono scelte e cosa viene chiesto all\u2019AI si impostano nell\u2019amministrazione web.",hubTooOld:"Su questo hub solo un amministratore pu\xf2 creare riepiloghi. Qui puoi vederli; aggiorna l\u2019hub per modificarli dall\u2019app.",problem:{devices:"Scegli almeno una telecamera.",window:"Controlla la finestra \u2014 un riepilogo a orario richiede delle ore e \xabmai pi\xf9 lunga di\xbb deve superare il periodo di quiete."}},family:{cameras_one:"{{count}} telecamera",cameras_other:"{{count}} telecamere",never:"Non ha ancora inviato nulla.",last:"Ultimo invio {{when}}.",off:"Disattivato \u2014 non verr\xe0 eseguito.",readOnly:"Creato da un amministratore. Qui puoi vederlo ma non modificarlo."}},login:{loginFailed:"Accesso fallito",verifyFailed:"Verifica fallita",serverUrl:"Server URL",username:"Username",password:"Password",showPassword:"Mostra password",hidePassword:"Nascondi password",signIn:"Accedi",signingIn:"Accesso\u2026",twoFactor:"Autenticazione a due fattori",totpHint:"Inserisci il codice a 6 cifre dall'app di autenticazione per accedere come ",verificationCode:"Codice di verifica",verifyAndSignIn:"Verifica e accedi",verifying:"Verifica\u2026",back:"Indietro",or:"oppure",signInWithCamStack:"Accedi con CamStack",hubSignInHint:"Apre la pagina di accesso del tuo hub e collega questa app senza digitare qui la password.",handoffFailed:"Accesso con CamStack non riuscito \u2014 riprova oppure usa nome utente e password",invalidServerUrl:"Inserisci prima un URL server valido (https://\u2026)"},live:{webUnsupported:"La vista live non \xe8 ancora disponibile nella versione web.",connecting:"Connessione allo stream live\u2026",error:"Impossibile caricare lo stream live.",retry:"Riprova",noConnection:"Nessuna connessione al server",failed:"Connessione fallita",errorPageLoad:"Caricamento della pagina del player fallito."},ptz:{title:"PTZ",notAvailable:"I controlli PTZ non sono disponibili per questa telecamera.",zoom:"Zoom",home:"Posizione iniziale",presets:"Preset",noPresets:"Nessun preset salvato."},navigation:{title:"Navigazione",notAvailable:"I comandi di navigazione non sono disponibili per questo dispositivo.",drive:"Guida",forward:"Avanti",left:"Gira a sinistra",right:"Gira a destra",turnAround:"Inverti",stop:"Stop",actions:"Azioni",sounds:"Suoni",light:"Luce",lightOn:"Luce accesa",lightOff:"Luce spenta",auto:"Auto",manual:"Manuale",levelUp:"Pi\xf9 luminosa",levelDown:"Meno luminosa",following:"sta seguendo",joystick:"Joystick di guida",joystickHint:"Trascina per guidare il robot; rilascia per fermarlo.",followMe:"Seguimi",returnToDock:"Torna alla base",moreControls:"Altri comandi",mode:{idle:"Fermo",cleaning:"Pulizia",spot:"Pulizia puntuale",following:"Sta seguendo",goto:"Verso il punto",returning:"Rientro alla base",paused:"In pausa",unknown:"Sconosciuto"}},timeline:{activityTitle:"Attivit\xe0",last24h:"Ultime 24h",loading:"Caricamento attivit\xe0\u2026",noActivity:"Nessuna attivit\xe0 nelle ultime 24 ore.",legendRecording:"Registrato",legendMotion:"Movimento",legendAudio:"Audio",showTimeline:"Mostra timeline",hideTimeline:"Nascondi timeline",faultStream:"Lo stream video non \xe8 disponibile.",faultRecordings:"Non \xe8 stato possibile caricare le registrazioni di questo giorno.",faultEvents:"Non \xe8 stato possibile caricare gli eventi di questo giorno.",faultDismiss:"Ignora",loadRetry:"Riprova",loadRetrying:"Riprovo\u2026",moreHistory:"C'\xe8 cronologia pi\xf9 vecchia non ancora mostrata.",scopeUnreadable_one:"Una videocamera di questa vista non \xe8 stata letta: qui mancano i suoi eventi e le sue registrazioni.",scopeUnreadable_other:"{{count}} videocamere di questa vista non sono state lette: qui mancano i loro eventi e le loro registrazioni.",scopeOverflow_one:"Questa vista ha una videocamera in pi\xf9 di quante la timeline riesca a leggerne insieme.",scopeOverflow_other:"Questa vista ha {{count}} videocamere in pi\xf9 di quante la timeline riesca a leggerne insieme.",scopeUnreadableAndOverflow:"{{unreadable}} videocamere non sono state lette e altre {{overflow}}, oltre il limite della timeline, non sono mostrate.",loadMoreHistory:"Carica altro",loadingMoreHistory:"Caricamento\u2026"},theater:{back:"Indietro",today:"Oggi",yesterday:"Ieri",prevDay:"Giorno precedente",nextDay:"Giorno successivo",selectDate:"Seleziona una data",live:"LIVE",now:"ORA",auto:"Auto",quality:"Qualit\xe0 stream",filterAll:"Tutti",filter_motion:"Movimento",filter_audio:"Audio",goToLive:"Vai al live",liveLockOn:"Blocco live attivo \u2014 navigando l'immagine resta in diretta",liveLockOff:"Blocco live disattivo \u2014 navigando parte la registrazione",recordLive:"Registra live",keepClip:"Salva la registrazione",keepClipTitle:"Tenere questo clip?",discardClip:"Scarta",saveToGallery:"Salva in Foto",shareClip:"Condividi",recordFailed:"Impossibile registrare la vista live",noRecording:"Nessuna registrazione",noRecordingHint:"Nessun filmato per questo momento",detailCount:"{{frames}} frame \xb7 {{count}} rilevamenti",detailTracks:"{{tracks}} tracce \xb7 {{count}} rilevamenti",detailEmpty:"Nessuna immagine di dettaglio per questo istante",detailSeek:"Vai a questo momento",zoneHint:"Trascina un rettangolo sul video per filtrare gli eventi per zona",zoneConfirm:"Conferma",zoneCancel:"Annulla",playbackBar:"Controlli di riproduzione",footerBar:"Strumenti timeline",filterTitle:"Filtri",zoomRange:"Intervallo di tempo",zoomSpanMinutes:"{{count}}m",zoomSpanHours:"{{count}}h",zoneFilter:"Filtro zona",detailSubjects_one:"{{count}} soggetto",detailSubjects_other:"{{count}} soggetti",zoneModeRect:"Rettangolo",zoneModePolygon:"Poligono",zoneClearPoints:"Pulisci",zoneHintPolygon:"Tocca per aggiungere punti \u2014 3 o pi\xf9",selectTime:"Ora",goSameTime:"Vai \u2014 stessa ora del giorno",recordingDaysFailed:"Non \xe8 stato possibile leggere i giorni con registrazioni.",recordingDaysPartial:"Alcune videocamere di questa vista non sono state lette: i giorni senza pallino potrebbero comunque avere registrazioni.",clusterOpenDetail:"Apri il dettaglio evento",clusterCarouselShow:"Apri il carosello del cluster",clusterCarouselHide:"Chiudi il carosello del cluster",clusterPrevImage:"Immagine precedente",clusterNextImage:"Immagine successiva",clusterCameras_one:"{{count}} telecamera",clusterCameras_other:"{{count}} telecamere",clipStartsAtSubjectAt:"La clip parte alle {{start}}, soggetto alle {{subject}}",clipEndsAt:"La clip termina alle {{end}}",legend:{open:"Legenda heatmap e timeline",title:"Legenda",heatmapTitle:"Heatmap delle 24 ore",heatmapRecordingTitle:"Registrazione",heatmapRecordingBody:"Linea rossa in alto sul nastro \u2014 copertura di quel tratto di giornata.",heatmapAudioTitle:"Audio",heatmapAudioBody:"Picchi dall'alto. Verde = basso, rosso = alto: la stessa scala a sei gradini del misuratore live.",heatmapBottomTitle:"Motion e detection",heatmapBottomBody:"La parte bassa di ogni slot \xe8 motion verde, oppure la classe prominente quando c'\xe8 object detection.",timelineTitle:"Colonna attivit\xe0",timelineRecordingTitle:"Registrazione",timelineRecordingBody:"Linea rossa continua all'estrema destra.",timelineMotionTitle:"Motion",timelineMotionBody:"Linea verde al centro.",timelineDetectionTitle:"Object detection",timelineDetectionBody:"Pallino sulla linea motion, del colore della classe prominente in quel momento.",timelineAudioTitle:"Livello audio",timelineAudioBody:"Linea all'estrema sinistra. Stessa scala verde\u2192rosso della heatmap e del misuratore live.",classesTitle:"Classi di detection",classPerson:"Persona",classPersonBody:"Persone e volti.",classVehicle:"Veicolo",classVehicleBody:"Auto, camion, bici e il resto della famiglia veicolo.",classAnimal:"Animale",classAnimalBody:"Cani, gatti, uccelli e altri animali."}},mediaKind:{crop:"Ritaglio oggetto",thumbnail:"Best shot",faceCrop:"Volto",plateCrop:"Targa",fullFrame:"Frame",fullFrameBoxed:"Riquadrato",keyFrame:"Frame chiave",firstFrame:"Primo",lastFrame:"Ultimo",snapshot:"Istantanea"},tracks:{crop:"Ritaglio",fullFrame:"Frame completo",bestShot:"Scatto migliore",media:"Media",noMedia:"Nessun media per questa traccia",mediaLoadError:"Impossibile caricare i media",mediaEntryLoading:"Caricamento del media\u2026",mediaEntryError:"Media presente in indice ma non leggibile",mediaEntryAbsent:"Non archiviato per questa traccia",path:"Percorso",pathSummary:"{{count}} punti \xb7 {{seconds}}s",pathNoLocalization:"nessuna posizione precisa",share:"Condividi",copyLink:"Copia link",linkCopied:"Link copiato",shareImage:"Condividi immagine",viewFullRes:"Risoluzione piena",fullResBadge:"Piena",zones:"Zone",audio:"Audio",prevTrack:"Evento precedente",nextTrack:"Evento successivo",reason:"Perch\xe9 rilevante",empty:"Nessuna traccia",recent:"Recenti",searchPlaceholder:"Cerca eventi (es. \"persona in rosso\")",searchSubmit:"Cerca",searchClear:"Cancella ricerca",noMatches:"Nessun evento corrispondente",person:"Persona",assignPerson:"Associa a persona",changePerson:"Cambia",notAssigned:"Non associata",matchConfidence:"Affidabilit\xe0 match",suggested:"Suggerito",suggestedUnknown:"Persona suggerita",suggestedConfirm:"Conferma",suggestedDismiss:"Ignora",assignFaceTitle:"Associa volto",newPersonPlaceholder:"Nome nuova persona\u2026",createAndAssign:"Crea e associa",assignFailed:"Associazione del volto non riuscita",removePerson:"Rimuovi persona",removePersonConfirmTitle:"Rimuovere la persona?",removePersonConfirmBody:"Questo scollega la persona da questo volto. Il volto torna tra quelli non associati e potr\xe0 essere riassociato in seguito.",disassociateFailed:"Rimozione della persona non riuscita",removePersonAll:"Rimuovi da tutti gli eventi",removePersonAllConfirmTitle:"Rimuovere da tutti gli eventi?",removePersonAllConfirmBody:"Questo scollega la persona da OGNI evento. Tutti i volti attualmente riconosciuti come questa persona tornano tra quelli non associati e potranno essere riassociati in seguito. La persona viene mantenuta.",disassociateAllFailed:"Rimozione della persona da tutti gli eventi non riuscita",existingPersons:"Persone",noPersons:"Ancora nessuna persona",metadata:"Metadati",markForTraining:"Segna per addestramento",markForTrainingHint:"Mantiene questa traccia e i suoi media oltre la conservazione",debugFlag:"Debug",debugFlagHint:"Segna questa traccia per un controllo diagnostico. Tieni premuto per modificare cosa controllare.",debugNotePromptTitle:"Cosa dobbiamo controllare?",debugNotePromptBody:"Descrivi cosa non torna in questo evento, con parole tue. Resta sulla traccia, cos\xec chi rivede il set di debug legge la domanda insieme ad essa.",debugNotePlaceholder:"es. il box salta sul cancello quando passa l\u2019auto",debugPreset:{noCrop:"Nessun ritaglio del soggetto",edgeCropMirror:"Ritaglio sul bordo, immagine specchiata",lateStart:"Traccia partita in ritardo",neverDetected:"Soggetto mai rilevato",boxPathMismatch:"Box non coincide col percorso",brokenTrack:"Traccia spezzata",badThumbnail:"Miniatura sbagliata",falsePositive:"Non c\u2019era nulla"},debugReviewed:"Analizzata",debugReviewedHint:"Segna questa traccia debug come analizzata cos\xec esce dal filtro e dall'export",favourited:"Preferito",favouritedHint:"Mantiene questa traccia e i suoi media oltre la conservazione",copy:"Copia",copied:"Copiato","meta.trackId":"ID traccia","meta.eventId":"ID evento migliore","meta.deviceId":"ID dispositivo","meta.camera":"Telecamera","meta.className":"Classe","meta.label":"Etichetta","meta.firstSeen":"Prima apparizione","meta.lastSeen":"Ultima apparizione","meta.state":"Stato","meta.importance":"Importanza","meta.confidence":"Confidenza","meta.mediaKeys":"Chiavi media",rescore:{button:"Ricalcola le corrispondenze",failed:"Impossibile ricalcolare le corrispondenze",params:"Soglia {{threshold}} \xb7 margine {{margin}}",needsSamples:"{{count}} campioni \u2014 ne servono {{min}}",reembed:"Ricalcola l'embedding e riprova",reembedFailed:"Ricalcolo embedding fallito: {{reason}}",verdict:{"auto-assignable":"Verrebbe assegnata a {{name}}",ambiguous:"Due persone hanno punteggi troppo vicini \u2014 il margine lo impedisce",suggestion:"Plausibile, ma sotto la soglia di assegnazione automatica","below-threshold":"Nessuna corrispondenza nella galleria attuale","no-eligible-identity":"Nessuna persona ha ancora abbastanza campioni (ne servono {{min}})","empty-gallery":"Nella galleria non c'\xe8 nulla di confrontabile con questo volto","model-mismatch":"Questo volto \xe8 stato calcolato con un modello precedente \u2014 i punteggi non sono confrontabili"}}},accessories:{on:"Acceso",off:"Spento",dimUp:"Pi\xf9 luminoso",dimDown:"Meno luminoso",lock:"Blocca",unlock:"Sblocca",open:"Apri",close:"Chiudi",stop:"Ferma",arm:"Attiva",disarm:"Disattiva",onMotion:"Su movimento",openPercent:"Apertura {{percent}}",warmer:"Pi\xf9 caldo",cooler:"Pi\xf9 freddo",speedUp:"Pi\xf9 veloce",speedDown:"Pi\xf9 lento",oscillate:"Oscillazione",press:"Premi",play:"Riproduci",pause:"Pausa",previous:"Precedente",next:"Successivo",start:"Avvia",dock:"Rientra",locate:"Localizza",feed:"Eroga",feeding:"Erogazione\u2026",install:"Installa",installing:"Installazione\u2026",upToDate:"Aggiornato",increase:"Aumenta",decrease:"Diminuisci",select:"Seleziona",noEvent:"Nessun evento",buttonIndex:"Tasto {{index}}",mode:"Modalit\xe0",fanMode:"Modalit\xe0 ventola",preset:"Preset",direction:"Direzione",forward:"Avanti",reverse:"Indietro",away:"Assente",humidityUp:"Aumenta umidit\xe0",humidityDown:"Riduci umidit\xe0",swingVertical:"Oscillazione verticale",swingHorizontal:"Oscillazione orizzontale",setTemperature:"Temperatura impostata",currentTemperature:"Temperatura attuale",climateModes:{off:"Spento",heat:"Riscaldamento",cool:"Raffreddamento",auto:"Auto",heat_cool:"Caldo/Freddo",fan_only:"Ventola",dry:"Deumidificazione"}},updates:{otaReadyTitle:"Aggiornamento scaricato",otaReadyBody:"Riavviare l'app adesso per applicarlo? Con \"Pi\xf9 tardi\" si applica al prossimo avvio.",install:"Riavvia ora",later:"Pi\xf9 tardi",whatsNewTitle:"Novit\xe0 nella {{version}}",whatsNewHeading:"Novit\xe0",whatsNewPrevious:"Aggiornamenti precedenti",whatsNewRow:"Novit\xe0",whatsNewNone:"Nessuna nota per questa versione.",nativeRow:"Build dell'app",nativeUpToDate:"Aggiornata",nativeUnknown:"\u2014",nativeNewer:"Disponibile {{version}} ({{build}})",nativeNewerTitle:"\xc8 disponibile una nuova build dell'app",nativeNewerBody:"La versione {{version}} (build {{build}}) \xe8 disponibile. Da ora gli aggiornamenti la richiedono.",openTestFlight:"Apri TestFlight",openStore:"Apri lo store"},cameraMenu:{title:"Opzioni vista",gridCommonHint:"Gli overlay comuni a tutta la griglia \u2014 riquadri, bordo di evidenziazione e i suoi trigger, etichette dei cluster \u2014 si impostano una volta sola per la griglia, nella barra della griglia.",streamStats:"Statistiche stream",audioLevel:"Livello audio",densityTitle:"Densit\xe0 timeline",density_compact:"Compatta",density_medium:"Media",density_wide:"Ampia",densityCustom:"Personalizzata",showImportance:"Mostra importanza",showClass:"Mostra classe rilevata",timelineSection:"Timeline",managementTitle:"Gestione"},viewOptions:{groupDetection:"Overlay di rilevamento"},cameraShelf:{goTo:"Vai a questa telecamera",addToView:"Aggiungi alla vista",closeView:"Chiudi la vista"},cameraSwitches:{title:"Funzioni telecamera",loading:"Lettura delle funzioni\u2026",readFailed:"Impossibile leggere le funzioni della telecamera. Nulla \xe8 cambiato \u2014 non vengono mostrate anzich\xe9 mostrarle con uno stato ipotizzato.",writeFailed:"Modifica rifiutata e annullata. {{reason}}",offBadge:"OFF",badgeLabel_one:"{{count}} funzione disattivata",badgeLabel_other:"{{count}} funzioni disattivate",unavailableNoProvider:"Non disponibile \u2014 nessun componente di questa installazione la fornisce.",unavailableUnreachable:"Sconosciuto \u2014 il servizio che la gestisce non ha risposto.",unavailableNotConfigured:"Non offerta \u2014 non \xe8 ancora configurato nulla su cui agire.",unavailableNoPrivacyZones:"Non offerta \u2014 sulla telecamera non \xe8 disegnata nessuna zona di privacy. Disegnane una nell\u2019app della telecamera e l\u2019interruttore comparir\xe0.",unavailableDeviceDisabled:"Non offerta finch\xe9 la telecamera \xe8 spenta.",unavailableUnknown:"Non disponibile su questa telecamera."},stats:{title:"Statistiche stream",resolution:"Risoluzione",fps:"FPS",bitrate:"Bitrate",packetLoss:"Pacchetti persi",jitter:"Jitter",codec:"Codec",frames:"Frame (persi/totali)",waiting:"Misurazione\u2026",playbackHint:"Le statistiche WebRTC complete richiedono il player nativo."},exportActions:{title:"Cattura",recordingExport:"Esporta registrazione"},exportSelection:{start:"Seleziona un periodo da esportare",discard:"Scarta la selezione",save:"Salva il periodo selezionato",savePartial:"Salva il periodo selezionato \u2014 una parte non \xe8 registrata",title:"Esportazione",queued:"Esportazione in coda. La troverai in Esportazioni quando \xe8 pronta.",failed:"Non \xe8 stato possibile mettere in coda l'esportazione.",gapTitle:"Una parte di questo periodo non \xe8 registrata",gapMessage:"I {{duration}} selezionati attraversano un tratto senza registrazione. L'esportazione conterr\xe0 solo le parti registrate.",gapConfirm:"Esporta comunque"},exports:{title:"Esportazioni",empty:"Nessuna esportazione.",settingsHint:"Scarica clip registrate",range:"Intervallo",rangeStart:"Inizio",rangeEnd:"Fine",profile:"Profilo",noFootage:"Nessuna registrazione in questo intervallo.",speed:"Velocit\xe0",timelapse:"Timelapse",cadence:"Un fotogramma ogni",audio:"Audio",includeAudio:"Includi audio",audioUnavailable:"L'audio \xe8 disponibile solo a velocit\xe0 0,5\u20132\xd7.",retention:"Conserva per",life24h:"24 ore",life7d:"7 giorni",life30d:"30 giorni",deleteAfterDownload:"Elimina dopo il download",deleteAfterDownloadHint:"Rimuovi il file una volta scaricato.",notify:"Avvisa quando \xe8 pronto",creating:"Creazione\u2026",createAction:"Esporta",createFailed:"Impossibile creare l'esportazione.",withAudio:"con audio",variantRegular:"1\xd7",variantAccelerated:"Accelerato {{speed}}\xd7",variantSlow:"Rallentato {{speed}}\xd7",variantTimelapse:"Timelapse",expired:"Scaduto",expiresInDays:"Scade tra {{count}}g",expiresInHours:"Scade tra {{count}}h",expiresInMinutes:"Scade tra {{count}}m",downloadAction:"Scarica",downloadUnavailable:"Download non disponibile.",downloadFailed:"Download non riuscito.",cancelAction:"Annulla",cancelConfirmTitle:"Annullare l'esportazione?",cancelConfirmBody:"Interrompe il rendering ed elimina il file parziale.",deleteAction:"Elimina",deleteConfirmTitle:"Eliminare l'esportazione?",deleteConfirmBody:"Rimuove il file. La voce nella cronologia viene mantenuta.",dismiss:"Chiudi",state:{queued:"In coda",rendering:"Rendering",ready:"Pronto",failed:"Non riuscito",expired:"Scaduto",deleted:"Eliminato"}},library:{title:"Libreria",sections:{events:"Eventi",artifacts:"Artefatti",exports:"Esportazioni",review:"Revisione"}},artifacts:{title:"Artefatti",settingsHint:"Timelapse, clip e riepiloghi",empty:"Nessun artefatto.",emptyFiltered:"Nessun artefatto corrisponde a questi filtri.",loadError:"Impossibile caricare gli artefatti.",gone:"Questo artefatto non \xe8 pi\xf9 sull'hub.",expired:"Scaduto",expiredBody:"La finestra di conservazione \xe8 terminata e il file \xe8 stato rimosso.",expiresInDays:"Scade tra {{count}}g",expiresInHours:"Scade tra {{count}}h",expiresInMinutes:"Scade tra {{count}}m",retentionHint:"Conservato fino a 14 giorni. I file possono essere rimossi prima se l'hub raggiunge i limiti di spazio.",byRule:"Regola: {{name}}",allCameras:"Tutte le telecamere",cameraPlus:"{{name}} +{{count}}",close:"Chiudi",downloadAction:"Scarica",downloadUnavailable:"Download non disponibile.",downloadFailed:"Download non riuscito.",kind:{timelapse:"Timelapse","timelapse-preview":"Anteprima timelapse","summary-mosaic":"Mosaico riepilogo","event-gif":"GIF","event-clip":"MP4","event-still":"Foto"},time:{now:"Adesso",minutesAgo:"{{count}}m fa",hoursAgo:"{{count}}h fa",daysAgo:"{{count}}g fa"},range:{all:"Tutto",day:"24h",week:"7g",month:"30g"},filters:{toggle:"Filtri",kind:"Tipo",camera:"Telecamera",range:"Periodo",clear:"Azzera filtri"},detail:{kind:"Tipo",cameras:"Telecamere",rule:"Regola",captured:"Ripreso il",created:"Prodotto il",size:"Dimensione",format:"Formato",expiry:"Scadenza"}},streamBar:{play:"Riproduci",pause:"Pausa",scrubForward:"Avanzamento veloce",scrubBackward:"Riavvolgimento",mute:"Silenzia",unmute:"Riattiva audio",talkStart:"Inizia a parlare",talkStop:"Smetti di parlare",quality:"Qualit\xe0 stream",menu:"Opzioni vista",snapshot:"Istantanea",pip:"Picture in picture",fullscreen:"Schermo intero",exitFullscreen:"Esci da schermo intero"},playback:{servedTier:"In riproduzione {{tier}}",servedTierDegraded:"{{requested}} non disponibile qui \u2014 riproduco {{served}}",tier:{high:"Alta",mid:"Media",low:"Bassa"},prevFrame:"Frame precedente",nextFrame:"Frame successivo",speed:"Velocit\xe0 riproduzione",audioMuted:"Audio off a \u2260 1\xd7",audioOn:"Audio attivo"},cameraSwitcher:{title:"Cambia videocamera",empty:"Nessuna videocamera disponibile",openGrid:"Apri griglia ({{n}})",selectA11y:"Seleziona {{name}}",buildView_one:"Mostra questa videocamera",buildView_other:"Mostra queste {{count}} videocamere"},storage:{title:"Archiviazione",usageTitle:"Utilizzo",nodeTotal:"Totale nodo",defaultLocation:"Posizione predefinita",locationFree:"{{free}} liberi",retentionTitle:"Conservazione",pruneAction:"Applica conservazione ora",pruneConfirmTitle:"Applicare la conservazione?",pruneConfirmBody:"Elimina le registrazioni su {{name}} che superano la policy di conservazione.",pruneResult:"Recuperati {{bytes}} ({{buckets}} segmenti).",deleteTitle:"Elimina registrazioni",deleteAction:"Elimina",deleteConfirmTitle:"Eliminare le registrazioni?",deleteConfirmBody:"Elimina definitivamente {{range}} di registrazioni su {{name}}. Operazione irreversibile.",deleteResult:"Recuperati {{bytes}} ({{buckets}} segmenti).",cancel:"Annulla",window24h:"Ultime 24h",window7d:"Ultimi 7 giorni",window30d:"Ultimi 30 giorni",windowAll:"Tutto"},eventsMgmt:{title:"Eventi",footprintTitle:"Ingombro",rowsBytes:"{{rows}} eventi \xb7 {{bytes}}",clusterTotal:"Totale cluster",pruneTitle:"Elimina pi\xf9 vecchi di",pruneHint:"Si applica a tutte le telecamere.",pruneAction:"Elimina",pruneConfirmTitle:"Eliminare gli eventi vecchi?",pruneConfirmBody:"Elimina gli eventi pi\xf9 vecchi di {{range}} su TUTTE le telecamere. Operazione irreversibile.",pruneResult:"Eliminati {{count}} eventi.",deleteTitle:"Elimina eventi telecamera",deleteAction:"Elimina tutti gli eventi di questa telecamera",deleteConfirmTitle:"Eliminare tutti gli eventi?",deleteConfirmBody:"Elimina definitivamente ogni evento di {{name}}. Operazione irreversibile.",deleteResult:"Eliminati {{count}} eventi.",cancel:"Annulla",older24h:"24 ore",older7d:"7 giorni",older30d:"30 giorni"},overlay:{title:"Overlay",liveSection:"Indicatori live",readoutsSection:"Sensori e valori",layersLabel:"Riquadri sull'immagine",layerMotion:"Movimento",layerObjects:"Oggetti",layerDiscarded:"Scartate",layerStationary:"Stazionarie",layerDiscardedHint:"Disegna anche, con tratteggio, le rilevazioni quasi accettate e quelle fuori zona delle classi che hai abilitato \u2014 soggetti rimasti appena sotto la soglia di confidenza, o fuori da una regola di zona. Utile quando i riquadri lampeggiano su un soggetto in movimento. La pillola confronta ci\xf2 che il modello ha visto con ci\xf2 che \xe8 stato tenuto.",layerStationaryHint:"Disegna gli oggetti che si sono fermati e non sono pi\xf9 tracciati \u2014 un'auto parcheggiata, un bidone lasciato fuori. L'hub sopprime le loro rilevazioni, quindi non possono mai comparire sotto Oggetti o Scartate.",diagCounts:"modello {{saw}} \xb7 tenuti {{kept}}",diagHidden:"{{hidden}} nascosti",diagOffTopic:"{{offTopic}} non pertinenti",diagShed:"frame saltato \xb7 {{reason}}",reasonThreshold:"sotto soglia",reasonFullFrame:"guardia full-frame",reasonNms:"soppresso da NMS",reasonClassFilter:"filtro classe",reasonZoneGate:"regola di zona",motionBadge:"Badge movimento",highlightBorder:"Bordo evidenziazione",occupancy:"Occupazione",addReadout:"Aggiungi un valore",removeReadout:"Rimuovi valore",readoutsHint:"Fissa un valore live sull'immagine: il livello audio, o un sensore collegato a questa telecamera.",noFields:"Questo dispositivo non pubblica valori live.",thisCamera:"Questa telecamera",audioDbfs:"Livello audio",liveOnlyHint:"Si disegnano solo sull'immagine live \u2014 non in riproduzione n\xe9 in pausa.",positions:{off:"Off","top-left":"In alto a sinistra","top-center":"In alto al centro","top-right":"In alto a destra","left-center":"Al centro a sinistra","right-center":"Al centro a destra","bottom-left":"In basso a sinistra","bottom-center":"In basso al centro","bottom-right":"In basso a destra"}},clips:{title:"Clip",loading:"Caricamento clip\u2026",empty:"Nessuna clip per questa telecamera nell'intervallo caricato.",summary_one:"{{count}} clip",summary_other:"{{count}} clip",collapsedHint:"{{duration}} saltati",hiddenHint_one:"{{count}} nascosta dal filtro sorgenti",hiddenHint_other:"{{count}} nascoste dal filtro sorgenti",segmentLabel:"Clip delle {{time}}, durata {{duration}}",gapLabel:"Salto di {{duration}}",notPlayable:"non ancora riproducibile",kind_motion:"Movimento",kind_object:"Oggetto",kind_audio:"Audio",kind_native:"Telecamera",sourceAnalytics:"Registrazione",sourceOnboard:"Telecamera ({{vendor}})",sourceHksv:"HomeKit",sourceUnknown:"{{vendor}}",unitDay:"g",unitHour:"o",unitMinute:"m",unitSecond:"s"},eventsEmbed:{section:"Embed dell'hub (anteprima)",title:"Embed eventi",count:"{{count}} mostrati",openPreview:"Anteprima embed",openPreviewHint:"Apre la superficie eventi ospitata dall'hub accanto a questa pagina. Non sostituisce nulla.",view_reel:"Striscia",view_gallery:"Galleria",error:"Impossibile caricare gli eventi",retry:"Riprova",empty:"Nessun evento",emptyFiltered:"Nessun evento corrisponde a questo filtro",end:"\xb7 fine \xb7"},eventsShare:{title:"Link embed eventi",openBuilder:"Crea link embed",openBuilderHint:"Costruisci un URL autonomo per una dashboard o un iframe.",view:"Vista",viewReel:"Striscia",viewGallery:"Galleria",columns:"Colonne",rows:"Righe",auto:"Auto",thumb:"Dimensione miniature",thumbSmall:"Piccola",thumbMedium:"Media",thumbLarge:"Grande",theme:"Tema",themeAuto:"Auto",themeDark:"Scuro",themeLight:"Chiaro",fields:"Testo della card",field_label:"Titolo",field_sublabel:"Classe",field_camera:"Telecamera",field_time:"Ora",field_badges:"Badge",cameras:"Telecamere",camerasAll:"Tutte le telecamere visibili al link",camerasCount:"{{count}} selezionate",preview:"Anteprima del link",shareMediaNotice:"Un link di condivisione non riesce a caricare le miniature. I token di condivisione non hanno alcun accesso all'endpoint dei media: la pagina elenca gli eventi, senza le immagini.",copyLink:"Crea link",chip:"Link embed",semanticScopeNotice:"La ricerca semantica gira su tutte le telecamere e viene poi ristretta a questo link: un link con poche telecamere pu\xf2 quindi restituire pochi risultati su un cluster grande."},eventsCard:{unassignedFace:"volto non assegnato",reviewed:"analizzata",debug:"debug",train:"addestramento",favourite:"preferito",active:"attivo",loadingMore:"Caricamento altri eventi"},gridTile:{play:"Riproduci",pause:"Pausa",listen:"Ascolta",mute:"Silenzia",talk:"Parla",stopTalk:"Termina",ptz:"PTZ",linkedDevices:"Dispositivi collegati",viewOptions:"Opzioni di visualizzazione",moreActions:"Altre azioni",open:"Apri",removeFromView:"Togli dalla vista",resizeWidth:"Ridimensiona larghezza",resizeHeight:"Ridimensiona altezza",noActiveCameras:"Nessuna videocamera attiva",camera:"Videocamera"},battery:{holdHint:"La camera \xe8 a batteria: premi play per avviare lo stream e svegliarla.",startStreamA11y:"Avvia lo stream e sveglia la camera a batteria"},faceReview:{loading:"Caricamento volti\u2026",loadError:"Impossibile caricare i volti.",empty:"Nessun volto da rivedere al momento.",previewClose:"Chiudi",pickIdentityTitle:"Assegna a\u2026",assignFailed:"Impossibile assegnare questo volto.",assign:"Assegna",assignedSuccess:"Assegnato a {{name}}.",confirmAssignTitle:"Assegna volti",confidence:"Affidabilit\xe0",groupSize:"{{count}} volti in questo gruppo",filterAssigned:"Assegnate",filterSuggested:"Suggerite",filterUnassigned:"Non assegnate",certaintyCertain:"quasi certo",certaintyProbable:"probabile",certaintyUncertain:"incerto",analyzeButton:"Analizza le ultime {{count}} non assegnate",analyzeModalTitle:"Gruppi simili",analyzeLoading:"Ricerca gruppi simili\u2026",analyzeEmpty:"Nessun gruppo simile trovato.",analyzeConfirmBody:"Assegnare {{count}} volti in {{groups}} gruppi?",analyzeResult:"Assegnati {{assigned}} di {{count}} volti.",analyzeAssignFailed:"Alcuni volti sono stati rifiutati e restano non assegnati.",recomputeButton:"Ricalcola i suggerimenti",recomputeProgress:"Ricalcolo {{done}}/{{total}}\u2026",recomputeDone:"Ricalcolati {{count}} volti.",analyzeCoverage:"{{grouped}} volti su {{pool}} rientrano in {{groups}} gruppi simili. Gli altri, sui {{requested}} analizzati, qui non hanno un simile.",groupExcludeFace:"Escludi questo volto dal gruppo",groupIncludeFace:"Rimetti questo volto nel gruppo",groupPickPerson:"Assegna questo gruppo a",groupShowDetail:"Mostra questo volto ingrandito",groupDetailExclude:"Escludi dal gruppo",groupDetailInclude:"Rimetti nel gruppo",assignedManySuccess:"Assegnati {{count}} volti a {{name}}.",detailTitleMany:"Assegna {{count}} volti selezionati a\u2026",knownPeople:"Persone conosciute",filtersButton:"Filtri",filtersButtonActive:"Filtri ({{count}})",sortLabel:"Ordina per",sortByCertainty:"Certezza",sortByDate:"Data",sortAscending:"Ordine crescente \u2014 tocca per decrescente",sortDescending:"Ordine decrescente \u2014 tocca per crescente",dateLabel:"Intervallo di date",rangeAll:"Tutte",rangeToday:"Oggi",rangeYesterday:"Ieri",rangeLast7:"7 giorni",rangeLast30:"30 giorni",cameraLabel:"Telecamera",cameraNone:"Nessuna telecamera nei volti caricati.",selectButton:"Seleziona",selectDone:"Fatto",selectionCount:"{{count}} selezionati",applySuggestions:"Applica {{count}} suggerimenti",applySuggestionsBlocked:"{{count}} dei volti selezionati non ha un suggerimento \u2014 deselezionali, oppure usa Assegna.",applySuggestionsResult:"Applicati {{count}} suggerimenti su {{total}}, per {{groups}} persone.",emptyFiltered:"Nessun volto corrisponde a questi filtri.",partialWindowHint:"Stai filtrando i {{count}} volti caricati finora \u2014 scorri in basso per caricarne di pi\xf9 vecchi.",auditTitle:"Rianalizza i campioni di {{name}}",auditSummary:"{{flagged}} campioni su {{total}} da guardare",auditLooksLike:"Somiglia a {{name}} ({{foreign}}) pi\xf9 che a questa persona ({{self}})",auditSelfOnly:"Concorda con gli altri campioni di questa persona: {{self}}",auditNotComparable:"Arruolato con un altro modello di volto \u2014 non \xe8 confrontabile, nemmeno per dire che va bene.",auditFromPhoto:"foto",auditRemoveTitle:"Rimuovi questo campione",auditRemoveBody:"Il campione smette di insegnare al riconoscimento. Non cambia nient\u2019altro, e la faccia da cui proviene resta dov\u2019\xe8.",auditUnavailable:"Questo hub non sa ancora rianalizzare una galleria.",auditOpen:"Rianalizza campioni"},statusDetail:{batteryTitle:"Batteria",linkTitle:"Collegamento",openBatteryA11y:"Dettagli batteria",openLinkA11y:"Dettagli collegamento",close:"Chiudi",label:{charge:"Carica",charging:"Alimentazione",state:"Stato",linkType:"Collegamento",signal:"Segnale",ssid:"Rete"},value:{unknown:"Non noto",notApplicable:"Non applicabile",binary:"Solo scarica / ok, senza percentuale",sleeping:"In sospensione",chargingDc:"In carica (rete)",chargingSolar:"In carica (solare)",chargingNone:"Non in carica",wifi:"Wi-Fi",ethernet:"Cavo (Ethernet)",cellular:"Cellulare",linkUnknown:"Non noto"}}},prototype:{today:"Oggi",yesterday:"Ieri",now:"ORA",endOfDay:"FINE GIORNATA",loading:"Caricamento...",timeline:"Timeline",events:"Eventi",playClip:"Riproduci clip",goToNow:"ORA",noEvents:"Nessun evento"},eventKind:{motion:"Movimento",audio:"Audio",person:"Persona",vehicle:"Veicolo",animal:"Animale",package:"Pacco",sensor:"Sensore",control:"Controllo",car:"Auto",truck:"Camion",bus:"Autobus",motorcycle:"Motocicletta",bicycle:"Bicicletta",airplane:"Aereo",boat:"Barca",train:"Treno",bird:"Uccello",cat:"Gatto",dog:"Cane",horse:"Cavallo",sheep:"Pecora",cow:"Mucca",elephant:"Elefante",bear:"Orso",zebra:"Zebra",giraffe:"Giraffa",contact:"Contatto","motion-sensor":"Sensore movimento",smoke:"Fumo",flood:"Allagamento",gas:"Gas","carbon-monoxide":"Monossido di carbonio",vibration:"Vibrazione",tamper:"Manomissione",presence:"Presenza","enum-sensor":"Stato sensore","device-event":"Evento dispositivo",lock:"Serratura",switch:"Interruttore",siren:"Sirena",button:"Pulsante",doorbell:"Campanello","package-delivered":"Pacco consegnato","package-picked-up":"Pacco ritirato","audio-speech":"Voce","audio-music":"Musica","audio-dog":"Cane","audio-doorbell":"Campanello","audio-siren":"Sirena","audio-alarm":"Allarme","audio-animal":"Animale (altro)","audio-bird":"Uccello","audio-cat":"Gatto","audio-crowd":"Folla / Chiacchiericcio","audio-crying":"Pianto / Neonato","audio-door":"Porta","audio-engine":"Motore","audio-fire":"Fuoco / Fumo","audio-footsteps":"Passi","audio-glass_breaking":"Vetro rotto","audio-gunshot":"Sparo / Esplosione","audio-laughter":"Risata","audio-scream":"Urlo","audio-silence":"Silenzio","audio-telephone":"Telefono","audio-tools":"Utensili / Lavori","audio-vehicle":"Veicolo","audio-water":"Acqua","audio-wind":"Vento / Maltempo"}}},2300,[]);
3674
+ __d(function(e,t,a,o,i,n,r){i.exports={devices:{editDevice:"Edit device",originalName:"Original name",customName:"Custom name",customNamePlaceholder:"Leave empty to use original",icon:"Icon",typeLight:"Light",typeSwitch:"Switch",typeCover:"Cover",typeLock:"Lock",typeAlarm:"Alarm",typeButton:"Button",typeSelect:"Select",typeSiren:"Siren",typeSensor:"Sensor",typeEntry:"Entry",typeMediaPlayer:"Media Player",typeScript:"Script",run:"Run",sourceHA:"Home Assistant",sourceScrypted:"Scrypted",off:"Off",on:"On",mute:"Mute",unmute:"Unmute",stop:"Stop",locked:"Locked",unlocked:"Unlocked",open:"Open",closed:"Closed",disarmed:"Disarmed",disarm:"Disarm"},common:{error:"Error",save:"Save",cancel:"Cancel",loading:"Loading...",comingSoon:"Coming soon",back:"Back",fullscreen:"Fullscreen",exitFullscreen:"Exit fullscreen",reset:"Reset",selectAll:"Select all",deselectAll:"Deselect all",delete:"Delete",retry:"Retry"},grids:{newGrid:"New grid",deleteConfirm:"Delete this grid?",noGrids:"No grids yet. Create one to arrange cameras in a mosaic view.",createGrid:"Create grid",cameras:"cameras",notFound:"Grid not found.",noCameras:"No cameras in this grid. Edit the grid to add some.",edit:"Edit",addCamera:"Add camera",presets:"Presets",auto:"Auto",manual:"Manual",gridName:"Grid name",view:"View",addCameraHint:"Add at least one camera from the button above.",allCamerasAdded:"All cameras already in grid",cameraUnavailable:"Camera unavailable",camerasInGrid:"Cameras in grid",addAll:"Add all",addCameras:"Add Cameras",backToGrid:"Back to Grid",timelineNotSupported:"Timeline not supported"},nav:{cameras:"Cameras",grids:"Grids",library:"Library",notifications:"Notifications",events:"Events",videoclips:"Videoclips",list:"List",settings:"Settings"},cameras:{addCamera:"Add camera",pipActive:"PiP active",reorderEnable:"Reorder",reorderDisable:"Unlock",live:"Live",noCameras:"No cameras configured",noIntegrations:"No integrations configured. Add a system to get started.",createSystem:"Create system",importFrom:"Import cameras from",importSuccess:"Import complete",importCount:"{{count}} cameras imported",selectCamerasToImport:"Select cameras to import",selectAll:"Select all",deselectAll:"Deselect all",importSelected:"Import {{count}} selected",noCamerasFound:"No cameras found",play:"\u25b6 Play",paused:"Paused",noDataForDate:"No data for this date",recordingNotAvailable:"Recording not available",noEventsReel:"No recent events",settings:"Settings",highlightMotion:"Motion Highlight",highlightOnMotion:"Highlight on motion",highlightAudio:"Audio Highlight",audioMode:"Mode",audioModeOff:"Off",audioModeSensor:"Sensor",audioModeLevel:"Level",audioPreset:"Audio Preset",audioPresetCustom:"Custom",audioPresetCrying:"Crying / baby",audioPresetAlarm:"Alarm / siren",audioPresetDog:"Dog barking",audioPresetDoorbell:"Doorbell / knock",audioPresetGlass:"Glass break",audioWindow:"Window (s)",audioThreshold:"Threshold (dB)",audioHitPercentage:"Hit (%)",audioHoldSeconds:"Hold (s)",highlightDetection:"Object Detection Highlight",highlightOnDetection:"Highlight on detection",detectionClasses:"Classes",holdSeconds:"Hold (s)",rtspNotSupportedWeb:"RTSP streams are not supported on web. Use the mobile app.",liveDetections:"Live detections",filterTimeline:"Filter timeline",filterClasses:"Filter classes...",filterBySeverity:"Filter by severity",severityAlert:"Alert",severityDetection:"Detection",statusPosition:"Status Indicators Position",today:"Today",yesterday:"Yesterday",timeline:"Timeline",timelineEventsClusterEvents:"Events",selectDate:"Select a date",videoclipsNotSupported:"Videoclips not supported for this camera",noVideoclipsForDate:"No videoclips for this date",endOfList:"End of list",backToLive:"Back to live",goLive:"Go live",loadingClip:"Loading clip...",clusterDetailShowBbox:"Show bounding box on image",clusterDetailOpenVideoclip:"Open videoclip",clusterDetailLoadingEvents:"Loading events...",devices:"Devices",noAssociatedDevices:"No devices linked. Configure in Settings > Cameras.",timelineData:"Timeline data",timelineDataHint:"What to show on the timeline.",timelineDataVideoclips:"Videoclips",timelineDataAdvancedNotifier:"Advanced Notifier",timelineDataEvents:"Events",timelineEvents:"Timeline events",timelineEventsHint:"Which event types to show on the timeline, by severity.",timelinePresetAll:"All",timelinePresetImportant:"Important",timelinePresetCritical:"Critical",timelinePresetCustom:"Custom",statusBlock:"Status Block",sensorsBlock:"Sensors Block",position:"Position",indicators:"Indicators",downloadSnapshot:"Download Snapshot",exportDownloadClip:"Download Clip",exportRecordingWebOnly:"Recording export (web only)",exportSnapshot:"Export Snapshot",intercomError:"Intercom error",multiCam:"Multi-Camera",ptzNotSupported:"PTZ not supported",ptzSelectPreset:"Select PTZ Preset",snapshotFailed:"Snapshot failed"},events:{loading:"Loading events...",filterByLabel:"Filter by label",filterByLabelPlaceholder:"e.g. person, doorbell",filterByCamera:"Filter by camera",date:"Date",detectionTypes:"Detection types",source:"Source",cameras:"Cameras",groupingRange:"Grouping",groupingPresetMinutes:"{{m}} min",groupingCustom:"Custom",groupingCustomMinutes:"Minutes",groupingCustomApply:"Apply",today:"Today",noCamerasFromConfig:"Cameras loaded from EventsApp config",all:"All",typesCount:"{{count}} types",camerasCount:"{{count}} cameras",cols:"cols",sourceAuto:"Auto",sourceNVR:"NVR",sourceFrigate:"Frigate",sourceVideoClips:"VideoClips API",sourceRawDetection:"Raw",sourceAdvancedNotifier:"Advanced Notifier",detectionPerson:"Person",detectionVehicle:"Vehicle",detectionAnimal:"Animal",detectionAudio:"Audio",detectionFace:"Face",detectionPlate:"Plate",detectionPackage:"Package",detectionDoorbell:"Doorbell",detectionSensor:"Sensor",detectionMotion:"Motion",detectionRules:"Rules",noScryptedIntegration:"Add a Scrypted integration in Settings to view events.",frigateNoEvents:"Events are only available for Scrypted. Select a Scrypted instance in Settings.",noSource:"Add a Scrypted or Frigate integration in Settings, then select it as the Events/Videoclips source.",loadError:"Error loading events",noEvents:"No events for this date. Try changing the date or filters.",clearCacheTitle:"Clear cache",clearCacheMessage:"Clear all cached events and videoclips data? This will force a fresh fetch on next load.",clearCacheConfirm:"Clear",columnsPerRow:"Columns per row",onlyWithClips:"Only with clips",relatedClip:"Related Clip"},settings:{integrations:"Integrations",camstackProxy:"CamStack Proxy",scrypted:"Scrypted",frigate:"Frigate",rtsp:"RTSP",homeAssistant:"Home Assistant",name:"Name",baseUrl:"Base URL",urlLocal:"Local URL",urlPublic:"Public URL",username:"Username",password:"Password",token:"Token (optional)",frigateTokenHint:"Token (optional): JWT from browser",tokenRequired:"Token",testConnection:"Test connection",testLocal:"Test Local",testPublic:"Test Public",testMqtt:"Test MQTT",connectionOk:"Connection successful",connectionError:"Connection failed",scryptedCredentialsPromptTitle:"Scrypted login",scryptedCredentialsPromptSubtitle:"Enter your Scrypted username and password to connect.",scryptedCredentialsPromptSkip:"Skip for now",usernamePlaceholder:"admin",save:"Save",tabStream:"Stream & playback",tabGeneral:"General",data:"Data",clearCacheEventsClips:"Clear events & videoclips cache",eventsClipsSourceHint:"Source for Events and Videoclips tabs.",hubReelTitle:"Hub & Reel",reelIntegrationsHint:"Choose which integrations to use for the reel.",reelScryptedSourceHint:"When using Scrypted: event source for reel.",eventsClipsAuto:"Auto",eventsClipsNoInstance:"Add a Scrypted or Frigate integration first.",exportBackup:"Export backup",exportError:"Export failed",importBackup:"Import backup",importConfirm:"This will replace all cameras, integrations and settings with the backup data. Continue?",importSuccess:"Backup restored successfully",importError:"Import failed",uiPrototypes:"UI Prototypes",uiPrototypesHint:"Explore experimental timeline designs",versions:"Versions",appVersion:"App",nativeVersion:"Native",updateNow:"Update now",updateError:"Update failed",updateAvailableTitle:"Update Available",updateAvailableMessage:"A new version of CamStack has been downloaded and is ready to install. The app will restart to apply the update.",updateInstall:"Install & Restart",updateLater:"Later",tabIntegrations:"Integrations",tabCameras:"Camera settings",theme:"Theme",themeSystem:"System",themeLight:"Light",themeDark:"Dark",language:"Language",languageSystem:"System",languageEn:"English",languageIt:"Italiano",timelineMode:"Timeline Mode",timelineModeClassic:"Classic",timelineModeTheater:"Theater",timeline:"Timeline",timelineVisible:"Show detection timeline",timelineVisibleDescription:"Display the detection timeline panel in the camera view.",clusterSize:"Cluster card size",snapshotInterval:"Snapshot refresh interval",clusterSizeXS:"XS",clusterSizeS:"S",clusterSizeM:"M",clusterSizeL:"L",clusterSizeXL:"XL",highlightAppearance:"Highlight appearance",highlightAppearanceHint:"Color and border thickness for motion, audio, and detection highlights on camera streams.",highlightMotion:"Motion",highlightAudio:"Audio",highlightDetection:"Detection",highlightColor:"Color",highlightThickness:"Thickness",selectSection:"Select section",addSystem:"Add system",selectPlatform:"Select platform",deleteInstance:"Delete instance",deleteInstanceConfirm:"Are you sure you want to delete this instance?",delete:"Delete",mqttEvents:"MQTT - Real-time events",mqttBrokerUrl:"MQTT broker URL",mqttUsername:"MQTT username",mqttPassword:"MQTT password",mqttTopicPrefix:"Topic prefix (default: frigate)",mqttOptional:"Optional",scryptedAddressAlreadyUsed:"This Scrypted address is already configured. Only one instance per address is allowed.",scryptedAdvancedNotifierRequired:"The Advanced Notifier plugin is required for the connection.",scryptedCorsTitle:"CORS configuration required (Web)",scryptedCorsBody:"In Scrypted, open the Cloud plugin settings and add your domain ({{domain}}) to the CORS Allowed Origins list. Without this, the browser will block requests to your Scrypted server.",scryptedUrlHint:"Local URL is tried first (e.g. on LAN), then public URL. At least one required.",gridLayout:"Grid layout",gridLayoutHint:"Display options for the cameras grid.",gridColumns:"Grid columns",gridColumnsHint:"Number of cameras per row. Auto = 1 on mobile, 4 on tablet.",gridShowName:"Show camera name",gridShowState:"Show state (battery, recording, sleeping)",reorderCameras:"Reorder cameras",reorderCamerasHint:"Drag to reorder cameras",reorderDone:"Done",manageCameras:"Manage cameras",manageCamerasHint:"Remove cameras from the app.",downloadSnapshot:"Download snapshot",snapshotFailed:"Could not fetch snapshot",exportSnapshot:"Snapshot",exportDownloadClip:"Download clip",exportStartRecording:"Start recording",exportStopRecording:"Stop recording",exportRecordingWebOnly:"Recording available on web",intercomError:"Intercom unavailable. Check camera credentials in Scrypted.",deleteCamera:"Remove camera",deleteCameraConfirm:"Remove {{name}} from the app?",streamPlayback:"Stream & playback",playOnOpen:"Start stream when opening camera",playOnOpenHint:"Automatically load the live stream when you open a camera.",audioOnOpen:"Unmute audio when opening",audioOnOpenHint:"Play audio when opening a camera (if supported).",streamWatchdog:"Stream watchdog",streamWatchdogHint:"Restart stream when no data received (helps with stalled connections).",cameraPlayer:"Camera player",webViewCameraDetail:"Use WebView player",webViewCameraDetailHint:"Use WebView for Scrypted cameras (faster first frame, more stable). PiP, fullscreen and intercom work. Default: native player.",streamQuality:"Stream quality",streamQualitySingle:"Single camera quality",streamQualityGrid:"Grid quality",qualityAuto:"Auto",qualityHigh:"High",qualityMedium:"Mid",qualityLow:"Sub",auto:"Auto",associatedDevices:"Associated devices",associatedDevicesHint:"Add actuators (lights, switches, covers, etc.) to control from the camera view.",linkedDevices:"Linked",reorderHint:"Use arrows to reorder",addDevice:"Add device",noEligibleDevices:"No Scrypted or Home Assistant configured. Add an integration first.",configureDevices:"Configure devices",cameraSettingsHint:"Choose a camera to configure its specific options.",noCamerasConfigured:"No cameras configured.",searchDevices:"Search devices...",source:"Source",type:"Type",all:"All",noMatchingDevices:"No devices match the filters.",frigateStream:"Frigate Stream",frigateStreamSourceHint:"Stream source: WebRTC (default), RTSP, or MJPEG.",frigateStreamMapping:"Stream mapping (go2rtc names from config)",frigateStreamMappingHint:"Select from available go2rtc streams. Order: Main, Sub, Low.",frigateSelectStream:"Select stream",frigateAddStream:"Add stream",frigateInfo:"Camera info",frigateShowConfig:"Show config",frigateShowGo2rtc:"Show go2rtc",frigateMissingConfig:"Missing baseUrl or cameraName in camera config.",tabLogs:"Logs",logsCount:"{{count}} entries",logsDownload:"Download",logsClear:"Clear",logsEmpty:"No logs yet. Console output will appear here.",logsExportError:"Export failed",logsExportTitle:"Export logs",logsClearConfirmTitle:"Clear logs",logsClearConfirmMessage:"Remove all log entries?",hubAppearanceTitle:"Appearance",hubAppearanceDesc:"Theme, language, timeline and highlights",hubCamerasTitle:"Cameras",hubCamerasDesc:"Grid layout, stream quality and camera management",hubIntegrationsTitle:"Integrations",hubIntegrationsDesc:"Manage Scrypted, Frigate and other systems",hubAdvancedTitle:"Advanced",hubAdvancedDesc:"Data backup and cache management",hubLogsTitle:"Logs",hubLogsDesc:"View and export application logs",hubCacheTitle:"Cache",frigateAutoSnap:"Auto Snapshot",frigateSegmentNav:"Segment Navigation",frigateShowGo:"Show Go2RTC",frigateTimeline:"Timeline",reelCameras:"Reel Cameras",reelCamerasHint:"Select which cameras appear in the events reel",reelDeselectAll:"Deselect All",reelDetectionClasses:"Detection Classes",reelDetectionClassesHint:"Filter events by detection class",reelIncludeRuleArtifacts:"Include Rule Artifacts",reelIncludeRuleArtifactsHint:"Show rule-based events in the reel",reelRuleArtifacts:"Rule Artifacts",reelSelectAll:"Select All",reelBadgeContent:"Badge content",reelBadgePosition:"Badge position",reelBadgeSize:"Badge size",reelBadgeBoth:"Time + Class",reelBadgeTime:"Time only",reelBadgeClass:"Class only",reelBadgeNone:"Hidden",reelBadgeSmall:"Small",reelBadgeMedium:"Medium",reelBadgeLarge:"Large"},reel:{filterMotion:"Motion",filterOnlyRules:"Only rules",filterOnlySensors:"Only sensors",goToMostRecent:"Go to most recent"},v2:{common:{connecting:"Connecting\u2026",online:"Online",offline:"Offline",loadError:"Loading error",create:"Create",back:"Back",on:"On",off:"Off",confirm:"Confirm",cancel:"Cancel",ok:"OK",done:"Done"},cameras:{empty:"No cameras",hubNotAnswering:"The hub isn't answering. Some cameras may belong to a node that is currently offline \u2014 pull to retry.",statusOnline:" \xb7 online",statusOffline:" \xb7 offline",motion:"Motion",doorbell:"Doorbell",doorbellRinging:"Ringing",doorbellLastRing:"Ring {{time}} ago",snapshotLoading:"Loading\u2026",refreshing:"Updating\u2026",stationaryFor:"stationary {{min}}m",manage:"Manage cameras",manageHint:"Drag to reorder. Rename inline. Toggle to show or hide a camera from the list.",reorderHandle:"Drag to reorder",appearance:"Appearance",editList:"Edit list",listOptions:"Camera list options",controlsA11y:"Camera controls",disabledTitle:"Out of service",disabledHint:"Disabled by an administrator",emptyOutOfScope:"No cameras in your access profile",emptyOutOfScopeHint:"Your account has no cameras assigned to it yet. Ask whoever administers this hub to grant you access.",snapshotStale:"Snapshot {{age}} old",hubNotProvisioning:"Hub not answering",reelFilter:"Recent events",reelFilterAll:"Showing every event",reelFilterDefaultHint:"Showing detection events only \u2014 audio and sensor events are hidden",reelFilterCount:"{{count}} event types shown",reelFilterUseDefault:"Default",reelFilterShowAll:"Everything",reelFilterDefaultTag:"Detections",reelFilterCountTag:"{{count}} types"},cameraDetail:{fallbackName:"Camera #{{id}}",mute:"Mute",unmute:"Unmute",snapshot:"Snapshot",snapshotFailed:"Could not capture a snapshot.",ptz:"PTZ controls",talk:"Talk",fullscreen:"Fullscreen",talkFailed:"Could not start talk-back. Check microphone access.",pip:"Picture in Picture",exitFullscreen:"Exit fullscreen",devices:"Devices",devicesEmpty:"No connected devices.",linkedModeAuto:"Link: Auto (same location)",linkedModeManual:"Link: Manual",close:"Close",deviceOnline:"Online",deviceOffline:"Offline"},grids:{createA11y:"Create grid",empty:"No grids",emptyHint:"Tap + to create your first grid",countNone:"No cameras",countOne:"1 camera",countOther:"{{count}} cameras",defaultName:"New grid",deleteTitle:"Delete grid",deleteConfirm:"Delete \"{{name}}\"? This cannot be undone.",export:"Export",exportAllA11y:"Export all grids",shareA11y:"Share grid",editA11y:"Edit grid",deleteA11y:"Delete grid",linkCopied:"Grid link copied to clipboard",layoutAuto:"Auto",layoutColumns:"{{count}} cols"},gridView:{editA11y:"Edit grid",fallbackTitle:"Grid",notFound:"Grid not found",emptyGrid:"This grid is empty",addCameras:"Add cameras",reorderTitle:"Reorder cameras",reorderA11y:"Reorder cameras",reorderDoneA11y:"Done reordering",allHidden:"All cameras are hidden. Use reorder mode to show some.",dragA11y:"Drag to reorder",hideA11y:"Hide from grid",showA11y:"Show in grid",removeA11y:"Remove from grid",adhocTitle:"Quick grid",cellActions:"Camera actions",cellActionsA11y:"More actions for this camera",cellDevicesA11y:"Linked devices",cellMenuA11y:"View options"},gridBuilder:{title:"Edit grid",nameLabel:"Name",namePlaceholder:"Grid name",camerasSelected:"Cameras ({{count}} selected)",optionsTitle:"Options",showName:"Show camera name",export:"Export grid",orderSection:"In the grid",orderHint:"Drag to reorder",emptyOrder:"No cameras yet \u2014 add some below.",addSection:"Add cameras",removeA11y:"Remove from grid",addA11y:"Add to grid",highlightMotion:"On motion",highlightAudio:"On audio",highlightAudioOff:"Off",highlightAudioLow:"Low",highlightAudioMid:"Mid",highlightAudioHigh:"High",highlightAudioSensor:"Presence",highlightAudioLevel:"Level",highlightThreshold:"Threshold",highlightHold:"Hold",highlightDetection:"On detection",clusterLabel:"Cluster label",clusterLabelIcon:"Icon",clusterLabelText:"Text"},gridBar:{back:"Back",pauseAll:"Pause all",playAll:"Play all",audio:"Audio",quality:"Stream quality",layout:"Layout",timeline:"Timeline",highlightMenu:"Highlight & overlays",activeOnly:"Active only",share:"Share grid",edit:"Edit grid",hide:"Hide controls",show:"Show controls",muteAll:"Mute all",unmuteAll:"Unmute all"},gridMenu:{highlightMaster:"Highlight borders"},gridShare:{title:"Share \"{{name}}\"",quality:"Stream quality",layout:"Layout",showNames:"Show camera names",activeOnly:"Active cameras only",boxes:"Bounding boxes",highlightEnable:"Highlight",audioSummary:"Audio starts on for {{count}} camera(s)",ttlTitle:"Link expires",ttl_1d:"1 day",ttl_7d:"7 days",ttl_30d:"30 days",ttl_never:"Forever",tokenNotice:"The link includes a view-only access token limited to these cameras. Anyone with the link can watch until it expires or is revoked.",copyLink:"Copy link",creating:"Creating link\u2026",copiedExpires:"Link copied \u2014 expires {{date}}",copiedNever:"Link copied \u2014 never expires",error:"Could not create the share link. Check the connection and try again.",optionAuto:"Auto"},gridControls:{play:"Play",pause:"Pause",mute:"Mute",unmute:"Unmute",quality:"Quality",layout:"Layout",layoutAuto:"Auto"},events:{comingSoon:"Events \u2014 coming soon",searchLabel:"Search label\u2026",searchSubmit:"Search",searchClear:"Clear search",empty:"No events",today:"Today",yesterday:"Yesterday",weekdayShort:{sun:"Sun",mon:"Mon",tue:"Tue",wed:"Wed",thu:"Thu",fri:"Fri",sat:"Sat"},filteredEmpty:"No matches in the loaded range",loadOlder:"Load older",selectPrompt:"Select an event to see its detail",filters:"Filters",more:"More",all:"All",day:"Day",sort:"Sort",sortTime:"Newest",sortImportance:"Importance",flaggedOnly:"Flagged",flaggedOnlyHint:"Favourited, debug, or marked for training",parked:"Parked",showStationary:"Show stationary",showStationaryHint:"Off = hide parked promotions",cameras:"Cameras",classes:"Classes",attributes:"Detected",attrFaces:"Faces",attrPlates:"Plates",attributesHint:"None = all",search:"Search",searchCameras:"Search cameras\u2026",searchClasses:"Search classes\u2026",allCamerasHint:"None = all",allClassesHint:"None = all",done:"Done",density:"Density",selectHint:"Select an event",unrecognizedFace:"Face detected, not recognised",eventKinds:"Event types",displayOptions:"Display",displayTitle:"Display options",useDefaultClasses:"Default"},settings:{themeSystem:"System",themeDark:"Dark",themeLight:"Light",server:"Server",account:"Signed in as",accountUnknown:"Loading\u2026",roleAdmin:"Admin",roleViewer:"Viewer",hubActive:"Active hub",changeServer:"Change server",signOut:"Sign out",network:"Network",networkNone:"No routes probed yet",endpointUnlikely:"Unlikely usable",activeRoute:"Route in use",routeChannelLan:"LAN (direct)",routeChannelPublic:"Public tunnel",routeChannelLoopback:"Local (loopback)",routeChannelUnknown:"Unrecognised",routeReasonInitial:"configured, not yet raced",routeReasonRaceWon:"fastest in the route race",routeReasonNoWinner:"fallback \u2014 no candidate answered",routeReasonUnchanged:"unchanged since the last probe",routeReasonDisposed:"no transport",reprobe:"Re-probe routes",reprobing:"Probing\u2026",diagnoseNetwork:"Diagnose LAN routes",diagnosingNetwork:"Diagnosing\u2026",diagnoseNetworkDone:"{{ok}}/{{total}} answered /health. Open Logs and share them \u2014 look for ipv4/ipv6 http FAIL.",preferredRoute:"Preferred route",routeAuto:"Automatic",routeReasonPinned:"forced in Settings",appearance:"Appearance",theme:"Theme",info:"Info",app:"App",version:"Version",noServer:"No server",footerNote:"CamStack Viewer connects to a single camstack hub. Cameras, grids and events are managed by the server.",language:"Language",langSystem:"System",gridDefaults:"Grid defaults",showName:"Show camera name",showNameHint:"Overlay the camera name on each tile",showState:"Show status badge",showStateHint:"Show online / recording state on each tile",columns:"Columns",cameraOrder:"Camera order",orderName:"By name",orderCustom:"Custom",motionHold:"Motion highlight linger",motionHoldHint:"Keep a tile's motion highlight lit this long after motion stops.",motionHoldOff:"Off",streamQuality:"Stream quality",streamDefaults:"Stream defaults",playOnOpen:"Play on open",playOnOpenHint:"Start the live stream when a camera opens",audioOnOpen:"Audio on open",audioOnOpenHint:"Unmute audio when a camera opens",snapshotInterval:"Snapshot refresh",highlightAppearance:"Highlight appearance",highlightMotionColor:"Motion color",highlightAudioColor:"Audio color",highlightDetectionColor:"Detection color",highlightThickness:"Border thickness",qualityAuto:"Auto",qualityHigh:"High",qualityMid:"Medium",qualityLow:"Low",secondsValue:"{{count}}s",advanced:"Advanced",clearCache:"Clear cache",clearCacheHint:"Free up snapshots and cached data (keeps your server and settings)",clearCacheConfirmTitle:"Clear cache?",clearCacheConfirmBody:"This removes cached images and query data. Your server, sign-in and settings are kept.",clearCacheDone:"Cache cleared",exportSettings:"Export settings",exportSettingsHint:"Copy your settings as JSON",exportSettingsDone:"Settings copied as JSON",shareTitle:"Share settings",shareHint:"Save a named snapshot of this device's settings, grids and camera prefs on the hub. Anyone signed in can import it \u2014 it replaces what is on this device.",shareNamePlaceholder:"Snapshot name",shareSave:"Save",shareEmpty:"No snapshots yet",shareImportTitle:"Import this snapshot?",shareImportBody:"\"{{name}}\" will replace settings, grids and camera prefs on this device.",shareDeleteTitle:"Delete this snapshot?",shareDeleteBody:"\"{{name}}\" will be removed from the hub.",shareFailed:"Could not share settings",shareInvalid:"That snapshot is not a valid settings document.",shareMissing:"That snapshot is no longer on the hub.",viewLogs:"View logs",viewLogsHint:"Recent in-app log messages",logsEmpty:"No logs recorded yet",keepLogs:"Keep logs",keepLogsHint:"Record a rolling buffer of in-app log messages",debugMode:"Debug mode",debugModeHint:"Verbose logs across live, playback and scrub \u2014 sent to the server",logsClear:"Clear",resetSettings:"Reset settings",resetSettingsHint:"Restore all defaults",resetConfirmTitle:"Reset settings?",resetConfirmBody:"This restores all settings to their defaults.",cancel:"Cancel",confirm:"Confirm",timeline:"Timeline",reel:"Event reel",reelThumbSize:"Reel thumbnail size",reelThumbSizeHint:"Size of the tiles in the Recent events reel.",reelSizeSmall:"Small",reelSizeMedium:"Medium",reelSizeLarge:"Large",reelShowLabels:"Show labels",reelShowLabelsHint:"Show the class/identity label on reel items.",reelLabelStyle:"Class display",reelLabelStyleHint:"Show the detection class as an icon or as text on reel items.",reelShowImportance:"Show importance",reelShowImportanceHint:"Show the importance badge on reel items.",events:"Events",eventsPage:"Events page",minImportance:"Minimum importance",minImportanceHint:"Hide events scored below this across the events page and the camera timeline.",minImportanceOff:"Off",tileShowLabels:"Show labels",tileShowLabelsHint:"Show the class / identity / audio labels on event cards.",tileShowImportance:"Show importance",tileShowImportanceHint:"Show the importance badge on event cards (when scored).",tileShowCameraName:"Show camera name",tileShowCameraNameHint:"Show the camera name in the event card footer.",tileLabelStyle:"Class display",tileLabelStyleHint:"Show the detection class as an icon or as text.",tileLabelStyleIcon:"Icon",tileLabelStyleText:"Text",comingSoon:"Coming soon",cameras:"Cameras",manageCameras:"Manage cameras",manageCamerasHint:"Rename, hide, reorder",notifications:"Notifications",notificationsManage:"Manage notifications",pinchExpandsHeight:"Pinch enlarges the view",pinchExpandsHeightHint:"Pinching to zoom also grows the video taller (crops the side edges on 16:9 cameras).",navBarOnStream:"Navigation bar on a single camera",navBarOnStreamHint:"Keep the main navigation visible while watching one camera. On wide windows the side navigation is already there.",reopenLastCamera:"Reopen the last camera",reopenLastCameraHint:"Start on the camera you were watching. Only if watching it was the last thing you did \u2014 going to another page clears it.","timeline.gapPercent":"Cluster gap (%)","timeline.sizePercent":"Cluster size (%)","timeline.indicatorPositionPct":"Indicator position (%)","timeline.showImportance":"Show importance on items","timeline.showClass":"Show detection class on items","timeline.cardWidthPct":"Card width (%)",haptics:"Vibration",hapticsUiFeedback:"Vibrate on press",hapticsUiFeedbackHint:"A short buzz confirms buttons, switches, PTZ and player controls. Native only (iOS/Android).",hapticsEnabled:"Vibrate on events",hapticsEnabledHint:"Small vibration pulses for key events on the camera you're watching. Native only (iOS/Android).",hapticsMotion:"Motion",hapticsDetection:"Detection",hapticsPerson:"Person / recognized",buildNumber:"Build",runtimeVersion:"Runtime",runningBundle:"Running bundle",checkUpdates:"Check for updates",checkingUpdates:"Checking\u2026",updateUpToDate:"You're on the latest version.",updatesDisabled:"Updates are disabled in this build.",updateReadyTitle:"Update downloaded",updateReadyBody:"Restart the app now to apply it?",updateCheckFailed:"Could not check for updates",listOverlays:"Camera cards",listMotionBorder:"Motion ring",listMotionBorderHint:"Pulse a ring around a card while the camera sees motion.",listMotionBadge:"Motion badge position",listOccupancy:"Occupancy position",useNativeRenderer:"Use the built-in renderer",useNativeRendererHint:"Render Recent and Events inside the app instead of loading the hub-hosted embed.",toolbarDensity:"Toolbar height","toolbarDensity.small":"Small","toolbarDensity.medium":"Medium","toolbarDensity.large":"Large"},nc:{title:"Notifications",tabs:{rules:"Rules",targets:"Targets",snooze:"Snooze"},rulesPlaceholder:"Notification rules will appear here.",targetsPlaceholder:"Delivery targets will appear here.",rules:{add:"New rule",empty:"No rules yet.",loadError:"Couldn't load rules. Pull to retry.",mine:"My rules",admin:"Admin rules",system:"System events",personalBadge:"Personal",adminBadge:"Admin",edit:"Edit",delete:"Delete",cancel:"Cancel",deleteConfirmTitle:"Delete rule",deleteConfirmMessage:"Delete \"{{name}}\"? This can't be undone.",receiveOn:"Receive on {{name}}",noOwnedTargets:"This rule doesn't deliver to any of your targets.",section:{all:"All",detection:"Detections",occupancy:"Occupancy",audio:"Sound",empty:{all:"No rules yet. Create one to be told what your cameras see.",detection:"No detection rules yet. Create one to be told what your cameras see.",occupancy:"No occupancy rules yet. A new one opens on the occupancy condition \u2014 pick the camera first, then the zone and the count.",audio:"No sound rules yet. A new one opens with a level threshold already set, so you only have to name the sounds and the targets.",timelapse:"No timelapses yet. A timelapse turns a night of recorded footage into a short video and sends it when the window closes \u2014 pick the cameras and the hours.",summary:"No summaries yet. A summary collects the best shot of everything that passed in front of several cameras and sends one image."},create:{detection:"New detection rule",occupancy:"New occupancy rule",audio:"New sound rule",timelapse:"New timelapse",summary:"New summary"},timelapse:"Timelapse",summary:"Summary"},mediaBadge:{attach:{"best-matching":"Matching image",keyFrame:"Key frame",none:"No image"},frame:{full:"Whole scene",boxed:"Boxed scene"},zoneCrop:"Zone crop",gif:"GIF",clip:"Clip",profile:"{{profile}} quality"},editor:{createTitle:"New rule",editTitle:"Edit \"{{name}}\"",basics:"Basics",nameLabel:"Name",namePlaceholder:"e.g. Front door people",triggerLabel:"Trigger",priorityLabel:"Priority",targetsLabel:"Deliver to",noTargets:"You have no targets yet. Add one under the Targets tab first.",pickTarget:"Pick at least one target.",conditionsLabel:"Conditions",section:{rule:"Rule",devices:"Cameras",conditions:"Conditions",notification:"Notification",advanced:"Advanced"},kindSection:{detection:"Conditions",sensor:"Conditions",occupancy:"Occupancy",sound:"Sound",system:"Events"},kindBlurb:{sensor:"A doorbell press or a linked sensor changing state. The picture comes from the camera the sensor is attributed to.",occupancy:"Fires when the count in a camera frame or a zone crosses your threshold and holds. Pick the camera first \u2014 the zone list is that camera's.",sound:"Fires on a confirmed window of audio, never on a picture. Name the sounds and/or keep a level threshold \u2014 with neither it can never match.",system:"The installation itself: a camera or stream dropping, a node leaving, an update landing. There is no detection behind it and no frame to attach."},dropTitle:"These will be removed when you save",dropHint:"This kind of rule can't use them, so keeping them would leave the rule silent.",condition:{systemEvent:"System event",sensorKinds:"Sensor kinds",eventTypeTokens:"Event-type tokens",source:"Detection source",classes:"Object classes",classesExclude:"Excluded classes",minConfidence:"Minimum confidence",zones:"Zones",zonesExclude:"Excluded zones",customZones:"Custom zones",crossing:"Zone crossing",labelEquals:"Label equals",identities:"Known faces",identitiesExclude:"Excluded faces",plates:"Known plates"},moreConditionsLabel:"More conditions",showAdvanced:"Show advanced",noConditions:"No conditions available.",notForTrigger:"Not for this trigger",notForTriggerHint:"Not evaluated for the selected trigger \u2014 switch the trigger to use it.",mediaLabel:"Media",attachLabel:"Attachment",frameLabel:"Picture shows",frame:{cropped:"The subject",full:"The whole scene",boxed:"The scene, with boxes"},zoneCropLabel:"Crop to the zone",zoneCropHint:"Crop the picture to the rule's zone instead of the subject or the whole scene.",gifLabel:"Attach a GIF",gifHint:"A short animation cut from the live buffer around the moment \u2014 the camera does not have to be recording.",clipLabel:"Attach a video clip",clipHint:"An MP4 of the same cut. Destinations that take no video still get the picture.",preRollLabel:"Seconds before",postRollLabel:"Seconds after",profileLabel:"Footage quality",profile:{auto:"Automatic",high:"High",mid:"Medium",low:"Low"},templateLabel:"Message (optional)",templateTitleLabel:"Title",templateBodyLabel:"Body",templatePlaceholder:"Supports {{var}} placeholders",save:"Save changes",create:"Create rule",addValue:"Add value\u2026",removeTag:"Remove {{value}}",clear:"Clear",noCameras:"No cameras available \u2014 the rule applies to all devices.",plateText:"Plate text\u2026",maxDistance:"Max distance",waitForEnhancementLabel:"Wait for recognition",waitForEnhancementHint:"On: one notification at the end of the track, with the name. Off: one straight away without the name, plus a second one if the name arrives before the track ends.",recognition:{noIdentities:"No people saved yet. Add one from an event's face.",unknownIdentities:"Selected but not in the gallery (a deleted person, or an old rule saved by name). Remove what no longer applies.",identities:{off:"Anyone",anyKnown:"Known",specific:"These people",offHint:"The rule does not care who it is \u2014 someone unrecognised matches too.",anyKnownHint:"Only people saved in the gallery, whoever they are. A stranger does not match.",specificHint:"Only the people selected here. Matched on the saved person, so renaming them does not break the rule."},plates:{off:"Any vehicle",anyKnown:"Any plate",specific:"These plates",offHint:"The rule does not care about the plate \u2014 a vehicle whose plate could not be read matches too.",anyKnownHint:"Only vehicles whose plate was actually read, whatever it said.",specificHint:"Only these plates, matched tolerantly \u2014 plate reading is never perfect."}},customZones:{empty:"No custom zones yet. Pick a camera and draw one.",pickCamera:"Camera to draw over",noCameras:"No online cameras to draw over.",draw:"Draw zone",zoneLabel:"Zone {{index}} ({{count}} pts)",remove:"Remove zone {{index}}",title:"Draw zone \u2014 {{name}}",hint:"Tap to add points, drag a point to move. Tap the first point to close.",loading:"Loading frame\u2026",cancel:"Cancel",clear:"Clear",close:"Close",confirm:"Confirm"},addWindow:"Add window",scheduleAlways:"Always active \u2014 add a window to restrict when the rule fires.",scheduleInvert:"Active outside the windows",delivery:{immediate:"Immediate",trackEnd:"Track end",deviceEvent:"Device event",packageEvent:"Package event",systemEvent:"System event"},systemKinds:{"device-online":"Device online","device-offline":"Device offline","device-disabled":"Device switched off","device-enabled":"Device switched on","camera-online":"Camera online","camera-offline":"Camera offline","camera-disabled":"Camera switched off","camera-enabled":"Camera switched on","stream-online":"Stream online","stream-offline":"Stream offline","node-online":"Node online","node-offline":"Node offline","node-inference-unavailable":"Node has no usable inference device","detection-blind":"Camera detecting nothing","addon-crash-loop":"Addon crash loop (runner gave up)","alarm-arm-refused":"Alarm arming refused","alarm-arming":"Alarm arming","alarm-triggered":"Alarm triggered","alarm-armed":"Alarm armed","alarm-disarmed":"Alarm disarmed","addon-update-available":"Addon update available","server-update-available":"Server update available","addon-updated":"Addons updated","server-updated":"Server updated","export-completed":"Export completed","device-battery-low":"Battery low","device-battery-normal":"Battery recovered"},systemFilters:{cameras:"Only these cameras (optional)",deviceTypes:"Only these device types (optional)",nodes:"Only these node IDs (optional)",packages:"Only these addon packages (optional)",addNode:"Add node ID\u2026",addPackage:"Add package name\u2026"},media:{best:"Best image",bestMatching:"Best matching",keyFrame:"Key frame",none:"No attachment"},source:{any:"Any",pipeline:"Pipeline",onboard:"Onboard",sensor:"Sensor",audio:"Audio"},phase:{delivered:"Delivered","picked-up":"Picked up",both:"Both"},zoneMatch:{any:"Any of",all:"All of"},group:{scope:"Scope",class:"Classes",zones:"Zones",quality:"Quality",label:"Identity & plates",device:"Device event",package:"Package",system:"System events",schedule:"Schedule",occupancy:"Occupancy",audio:"Sound"},taxonomy:{person:"People",vehicle:"Vehicles",animal:"Animals",audio:"Audio",sensor:"Sensors",control:"Controls",custom:"Custom values",addCustom:"Add a custom value\u2026"},weekday:{mon:"Mon",tue:"Tue",wed:"Wed",thu:"Thu",fri:"Fri",sat:"Sat",sun:"Sun"},crossing:{unset:"Entering",exit:"Leaving",any:"Either"},deviceStateNone:"Not set \u2014 this rule is never gated on another device.",deviceStateSet:"Only while device {{deviceId}} is: {{states}}. Change it from the admin UI \u2014 this app cannot list every device.",sceneGateNone:"Not set \u2014 this rule is never gated on a scene.",sceneGateSet:"Only while scene {{sceneId}} is {{state}}, reading {{read}}. Pick the scene from the admin UI \u2014 this app cannot list them.",sceneReadDefault:"whichever boolean the scene itself uses",sceneReadLatched:"the latch (since it was armed)",sceneReadLive:"the live verdict",sceneState:{matched:"matched (as captured)",diverged:"diverged (changed)"},occupancy:{zoneLabel:"Zone",wholeFrame:"\u2014 whole frame \u2014",zonesLoading:"Loading zones\u2026",zonesNeedCamera:"Pick the cameras above to choose one of their zones.",zonesNone:"These cameras have no zones \u2014 the count covers the whole frame.",zoneMissing:"Zone \"{{id}}\" no longer exists on these cameras. The rule still stores it and will never fire until you pick another scope.",classLabel:"Class",anyClass:"\u2014 any class \u2014",classesNone:"The hub sent no class vocabulary \u2014 the count covers every class.",classMissing:"\"{{name}}\" is not a class these cameras report. The rule still stores it and will never fire until you pick another one.",opLabel:"Fires when",op:{"became-occupied":"Became occupied","became-free":"Became free",">=":"Count \u2265","<=":"Count \u2264"},thresholdLabel:"Threshold",countLabel:"Count",sustainLabel:"Hold for (seconds)",sustainInstantHint:"A 0-second hold fires on the very first frame that crosses \u2014 expect repeat notifications from a subject that walks the edge of the zone. 15 seconds is the usual choice.",hint:"Counts confirmed tracked objects from zone analytics. The change must hold for the whole window before it fires; with no snapshot for the camera or zone the rule never fires.",classesDropped:"The class filter ({{classes}}) is dropped on save: an occupancy edge carries one class, so it would only stop this rule from ever firing. Scope the class above instead."},audio:{modeLabel:"How it fires",modeLabelOption:"\ud83d\udd0e Sounds",modeLevelOption:"\ud83d\udcc8 Volume",modeLabelHint:"Fires when enough labelled frames land inside a short window (default 2 in 5 seconds). A single-frame false positive never reaches 2; a real episode usually labels two or three frames. The rule's cooldown is the other throttle.",modeLevelHint:"Fires when the sound stays loud enough for long enough: the window below is the whole condition.",labelsLabel:"Sounds",labelsHint:"Pick at least one. The classifier labels only a frame or two per episode, so a percentage of a window could never confirm them \u2014 this mode counts those frames instead.",confirmHitsLabel:"Confirm after (frames)",confirmHitsHint:"How many labelled frames must land inside the window before a notification is sent. Default 2 \u2014 a single-frame false positive never reaches it.",confirmWindowLabel:"within (seconds)",confirmWindowHint:"The window those frames must share. Default 5 s. Two frames six seconds apart do not confirm.",labelsUnknown:"This rule stores {{labels}}, which this hub does not classify. It is kept as-is; tap it to drop it.",dbLabel:"Louder than (dBFS)",dbHint:"dBFS is negative-going: 0 is full scale, \u221296 is silence \u2014 so a HIGHER number is a NARROWER filter. Measured on this hub, a baby crying reads \u221255 to \u221226 dBFS, so a floor above \u221255 excludes most of it.",hitPercentLabel:"Hits in the window (%)",hitPercentHint:"How much of the window must match before it fires. Default 60%.",samplingLabel:"Window (seconds)",samplingHint:"The window must be FULL before it can match \u2014 a half-open window never fires. Default 10s.",failClosedHint:"Pick at least one sound or set a level floor. With neither, every sample is a hit and the hub refuses the rule rather than notifying on silence.",hint:"Fires on sustained SOUND, not on a picture: a rule with this condition is evaluated only on a confirmed audio window, never on a detection or a track. The cameras it covers need audio analysis enabled."},zonePicker:{needCamera:"Select a camera first \u2014 zones belong to a camera.",loading:"Loading zones\u2026",none:"The selected cameras have no zones.",missing:"Zone {{id}} no longer exists on the selected cameras"},dropReason:{occupancy:{sensorKinds:"An occupancy edge is not a sensor event: it carries no sensor kind, so this condition can never match one.",eventTypeTokens:"An occupancy edge carries no device event-type token \u2014 that comes from an event emitter, which a count crossing has none of.",source:"An occupancy edge is always produced by the pipeline, so any other source can never match and \u201cpipeline\u201d narrows nothing."},sound:{classes:"A sound rule fires on what the camera HEARD. Its subject carries no detection, so this condition can never match one \u2014 name the sounds in the Sound condition instead.",classesExclude:"A sound rule fires on what the camera HEARD. Its subject carries no detection, so there is nothing here to exclude \u2014 name the sounds in the Sound condition instead.",minConfidence:"A sound window\u2019s evidence is a percentage of samples, not a detector score, so a confidence threshold can never be satisfied.",zones:"A sound has no position in the frame, so a zone can never match it.",zonesExclude:"A sound has no position in the frame, so a zone can never exclude it.",customZones:"A sound has no position in the frame, so a drawn area can never match it.",crossing:"A sound has no position in the frame, so it can never cross a zone boundary.",labelEquals:"A sound rule fires on what the camera HEARD. Its subject carries no detection and therefore no label \u2014 name the sounds in the Sound condition instead.",identities:"A sound rule fires on what the camera HEARD. Its subject carries no detection, so there is no face to recognise.",identitiesExclude:"A sound rule fires on what the camera HEARD. Its subject carries no detection, so there is no face to exclude.",plates:"A sound rule fires on what the camera HEARD. Its subject carries no detection, so there is no plate to read.",source:"A confirmed sound window is always stamped as an audio subject, so any other source can never match."}},ai:{sectionLabel:"AI description",enabledLabel:"Describe with AI",enabledHint:"Adds one sentence written by a vision model to this notification. It never withholds the notification \u2014 if the model is cold or unreachable, the alert is delivered without the sentence.",blurb:{occupancy:"The model is shown the still and told the count this rule claims, and answers whether that count holds. Your question guides what it looks at; the verdict sentence is written by the hub, so a disagreement always says so.","detection-immediate":"The model is shown the still taken at the moment this rule fired and answers your question about it.","detection-track":"The model is shown the beginning, the best moment and the end of the passage, and answers your question about what happened across them."},profileLabel:"Model",profileAuto:"Automatic",noProfiles:"No vision-capable model is configured on this hub. Add one from the admin Settings before switching this on.",profilesUnavailable:"This hub cannot list its vision models. The section still saves; the hub picks its own default model.",languageLabel:"Answer language",languageAuto:"Hub default",language:{en:"English",it:"Italian"},maxWordsLabel:"Length",maxWordsHint:"About how many words to ask for. It is an instruction to the model, not a cut \u2014 expect roughly this length, occasionally a word or two over. Unset, this rule's targets give {{words}}.",maxWordsVaries:"About how many words to ask for. It is an instruction to the model, not a cut. Your targets do not agree on a default; the strictest of them gives {{words}}, and unset each target gets its own.",promptLabel:"Your question",occupancyContract:"The answer stays a verdict: the hub asks for the count, compares it with this rule's, and writes the confirmation or the refutation itself. Your question guides the model \u2014 it cannot change the answer's format."}}},targets:{add:"Add target",empty:"No targets yet. Add one to start receiving notifications.",loadError:"Couldn't load your targets. Pull to retry.",pickKind:"Choose a notification kind",noKinds:"No notification kinds are available.",kindUnavailable:"unavailable",test:"Send test",testing:"Sending\u2026",testOk:"Test delivered",testFail:"Test failed",edit:"Edit",delete:"Delete",cancel:"Cancel",save:"Save changes",create:"Create target",addTitle:"Add {{kind}} target",editTitle:"Edit {{name}}",deleteConfirmTitle:"Delete target",deleteConfirmMessage:"Delete \"{{name}}\"? This can't be undone.",form:{details:"Details",config:"Configuration",nameLabel:"Name",nameHint:"A label to recognize this target.",secretHint:"Leave blank to keep the saved value."}},snooze:{title:"Snooze",intro:"A snooze silences YOU, not the household \u2014 unless a rule says otherwise. It ends by itself.",activeNone:"Nothing is snoozed.",active:"Silenced now",past:"Recently ended",openTitle:"Silence for",scopeLabel:"What to silence",everything:"Everything",aRule:"One rule",aCamera:"One camera",chooseRule:"Choose a rule",chooseCamera:"Choose a camera",camerasLoading:"Loading your cameras\u2026",noCameras:"No cameras to silence.",globalLabel:"Silence it for everyone",globalHelp:"Other people stop being notified too.",globalNotAllowed:"This rule can only be silenced for you.",summaryLabel:"Tell me what I missed",summaryHelp:"A summary arrives when the window ends.",endNow:"End now",endsIn:"ends in {{label}}",everyone:"for everyone",loadError:"Couldn't load your snoozes.",createError:"Couldn't start that snooze.",classesTitle:"Only these",classesHelp:"Leave this alone and the window covers everything. Pick classes to silence only those \u2014 the rest still reaches you.",everyClass:"Everything",durations:{m10:"10 min",m30:"30 min",h1:"1 hour"},scope:{rule:"One rule",device:"One camera",all:"Everything"},remaining:{ended:"over",minutes:"{{minutes}} min",hours:"{{hours}}h",hoursMinutes:"{{hours}}h {{minutes}}m"},viewOnly:"Your account can see snoozes but not open one."},timelapse:{createTitle:"New timelapse",editTitle:"Edit \u201c{{name}}\u201d",namePlaceholder:"Driveway overnight",enabledLabel:"Active",camerasHint:"One video per camera. A camera that is not recording cannot produce a timelapse \u2014 the hub refuses the save and says which one.",windowLabel:"Window",windowHint:"The hours this covers. The window is the rule: it starts collecting when the window opens and sends the video when it closes.",samplingLabel:"Sampling",cadenceLabel:"One frame every (s)",framerateLabel:"Playback (fps)",denseHint:"Around detections the hub samples faster on its own. Set that rate by hand in the web admin if you need to.",previewHint:"What the notification shows before you open the video.",preview:{image:"Still",gif:"GIF"},problem:{devices:"Pick at least one camera.",schedule:"Add at least one window \u2014 a timelapse with no hours never runs."}},summary:{createTitle:"New summary",editTitle:"Edit \u201c{{name}}\u201d",namePlaceholder:"Overnight round-up",enabledLabel:"Active",camerasHint:"One image covering all of them \u2014 the best shot of everything that passed.",windowLabel:"Window",window:{motion:"On motion",schedule:"On a schedule"},motionHint:"Opens on the first movement at any of these cameras and stays open while more keeps arriving.",scheduleHint:"Fixed hours. The summary is sent when the window closes.",quietLabel:"Close after quiet (s)",maxWindowLabel:"Never longer than (s)",advancedHint:"How many pictures go in, how they are chosen and what the AI is asked are set in the web admin.",hubTooOld:"This hub only lets an administrator create summaries. You can see them here; update the hub to edit them from the app.",problem:{devices:"Pick at least one camera.",window:"Check the window \u2014 a scheduled summary needs hours, and \u201cnever longer than\u201d has to be greater than the quiet period."}},family:{cameras_one:"{{count}} camera",cameras_other:"{{count}} cameras",never:"Nothing sent yet.",last:"Last sent {{when}}.",off:"Switched off \u2014 it will not run.",readOnly:"Created by an administrator. You can see it here but not change it."}},login:{loginFailed:"Login failed",verifyFailed:"Verification failed",serverUrl:"Server URL",username:"Username",password:"Password",showPassword:"Show password",hidePassword:"Hide password",signIn:"Sign in",signingIn:"Signing in\u2026",twoFactor:"Two-factor authentication",totpHint:"Enter the 6-digit code from your authenticator app to sign in as ",verificationCode:"Verification code",verifyAndSignIn:"Verify and sign in",verifying:"Verifying\u2026",back:"Back",or:"or",signInWithCamStack:"Sign in with CamStack",hubSignInHint:"Opens your hub\u2019s login page and links this app without typing your password here.",handoffFailed:"Sign-in with CamStack failed \u2014 try again or use username and password",invalidServerUrl:"Enter a valid server URL (https://\u2026) first"},live:{webUnsupported:"Live view is not available on the web version yet.",connecting:"Connecting to live stream\u2026",error:"Unable to load the live stream.",retry:"Retry",noConnection:"No connection to the server",failed:"Connection failed",errorPageLoad:"The player page failed to load."},ptz:{title:"PTZ",notAvailable:"PTZ controls are not available for this camera.",zoom:"Zoom",home:"Home position",presets:"Presets",noPresets:"No presets saved."},navigation:{title:"Navigation",notAvailable:"Navigation controls are not available for this device.",drive:"Drive",forward:"Forward",left:"Turn left",right:"Turn right",turnAround:"Turn around",stop:"Stop",actions:"Actions",sounds:"Sounds",light:"Fill light",lightOn:"Light on",lightOff:"Light off",auto:"Auto",manual:"Manual",levelUp:"Brighter",levelDown:"Dimmer",following:"following",joystick:"Drive joystick",joystickHint:"Drag to drive the robot; release to stop.",followMe:"Follow me",returnToDock:"Return to dock",moreControls:"More controls",mode:{idle:"Idle",cleaning:"Cleaning",spot:"Spot cleaning",following:"Following",goto:"Going to point",returning:"Returning to dock",paused:"Paused",unknown:"Unknown"}},timeline:{activityTitle:"Activity",last24h:"Last 24h",loading:"Loading activity\u2026",noActivity:"No activity in the last 24 hours.",legendRecording:"Recorded",legendMotion:"Motion",legendAudio:"Audio",showTimeline:"Show timeline",hideTimeline:"Hide timeline",faultStream:"The video stream is unavailable.",faultRecordings:"Couldn't load the recordings for this day.",faultEvents:"Couldn't load this day's events.",faultDismiss:"Dismiss",loadRetry:"Retry",loadRetrying:"Retrying\u2026",moreHistory:"There is older history not shown yet.",scopeUnreadable_one:"One camera in this view could not be read \u2014 its events and footage are missing here.",scopeUnreadable_other:"{{count}} cameras in this view could not be read \u2014 their events and footage are missing here.",scopeOverflow_one:"This view has one camera more than the timeline can read at once.",scopeOverflow_other:"This view has {{count}} cameras more than the timeline can read at once.",scopeUnreadableAndOverflow:"{{unreadable}} cameras could not be read and {{overflow}} more than the timeline can read at once are not shown.",loadMoreHistory:"Load more",loadingMoreHistory:"Loading\u2026"},theater:{back:"Back",today:"Today",yesterday:"Yesterday",prevDay:"Previous day",nextDay:"Next day",selectDate:"Pick a date",live:"LIVE",now:"NOW",auto:"Auto",quality:"Stream quality",filterAll:"All",filter_motion:"Motion",filter_audio:"Audio",goToLive:"Go to live",liveLockOn:"Live lock on \u2014 browsing keeps the picture live",liveLockOff:"Live lock off \u2014 browsing plays the recording",recordLive:"Record live",keepClip:"Keep the recording",keepClipTitle:"Keep this clip?",discardClip:"Discard",saveToGallery:"Save to Photos",shareClip:"Share",recordFailed:"Could not record the live view",noRecording:"No recording",noRecordingHint:"No footage at this time",detailCount:"{{frames}} frames \xb7 {{count}} detections",detailTracks:"{{tracks}} tracks \xb7 {{count}} detections",detailEmpty:"No detail images for this moment",detailSeek:"Go to this moment",zoneHint:"Drag a rectangle over the video to filter events by zone",zoneConfirm:"Confirm",zoneCancel:"Cancel",playbackBar:"Playback controls",footerBar:"Timeline tools",filterTitle:"Filters",zoomRange:"Time range",zoomSpanMinutes:"{{count}}m",zoomSpanHours:"{{count}}h",zoneFilter:"Zone filter",detailSubjects_one:"{{count}} subject",detailSubjects_other:"{{count}} subjects",zoneModeRect:"Rectangle",zoneModePolygon:"Polygon",zoneClearPoints:"Clear",zoneHintPolygon:"Tap to add points \u2014 3 or more",selectTime:"Time",goSameTime:"Go \u2014 same time of day",recordingDaysFailed:"Couldn't read which days have recordings.",recordingDaysPartial:"Some cameras in this view could not be read \u2014 days without a dot may still have footage on them.",clusterOpenDetail:"Open event detail",clusterCarouselShow:"Open the cluster carousel",clusterCarouselHide:"Close the cluster carousel",clusterPrevImage:"Previous image",clusterNextImage:"Next image",clusterCameras_one:"{{count}} camera",clusterCameras_other:"{{count}} cameras",clipStartsAtSubjectAt:"Clip starts at {{start}}, subject at {{subject}}",clipEndsAt:"Clip ends at {{end}}",legend:{open:"Heatmap and timeline legend",title:"Legend",heatmapTitle:"24-hour heatmap",heatmapRecordingTitle:"Recording",heatmapRecordingBody:"Red hairline along the top of the tape \u2014 coverage for that stretch of the day.",heatmapAudioTitle:"Audio",heatmapAudioBody:"Peaks hanging from the top. Quiet is green, loud is red \u2014 the same six rungs as the live meter.",heatmapBottomTitle:"Motion and detections",heatmapBottomBody:"The bottom of each slot fills with green motion, or with the prominent object class when a detection is in that slot.",timelineTitle:"Activity column",timelineRecordingTitle:"Recording",timelineRecordingBody:"Continuous red line on the far right.",timelineMotionTitle:"Motion",timelineMotionBody:"Green line down the centre.",timelineDetectionTitle:"Object detection",timelineDetectionBody:"Dot sitting on the motion line, coloured as the prominent class at that moment.",timelineAudioTitle:"Audio level",timelineAudioBody:"Line on the far left. Same green-to-red scale as the heatmap and the live meter.",classesTitle:"Detection classes",classPerson:"Person",classPersonBody:"People and faces.",classVehicle:"Vehicle",classVehicleBody:"Cars, trucks, bikes and the rest of the vehicle family.",classAnimal:"Animal",classAnimalBody:"Dogs, cats, birds and other animals."}},mediaKind:{crop:"Object crop",thumbnail:"Best shot",faceCrop:"Face",plateCrop:"Plate",fullFrame:"Frame",fullFrameBoxed:"Boxed",keyFrame:"Key frame",firstFrame:"First",lastFrame:"Last",snapshot:"Snapshot"},tracks:{crop:"Crop",fullFrame:"Full frame",bestShot:"Best shot",media:"Media",noMedia:"No media stored for this track",mediaLoadError:"Media could not be loaded",mediaEntryLoading:"Loading this media\u2026",mediaEntryError:"This media is indexed but could not be read",mediaEntryAbsent:"Not stored for this track",path:"Path",pathSummary:"{{count}} points \xb7 {{seconds}}s",pathNoLocalization:"no precise position",share:"Share",copyLink:"Copy link",linkCopied:"Link copied",shareImage:"Share image",viewFullRes:"Full resolution",fullResBadge:"Full",zones:"Zones",audio:"Audio",prevTrack:"Previous event",nextTrack:"Next event",reason:"Why notable",empty:"No tracks",recent:"Recent",searchPlaceholder:"Search events (e.g. \"person in red\")",searchSubmit:"Search",searchClear:"Clear search",noMatches:"No matching events",person:"Person",assignPerson:"Assign to person",changePerson:"Change",notAssigned:"Not assigned",matchConfidence:"Match confidence",suggested:"Suggested",suggestedUnknown:"Suggested person",suggestedConfirm:"Confirm",suggestedDismiss:"Dismiss",assignFaceTitle:"Assign face",newPersonPlaceholder:"New person name\u2026",createAndAssign:"Create & assign",assignFailed:"Couldn't assign the face",removePerson:"Remove person",removePersonConfirmTitle:"Remove person?",removePersonConfirmBody:"This unlinks the person from this face. The face returns to the unassigned buffer and can be reassigned later.",disassociateFailed:"Couldn't remove the person",removePersonAll:"Remove from all events",removePersonAllConfirmTitle:"Remove from all events?",removePersonAllConfirmBody:"This unlinks this person from EVERY event. All faces currently recognized as this person return to the unassigned buffer and can be reassigned later. The person is kept.",disassociateAllFailed:"Couldn't remove the person from all events",existingPersons:"People",noPersons:"No people yet",metadata:"Metadata",markForTraining:"Mark for training",markForTrainingHint:"Keeps this track and its media past retention",debugFlag:"Debug",debugFlagHint:"Flag this track for diagnostic attention. Hold to edit what should be checked.",debugNotePromptTitle:"What should we check?",debugNotePromptBody:"Describe what looks wrong on this event, in your own words. It stays on the track, so whoever reviews the debug set reads the question with it.",debugNotePlaceholder:"e.g. the box jumps to the fence when the car passes",debugPreset:{lateStart:"Track started late",betterShotExisted:"Best shot: a better frame existed (face/plate)",lastFrameBeforeFirst:"Last frame before the first",riderNotInKeyframe:"Two-wheeler: rider not in the keyframe",twoSubjectsOneTrack:"Two subjects in one track",brokenTrack:"Track broke into pieces",edgeCropMirror:"Edge crop came out mirrored",noCrop:"No crop of the subject",neverDetected:"Subject never detected",falsePositive:"Nothing was there"},debugReviewed:"Analyzed",debugReviewedHint:"Mark this debug track as analyzed so it drops out of the debug filter and export",favourited:"Favourited",favouritedHint:"Keeps this track and its media past retention",copy:"Copy",copied:"Copied","meta.trackId":"Track ID","meta.eventId":"Best event ID","meta.deviceId":"Device ID","meta.camera":"Camera","meta.className":"Class","meta.label":"Label","meta.firstSeen":"First seen","meta.lastSeen":"Last seen","meta.state":"State","meta.importance":"Importance","meta.confidence":"Confidence","meta.mediaKeys":"Media keys",rescore:{button:"Recompute matches",failed:"Couldn't recompute the matches",params:"Threshold {{threshold}} \xb7 margin {{margin}}",needsSamples:"{{count}} samples \u2014 needs {{min}}",reembed:"Re-embed this face and retry",reembedFailed:"Re-embed failed: {{reason}}",verdict:{"auto-assignable":"Would be assigned to {{name}}",ambiguous:"Two people score too close to call \u2014 the margin blocks it",suggestion:"Plausible, but below the auto-assign threshold","below-threshold":"No match in the gallery as it stands","no-eligible-identity":"No person has enough samples yet ({{min}} needed)","empty-gallery":"Nothing in the gallery is comparable to this face","model-mismatch":"This face was embedded with an older model \u2014 its scores cannot be compared"}}},accessories:{on:"On",off:"Off",dimUp:"Brighter",dimDown:"Dimmer",lock:"Lock",unlock:"Unlock",open:"Open",close:"Close",stop:"Stop",arm:"Arm",disarm:"Disarm",onMotion:"On motion",openPercent:"Open {{percent}}",warmer:"Warmer",cooler:"Cooler",speedUp:"Faster",speedDown:"Slower",oscillate:"Oscillate",press:"Press",play:"Play",pause:"Pause",previous:"Previous",next:"Next",start:"Start",dock:"Dock",locate:"Locate",feed:"Feed",feeding:"Feeding\u2026",install:"Install",installing:"Installing\u2026",upToDate:"Up to date",increase:"Increase",decrease:"Decrease",select:"Select",noEvent:"No events yet",buttonIndex:"Button {{index}}",mode:"Mode",fanMode:"Fan mode",preset:"Preset",direction:"Direction",forward:"Forward",reverse:"Reverse",away:"Away",humidityUp:"Increase humidity",humidityDown:"Decrease humidity",swingVertical:"Vertical swing",swingHorizontal:"Horizontal swing",setTemperature:"Set temperature",currentTemperature:"Current temperature",climateModes:{off:"Off",heat:"Heat",cool:"Cool",auto:"Auto",heat_cool:"Heat/Cool",fan_only:"Fan",dry:"Dry"}},updates:{otaReadyTitle:"Update downloaded",otaReadyBody:"Restart the app now to apply it? Later applies it at the next start.",install:"Restart now",later:"Later",whatsNewTitle:"What's new in {{version}}",whatsNewHeading:"What's new",whatsNewPrevious:"Previous updates",whatsNewRow:"What's new",whatsNewNone:"No notes for this version.",nativeRow:"App build",nativeUpToDate:"Up to date",nativeUnknown:"\u2014",nativeNewer:"{{version}} ({{build}}) available",nativeNewerTitle:"A newer app build is available",nativeNewerBody:"Version {{version}} (build {{build}}) is available. Updates from now on need it.",openTestFlight:"Open TestFlight",openStore:"Open the store"},cameraMenu:{title:"View options",gridCommonHint:"Overlays shared by the whole wall \u2014 boxes, highlight border and its triggers, cluster labels \u2014 are set once for the grid, in the grid bar.",streamStats:"Stream stats",audioLevel:"Audio level",densityTitle:"Timeline density",density_compact:"Compact",density_medium:"Medium",density_wide:"Wide",densityCustom:"Custom",showImportance:"Show importance",showClass:"Show detection class",timelineSection:"Timeline",managementTitle:"Management"},viewOptions:{groupDetection:"Detection overlays"},cameraShelf:{goTo:"Go to this camera",addToView:"Add to view",closeView:"Close view"},cameraSwitches:{title:"Camera functions",loading:"Reading camera functions\u2026",readFailed:"Camera functions could not be read. Nothing has changed \u2014 they are not shown rather than shown with a guessed state.",writeFailed:"That change was refused and has been undone. {{reason}}",offBadge:"OFF",badgeLabel_one:"{{count}} function switched off",badgeLabel_other:"{{count}} functions switched off",unavailableNoProvider:"Not available \u2014 nothing in this installation provides it.",unavailableUnreachable:"Unknown \u2014 the service that owns this did not answer.",unavailableNotConfigured:"Not offered \u2014 nothing is set up for it to act on yet.",unavailableNoPrivacyZones:"Not offered \u2014 no privacy zone is drawn on the camera yet. Draw one in the camera\u2019s own app, then this switch appears.",unavailableDeviceDisabled:"Not offered while the camera is switched off.",unavailableUnknown:"Not available on this camera."},stats:{title:"Stream stats",resolution:"Resolution",fps:"FPS",bitrate:"Bitrate",packetLoss:"Packet loss",jitter:"Jitter",codec:"Codec",frames:"Frames (dropped/total)",waiting:"Measuring\u2026",playbackHint:"Full WebRTC stats need the native player."},exportActions:{title:"Capture",recordingExport:"Recording export"},exportSelection:{start:"Select a period to export",discard:"Discard the selection",save:"Save the selected period",savePartial:"Save the selected period \u2014 part of it was not recorded",title:"Export",queued:"The export was queued. You will find it under Exports when it is ready.",failed:"The export could not be queued.",gapTitle:"Part of this period was not recorded",gapMessage:"The selected {{duration}} crosses a stretch with no recording. The export will contain only the recorded parts.",gapConfirm:"Export anyway"},exports:{title:"Exports",empty:"No exports yet.",settingsHint:"Download recorded clips",range:"Range",rangeStart:"Start",rangeEnd:"End",profile:"Profile",noFootage:"No footage in this range.",speed:"Speed",timelapse:"Timelapse",cadence:"Frame every",audio:"Audio",includeAudio:"Include audio",audioUnavailable:"Audio is only available at 0.5\u20132\xd7 speed.",retention:"Keep for",life24h:"24 hours",life7d:"7 days",life30d:"30 days",deleteAfterDownload:"Delete after download",deleteAfterDownloadHint:"Remove the file once downloaded.",notify:"Notify when ready",creating:"Creating\u2026",createAction:"Export",createFailed:"Could not create the export.",withAudio:"with audio",variantRegular:"1\xd7",variantAccelerated:"Accelerated {{speed}}\xd7",variantSlow:"Slow {{speed}}\xd7",variantTimelapse:"Timelapse",expired:"Expired",expiresInDays:"Expires in {{count}}d",expiresInHours:"Expires in {{count}}h",expiresInMinutes:"Expires in {{count}}m",downloadAction:"Download",downloadUnavailable:"Download not available.",downloadFailed:"Download failed.",cancelAction:"Cancel",cancelConfirmTitle:"Cancel export?",cancelConfirmBody:"This stops rendering and discards the partial file.",deleteAction:"Delete",deleteConfirmTitle:"Delete export?",deleteConfirmBody:"This removes the file. The history entry is kept.",dismiss:"Dismiss",state:{queued:"Queued",rendering:"Rendering",ready:"Ready",failed:"Failed",expired:"Expired",deleted:"Deleted"}},library:{title:"Library",sections:{events:"Events",artifacts:"Artifacts",exports:"Exports",review:"Review"}},artifacts:{title:"Artifacts",settingsHint:"Timelapses, clips and summaries",empty:"No artifacts yet.",emptyFiltered:"No artifacts match these filters.",loadError:"Could not load the artifacts.",gone:"This artifact is no longer on the hub.",expired:"Expired",expiredBody:"The retention window closed and the file was removed.",expiresInDays:"Expires in {{count}}d",expiresInHours:"Expires in {{count}}h",expiresInMinutes:"Expires in {{count}}m",retentionHint:"Kept for up to 14 days. Files may be removed sooner when the hub reaches its storage limits.",byRule:"Rule: {{name}}",allCameras:"All cameras",cameraPlus:"{{name}} +{{count}}",close:"Close",downloadAction:"Download",downloadUnavailable:"Download not available.",downloadFailed:"Download failed.",kind:{timelapse:"Timelapse","timelapse-preview":"Timelapse preview","summary-mosaic":"Summary mosaic","event-gif":"GIF","event-clip":"MP4","event-still":"Still"},time:{now:"Just now",minutesAgo:"{{count}}m ago",hoursAgo:"{{count}}h ago",daysAgo:"{{count}}d ago"},range:{all:"All",day:"24h",week:"7d",month:"30d"},filters:{toggle:"Filters",kind:"Type",camera:"Camera",range:"Period",clear:"Clear filters"},detail:{kind:"Type",cameras:"Cameras",rule:"Rule",captured:"Captured",created:"Produced",size:"Size",format:"Format",expiry:"Expires"}},streamBar:{play:"Play",pause:"Pause",scrubForward:"Scrubbing forward",scrubBackward:"Scrubbing backward",mute:"Mute",unmute:"Unmute",talkStart:"Start talking",talkStop:"Stop talking",quality:"Stream quality",menu:"View options",snapshot:"Snapshot",pip:"Picture in picture",fullscreen:"Fullscreen",exitFullscreen:"Exit fullscreen"},playback:{servedTier:"Playing {{tier}}",servedTierDegraded:"{{requested}} not available here \u2014 playing {{served}}",tier:{high:"High",mid:"Mid",low:"Low"},prevFrame:"Previous frame",nextFrame:"Next frame",speed:"Playback speed",audioMuted:"Audio off at \u2260 1\xd7",audioOn:"Audio on"},cameraSwitcher:{title:"Switch camera",empty:"No cameras available",openGrid:"Open grid ({{n}})",selectA11y:"Select {{name}}",buildView_one:"Show this camera",buildView_other:"Show these {{count}} cameras"},storage:{title:"Storage",usageTitle:"Usage",nodeTotal:"Node total",defaultLocation:"Default location",locationFree:"{{free}} free",retentionTitle:"Retention",pruneAction:"Apply retention now",pruneConfirmTitle:"Apply retention?",pruneConfirmBody:"Delete footage on {{name}} that exceeds its retention policy.",pruneResult:"Reclaimed {{bytes}} ({{buckets}} segments).",deleteTitle:"Delete footage",deleteAction:"Delete",deleteConfirmTitle:"Delete footage?",deleteConfirmBody:"Permanently delete {{range}} of footage on {{name}}. This cannot be undone.",deleteResult:"Reclaimed {{bytes}} ({{buckets}} segments).",cancel:"Cancel",window24h:"Last 24h",window7d:"Last 7 days",window30d:"Last 30 days",windowAll:"Everything"},eventsMgmt:{title:"Events",footprintTitle:"Footprint",rowsBytes:"{{rows}} events \xb7 {{bytes}}",clusterTotal:"Cluster total",pruneTitle:"Prune older than",pruneHint:"Applies to all cameras.",pruneAction:"Prune",pruneConfirmTitle:"Prune old events?",pruneConfirmBody:"Delete events older than {{range}} across ALL cameras. This cannot be undone.",pruneResult:"Deleted {{count}} events.",deleteTitle:"Delete camera events",deleteAction:"Delete all events for this camera",deleteConfirmTitle:"Delete all events?",deleteConfirmBody:"Permanently delete every event for {{name}}. This cannot be undone.",deleteResult:"Deleted {{count}} events.",cancel:"Cancel",older24h:"24 hours",older7d:"7 days",older30d:"30 days"},overlay:{title:"Overlay",liveSection:"Live indicators",readoutsSection:"Sensors & values",layersLabel:"Boxes on the picture",layerMotion:"Motion",layerObjects:"Objects",layerDiscarded:"Discarded",layerStationary:"Stationary",layerDiscardedHint:"Also draws, as dashed outlines, the near-miss and out-of-zone detections of the classes you enabled \u2014 subjects that fell just under the confidence threshold, or stood outside a zone rule. Use it when boxes flicker on a moving subject. The count pill compares what the model saw with what was kept.",layerStationaryHint:"Draws objects that have stopped and are no longer tracked \u2014 a parked car, a bin left out. The hub suppresses their detections, so they can never appear under Objects or Discarded.",diagCounts:"model {{saw}} \xb7 kept {{kept}}",diagHidden:"{{hidden}} hidden",diagOffTopic:"{{offTopic}} off-topic",diagShed:"frame shed \xb7 {{reason}}",reasonThreshold:"below threshold",reasonFullFrame:"full-frame guard",reasonNms:"suppressed by NMS",reasonClassFilter:"class filter",reasonZoneGate:"zone rule",motionBadge:"Motion badge",highlightBorder:"Highlight border",occupancy:"Occupancy",addReadout:"Add a readout",removeReadout:"Remove readout",readoutsHint:"Pin a live value over the picture \u2014 the audio level, or any sensor linked to this camera.",noFields:"This device publishes no live values.",thisCamera:"This camera",audioDbfs:"Audio level",liveOnlyHint:"These draw on the live picture only \u2014 not during playback or while paused.",positions:{off:"Off","top-left":"Top left","top-center":"Top center","top-right":"Top right","left-center":"Left center","right-center":"Right center","bottom-left":"Bottom left","bottom-center":"Bottom center","bottom-right":"Bottom right"}},clips:{title:"Clips",loading:"Loading clips\u2026",empty:"No clips for this camera in the loaded window.",summary_one:"{{count}} clip",summary_other:"{{count}} clips",collapsedHint:"{{duration}} skipped",hiddenHint_one:"{{count}} hidden by source",hiddenHint_other:"{{count}} hidden by source",segmentLabel:"Clip at {{time}}, {{duration}} long",gapLabel:"Gap of {{duration}}",notPlayable:"not playable yet",kind_motion:"Motion",kind_object:"Object",kind_audio:"Audio",kind_native:"Camera",sourceAnalytics:"Recording",sourceOnboard:"Camera ({{vendor}})",sourceHksv:"HomeKit",sourceUnknown:"{{vendor}}",unitDay:"d",unitHour:"h",unitMinute:"m",unitSecond:"s"},eventsEmbed:{section:"Hub embed (preview)",title:"Events embed",count:"{{count}} shown",openPreview:"Embed preview",openPreviewHint:"Open the hub-hosted events surface next to this page. Nothing is replaced.",view_reel:"Reel",view_gallery:"Gallery",error:"Couldn't load events",retry:"Retry",empty:"No events",emptyFiltered:"No events match this filter",end:"\xb7 end \xb7"},eventsShare:{title:"Events embed link",openBuilder:"Create embed link",openBuilderHint:"Build a standalone URL for a dashboard or an iframe.",view:"View",viewReel:"Reel",viewGallery:"Gallery",columns:"Columns",rows:"Rows",auto:"Auto",thumb:"Thumbnail size",thumbSmall:"Small",thumbMedium:"Medium",thumbLarge:"Large",theme:"Theme",themeAuto:"Auto",themeDark:"Dark",themeLight:"Light",fields:"Card text",field_label:"Title",field_sublabel:"Class",field_camera:"Camera",field_time:"Time",field_badges:"Badges",cameras:"Cameras",camerasAll:"All cameras the link can see",camerasCount:"{{count}} selected",preview:"Link preview",shareMediaNotice:"A share link cannot load thumbnails. Share tokens have no access to the media endpoint at all \u2014 the shared page lists its events, without their images.",copyLink:"Create link",chip:"Embed link",semanticScopeNotice:"Semantic search runs across every camera and is trimmed to this link afterwards, so a link with few cameras can return sparse results on a large cluster."},eventsCard:{unassignedFace:"unassigned face",reviewed:"reviewed",debug:"debug",train:"train",favourite:"favourite",active:"active",loadingMore:"Loading more events"},gridTile:{play:"Play",pause:"Pause",listen:"Listen",mute:"Mute",talk:"Talk",stopTalk:"Stop talk",ptz:"PTZ",linkedDevices:"Linked devices",viewOptions:"View options",moreActions:"More actions",open:"Open",removeFromView:"Remove from view",resizeWidth:"Resize width",resizeHeight:"Resize height",noActiveCameras:"No active cameras",camera:"Camera"},battery:{holdHint:"This camera runs on battery \u2014 press play to start the stream and wake it.",startStreamA11y:"Start the stream and wake the battery camera"},faceReview:{loading:"Loading faces\u2026",loadError:"Could not load faces.",empty:"No faces to review right now.",previewClose:"Close",pickIdentityTitle:"Assign to\u2026",assignFailed:"Could not assign this face.",assign:"Assign",assignedSuccess:"Assigned to {{name}}.",confirmAssignTitle:"Assign faces",confidence:"Confidence",groupSize:"{{count}} faces in this group",filterAssigned:"Assigned",filterSuggested:"Suggested",filterUnassigned:"Unassigned",certaintyCertain:"near-certain",certaintyProbable:"probable",certaintyUncertain:"uncertain",analyzeButton:"Analyze last {{count}} unassigned",analyzeModalTitle:"Look-alike groups",analyzeLoading:"Looking for look-alike groups\u2026",analyzeEmpty:"No look-alike groups found.",analyzeConfirmBody:"Assign {{count}} face(s) across {{groups}} group(s)?",analyzeResult:"Assigned {{assigned}} of {{count}} face(s).",analyzeAssignFailed:"Some faces were refused and are still unassigned.",recomputeButton:"Recompute suggestions",recomputeProgress:"Recomputing {{done}}/{{total}}\u2026",recomputeDone:"Recomputed {{count}} face(s).",analyzeCoverage:"{{grouped}} of {{pool}} faces fall into {{groups}} look-alike group(s). The rest of the {{requested}} analysed have no look-alike here.",groupExcludeFace:"Exclude this face from the group",groupIncludeFace:"Put this face back in the group",groupPickPerson:"Assign this group to",groupShowDetail:"Show this face larger",groupDetailExclude:"Exclude from group",groupDetailInclude:"Put back in the group",assignedManySuccess:"Assigned {{count}} face(s) to {{name}}.",detailTitleMany:"Assign {{count}} selected face(s) to\u2026",knownPeople:"Known people",filtersButton:"Filters",filtersButtonActive:"Filters ({{count}})",sortLabel:"Sort by",sortByCertainty:"Certainty",sortByDate:"Date",sortAscending:"Sorting ascending \u2014 tap for descending",sortDescending:"Sorting descending \u2014 tap for ascending",dateLabel:"Date range",rangeAll:"All",rangeToday:"Today",rangeYesterday:"Yesterday",rangeLast7:"7 days",rangeLast30:"30 days",cameraLabel:"Camera",cameraNone:"No cameras in the loaded faces yet.",selectButton:"Select",selectDone:"Done",selectionCount:"{{count}} selected",applySuggestions:"Apply {{count}} suggestion(s)",applySuggestionsBlocked:"{{count}} of the selected face(s) have no suggestion \u2014 deselect them, or use Assign.",applySuggestionsResult:"Applied {{count}} of {{total}} suggestion(s) across {{groups}} person(s).",emptyFiltered:"No faces match these filters.",partialWindowHint:"Filtering the {{count}} faces loaded so far \u2014 scroll down to load older ones.",auditTitle:"Re-analyse {{name}}\u2019s samples",auditSummary:"{{flagged}} of {{total}} samples worth a look",auditLooksLike:"Looks like {{name}} ({{foreign}}) more than like this person ({{self}})",auditSelfOnly:"Agrees with this person\u2019s other samples: {{self}}",auditNotComparable:"Enrolled with a different face model \u2014 it cannot be compared, not even to say it is fine.",auditFromPhoto:"photo",auditRemoveTitle:"Remove this sample",auditRemoveBody:"The sample stops teaching recognition. Nothing else changes, and the face it came from stays where it is.",auditUnavailable:"This hub cannot re-analyse a gallery yet.",auditOpen:"Re-analyse samples"},statusDetail:{batteryTitle:"Battery",linkTitle:"Connection",openBatteryA11y:"Battery details",openLinkA11y:"Connection details",close:"Close",label:{charge:"Charge",charging:"Power",state:"State",linkType:"Link",signal:"Signal",ssid:"Network"},value:{unknown:"Not known",notApplicable:"Not applicable",binary:"Low / ok only, no percentage",sleeping:"Sleeping",chargingDc:"Charging (mains)",chargingSolar:"Charging (solar)",chargingNone:"Not charging",wifi:"Wi-Fi",ethernet:"Wired (Ethernet)",cellular:"Cellular",linkUnknown:"Not known"}}},prototype:{today:"Today",yesterday:"Yesterday",now:"NOW",endOfDay:"END OF DAY",loading:"Loading...",timeline:"Timeline",events:"Events",playClip:"Play clip",goToNow:"NOW",noEvents:"No events"},eventKind:{motion:"Motion",audio:"Audio",person:"Person",vehicle:"Vehicle",animal:"Animal",package:"Package",sensor:"Sensor",control:"Control",car:"Car",truck:"Truck",bus:"Bus",motorcycle:"Motorcycle",bicycle:"Bicycle",airplane:"Airplane",boat:"Boat",train:"Train",bird:"Bird",cat:"Cat",dog:"Dog",horse:"Horse",sheep:"Sheep",cow:"Cow",elephant:"Elephant",bear:"Bear",zebra:"Zebra",giraffe:"Giraffe",contact:"Contact","motion-sensor":"Motion sensor",smoke:"Smoke",flood:"Water leak",gas:"Gas","carbon-monoxide":"Carbon monoxide",vibration:"Vibration",tamper:"Tamper",presence:"Presence","enum-sensor":"Sensor state","device-event":"Device event",lock:"Lock",switch:"Switch",siren:"Siren",button:"Button",doorbell:"Doorbell","package-delivered":"Package delivered","package-picked-up":"Package picked up","audio-speech":"Speech","audio-music":"Music","audio-dog":"Dog","audio-doorbell":"Doorbell","audio-siren":"Siren","audio-alarm":"Alarm","audio-animal":"Animal (other)","audio-bird":"Bird","audio-cat":"Cat","audio-crowd":"Crowd / Chatter","audio-crying":"Crying / Baby","audio-door":"Door","audio-engine":"Engine / Motor","audio-fire":"Fire / Smoke","audio-footsteps":"Footsteps","audio-glass_breaking":"Glass Breaking","audio-gunshot":"Gunshot / Explosion","audio-laughter":"Laughter","audio-scream":"Scream / Shout","audio-silence":"Silence","audio-telephone":"Telephone","audio-tools":"Tools / Construction","audio-vehicle":"Vehicle","audio-water":"Water","audio-wind":"Wind / Weather"}}},2299,[]);
3675
+ __d(function(e,i,a,o,t,n,r){t.exports={devices:{editDevice:"Modifica dispositivo",originalName:"Nome originale",customName:"Nome personalizzato",customNamePlaceholder:"Lascia vuoto per usare l'originale",icon:"Icona",typeLight:"Luce",typeSwitch:"Interruttore",typeCover:"Tapparella",typeLock:"Serratura",typeAlarm:"Allarme",typeButton:"Pulsante",typeSelect:"Selezione",typeSiren:"Sirena",typeSensor:"Sensore",typeEntry:"Ingresso",typeMediaPlayer:"Media Player",typeScript:"Script",run:"Esegui",sourceHA:"Home Assistant",sourceScrypted:"Scrypted",off:"Off",on:"On",mute:"Muto",unmute:"Audio",stop:"Stop",locked:"Chiusa",unlocked:"Aperta",open:"Aperta",closed:"Chiusa",disarmed:"Disinserito",disarm:"Disinserisci"},common:{error:"Errore",save:"Salva",cancel:"Annulla",loading:"Caricamento...",comingSoon:"In arrivo",back:"Indietro",fullscreen:"Schermo intero",exitFullscreen:"Esci da schermo intero",reset:"Reimposta",selectAll:"Seleziona tutte",deselectAll:"Deseleziona tutte",delete:"Elimina",retry:"Riprova"},grids:{newGrid:"Nuova griglia",deleteConfirm:"Eliminare questa griglia?",noGrids:"Nessuna griglia. Creane una per disporre le telecamere in vista mosaico.",createGrid:"Crea griglia",cameras:"telecamere",notFound:"Griglia non trovata.",noCameras:"Nessuna telecamera in questa griglia. Modifica per aggiungerne.",edit:"Modifica",addCamera:"Aggiungi telecamera",presets:"Preset",auto:"Auto",manual:"Manuale",gridName:"Nome griglia",view:"Visualizza",addCameraHint:"Aggiungi almeno una telecamera dal pulsante sopra.",allCamerasAdded:"Tutte le telecamere sono gi\xe0 in griglia",cameraUnavailable:"Telecamera non disponibile",camerasInGrid:"Telecamere nella griglia",addAll:"Aggiungi tutte",addCameras:"Aggiungi Telecamere",backToGrid:"Torna alla Griglia",timelineNotSupported:"Timeline non supportata"},nav:{cameras:"Telecamere",grids:"Griglie",library:"Libreria",notifications:"Notifiche",events:"Eventi",videoclips:"Videoclip",list:"Lista",settings:"Impostazioni"},cameras:{addCamera:"Aggiungi telecamera",pipActive:"PiP attivo",reorderEnable:"Riordina",reorderDisable:"Sblocca",live:"Live",noCameras:"Nessuna telecamera configurata",noIntegrations:"Nessuna integrazione configurata. Aggiungi un sistema per iniziare.",createSystem:"Crea sistema",importFrom:"Importa telecamere da",importSuccess:"Importazione completata",importCount:"{{count}} telecamere importate",selectCamerasToImport:"Seleziona telecamere da importare",selectAll:"Seleziona tutte",deselectAll:"Deseleziona tutte",importSelected:"Importa {{count}} selezionate",noCamerasFound:"Nessuna telecamera trovata",play:"\u25b6 Riproduci",paused:"In pausa",noDataForDate:"Nessun dato per questa data",recordingNotAvailable:"Registrazione non disponibile",noEventsReel:"Nessun evento recente",settings:"Impostazioni",highlightMotion:"Evidenza movimento",highlightOnMotion:"Evidenzia al movimento",highlightAudio:"Evidenza audio",audioMode:"Modalit\xe0",audioModeOff:"Off",audioModeSensor:"Sensore",audioModeLevel:"Livello",audioPreset:"Preset audio",audioPresetCustom:"Personalizzato",audioPresetCrying:"Pianto / neonato",audioPresetAlarm:"Allarme / sirena",audioPresetDog:"Abbaio cane",audioPresetDoorbell:"Campanello / bussata",audioPresetGlass:"Rottura vetro",audioWindow:"Finestra (s)",audioThreshold:"Soglia (dB)",audioHitPercentage:"Percentuale (%)",audioHoldSeconds:"Mantenimento (s)",highlightDetection:"Evidenza rilevamento oggetti",highlightOnDetection:"Evidenzia al rilevamento",detectionClasses:"Classi",holdSeconds:"Mantenimento (s)",rtspNotSupportedWeb:"Gli stream RTSP non sono supportati sul web. Usa l'app mobile.",liveDetections:"Detections live",filterTimeline:"Filtra timeline",filterClasses:"Filtra classi...",filterBySeverity:"Filtra per severit\xe0",severityAlert:"Allarme",severityDetection:"Rilevamento",statusPosition:"Posizione indicatori di stato",today:"Oggi",yesterday:"Ieri",timeline:"Timeline",timelineEventsClusterEvents:"Eventi",selectDate:"Seleziona una data",videoclipsNotSupported:"Videoclip non supportati per questa telecamera",noVideoclipsForDate:"Nessun videoclip per questa data",endOfList:"Fine elenco",backToLive:"Torna al live",goLive:"Vai al live",loadingClip:"Caricamento clip...",clusterDetailShowBbox:"Mostra bounding box sull'immagine",clusterDetailOpenVideoclip:"Apri videoclip",clusterDetailLoadingEvents:"Caricamento eventi...",devices:"Dispositivi",noAssociatedDevices:"Nessun dispositivo collegato. Configura in Impostazioni > Telecamere.",timelineData:"Dati timeline",timelineDataHint:"Cosa mostrare sulla timeline.",timelineDataVideoclips:"Videoclip",timelineDataAdvancedNotifier:"Advanced Notifier",timelineDataEvents:"Eventi",timelineEvents:"Eventi timeline",timelineEventsHint:"Quali tipi di eventi mostrare sulla timeline, in base alla severit\xe0.",timelinePresetAll:"Tutti",timelinePresetImportant:"Importanti",timelinePresetCritical:"Critici",timelinePresetCustom:"Personalizzato",statusBlock:"Blocco stato",sensorsBlock:"Blocco sensori",position:"Posizione",indicators:"Indicatori",downloadSnapshot:"Scarica Istantanea",exportDownloadClip:"Scarica Clip",exportRecordingWebOnly:"Esporta registrazione (solo web)",exportSnapshot:"Esporta Istantanea",intercomError:"Errore interfono",multiCam:"Multi-Camera",ptzNotSupported:"PTZ non supportato",ptzSelectPreset:"Seleziona Preset PTZ",snapshotFailed:"Istantanea fallita"},events:{loading:"Caricamento eventi...",filterByLabel:"Filtra per etichetta",filterByLabelPlaceholder:"es. person, doorbell",filterByCamera:"Filtra per telecamera",date:"Data",detectionTypes:"Tipi di rilevamento",source:"Sorgente",cameras:"Telecamere",groupingRange:"Raggruppamento",groupingPresetMinutes:"{{m}} min",groupingCustom:"Personalizzato",groupingCustomMinutes:"Minuti",groupingCustomApply:"Applica",today:"Oggi",noCamerasFromConfig:"Telecamere caricate dalla config EventsApp",all:"Tutti",typesCount:"{{count}} tipi",camerasCount:"{{count}} telecamere",cols:"col",sourceAuto:"Auto",sourceNVR:"NVR",sourceFrigate:"Frigate",sourceVideoClips:"API VideoClips",sourceRawDetection:"Raw",sourceAdvancedNotifier:"Advanced Notifier",detectionPerson:"Persona",detectionVehicle:"Veicolo",detectionAnimal:"Animale",detectionAudio:"Audio",detectionFace:"Volto",detectionPlate:"Targa",detectionPackage:"Pacco",detectionDoorbell:"Campanello",detectionSensor:"Sensore",detectionMotion:"Motion",detectionRules:"Regole",noScryptedIntegration:"Aggiungi un'integrazione Scrypted in Impostazioni per vedere gli eventi.",frigateNoEvents:"Gli eventi sono disponibili solo per Scrypted. Seleziona un'istanza Scrypted in Impostazioni.",noSource:"Aggiungi un'integrazione Scrypted o Frigate in Impostazioni, poi selezionala come sorgente per Eventi e Videoclip.",loadError:"Errore nel caricamento degli eventi",noEvents:"Nessun evento per questa data. Prova a cambiare data o filtri.",clearCacheTitle:"Svuota cache",clearCacheMessage:"Svuotare tutti i dati in cache di eventi e videoclip? Verr\xe0 effettuato un nuovo caricamento al prossimo accesso.",clearCacheConfirm:"Svuota",columnsPerRow:"Colonne per riga",onlyWithClips:"Solo con clip",relatedClip:"Clip Correlata"},settings:{integrations:"Integrazioni",camstackProxy:"CamStack Proxy",scrypted:"Scrypted",frigate:"Frigate",rtsp:"RTSP",homeAssistant:"Home Assistant",name:"Nome",baseUrl:"URL base",urlLocal:"URL locale",urlPublic:"URL pubblico",username:"Username",password:"Password",token:"Token (opzionale)",frigateTokenHint:"Token (opzionale): JWT dal browser",tokenRequired:"Token",testConnection:"Test connessione",testLocal:"Test Local",testPublic:"Test Public",testMqtt:"Test MQTT",connectionOk:"Connessione riuscita",connectionError:"Connessione fallita",scryptedCredentialsPromptTitle:"Accesso Scrypted",scryptedCredentialsPromptSubtitle:"Inserisci username e password Scrypted per connettere.",scryptedCredentialsPromptSkip:"Salta per ora",usernamePlaceholder:"admin",save:"Salva",tabStream:"Stream e riproduzione",tabGeneral:"Generale",data:"Dati",clearCacheEventsClips:"Svuota cache eventi e videoclip",eventsClipsSourceHint:"Sorgente per le schede Eventi e Videoclip.",hubReelTitle:"Hub & Reel",reelIntegrationsHint:"Scegli quali integrazioni usare per il reel.",reelScryptedSourceHint:"Con Scrypted: sorgente eventi per il reel.",eventsClipsAuto:"Auto",eventsClipsNoInstance:"Aggiungi prima un'integrazione Scrypted o Frigate.",exportBackup:"Esporta backup",exportError:"Esportazione fallita",importBackup:"Importa backup",importConfirm:"Questo sostituir\xe0 tutte le telecamere, integrazioni e impostazioni con i dati del backup. Continuare?",importSuccess:"Backup ripristinato con successo",importError:"Importazione fallita",uiPrototypes:"Prototipi UI",uiPrototypesHint:"Esplora design sperimentali della timeline",versions:"Versioni",appVersion:"App",nativeVersion:"Nativa",updateNow:"Aggiorna ora",updateError:"Aggiornamento fallito",updateAvailableTitle:"Aggiornamento disponibile",updateAvailableMessage:"Una nuova versione di CamStack \xe8 stata scaricata ed \xe8 pronta per l'installazione. L'app verr\xe0 riavviata per applicare l'aggiornamento.",updateInstall:"Installa e riavvia",updateLater:"Pi\xf9 tardi",tabIntegrations:"Integrazioni",tabCameras:"Telecamere",theme:"Tema",themeSystem:"Sistema",themeLight:"Chiaro",themeDark:"Scuro",language:"Lingua",languageSystem:"Sistema",languageEn:"English",languageIt:"Italiano",timelineMode:"Modalit\xe0 timeline",timelineModeClassic:"Classica",timelineModeTheater:"Theater",timeline:"Timeline",timelineVisible:"Mostra timeline rilevamenti",timelineVisibleDescription:"Visualizza il pannello della timeline nella vista telecamera.",clusterSize:"Dimensione cluster",snapshotInterval:"Intervallo aggiornamento snapshot",clusterSizeXS:"Molto piccola",clusterSizeS:"Piccola",clusterSizeM:"Normale",clusterSizeL:"Grande",clusterSizeXL:"Molto grande",highlightAppearance:"Aspetto evidenze",highlightAppearanceHint:"Colore e spessore del bordo per evidenze movimento, audio e rilevamento sugli stream delle telecamere.",highlightMotion:"Movimento",highlightAudio:"Audio",highlightDetection:"Rilevamento",highlightColor:"Colore",highlightThickness:"Spessore",selectSection:"Seleziona sezione",addSystem:"Aggiungi sistema",selectPlatform:"Seleziona piattaforma",deleteInstance:"Elimina istanza",deleteInstanceConfirm:"Vuoi eliminare questa istanza?",delete:"Elimina",mqttEvents:"MQTT - Eventi in tempo reale",mqttBrokerUrl:"URL broker MQTT",mqttUsername:"Username MQTT",mqttPassword:"Password MQTT",mqttTopicPrefix:"Prefisso topic (default: frigate)",mqttOptional:"Opzionale",scryptedAddressAlreadyUsed:"Questo indirizzo Scrypted \xe8 gi\xe0 configurato. \xc8 consentita una sola istanza per indirizzo.",scryptedAdvancedNotifierRequired:"Il plugin Advanced Notifier \xe8 richiesto per la connessione.",scryptedCorsTitle:"Configurazione CORS richiesta (Web)",scryptedCorsBody:"In Scrypted, apri le impostazioni del plugin Cloud e aggiungi il tuo dominio ({{domain}}) alla lista CORS Allowed Origins. Senza questa configurazione, il browser bloccher\xe0 le richieste verso il server Scrypted.",scryptedUrlHint:"L'URL locale viene provato per primo (es. in LAN), poi quello pubblico. Ne serve almeno uno.",gridLayout:"Layout griglia",gridLayoutHint:"Opzioni di visualizzazione per la griglia telecamere.",gridColumns:"Colonne griglia",gridColumnsHint:"Numero di telecamere per riga. Auto = 1 su mobile, 4 su tablet.",gridShowName:"Mostra nome telecamera",gridShowState:"Mostra stato (batteria, registrazione, sleep)",reorderCameras:"Riordina telecamere",reorderCamerasHint:"Trascina per riordinare le telecamere",reorderDone:"Fatto",manageCameras:"Gestisci telecamere",manageCamerasHint:"Rimuovi telecamere dall'app.",downloadSnapshot:"Scarica snapshot",snapshotFailed:"Impossibile recuperare lo snapshot",exportSnapshot:"Snapshot",exportDownloadClip:"Scarica clip",exportStartRecording:"Avvia registrazione",exportStopRecording:"Ferma registrazione",exportRecordingWebOnly:"Registrazione disponibile su web",intercomError:"Intercom non disponibile. Verifica le credenziali della telecamera su Scrypted.",deleteCamera:"Rimuovi telecamera",deleteCameraConfirm:"Rimuovere {{name}} dall'app?",streamPlayback:"Stream e riproduzione",playOnOpen:"Avvia stream all'apertura telecamera",playOnOpenHint:"Carica automaticamente lo stream live quando apri una telecamera.",audioOnOpen:"Audio attivo all'apertura",audioOnOpenHint:"Riproduci audio quando apri una telecamera (se supportato).",streamWatchdog:"Stream watchdog",streamWatchdogHint:"Riavvia lo stream quando non arrivano dati (aiuta con connessioni bloccate).",cameraPlayer:"Player telecamera",webViewCameraDetail:"Usa player WebView",webViewCameraDetailHint:"Usa WebView per le telecamere Scrypted (primo frame pi\xf9 veloce, pi\xf9 stabile). PiP, fullscreen e intercom funzionano. Default: player nativo.",streamQuality:"Qualit\xe0 stream",streamQualitySingle:"Qualit\xe0 singola telecamera",streamQualityGrid:"Qualit\xe0 griglia",qualityAuto:"Auto",qualityHigh:"High",qualityMedium:"Mid",qualityLow:"Sub",auto:"Auto",associatedDevices:"Dispositivi associati",associatedDevicesHint:"Aggiungi attuatori (luci, interruttori, tapparelle, ecc.) per controllarli dalla vista telecamera.",linkedDevices:"Collegati",reorderHint:"Usa le frecce per riordinare",addDevice:"Aggiungi dispositivo",noEligibleDevices:"Nessun Scrypted o Home Assistant configurato. Aggiungi prima un'integrazione.",configureDevices:"Configura dispositivi",cameraSettingsHint:"Scegli una telecamera per configurarne le opzioni.",noCamerasConfigured:"Nessuna telecamera configurata.",searchDevices:"Cerca dispositivi...",source:"Sorgente",type:"Tipo",all:"Tutti",noMatchingDevices:"Nessun dispositivo corrisponde ai filtri.",frigateStream:"Stream Frigate",frigateStreamSourceHint:"Sorgente stream: WebRTC (default), RTSP o MJPEG.",frigateStreamMapping:"Mappatura stream (nomi go2rtc da config)",frigateStreamMappingHint:"Seleziona dagli stream go2rtc disponibili. Ordine: High, Mid, Sub.",frigateSelectStream:"Seleziona stream",frigateAddStream:"Aggiungi stream",frigateInfo:"Info telecamera",frigateShowConfig:"Mostra config",frigateShowGo2rtc:"Mostra go2rtc",frigateMissingConfig:"Mancano baseUrl o cameraName nella config della telecamera.",tabLogs:"Log",logsCount:"{{count}} voci",logsDownload:"Scarica",logsClear:"Svuota",logsEmpty:"Nessun log. L'output della console apparir\xe0 qui.",logsExportError:"Esportazione fallita",logsExportTitle:"Esporta log",logsClearConfirmTitle:"Svuota log",logsClearConfirmMessage:"Rimuovere tutte le voci di log?",hubAppearanceTitle:"Aspetto",hubAppearanceDesc:"Tema, lingua, timeline e evidenze",hubCamerasTitle:"Telecamere",hubCamerasDesc:"Layout griglia, qualit\xe0 stream e gestione telecamere",hubIntegrationsTitle:"Integrazioni",hubIntegrationsDesc:"Gestisci Scrypted, Frigate e altri sistemi",hubAdvancedTitle:"Avanzato",hubAdvancedDesc:"Backup dati e gestione cache",hubLogsTitle:"Log",hubLogsDesc:"Visualizza ed esporta i log dell'applicazione",hubCacheTitle:"Cache",frigateAutoSnap:"Istantanea Automatica",frigateSegmentNav:"Navigazione Segmenti",frigateShowGo:"Mostra Go2RTC",frigateTimeline:"Timeline",reelCameras:"Telecamere Reel",reelCamerasHint:"Seleziona quali telecamere appaiono nel reel eventi",reelDeselectAll:"Deseleziona Tutto",reelDetectionClasses:"Classi di Rilevamento",reelDetectionClassesHint:"Filtra gli eventi per classe di rilevamento",reelIncludeRuleArtifacts:"Includi Artefatti Regole",reelIncludeRuleArtifactsHint:"Mostra gli eventi basati su regole nel reel",reelRuleArtifacts:"Artefatti Regole",reelSelectAll:"Seleziona Tutto",reelBadgeContent:"Contenuto badge",reelBadgePosition:"Posizione badge",reelBadgeSize:"Dimensione badge",reelBadgeBoth:"Ora + Classe",reelBadgeTime:"Solo ora",reelBadgeClass:"Solo classe",reelBadgeNone:"Nascosto",reelBadgeSmall:"Piccolo",reelBadgeMedium:"Medio",reelBadgeLarge:"Grande"},reel:{filterMotion:"Motion",filterOnlyRules:"Solo rule",filterOnlySensors:"Solo sensori",goToMostRecent:"Vai al pi\xf9 recente"},v2:{common:{connecting:"Connessione\u2026",online:"Online",offline:"Offline",loadError:"Errore di caricamento",create:"Crea",back:"Indietro",on:"On",off:"Off",confirm:"Conferma",cancel:"Annulla",ok:"OK",done:"Fatto"},cameras:{empty:"Nessuna telecamera",hubNotAnswering:"L'hub non risponde. Alcune telecamere potrebbero appartenere a un nodo attualmente offline \u2014 trascina per riprovare.",statusOnline:" \xb7 online",statusOffline:" \xb7 offline",motion:"Movimento",doorbell:"Campanello",doorbellRinging:"Sta suonando",doorbellLastRing:"Suonato {{time}} fa",snapshotLoading:"Caricamento\u2026",refreshing:"Aggiornamento\u2026",stationaryFor:"stazionario {{min}}m",manage:"Gestisci telecamere",manageHint:"Trascina per riordinare. Rinomina al volo. Usa lo switch per mostrare o nascondere una telecamera dall\u2019elenco.",reorderHandle:"Trascina per riordinare",appearance:"Aspetto",editList:"Modifica elenco",listOptions:"Opzioni elenco telecamere",controlsA11y:"Controlli telecamera",disabledTitle:"Fuori servizio",disabledHint:"Disattivata da un amministratore",emptyOutOfScope:"Nessuna telecamera nel tuo profilo di accesso",emptyOutOfScopeHint:"Al tuo account non \xe8 ancora assegnata nessuna telecamera. Chiedi a chi amministra questo hub di darti accesso.",snapshotStale:"Snapshot di {{age}} fa",hubNotProvisioning:"L'hub non risponde",reelFilter:"Eventi recenti",reelFilterAll:"Mostra tutti gli eventi",reelFilterDefaultHint:"Solo eventi di rilevamento \u2014 audio e sensori sono nascosti",reelFilterCount:"{{count}} tipi di evento mostrati",reelFilterUseDefault:"Predefinito",reelFilterShowAll:"Tutto",reelFilterDefaultTag:"Rilevamenti",reelFilterCountTag:"{{count}} tipi"},cameraDetail:{fallbackName:"Camera #{{id}}",mute:"Disattiva audio",unmute:"Attiva audio",snapshot:"Istantanea",snapshotFailed:"Impossibile acquisire l'istantanea.",ptz:"Controlli PTZ",talk:"Parla",fullscreen:"Schermo intero",talkFailed:"Impossibile avviare la comunicazione. Verifica l'accesso al microfono.",pip:"Picture in Picture",exitFullscreen:"Esci da schermo intero",devices:"Dispositivi",devicesEmpty:"Nessun dispositivo collegato.",linkedModeAuto:"Collegamento: Auto (posizione)",linkedModeManual:"Collegamento: Manuale",close:"Chiudi",deviceOnline:"Online",deviceOffline:"Offline"},grids:{createA11y:"Crea griglia",empty:"Nessuna griglia",emptyHint:"Tocca + per creare la tua prima griglia",countNone:"Nessuna telecamera",countOne:"1 telecamera",countOther:"{{count}} telecamere",defaultName:"Nuova griglia",deleteTitle:"Elimina griglia",deleteConfirm:"Eliminare \"{{name}}\"? L'operazione non \xe8 reversibile.",export:"Esporta",exportAllA11y:"Esporta tutte le griglie",shareA11y:"Condividi griglia",editA11y:"Modifica griglia",deleteA11y:"Elimina griglia",linkCopied:"Link della griglia copiato negli appunti",layoutAuto:"Auto",layoutColumns:"{{count}} col"},gridView:{editA11y:"Modifica griglia",fallbackTitle:"Griglia",notFound:"Griglia non trovata",emptyGrid:"Questa griglia \xe8 vuota",addCameras:"Aggiungi telecamere",reorderTitle:"Riordina telecamere",reorderA11y:"Riordina telecamere",reorderDoneA11y:"Fine riordino",allHidden:"Tutte le telecamere sono nascoste. Usa la modalit\xe0 riordino per mostrarne alcune.",dragA11y:"Trascina per riordinare",hideA11y:"Nascondi dalla griglia",showA11y:"Mostra nella griglia",removeA11y:"Rimuovi dalla griglia",adhocTitle:"Griglia rapida",cellActions:"Azioni telecamera",cellActionsA11y:"Altre azioni per questa telecamera",cellDevicesA11y:"Dispositivi collegati",cellMenuA11y:"Opzioni di visualizzazione"},gridBuilder:{title:"Modifica griglia",nameLabel:"Nome",namePlaceholder:"Nome griglia",camerasSelected:"Telecamere ({{count}} selezionate)",optionsTitle:"Opzioni",showName:"Mostra nome telecamera",export:"Esporta griglia",orderSection:"Nella griglia",orderHint:"Trascina per riordinare",emptyOrder:"Nessuna telecamera \u2014 aggiungine qui sotto.",addSection:"Aggiungi telecamere",removeA11y:"Rimuovi dalla griglia",addA11y:"Aggiungi alla griglia",highlightMotion:"Su movimento",highlightAudio:"Su audio",highlightAudioOff:"Off",highlightAudioLow:"Basso",highlightAudioMid:"Medio",highlightAudioHigh:"Alto",highlightThreshold:"Soglia",highlightHold:"Mantieni",highlightDetection:"Su rilevamento",clusterLabel:"Etichetta cluster",clusterLabelIcon:"Icona",clusterLabelText:"Testo"},gridBar:{back:"Indietro",pauseAll:"Metti tutto in pausa",playAll:"Riproduci tutto",audio:"Audio",quality:"Qualit\xe0 stream",layout:"Layout",timeline:"Timeline",highlightMenu:"Evidenziazione e overlay",activeOnly:"Solo attive",share:"Condividi griglia",edit:"Modifica griglia",hide:"Nascondi controlli",show:"Mostra controlli",muteAll:"Silenzia tutte",unmuteAll:"Riattiva audio"},gridMenu:{highlightMaster:"Bordi di evidenziazione"},gridShare:{title:"Condividi \"{{name}}\"",quality:"Qualit\xe0 stream",layout:"Layout",showNames:"Mostra nomi delle camere",activeOnly:"Solo camere attive",boxes:"Bounding box",highlightEnable:"Evidenziazione",audioSummary:"Audio attivo all\u2019apertura per {{count}} camera/e",ttlTitle:"Scadenza del link",ttl_1d:"1 giorno",ttl_7d:"7 giorni",ttl_30d:"30 giorni",ttl_never:"Per sempre",tokenNotice:"Il link include un token di sola visualizzazione limitato a queste camere. Chiunque abbia il link pu\xf2 guardare finch\xe9 non scade o viene revocato.",copyLink:"Copia link",creating:"Creazione link\u2026",copiedExpires:"Link copiato \u2014 scade il {{date}}",copiedNever:"Link copiato \u2014 non scade mai",error:"Impossibile creare il link di condivisione. Controlla la connessione e riprova.",optionAuto:"Auto"},gridControls:{play:"Riproduci",pause:"Pausa",mute:"Muto",unmute:"Riattiva audio",quality:"Qualit\xe0",layout:"Layout",layoutAuto:"Auto"},events:{comingSoon:"Eventi \u2014 in arrivo",searchLabel:"Cerca etichetta\u2026",searchSubmit:"Cerca",searchClear:"Cancella ricerca",empty:"Nessun evento",today:"Oggi",yesterday:"Ieri",weekdayShort:{sun:"Dom",mon:"Lun",tue:"Mar",wed:"Mer",thu:"Gio",fri:"Ven",sat:"Sab"},filteredEmpty:"Nessuna corrispondenza nell'intervallo caricato",loadOlder:"Carica meno recenti",selectPrompt:"Seleziona un evento per vederne i dettagli",filters:"Filtri",more:"Altro",all:"Tutte",day:"Giorno",sort:"Ordina",sortTime:"Recenti",sortImportance:"Importanza",flaggedOnly:"Contrassegnate",flaggedOnlyHint:"Preferite, debug o da addestrare",parked:"Stazionari",showStationary:"Mostra stazionari",showStationaryHint:"Spento = nascondi le promozioni parcheggiate",cameras:"Telecamere",classes:"Classi",attributes:"Rilevati",attrFaces:"Volti",attrPlates:"Targhe",attributesHint:"Nessuno = tutti",search:"Cerca",searchCameras:"Cerca telecamere\u2026",searchClasses:"Cerca classi\u2026",allCamerasHint:"Nessuna = tutte",allClassesHint:"Nessuna = tutte",done:"Fatto",density:"Densit\xe0",selectHint:"Seleziona un evento",unrecognizedFace:"Volto rilevato, non riconosciuto",eventKinds:"Tipi di evento",displayOptions:"Aspetto",displayTitle:"Opzioni di visualizzazione",useDefaultClasses:"Predefinito"},settings:{themeSystem:"Sistema",themeDark:"Scuro",themeLight:"Chiaro",server:"Server",account:"Accesso come",accountUnknown:"Caricamento\u2026",roleAdmin:"Admin",roleViewer:"Viewer",hubActive:"Hub attivo",changeServer:"Cambia server",signOut:"Esci",network:"Rete",networkNone:"Nessuna rotta ancora rilevata",endpointUnlikely:"Probabilmente non utilizzabile",activeRoute:"Rotta in uso",routeChannelLan:"LAN (diretta)",routeChannelPublic:"Tunnel pubblico",routeChannelLoopback:"Locale (loopback)",routeChannelUnknown:"Non riconosciuta",routeReasonInitial:"configurata, gara non ancora conclusa",routeReasonRaceWon:"la pi\xf9 veloce nella gara delle rotte",routeReasonNoWinner:"ripiego \u2014 nessun candidato ha risposto",routeReasonUnchanged:"invariata dall'ultimo rilevamento",routeReasonDisposed:"nessun trasporto",reprobe:"Ri-rileva rotte",reprobing:"Rilevamento\u2026",diagnoseNetwork:"Diagnostica rotte LAN",diagnosingNetwork:"Diagnostica in corso\u2026",diagnoseNetworkDone:"{{ok}}/{{total}} hanno risposto a /health. Apri i log e condividili \u2014 cerca ipv4/ipv6 http FAIL.",preferredRoute:"Rotta preferita",routeAuto:"Automatica",routeReasonPinned:"forzata dalle Impostazioni",appearance:"Aspetto",theme:"Tema",info:"Info",app:"App",version:"Versione",noServer:"Nessun server",footerNote:"CamStack Viewer si connette a un singolo hub camstack. Telecamere, griglie ed eventi sono gestiti dal server.",language:"Lingua",langSystem:"Sistema",gridDefaults:"Impostazioni griglia",showName:"Mostra nome telecamera",showNameHint:"Sovrapponi il nome della telecamera su ogni riquadro",showState:"Mostra stato",showStateHint:"Mostra lo stato online / registrazione su ogni riquadro",columns:"Colonne",cameraOrder:"Ordine telecamere",orderName:"Per nome",orderCustom:"Personalizzato",motionHold:"Persistenza evidenziazione movimento",motionHoldHint:"Mantieni accesa l'evidenziazione del movimento su una tile per questo tempo dopo che il movimento si ferma.",motionHoldOff:"Off",streamQuality:"Qualit\xe0 stream",streamDefaults:"Impostazioni stream",playOnOpen:"Riproduci all'apertura",playOnOpenHint:"Avvia lo stream live quando apri una telecamera",audioOnOpen:"Audio all'apertura",audioOnOpenHint:"Attiva l'audio quando apri una telecamera",snapshotInterval:"Aggiornamento snapshot",highlightAppearance:"Aspetto evidenziazione",highlightMotionColor:"Colore movimento",highlightAudioColor:"Colore audio",highlightDetectionColor:"Colore rilevamento",highlightThickness:"Spessore bordo",qualityAuto:"Auto",qualityHigh:"Alta",qualityMid:"Media",qualityLow:"Bassa",secondsValue:"{{count}}s",advanced:"Avanzate",clearCache:"Svuota cache",clearCacheHint:"Libera snapshot e dati in cache (mantiene server e impostazioni)",clearCacheConfirmTitle:"Svuotare la cache?",clearCacheConfirmBody:"Rimuove immagini e dati in cache. Server, accesso e impostazioni vengono mantenuti.",clearCacheDone:"Cache svuotata",exportSettings:"Esporta impostazioni",exportSettingsHint:"Copia le impostazioni in formato JSON",exportSettingsDone:"Impostazioni copiate in JSON",shareTitle:"Condividi impostazioni",shareHint:"Salva uno snapshot nominato di impostazioni, griglie e preferenze telecamere sul hub. Chiunque sia connesso pu\xf2 importarlo \u2014 sostituisce quanto c'\xe8 su questo dispositivo.",shareNamePlaceholder:"Nome snapshot",shareSave:"Salva",shareEmpty:"Nessuno snapshot",shareImportTitle:"Importare questo snapshot?",shareImportBody:"\"{{name}}\" sostituir\xe0 impostazioni, griglie e preferenze telecamere su questo dispositivo.",shareDeleteTitle:"Eliminare questo snapshot?",shareDeleteBody:"\"{{name}}\" verr\xe0 rimosso dal hub.",shareFailed:"Impossibile condividere le impostazioni",shareInvalid:"Questo snapshot non \xe8 un documento di impostazioni valido.",shareMissing:"Questo snapshot non \xe8 pi\xf9 sul hub.",viewLogs:"Visualizza log",viewLogsHint:"Messaggi di log recenti dell'app",logsEmpty:"Nessun log registrato",keepLogs:"Mantieni log",keepLogsHint:"Registra un buffer dei messaggi di log dell'app",debugMode:"Modalit\xe0 debug",debugModeHint:"Log verbosi su live, playback e scrub \u2014 inviati al server",logsClear:"Pulisci",resetSettings:"Ripristina impostazioni",resetSettingsHint:"Ripristina tutti i valori predefiniti",resetConfirmTitle:"Ripristinare le impostazioni?",resetConfirmBody:"Ripristina tutte le impostazioni ai valori predefiniti.",cancel:"Annulla",confirm:"Conferma",timeline:"Timeline",reel:"Sequenza eventi",reelThumbSize:"Dimensione miniature",reelThumbSizeHint:"Dimensione delle miniature nella sequenza eventi recenti.",reelSizeSmall:"Piccola",reelSizeMedium:"Media",reelSizeLarge:"Grande",reelShowLabels:"Mostra etichette",reelShowLabelsHint:"Mostra l'etichetta classe/identit\xe0 sugli elementi della sequenza.",reelLabelStyle:"Visualizzazione classe",reelLabelStyleHint:"Mostra la classe di rilevamento come icona o come testo negli elementi della sequenza.",reelShowImportance:"Mostra importanza",reelShowImportanceHint:"Mostra il badge di importanza sugli elementi della sequenza.",events:"Eventi",eventsPage:"Pagina eventi",minImportance:"Importanza minima",minImportanceHint:"Nascondi gli eventi con punteggio inferiore, nella pagina eventi e nella timeline della telecamera.",minImportanceOff:"Off",tileShowLabels:"Mostra etichette",tileShowLabelsHint:"Mostra le etichette classe / identit\xe0 / audio sulle schede evento.",tileShowImportance:"Mostra importanza",tileShowImportanceHint:"Mostra il badge di importanza sulle schede evento (se valutato).",tileShowCameraName:"Mostra nome telecamera",tileShowCameraNameHint:"Mostra il nome della telecamera nel pi\xe8 di pagina della scheda evento.",tileLabelStyle:"Visualizzazione classe",tileLabelStyleHint:"Mostra la classe di rilevamento come icona o come testo.",tileLabelStyleIcon:"Icona",tileLabelStyleText:"Testo",comingSoon:"Prossimamente",cameras:"Telecamere",manageCameras:"Gestisci telecamere",manageCamerasHint:"Rinomina, nascondi, riordina",notifications:"Notifiche",notificationsManage:"Gestisci notifiche",pinchExpandsHeight:"Il pizzico ingrandisce la vista",pinchExpandsHeightHint:"Pizzicando per lo zoom il video cresce in altezza (ritaglia i bordi laterali sulle camere 16:9).",navBarOnStream:"Barra di navigazione sulla singola camera",navBarOnStreamHint:"Mantiene visibile la navigazione principale mentre guardi una camera. Sulle finestre larghe la navigazione laterale c'\xe8 gi\xe0.",reopenLastCamera:"Riapri l'ultima camera",reopenLastCameraHint:"All'avvio riapre la camera che stavi guardando. Solo se guardarla \xe8 stata l'ultima cosa che hai fatto \u2014 cambiare pagina la dimentica.","timeline.gapPercent":"Gap cluster (%)","timeline.sizePercent":"Dimensione cluster (%)","timeline.indicatorPositionPct":"Posizione indicatore (%)","timeline.showImportance":"Mostra importanza sugli elementi","timeline.showClass":"Mostra classe di rilevamento sugli elementi","timeline.cardWidthPct":"Larghezza card (%)",haptics:"Vibrazione",hapticsUiFeedback:"Vibra alla pressione",hapticsUiFeedbackHint:"Una breve vibrazione conferma pulsanti, interruttori, PTZ e comandi del player. Solo su dispositivo (iOS/Android).",hapticsEnabled:"Vibra sugli eventi",hapticsEnabledHint:"Brevi vibrazioni per gli eventi chiave sulla telecamera che stai guardando. Solo su dispositivo (iOS/Android).",hapticsMotion:"Movimento",hapticsDetection:"Rilevamento",hapticsPerson:"Persona / riconosciuta",buildNumber:"Build",runtimeVersion:"Runtime",runningBundle:"Bundle in esecuzione",checkUpdates:"Controlla aggiornamenti",checkingUpdates:"Controllo\u2026",updateUpToDate:"Sei gi\xe0 all'ultima versione.",updatesDisabled:"Gli aggiornamenti sono disattivati in questa build.",updateReadyTitle:"Aggiornamento scaricato",updateReadyBody:"Riavviare l'app ora per applicarlo?",updateCheckFailed:"Impossibile controllare gli aggiornamenti",listOverlays:"Schede videocamere",listMotionBorder:"Anello movimento",listMotionBorderHint:"Pulsa un anello attorno alla scheda mentre la videocamera vede movimento.",listMotionBadge:"Posizione badge movimento",listOccupancy:"Posizione occupazione",useNativeRenderer:"Usa il renderer integrato",useNativeRendererHint:"Disegna Recenti ed Eventi dentro l\u2019app invece di caricare l\u2019embed ospitato dall\u2019hub.",toolbarDensity:"Altezza barra strumenti","toolbarDensity.small":"Piccola","toolbarDensity.medium":"Media","toolbarDensity.large":"Grande"},nc:{title:"Notifiche",tabs:{rules:"Regole",targets:"Targets",snooze:"Silenzia"},rulesPlaceholder:"Le regole di notifica appariranno qui.",targetsPlaceholder:"Le destinazioni di consegna appariranno qui.",rules:{add:"Nuova regola",empty:"Nessuna regola.",loadError:"Impossibile caricare le regole. Riprova.",mine:"Le mie regole",admin:"Regole admin",system:"Eventi di sistema",personalBadge:"Personale",adminBadge:"Admin",edit:"Modifica",delete:"Elimina",cancel:"Annulla",deleteConfirmTitle:"Elimina regola",deleteConfirmMessage:"Eliminare \"{{name}}\"? L'operazione non \xe8 reversibile.",receiveOn:"Ricevi su {{name}}",noOwnedTargets:"Questa regola non invia ad alcuna delle tue destinazioni.",section:{all:"Tutte",detection:"Rilevamenti",occupancy:"Occupazione",audio:"Suoni",empty:{all:"Nessuna regola. Creane una per sapere cosa vedono le telecamere.",detection:"Nessuna regola di rilevamento. Creane una per sapere cosa vedono le telecamere.",occupancy:"Nessuna regola di occupazione. Una nuova regola parte dalla condizione di occupazione: scegli prima la telecamera, poi la zona e il conteggio.",audio:"Nessuna regola sui suoni. Una nuova regola parte gi\xe0 con una soglia di livello: ti resta solo da indicare i suoni e le destinazioni.",timelapse:"Nessun timelapse. Un timelapse trasforma una notte di registrazioni in un video breve e lo invia alla chiusura della finestra \u2014 scegli le telecamere e le ore.",summary:"Nessun riepilogo. Un riepilogo raccoglie lo scatto migliore di tutto ci\xf2 che \xe8 passato davanti a pi\xf9 telecamere e invia una sola immagine."},create:{detection:"Nuova regola di rilevamento",occupancy:"Nuova regola di occupazione",audio:"Nuova regola sui suoni",timelapse:"Nuovo timelapse",summary:"Nuovo riepilogo"},timelapse:"Timelapse",summary:"Riepilogo"},mediaBadge:{attach:{"best-matching":"Immagine pertinente",keyFrame:"Fotogramma chiave",none:"Nessuna immagine"},frame:{full:"Tutta la scena",boxed:"Scena con riquadri"},zoneCrop:"Ritaglio zona",gif:"GIF",clip:"Video",profile:"Qualit\xe0 {{profile}}"},editor:{createTitle:"Nuova regola",editTitle:"Modifica \"{{name}}\"",basics:"Generali",nameLabel:"Nome",namePlaceholder:"es. Persone al portone",triggerLabel:"Attivazione",priorityLabel:"Priorit\xe0",targetsLabel:"Invia a",noTargets:"Non hai ancora destinazioni. Aggiungine una nella scheda Destinazioni.",pickTarget:"Seleziona almeno una destinazione.",conditionsLabel:"Condizioni",section:{rule:"Regola",devices:"Telecamere",conditions:"Condizioni",notification:"Notifica",advanced:"Avanzate"},kindSection:{detection:"Condizioni",sensor:"Condizioni",occupancy:"Occupazione",sound:"Suono",system:"Eventi"},kindBlurb:{sensor:"Un campanello premuto o un sensore collegato che cambia stato. L'immagine arriva dalla telecamera a cui il sensore \xe8 attribuito.",occupancy:"Scatta quando il conteggio nell'inquadratura o in una zona supera la tua soglia e la mantiene. Scegli prima la telecamera: l'elenco delle zone \xe8 quello di quella telecamera.",sound:"Scatta su una finestra audio confermata, mai su un'immagine. Indica i suoni e/o mantieni una soglia di livello: senza nessuno dei due non pu\xf2 mai scattare.",system:"L'impianto stesso: una telecamera o uno stream che cade, un nodo che esce, un aggiornamento disponibile. Non c'\xe8 un rilevamento dietro e non c'\xe8 un fotogramma da allegare."},dropTitle:"Verranno rimossi al salvataggio",dropHint:"Questo tipo di regola non pu\xf2 usarli, e tenerli la lascerebbe silenziosa.",condition:{systemEvent:"Evento di sistema",sensorKinds:"Tipi di sensore",eventTypeTokens:"Token del tipo di evento",source:"Origine del rilevamento",classes:"Classi di oggetti",classesExclude:"Classi escluse",minConfidence:"Affidabilit\xe0 minima",zones:"Zone",zonesExclude:"Zone escluse",customZones:"Zone personalizzate",crossing:"Attraversamento zona",labelEquals:"Etichetta uguale a",identities:"Volti noti",identitiesExclude:"Volti esclusi",plates:"Targhe note"},moreConditionsLabel:"Altre condizioni",showAdvanced:"Mostra avanzate",noConditions:"Nessuna condizione disponibile.",notForTrigger:"Non per questa attivazione",notForTriggerHint:"Non valutata per l'attivazione scelta \u2014 cambia attivazione per usarla.",mediaLabel:"Media",attachLabel:"Allegato",frameLabel:"L'immagine mostra",frame:{cropped:"Il soggetto",full:"Tutta la scena",boxed:"La scena, con i riquadri"},zoneCropLabel:"Ritaglia sulla zona",zoneCropHint:"Ritaglia l'immagine sulla zona della regola invece che sul soggetto o sull'intera scena.",gifLabel:"Allega una GIF",gifHint:"Una breve animazione ritagliata dal buffer live attorno al momento \u2014 la telecamera non deve essere in registrazione.",clipLabel:"Allega un video",clipHint:"Un MP4 dello stesso spezzone. Le destinazioni che non accettano video ricevono comunque l'immagine.",preRollLabel:"Secondi prima",postRollLabel:"Secondi dopo",profileLabel:"Qualit\xe0 del video",profile:{auto:"Automatica",high:"Alta",mid:"Media",low:"Bassa"},templateLabel:"Messaggio (facoltativo)",templateTitleLabel:"Titolo",templateBodyLabel:"Testo",templatePlaceholder:"Supporta i segnaposto {{var}}",save:"Salva modifiche",create:"Crea regola",addValue:"Aggiungi valore\u2026",removeTag:"Rimuovi {{value}}",clear:"Azzera",noCameras:"Nessuna telecamera disponibile \u2014 la regola vale per tutti i dispositivi.",plateText:"Testo targa\u2026",maxDistance:"Distanza massima",waitForEnhancementLabel:"Attendi il riconoscimento",waitForEnhancementHint:"Attivo: una sola notifica a fine traccia, con il nome. Disattivo: una subito senza nome, pi\xf9 una seconda se il nome arriva prima che la traccia si chiuda.",recognition:{noIdentities:"Nessuna persona salvata. Aggiungine una dal volto di un evento.",unknownIdentities:"Selezionati ma non presenti in galleria (una persona eliminata, o una regola vecchia salvata per nome). Rimuovi ci\xf2 che non vale pi\xf9.",identities:{off:"Chiunque",anyKnown:"Conosciuti",specific:"Queste persone",offHint:"Alla regola non importa chi sia: corrisponde anche una persona non riconosciuta.",anyKnownHint:"Solo le persone salvate in galleria, chiunque siano. Uno sconosciuto non corrisponde.",specificHint:"Solo le persone selezionate qui. La corrispondenza usa la persona salvata, quindi rinominarla non rompe la regola."},plates:{off:"Qualsiasi veicolo",anyKnown:"Targa letta",specific:"Queste targhe",offHint:"Alla regola non importa la targa: corrisponde anche un veicolo di cui non \xe8 stata letta.",anyKnownHint:"Solo i veicoli di cui la targa \xe8 stata effettivamente letta, qualunque essa sia.",specificHint:"Solo queste targhe, con corrispondenza tollerante \u2014 la lettura della targa non \xe8 mai perfetta."}},customZones:{empty:"Nessuna zona personalizzata. Scegli una camera e disegnane una.",pickCamera:"Camera su cui disegnare",noCameras:"Nessuna camera online su cui disegnare.",draw:"Disegna zona",zoneLabel:"Zona {{index}} ({{count}} punti)",remove:"Rimuovi zona {{index}}",title:"Disegna zona \u2014 {{name}}",hint:"Tocca per aggiungere punti, trascina un punto per spostarlo. Tocca il primo punto per chiudere.",loading:"Caricamento frame\u2026",cancel:"Annulla",clear:"Cancella",close:"Chiudi",confirm:"Conferma"},addWindow:"Aggiungi finestra",scheduleAlways:"Sempre attiva \u2014 aggiungi una finestra per limitare quando scatta.",scheduleInvert:"Attiva fuori dalle finestre",delivery:{immediate:"Immediata",trackEnd:"Fine traccia",deviceEvent:"Evento dispositivo",packageEvent:"Evento pacco",systemEvent:"Evento di sistema"},systemKinds:{"device-online":"Dispositivo online","device-offline":"Dispositivo offline","device-disabled":"Dispositivo spento","device-enabled":"Dispositivo acceso","camera-online":"Videocamera online","camera-offline":"Videocamera offline","camera-disabled":"Videocamera spenta","camera-enabled":"Videocamera accesa","stream-online":"Flusso online","stream-offline":"Flusso offline","node-online":"Nodo online","node-offline":"Nodo offline","node-inference-unavailable":"Nodo senza dispositivi di inferenza utilizzabili","detection-blind":"Telecamera che non rileva nulla","addon-crash-loop":"Crash loop addon (runner arreso)","alarm-arm-refused":"Inserimento allarme rifiutato","alarm-arming":"Allarme in inserimento","alarm-triggered":"Allarme scattato","alarm-armed":"Allarme inserito","alarm-disarmed":"Allarme disinserito","addon-update-available":"Aggiornamento addon disponibile","server-update-available":"Aggiornamento server disponibile","addon-updated":"Addon aggiornati","server-updated":"Server aggiornato","export-completed":"Export completato","device-battery-low":"Batteria scarica","device-battery-normal":"Batteria ripristinata"},systemFilters:{cameras:"Solo queste videocamere (facoltativo)",deviceTypes:"Solo questi tipi di dispositivo (facoltativo)",nodes:"Solo questi ID nodo (facoltativo)",packages:"Solo questi pacchetti addon (facoltativo)",addNode:"Aggiungi ID nodo\u2026",addPackage:"Aggiungi nome pacchetto\u2026"},media:{best:"Immagine migliore",bestMatching:"Migliore corrispondente",keyFrame:"Fotogramma chiave",none:"Nessun allegato"},source:{any:"Qualsiasi",pipeline:"Pipeline",onboard:"A bordo",sensor:"Sensore",audio:"Audio"},phase:{delivered:"Consegnato","picked-up":"Ritirato",both:"Entrambi"},zoneMatch:{any:"Almeno una",all:"Tutte"},group:{scope:"Ambito",class:"Classi",zones:"Zone",quality:"Qualit\xe0",label:"Identit\xe0 e targhe",device:"Evento dispositivo",package:"Pacco",system:"Eventi di sistema",schedule:"Programmazione",occupancy:"Occupazione",audio:"Suono"},taxonomy:{person:"Persone",vehicle:"Veicoli",animal:"Animali",audio:"Audio",sensor:"Sensori",control:"Comandi",custom:"Valori personalizzati",addCustom:"Aggiungi un valore\u2026"},weekday:{mon:"Lun",tue:"Mar",wed:"Mer",thu:"Gio",fri:"Ven",sat:"Sab",sun:"Dom"},crossing:{unset:"In entrata",exit:"In uscita",any:"Entrambe"},deviceStateNone:"Non impostato \u2014 questa regola non dipende da nessun altro dispositivo.",deviceStateSet:"Solo mentre il dispositivo {{deviceId}} \xe8: {{states}}. Si modifica dall'admin \u2014 questa app non pu\xf2 elencare tutti i dispositivi.",sceneGateNone:"Non impostato \u2014 questa regola non dipende da nessuna scena.",sceneGateSet:"Solo mentre la scena {{sceneId}} \xe8 {{state}}, leggendo {{read}}. La scena si sceglie dall'admin \u2014 questa app non pu\xf2 elencarle.",sceneReadDefault:"il booleano scelto dalla scena stessa",sceneReadLatched:"il latch (dall'ultimo riarmo)",sceneReadLive:"il verdetto attuale",sceneState:{matched:"coincidente (come catturata)",diverged:"divergente (cambiata)"},occupancy:{zoneLabel:"Zona",wholeFrame:"\u2014 intero fotogramma \u2014",zonesLoading:"Caricamento zone\u2026",zonesNeedCamera:"Scegli le telecamere qui sopra per selezionare una delle loro zone.",zonesNone:"Queste telecamere non hanno zone \u2014 il conteggio copre l\u2019intero fotogramma.",zoneMissing:"La zona \"{{id}}\" non esiste pi\xf9 su queste telecamere. La regola la conserva e non scatter\xe0 finch\xe9 non scegli un altro ambito.",classLabel:"Classe",anyClass:"\u2014 qualsiasi classe \u2014",classesNone:"L\u2019hub non ha inviato un vocabolario di classi \u2014 il conteggio copre ogni classe.",classMissing:"\"{{name}}\" non \xe8 una classe segnalata da queste telecamere. La regola la conserva e non scatter\xe0 finch\xe9 non ne scegli un\u2019altra.",opLabel:"Scatta quando",op:{"became-occupied":"Diventa occupata","became-free":"Diventa libera",">=":"Conteggio \u2265","<=":"Conteggio \u2264"},thresholdLabel:"Soglia",countLabel:"Conteggio",sustainLabel:"Mantieni per (secondi)",sustainInstantHint:"Con 0 secondi scatta al primo fotogramma che supera la soglia \u2014 aspettati notifiche ripetute da un soggetto che cammina sul bordo della zona. Di solito si usano 15 secondi.",hint:"Conta gli oggetti tracciati confermati dall\u2019analisi delle zone. Il cambiamento deve durare per tutta la finestra prima di scattare; senza uno snapshot per la telecamera o la zona la regola non scatta mai.",classesDropped:"Il filtro classi ({{classes}}) viene rimosso al salvataggio: un evento di occupazione porta una sola classe, quindi impedirebbe soltanto alla regola di scattare. Imposta invece la classe qui sopra."},audio:{modeLabel:"Come scatta",modeLabelOption:"\ud83d\udd0e Suoni",modeLevelOption:"\ud83d\udcc8 Volume",modeLabelHint:"Scatta quando abbastanza fotogrammi etichettati cadono in una finestra breve (predefinito 2 in 5 secondi). Un falso positivo di un solo fotogramma non arriva a 2; un episodio vero di solito ne etichetta due o tre. L\u2019altro freno \xe8 la pausa della regola.",modeLevelHint:"Scatta quando il suono resta abbastanza forte abbastanza a lungo: la finestra qui sotto \xe8 tutta la condizione.",labelsLabel:"Suoni",labelsHint:"Scegline almeno uno. Il classificatore etichetta solo uno o due fotogrammi per episodio, quindi una percentuale su una finestra non potrebbe mai confermarli \u2014 questo modo conta quei fotogrammi.",confirmHitsLabel:"Conferma dopo (fotogrammi)",confirmHitsHint:"Quanti fotogrammi etichettati devono cadere nella finestra prima di notificare. Predefinito 2 \u2014 un falso positivo di un solo fotogramma non ci arriva.",confirmWindowLabel:"entro (secondi)",confirmWindowHint:"La finestra che quei fotogrammi devono condividere. Predefinito 5 s. Due fotogrammi a sei secondi di distanza non confermano.",labelsUnknown:"Questa regola conserva {{labels}}, che questo hub non classifica. Resta com\u2019\xe8; toccalo per rimuoverlo.",dbLabel:"Pi\xf9 forte di (dBFS)",dbHint:"I dBFS sono negativi: 0 \xe8 il fondo scala, \u221296 \xe8 il silenzio \u2014 quindi un numero PI\xd9 ALTO \xe8 un filtro PI\xd9 STRETTO. Misurato su questo hub, un bambino che piange sta fra \u221255 e \u221226 dBFS: una soglia sopra \u221255 ne esclude la maggior parte.",hitPercentLabel:"Rilevamenti nella finestra (%)",hitPercentHint:"Quanta parte della finestra deve corrispondere prima di scattare. Predefinito 60%.",samplingLabel:"Finestra (secondi)",samplingHint:"La finestra deve essere PIENA prima di poter corrispondere \u2014 una finestra a met\xe0 non scatta mai. Predefinito 10s.",failClosedHint:"Scegli almeno un suono oppure imposta una soglia di livello. Senza nessuno dei due ogni campione conta come rilevamento e l\u2019hub rifiuta la regola invece di notificare sul silenzio.",hint:"Scatta sul SUONO prolungato, non su un\u2019immagine: una regola con questa condizione viene valutata solo su una finestra audio confermata, mai su un rilevamento o una traccia. Le telecamere coinvolte devono avere l\u2019analisi audio attiva."},zonePicker:{needCamera:"Seleziona prima una camera \u2014 le zone appartengono a una camera.",loading:"Caricamento zone\u2026",none:"Le camere selezionate non hanno zone.",missing:"La zona {{id}} non esiste pi\xf9 sulle camere selezionate"},dropReason:{occupancy:{sensorKinds:"Un cambio di occupazione non \xe8 un evento di un sensore: non porta con s\xe9 alcun tipo di sensore, quindi questa condizione non potr\xe0 mai corrispondere.",eventTypeTokens:"Un cambio di occupazione non porta con s\xe9 alcun token di evento del dispositivo \u2014 quello arriva da un emettitore di eventi, che il superamento di una soglia di conteggio non ha.",source:"Un cambio di occupazione \xe8 sempre prodotto dalla pipeline, quindi qualsiasi altra origine non potr\xe0 mai corrispondere e \xabpipeline\xbb non restringe nulla."},sound:{classes:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento, quindi questa condizione non potr\xe0 mai corrispondere \u2014 indica invece i suoni nella condizione Suono.",classesExclude:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento, quindi qui non c'\xe8 nulla da escludere \u2014 indica invece i suoni nella condizione Suono.",minConfidence:"La prova di una finestra audio \xe8 una percentuale di campioni, non il punteggio di un rilevatore: una soglia di affidabilit\xe0 non potr\xe0 mai essere soddisfatta.",zones:"Un suono non ha una posizione nell'inquadratura, quindi una zona non potr\xe0 mai corrispondere.",zonesExclude:"Un suono non ha una posizione nell'inquadratura, quindi una zona non potr\xe0 mai escluderlo.",customZones:"Un suono non ha una posizione nell'inquadratura, quindi un'area disegnata non potr\xe0 mai corrispondere.",crossing:"Un suono non ha una posizione nell'inquadratura, quindi non potr\xe0 mai attraversare il bordo di una zona.",labelEquals:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento e quindi nessuna etichetta \u2014 indica invece i suoni nella condizione Suono.",identities:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento, quindi non c'\xe8 alcun volto da riconoscere.",identitiesExclude:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento, quindi non c'\xe8 alcun volto da escludere.",plates:"Una regola audio scatta su ci\xf2 che la telecamera ha SENTITO. Il suo soggetto non contiene alcun rilevamento, quindi non c'\xe8 alcuna targa da leggere.",source:"Una finestra audio confermata \xe8 sempre marcata come soggetto audio, quindi qualsiasi altra origine non potr\xe0 mai corrispondere."}},ai:{sectionLabel:"Descrizione AI",enabledLabel:"Descrivi con l'AI",enabledHint:"Aggiunge a questa notifica una frase scritta da un modello di visione. Non trattiene mai la notifica: se il modello \xe8 freddo o irraggiungibile, l'avviso arriva senza la frase.",blurb:{occupancy:"Al modello vengono mostrati il fermo immagine e il conteggio che questa regola dichiara, e risponde se quel conteggio regge. La tua domanda guida ci\xf2 che guarda; la frase del verdetto la scrive l'hub, cos\xec un disaccordo lo dice sempre.","detection-immediate":"Al modello viene mostrato il fermo immagine preso nell'istante in cui la regola \xe8 scattata, e risponde alla tua domanda su di esso.","detection-track":"Al modello vengono mostrati l'inizio, il momento migliore e la fine del passaggio, e risponde alla tua domanda su cosa \xe8 successo."},profileLabel:"Modello",profileAuto:"Automatico",noProfiles:"Su questo hub non \xe8 configurato nessun modello con visione. Aggiungine uno dalle impostazioni admin prima di attivare questa sezione.",profilesUnavailable:"Questo hub non riesce a elencare i suoi modelli di visione. La sezione si salva lo stesso; l'hub sceglie il proprio modello predefinito.",languageLabel:"Lingua della risposta",languageAuto:"Predefinita dell'hub",language:{en:"Inglese",it:"Italiano"},maxWordsLabel:"Lunghezza",maxWordsHint:"Quante parole chiedere, all'incirca. \xc8 un'istruzione al modello, non un taglio: aspettati pi\xf9 o meno questa lunghezza, ogni tanto una parola in pi\xf9. Senza impostarla, i destinatari di questa regola danno {{words}}.",maxWordsVaries:"Quante parole chiedere, all'incirca. \xc8 un'istruzione al modello, non un taglio. I tuoi destinatari non concordano su un valore predefinito; il pi\xf9 stretto d\xe0 {{words}}, e senza impostarla ognuno usa il proprio.",promptLabel:"La tua domanda",occupancyContract:"La risposta resta un verdetto: l'hub chiede il conteggio, lo confronta con quello della regola e scrive da s\xe9 la conferma o la smentita. La tua domanda guida il modello, non pu\xf2 cambiare il formato della risposta."}}},targets:{add:"Aggiungi destinazione",empty:"Nessuna destinazione. Aggiungine una per ricevere notifiche.",loadError:"Impossibile caricare le destinazioni. Riprova.",pickKind:"Scegli un tipo di notifica",noKinds:"Nessun tipo di notifica disponibile.",kindUnavailable:"non disponibile",test:"Invia test",testing:"Invio\u2026",testOk:"Test consegnato",testFail:"Test fallito",edit:"Modifica",delete:"Elimina",cancel:"Annulla",save:"Salva modifiche",create:"Crea destinazione",addTitle:"Aggiungi destinazione {{kind}}",editTitle:"Modifica {{name}}",deleteConfirmTitle:"Elimina destinazione",deleteConfirmMessage:"Eliminare \"{{name}}\"? L'operazione non \xe8 reversibile.",form:{details:"Dettagli",config:"Configurazione",nameLabel:"Nome",nameHint:"Un'etichetta per riconoscere questa destinazione.",secretHint:"Lascia vuoto per mantenere il valore salvato."}},snooze:{title:"Silenzia",intro:"Silenzia TE, non tutta la casa \u2014 a meno che una regola non dica il contrario. Finisce da sola.",activeNone:"Non c'\xe8 niente in silenzio.",active:"In silenzio ora",past:"Finiti da poco",openTitle:"Silenzia per",scopeLabel:"Cosa silenziare",everything:"Tutto",aRule:"Una regola",aCamera:"Una telecamera",chooseRule:"Scegli una regola",chooseCamera:"Scegli una telecamera",camerasLoading:"Sto caricando le telecamere\u2026",noCameras:"Nessuna telecamera da silenziare.",globalLabel:"Silenzia per tutti",globalHelp:"Anche le altre persone smettono di ricevere le notifiche.",globalNotAllowed:"Questa regola si pu\xf2 silenziare solo per te.",summaryLabel:"Dimmi cosa ho perso",summaryHelp:"Alla fine della finestra arriva un riepilogo.",endNow:"Termina ora",endsIn:"finisce tra {{label}}",everyone:"per tutti",loadError:"Non riesco a caricare i silenzi.",createError:"Non riesco ad avviare il silenzio.",classesTitle:"Solo questi",classesHelp:"Se non tocchi nulla la finestra copre tutto. Scegli delle classi per silenziare solo quelle \u2014 il resto continua ad arrivarti.",everyClass:"Tutto",durations:{m10:"10 min",m30:"30 min",h1:"1 ora"},scope:{rule:"Una regola",device:"Una telecamera",all:"Tutto"},remaining:{ended:"finito",minutes:"{{minutes}} min",hours:"{{hours}}h",hoursMinutes:"{{hours}}h {{minutes}}m"},viewOnly:"Il tuo account pu\xf2 vedere le pause ma non aprirne una."},timelapse:{createTitle:"Nuovo timelapse",editTitle:"Modifica \xab{{name}}\xbb",namePlaceholder:"Vialetto di notte",enabledLabel:"Attivo",camerasHint:"Un video per telecamera. Una telecamera che non registra non pu\xf2 produrre un timelapse \u2014 l\u2019hub rifiuta il salvataggio e indica quale.",windowLabel:"Finestra",windowHint:"Le ore coperte. La finestra \xe8 la regola: inizia a raccogliere quando si apre e invia il video quando si chiude.",samplingLabel:"Campionamento",cadenceLabel:"Un fotogramma ogni (s)",framerateLabel:"Riproduzione (fps)",denseHint:"In prossimit\xe0 dei rilevamenti l\u2019hub campiona pi\xf9 fitto da solo. Se serve, imposta quel ritmo a mano nell\u2019amministrazione web.",previewHint:"Cosa mostra la notifica prima che tu apra il video.",preview:{image:"Immagine",gif:"GIF"},problem:{devices:"Scegli almeno una telecamera.",schedule:"Aggiungi almeno una finestra \u2014 un timelapse senza ore non parte mai."}},summary:{createTitle:"Nuovo riepilogo",editTitle:"Modifica \xab{{name}}\xbb",namePlaceholder:"Riepilogo della notte",enabledLabel:"Attivo",camerasHint:"Una sola immagine per tutte \u2014 lo scatto migliore di tutto ci\xf2 che \xe8 passato.",windowLabel:"Finestra",window:{motion:"Al movimento",schedule:"A orario"},motionHint:"Si apre al primo movimento su una qualsiasi di queste telecamere e resta aperta finch\xe9 ne arriva altro.",scheduleHint:"Orari fissi. Il riepilogo viene inviato alla chiusura della finestra.",quietLabel:"Chiudi dopo quiete (s)",maxWindowLabel:"Mai pi\xf9 lunga di (s)",advancedHint:"Quante immagini entrano, come vengono scelte e cosa viene chiesto all\u2019AI si impostano nell\u2019amministrazione web.",hubTooOld:"Su questo hub solo un amministratore pu\xf2 creare riepiloghi. Qui puoi vederli; aggiorna l\u2019hub per modificarli dall\u2019app.",problem:{devices:"Scegli almeno una telecamera.",window:"Controlla la finestra \u2014 un riepilogo a orario richiede delle ore e \xabmai pi\xf9 lunga di\xbb deve superare il periodo di quiete."}},family:{cameras_one:"{{count}} telecamera",cameras_other:"{{count}} telecamere",never:"Non ha ancora inviato nulla.",last:"Ultimo invio {{when}}.",off:"Disattivato \u2014 non verr\xe0 eseguito.",readOnly:"Creato da un amministratore. Qui puoi vederlo ma non modificarlo."}},login:{loginFailed:"Accesso fallito",verifyFailed:"Verifica fallita",serverUrl:"Server URL",username:"Username",password:"Password",showPassword:"Mostra password",hidePassword:"Nascondi password",signIn:"Accedi",signingIn:"Accesso\u2026",twoFactor:"Autenticazione a due fattori",totpHint:"Inserisci il codice a 6 cifre dall'app di autenticazione per accedere come ",verificationCode:"Codice di verifica",verifyAndSignIn:"Verifica e accedi",verifying:"Verifica\u2026",back:"Indietro",or:"oppure",signInWithCamStack:"Accedi con CamStack",hubSignInHint:"Apre la pagina di accesso del tuo hub e collega questa app senza digitare qui la password.",handoffFailed:"Accesso con CamStack non riuscito \u2014 riprova oppure usa nome utente e password",invalidServerUrl:"Inserisci prima un URL server valido (https://\u2026)"},live:{webUnsupported:"La vista live non \xe8 ancora disponibile nella versione web.",connecting:"Connessione allo stream live\u2026",error:"Impossibile caricare lo stream live.",retry:"Riprova",noConnection:"Nessuna connessione al server",failed:"Connessione fallita",errorPageLoad:"Caricamento della pagina del player fallito."},ptz:{title:"PTZ",notAvailable:"I controlli PTZ non sono disponibili per questa telecamera.",zoom:"Zoom",home:"Posizione iniziale",presets:"Preset",noPresets:"Nessun preset salvato."},navigation:{title:"Navigazione",notAvailable:"I comandi di navigazione non sono disponibili per questo dispositivo.",drive:"Guida",forward:"Avanti",left:"Gira a sinistra",right:"Gira a destra",turnAround:"Inverti",stop:"Stop",actions:"Azioni",sounds:"Suoni",light:"Luce",lightOn:"Luce accesa",lightOff:"Luce spenta",auto:"Auto",manual:"Manuale",levelUp:"Pi\xf9 luminosa",levelDown:"Meno luminosa",following:"sta seguendo",joystick:"Joystick di guida",joystickHint:"Trascina per guidare il robot; rilascia per fermarlo.",followMe:"Seguimi",returnToDock:"Torna alla base",moreControls:"Altri comandi",mode:{idle:"Fermo",cleaning:"Pulizia",spot:"Pulizia puntuale",following:"Sta seguendo",goto:"Verso il punto",returning:"Rientro alla base",paused:"In pausa",unknown:"Sconosciuto"}},timeline:{activityTitle:"Attivit\xe0",last24h:"Ultime 24h",loading:"Caricamento attivit\xe0\u2026",noActivity:"Nessuna attivit\xe0 nelle ultime 24 ore.",legendRecording:"Registrato",legendMotion:"Movimento",legendAudio:"Audio",showTimeline:"Mostra timeline",hideTimeline:"Nascondi timeline",faultStream:"Lo stream video non \xe8 disponibile.",faultRecordings:"Non \xe8 stato possibile caricare le registrazioni di questo giorno.",faultEvents:"Non \xe8 stato possibile caricare gli eventi di questo giorno.",faultDismiss:"Ignora",loadRetry:"Riprova",loadRetrying:"Riprovo\u2026",moreHistory:"C'\xe8 cronologia pi\xf9 vecchia non ancora mostrata.",scopeUnreadable_one:"Una videocamera di questa vista non \xe8 stata letta: qui mancano i suoi eventi e le sue registrazioni.",scopeUnreadable_other:"{{count}} videocamere di questa vista non sono state lette: qui mancano i loro eventi e le loro registrazioni.",scopeOverflow_one:"Questa vista ha una videocamera in pi\xf9 di quante la timeline riesca a leggerne insieme.",scopeOverflow_other:"Questa vista ha {{count}} videocamere in pi\xf9 di quante la timeline riesca a leggerne insieme.",scopeUnreadableAndOverflow:"{{unreadable}} videocamere non sono state lette e altre {{overflow}}, oltre il limite della timeline, non sono mostrate.",loadMoreHistory:"Carica altro",loadingMoreHistory:"Caricamento\u2026"},theater:{back:"Indietro",today:"Oggi",yesterday:"Ieri",prevDay:"Giorno precedente",nextDay:"Giorno successivo",selectDate:"Seleziona una data",live:"LIVE",now:"ORA",auto:"Auto",quality:"Qualit\xe0 stream",filterAll:"Tutti",filter_motion:"Movimento",filter_audio:"Audio",goToLive:"Vai al live",liveLockOn:"Blocco live attivo \u2014 navigando l'immagine resta in diretta",liveLockOff:"Blocco live disattivo \u2014 navigando parte la registrazione",recordLive:"Registra live",keepClip:"Salva la registrazione",keepClipTitle:"Tenere questo clip?",discardClip:"Scarta",saveToGallery:"Salva in Foto",shareClip:"Condividi",recordFailed:"Impossibile registrare la vista live",noRecording:"Nessuna registrazione",noRecordingHint:"Nessun filmato per questo momento",detailCount:"{{frames}} frame \xb7 {{count}} rilevamenti",detailTracks:"{{tracks}} tracce \xb7 {{count}} rilevamenti",detailEmpty:"Nessuna immagine di dettaglio per questo istante",detailSeek:"Vai a questo momento",zoneHint:"Trascina un rettangolo sul video per filtrare gli eventi per zona",zoneConfirm:"Conferma",zoneCancel:"Annulla",playbackBar:"Controlli di riproduzione",footerBar:"Strumenti timeline",filterTitle:"Filtri",zoomRange:"Intervallo di tempo",zoomSpanMinutes:"{{count}}m",zoomSpanHours:"{{count}}h",zoneFilter:"Filtro zona",detailSubjects_one:"{{count}} soggetto",detailSubjects_other:"{{count}} soggetti",zoneModeRect:"Rettangolo",zoneModePolygon:"Poligono",zoneClearPoints:"Pulisci",zoneHintPolygon:"Tocca per aggiungere punti \u2014 3 o pi\xf9",selectTime:"Ora",goSameTime:"Vai \u2014 stessa ora del giorno",recordingDaysFailed:"Non \xe8 stato possibile leggere i giorni con registrazioni.",recordingDaysPartial:"Alcune videocamere di questa vista non sono state lette: i giorni senza pallino potrebbero comunque avere registrazioni.",clusterOpenDetail:"Apri il dettaglio evento",clusterCarouselShow:"Apri il carosello del cluster",clusterCarouselHide:"Chiudi il carosello del cluster",clusterPrevImage:"Immagine precedente",clusterNextImage:"Immagine successiva",clusterCameras_one:"{{count}} telecamera",clusterCameras_other:"{{count}} telecamere",clipStartsAtSubjectAt:"La clip parte alle {{start}}, soggetto alle {{subject}}",clipEndsAt:"La clip termina alle {{end}}",legend:{open:"Legenda heatmap e timeline",title:"Legenda",heatmapTitle:"Heatmap delle 24 ore",heatmapRecordingTitle:"Registrazione",heatmapRecordingBody:"Linea rossa in alto sul nastro \u2014 copertura di quel tratto di giornata.",heatmapAudioTitle:"Audio",heatmapAudioBody:"Picchi dall'alto. Verde = basso, rosso = alto: la stessa scala a sei gradini del misuratore live.",heatmapBottomTitle:"Motion e detection",heatmapBottomBody:"La parte bassa di ogni slot \xe8 motion verde, oppure la classe prominente quando c'\xe8 object detection.",timelineTitle:"Colonna attivit\xe0",timelineRecordingTitle:"Registrazione",timelineRecordingBody:"Linea rossa continua all'estrema destra.",timelineMotionTitle:"Motion",timelineMotionBody:"Linea verde al centro.",timelineDetectionTitle:"Object detection",timelineDetectionBody:"Pallino sulla linea motion, del colore della classe prominente in quel momento.",timelineAudioTitle:"Livello audio",timelineAudioBody:"Linea all'estrema sinistra. Stessa scala verde\u2192rosso della heatmap e del misuratore live.",classesTitle:"Classi di detection",classPerson:"Persona",classPersonBody:"Persone e volti.",classVehicle:"Veicolo",classVehicleBody:"Auto, camion, bici e il resto della famiglia veicolo.",classAnimal:"Animale",classAnimalBody:"Cani, gatti, uccelli e altri animali."}},mediaKind:{crop:"Ritaglio oggetto",thumbnail:"Best shot",faceCrop:"Volto",plateCrop:"Targa",fullFrame:"Frame",fullFrameBoxed:"Riquadrato",keyFrame:"Frame chiave",firstFrame:"Primo",lastFrame:"Ultimo",snapshot:"Istantanea"},tracks:{crop:"Ritaglio",fullFrame:"Frame completo",bestShot:"Scatto migliore",media:"Media",noMedia:"Nessun media per questa traccia",mediaLoadError:"Impossibile caricare i media",mediaEntryLoading:"Caricamento del media\u2026",mediaEntryError:"Media presente in indice ma non leggibile",mediaEntryAbsent:"Non archiviato per questa traccia",path:"Percorso",pathSummary:"{{count}} punti \xb7 {{seconds}}s",pathNoLocalization:"nessuna posizione precisa",share:"Condividi",copyLink:"Copia link",linkCopied:"Link copiato",shareImage:"Condividi immagine",viewFullRes:"Risoluzione piena",fullResBadge:"Piena",zones:"Zone",audio:"Audio",prevTrack:"Evento precedente",nextTrack:"Evento successivo",reason:"Perch\xe9 rilevante",empty:"Nessuna traccia",recent:"Recenti",searchPlaceholder:"Cerca eventi (es. \"persona in rosso\")",searchSubmit:"Cerca",searchClear:"Cancella ricerca",noMatches:"Nessun evento corrispondente",person:"Persona",assignPerson:"Associa a persona",changePerson:"Cambia",notAssigned:"Non associata",matchConfidence:"Affidabilit\xe0 match",suggested:"Suggerito",suggestedUnknown:"Persona suggerita",suggestedConfirm:"Conferma",suggestedDismiss:"Ignora",assignFaceTitle:"Associa volto",newPersonPlaceholder:"Nome nuova persona\u2026",createAndAssign:"Crea e associa",assignFailed:"Associazione del volto non riuscita",removePerson:"Rimuovi persona",removePersonConfirmTitle:"Rimuovere la persona?",removePersonConfirmBody:"Questo scollega la persona da questo volto. Il volto torna tra quelli non associati e potr\xe0 essere riassociato in seguito.",disassociateFailed:"Rimozione della persona non riuscita",removePersonAll:"Rimuovi da tutti gli eventi",removePersonAllConfirmTitle:"Rimuovere da tutti gli eventi?",removePersonAllConfirmBody:"Questo scollega la persona da OGNI evento. Tutti i volti attualmente riconosciuti come questa persona tornano tra quelli non associati e potranno essere riassociati in seguito. La persona viene mantenuta.",disassociateAllFailed:"Rimozione della persona da tutti gli eventi non riuscita",existingPersons:"Persone",noPersons:"Ancora nessuna persona",metadata:"Metadati",markForTraining:"Segna per addestramento",markForTrainingHint:"Mantiene questa traccia e i suoi media oltre la conservazione",debugFlag:"Debug",debugFlagHint:"Segna questa traccia per un controllo diagnostico. Tieni premuto per modificare cosa controllare.",debugNotePromptTitle:"Cosa dobbiamo controllare?",debugNotePromptBody:"Descrivi cosa non torna in questo evento, con parole tue. Resta sulla traccia, cos\xec chi rivede il set di debug legge la domanda insieme ad essa.",debugNotePlaceholder:"es. il box salta sul cancello quando passa l\u2019auto",debugPreset:{lateStart:"Traccia partita in ritardo",betterShotExisted:"Best shot: c\u2019era un frame migliore (volto/targa)",lastFrameBeforeFirst:"Ultimo frame prima del primo",riderNotInKeyframe:"Due ruote: il conducente non \xe8 nel keyframe",twoSubjectsOneTrack:"Due soggetti nella stessa traccia",brokenTrack:"Traccia spezzata",edgeCropMirror:"Ritaglio sul bordo, immagine specchiata",noCrop:"Nessun ritaglio del soggetto",neverDetected:"Soggetto mai rilevato",falsePositive:"Non c\u2019era nulla"},debugReviewed:"Analizzata",debugReviewedHint:"Segna questa traccia debug come analizzata cos\xec esce dal filtro e dall'export",favourited:"Preferito",favouritedHint:"Mantiene questa traccia e i suoi media oltre la conservazione",copy:"Copia",copied:"Copiato","meta.trackId":"ID traccia","meta.eventId":"ID evento migliore","meta.deviceId":"ID dispositivo","meta.camera":"Telecamera","meta.className":"Classe","meta.label":"Etichetta","meta.firstSeen":"Prima apparizione","meta.lastSeen":"Ultima apparizione","meta.state":"Stato","meta.importance":"Importanza","meta.confidence":"Confidenza","meta.mediaKeys":"Chiavi media",rescore:{button:"Ricalcola le corrispondenze",failed:"Impossibile ricalcolare le corrispondenze",params:"Soglia {{threshold}} \xb7 margine {{margin}}",needsSamples:"{{count}} campioni \u2014 ne servono {{min}}",reembed:"Ricalcola l'embedding e riprova",reembedFailed:"Ricalcolo embedding fallito: {{reason}}",verdict:{"auto-assignable":"Verrebbe assegnata a {{name}}",ambiguous:"Due persone hanno punteggi troppo vicini \u2014 il margine lo impedisce",suggestion:"Plausibile, ma sotto la soglia di assegnazione automatica","below-threshold":"Nessuna corrispondenza nella galleria attuale","no-eligible-identity":"Nessuna persona ha ancora abbastanza campioni (ne servono {{min}})","empty-gallery":"Nella galleria non c'\xe8 nulla di confrontabile con questo volto","model-mismatch":"Questo volto \xe8 stato calcolato con un modello precedente \u2014 i punteggi non sono confrontabili"}}},accessories:{on:"Acceso",off:"Spento",dimUp:"Pi\xf9 luminoso",dimDown:"Meno luminoso",lock:"Blocca",unlock:"Sblocca",open:"Apri",close:"Chiudi",stop:"Ferma",arm:"Attiva",disarm:"Disattiva",onMotion:"Su movimento",openPercent:"Apertura {{percent}}",warmer:"Pi\xf9 caldo",cooler:"Pi\xf9 freddo",speedUp:"Pi\xf9 veloce",speedDown:"Pi\xf9 lento",oscillate:"Oscillazione",press:"Premi",play:"Riproduci",pause:"Pausa",previous:"Precedente",next:"Successivo",start:"Avvia",dock:"Rientra",locate:"Localizza",feed:"Eroga",feeding:"Erogazione\u2026",install:"Installa",installing:"Installazione\u2026",upToDate:"Aggiornato",increase:"Aumenta",decrease:"Diminuisci",select:"Seleziona",noEvent:"Nessun evento",buttonIndex:"Tasto {{index}}",mode:"Modalit\xe0",fanMode:"Modalit\xe0 ventola",preset:"Preset",direction:"Direzione",forward:"Avanti",reverse:"Indietro",away:"Assente",humidityUp:"Aumenta umidit\xe0",humidityDown:"Riduci umidit\xe0",swingVertical:"Oscillazione verticale",swingHorizontal:"Oscillazione orizzontale",setTemperature:"Temperatura impostata",currentTemperature:"Temperatura attuale",climateModes:{off:"Spento",heat:"Riscaldamento",cool:"Raffreddamento",auto:"Auto",heat_cool:"Caldo/Freddo",fan_only:"Ventola",dry:"Deumidificazione"}},updates:{otaReadyTitle:"Aggiornamento scaricato",otaReadyBody:"Riavviare l'app adesso per applicarlo? Con \"Pi\xf9 tardi\" si applica al prossimo avvio.",install:"Riavvia ora",later:"Pi\xf9 tardi",whatsNewTitle:"Novit\xe0 nella {{version}}",whatsNewHeading:"Novit\xe0",whatsNewPrevious:"Aggiornamenti precedenti",whatsNewRow:"Novit\xe0",whatsNewNone:"Nessuna nota per questa versione.",nativeRow:"Build dell'app",nativeUpToDate:"Aggiornata",nativeUnknown:"\u2014",nativeNewer:"Disponibile {{version}} ({{build}})",nativeNewerTitle:"\xc8 disponibile una nuova build dell'app",nativeNewerBody:"La versione {{version}} (build {{build}}) \xe8 disponibile. Da ora gli aggiornamenti la richiedono.",openTestFlight:"Apri TestFlight",openStore:"Apri lo store"},cameraMenu:{title:"Opzioni vista",gridCommonHint:"Gli overlay comuni a tutta la griglia \u2014 riquadri, bordo di evidenziazione e i suoi trigger, etichette dei cluster \u2014 si impostano una volta sola per la griglia, nella barra della griglia.",streamStats:"Statistiche stream",audioLevel:"Livello audio",densityTitle:"Densit\xe0 timeline",density_compact:"Compatta",density_medium:"Media",density_wide:"Ampia",densityCustom:"Personalizzata",showImportance:"Mostra importanza",showClass:"Mostra classe rilevata",timelineSection:"Timeline",managementTitle:"Gestione"},viewOptions:{groupDetection:"Overlay di rilevamento"},cameraShelf:{goTo:"Vai a questa telecamera",addToView:"Aggiungi alla vista",closeView:"Chiudi la vista"},cameraSwitches:{title:"Funzioni telecamera",loading:"Lettura delle funzioni\u2026",readFailed:"Impossibile leggere le funzioni della telecamera. Nulla \xe8 cambiato \u2014 non vengono mostrate anzich\xe9 mostrarle con uno stato ipotizzato.",writeFailed:"Modifica rifiutata e annullata. {{reason}}",offBadge:"OFF",badgeLabel_one:"{{count}} funzione disattivata",badgeLabel_other:"{{count}} funzioni disattivate",unavailableNoProvider:"Non disponibile \u2014 nessun componente di questa installazione la fornisce.",unavailableUnreachable:"Sconosciuto \u2014 il servizio che la gestisce non ha risposto.",unavailableNotConfigured:"Non offerta \u2014 non \xe8 ancora configurato nulla su cui agire.",unavailableNoPrivacyZones:"Non offerta \u2014 sulla telecamera non \xe8 disegnata nessuna zona di privacy. Disegnane una nell\u2019app della telecamera e l\u2019interruttore comparir\xe0.",unavailableDeviceDisabled:"Non offerta finch\xe9 la telecamera \xe8 spenta.",unavailableUnknown:"Non disponibile su questa telecamera."},stats:{title:"Statistiche stream",resolution:"Risoluzione",fps:"FPS",bitrate:"Bitrate",packetLoss:"Pacchetti persi",jitter:"Jitter",codec:"Codec",frames:"Frame (persi/totali)",waiting:"Misurazione\u2026",playbackHint:"Le statistiche WebRTC complete richiedono il player nativo."},exportActions:{title:"Cattura",recordingExport:"Esporta registrazione"},exportSelection:{start:"Seleziona un periodo da esportare",discard:"Scarta la selezione",save:"Salva il periodo selezionato",savePartial:"Salva il periodo selezionato \u2014 una parte non \xe8 registrata",title:"Esportazione",queued:"Esportazione in coda. La troverai in Esportazioni quando \xe8 pronta.",failed:"Non \xe8 stato possibile mettere in coda l'esportazione.",gapTitle:"Una parte di questo periodo non \xe8 registrata",gapMessage:"I {{duration}} selezionati attraversano un tratto senza registrazione. L'esportazione conterr\xe0 solo le parti registrate.",gapConfirm:"Esporta comunque"},exports:{title:"Esportazioni",empty:"Nessuna esportazione.",settingsHint:"Scarica clip registrate",range:"Intervallo",rangeStart:"Inizio",rangeEnd:"Fine",profile:"Profilo",noFootage:"Nessuna registrazione in questo intervallo.",speed:"Velocit\xe0",timelapse:"Timelapse",cadence:"Un fotogramma ogni",audio:"Audio",includeAudio:"Includi audio",audioUnavailable:"L'audio \xe8 disponibile solo a velocit\xe0 0,5\u20132\xd7.",retention:"Conserva per",life24h:"24 ore",life7d:"7 giorni",life30d:"30 giorni",deleteAfterDownload:"Elimina dopo il download",deleteAfterDownloadHint:"Rimuovi il file una volta scaricato.",notify:"Avvisa quando \xe8 pronto",creating:"Creazione\u2026",createAction:"Esporta",createFailed:"Impossibile creare l'esportazione.",withAudio:"con audio",variantRegular:"1\xd7",variantAccelerated:"Accelerato {{speed}}\xd7",variantSlow:"Rallentato {{speed}}\xd7",variantTimelapse:"Timelapse",expired:"Scaduto",expiresInDays:"Scade tra {{count}}g",expiresInHours:"Scade tra {{count}}h",expiresInMinutes:"Scade tra {{count}}m",downloadAction:"Scarica",downloadUnavailable:"Download non disponibile.",downloadFailed:"Download non riuscito.",cancelAction:"Annulla",cancelConfirmTitle:"Annullare l'esportazione?",cancelConfirmBody:"Interrompe il rendering ed elimina il file parziale.",deleteAction:"Elimina",deleteConfirmTitle:"Eliminare l'esportazione?",deleteConfirmBody:"Rimuove il file. La voce nella cronologia viene mantenuta.",dismiss:"Chiudi",state:{queued:"In coda",rendering:"Rendering",ready:"Pronto",failed:"Non riuscito",expired:"Scaduto",deleted:"Eliminato"}},library:{title:"Libreria",sections:{events:"Eventi",artifacts:"Artefatti",exports:"Esportazioni",review:"Revisione"}},artifacts:{title:"Artefatti",settingsHint:"Timelapse, clip e riepiloghi",empty:"Nessun artefatto.",emptyFiltered:"Nessun artefatto corrisponde a questi filtri.",loadError:"Impossibile caricare gli artefatti.",gone:"Questo artefatto non \xe8 pi\xf9 sull'hub.",expired:"Scaduto",expiredBody:"La finestra di conservazione \xe8 terminata e il file \xe8 stato rimosso.",expiresInDays:"Scade tra {{count}}g",expiresInHours:"Scade tra {{count}}h",expiresInMinutes:"Scade tra {{count}}m",retentionHint:"Conservato fino a 14 giorni. I file possono essere rimossi prima se l'hub raggiunge i limiti di spazio.",byRule:"Regola: {{name}}",allCameras:"Tutte le telecamere",cameraPlus:"{{name}} +{{count}}",close:"Chiudi",downloadAction:"Scarica",downloadUnavailable:"Download non disponibile.",downloadFailed:"Download non riuscito.",kind:{timelapse:"Timelapse","timelapse-preview":"Anteprima timelapse","summary-mosaic":"Mosaico riepilogo","event-gif":"GIF","event-clip":"MP4","event-still":"Foto"},time:{now:"Adesso",minutesAgo:"{{count}}m fa",hoursAgo:"{{count}}h fa",daysAgo:"{{count}}g fa"},range:{all:"Tutto",day:"24h",week:"7g",month:"30g"},filters:{toggle:"Filtri",kind:"Tipo",camera:"Telecamera",range:"Periodo",clear:"Azzera filtri"},detail:{kind:"Tipo",cameras:"Telecamere",rule:"Regola",captured:"Ripreso il",created:"Prodotto il",size:"Dimensione",format:"Formato",expiry:"Scadenza"}},streamBar:{play:"Riproduci",pause:"Pausa",scrubForward:"Avanzamento veloce",scrubBackward:"Riavvolgimento",mute:"Silenzia",unmute:"Riattiva audio",talkStart:"Inizia a parlare",talkStop:"Smetti di parlare",quality:"Qualit\xe0 stream",menu:"Opzioni vista",snapshot:"Istantanea",pip:"Picture in picture",fullscreen:"Schermo intero",exitFullscreen:"Esci da schermo intero"},playback:{servedTier:"In riproduzione {{tier}}",servedTierDegraded:"{{requested}} non disponibile qui \u2014 riproduco {{served}}",tier:{high:"Alta",mid:"Media",low:"Bassa"},prevFrame:"Frame precedente",nextFrame:"Frame successivo",speed:"Velocit\xe0 riproduzione",audioMuted:"Audio off a \u2260 1\xd7",audioOn:"Audio attivo"},cameraSwitcher:{title:"Cambia videocamera",empty:"Nessuna videocamera disponibile",openGrid:"Apri griglia ({{n}})",selectA11y:"Seleziona {{name}}",buildView_one:"Mostra questa videocamera",buildView_other:"Mostra queste {{count}} videocamere"},storage:{title:"Archiviazione",usageTitle:"Utilizzo",nodeTotal:"Totale nodo",defaultLocation:"Posizione predefinita",locationFree:"{{free}} liberi",retentionTitle:"Conservazione",pruneAction:"Applica conservazione ora",pruneConfirmTitle:"Applicare la conservazione?",pruneConfirmBody:"Elimina le registrazioni su {{name}} che superano la policy di conservazione.",pruneResult:"Recuperati {{bytes}} ({{buckets}} segmenti).",deleteTitle:"Elimina registrazioni",deleteAction:"Elimina",deleteConfirmTitle:"Eliminare le registrazioni?",deleteConfirmBody:"Elimina definitivamente {{range}} di registrazioni su {{name}}. Operazione irreversibile.",deleteResult:"Recuperati {{bytes}} ({{buckets}} segmenti).",cancel:"Annulla",window24h:"Ultime 24h",window7d:"Ultimi 7 giorni",window30d:"Ultimi 30 giorni",windowAll:"Tutto"},eventsMgmt:{title:"Eventi",footprintTitle:"Ingombro",rowsBytes:"{{rows}} eventi \xb7 {{bytes}}",clusterTotal:"Totale cluster",pruneTitle:"Elimina pi\xf9 vecchi di",pruneHint:"Si applica a tutte le telecamere.",pruneAction:"Elimina",pruneConfirmTitle:"Eliminare gli eventi vecchi?",pruneConfirmBody:"Elimina gli eventi pi\xf9 vecchi di {{range}} su TUTTE le telecamere. Operazione irreversibile.",pruneResult:"Eliminati {{count}} eventi.",deleteTitle:"Elimina eventi telecamera",deleteAction:"Elimina tutti gli eventi di questa telecamera",deleteConfirmTitle:"Eliminare tutti gli eventi?",deleteConfirmBody:"Elimina definitivamente ogni evento di {{name}}. Operazione irreversibile.",deleteResult:"Eliminati {{count}} eventi.",cancel:"Annulla",older24h:"24 ore",older7d:"7 giorni",older30d:"30 giorni"},overlay:{title:"Overlay",liveSection:"Indicatori live",readoutsSection:"Sensori e valori",layersLabel:"Riquadri sull'immagine",layerMotion:"Movimento",layerObjects:"Oggetti",layerDiscarded:"Scartate",layerStationary:"Stazionarie",layerDiscardedHint:"Disegna anche, con tratteggio, le rilevazioni quasi accettate e quelle fuori zona delle classi che hai abilitato \u2014 soggetti rimasti appena sotto la soglia di confidenza, o fuori da una regola di zona. Utile quando i riquadri lampeggiano su un soggetto in movimento. La pillola confronta ci\xf2 che il modello ha visto con ci\xf2 che \xe8 stato tenuto.",layerStationaryHint:"Disegna gli oggetti che si sono fermati e non sono pi\xf9 tracciati \u2014 un'auto parcheggiata, un bidone lasciato fuori. L'hub sopprime le loro rilevazioni, quindi non possono mai comparire sotto Oggetti o Scartate.",diagCounts:"modello {{saw}} \xb7 tenuti {{kept}}",diagHidden:"{{hidden}} nascosti",diagOffTopic:"{{offTopic}} non pertinenti",diagShed:"frame saltato \xb7 {{reason}}",reasonThreshold:"sotto soglia",reasonFullFrame:"guardia full-frame",reasonNms:"soppresso da NMS",reasonClassFilter:"filtro classe",reasonZoneGate:"regola di zona",motionBadge:"Badge movimento",highlightBorder:"Bordo evidenziazione",occupancy:"Occupazione",addReadout:"Aggiungi un valore",removeReadout:"Rimuovi valore",readoutsHint:"Fissa un valore live sull'immagine: il livello audio, o un sensore collegato a questa telecamera.",noFields:"Questo dispositivo non pubblica valori live.",thisCamera:"Questa telecamera",audioDbfs:"Livello audio",liveOnlyHint:"Si disegnano solo sull'immagine live \u2014 non in riproduzione n\xe9 in pausa.",positions:{off:"Off","top-left":"In alto a sinistra","top-center":"In alto al centro","top-right":"In alto a destra","left-center":"Al centro a sinistra","right-center":"Al centro a destra","bottom-left":"In basso a sinistra","bottom-center":"In basso al centro","bottom-right":"In basso a destra"}},clips:{title:"Clip",loading:"Caricamento clip\u2026",empty:"Nessuna clip per questa telecamera nell'intervallo caricato.",summary_one:"{{count}} clip",summary_other:"{{count}} clip",collapsedHint:"{{duration}} saltati",hiddenHint_one:"{{count}} nascosta dal filtro sorgenti",hiddenHint_other:"{{count}} nascoste dal filtro sorgenti",segmentLabel:"Clip delle {{time}}, durata {{duration}}",gapLabel:"Salto di {{duration}}",notPlayable:"non ancora riproducibile",kind_motion:"Movimento",kind_object:"Oggetto",kind_audio:"Audio",kind_native:"Telecamera",sourceAnalytics:"Registrazione",sourceOnboard:"Telecamera ({{vendor}})",sourceHksv:"HomeKit",sourceUnknown:"{{vendor}}",unitDay:"g",unitHour:"o",unitMinute:"m",unitSecond:"s"},eventsEmbed:{section:"Embed dell'hub (anteprima)",title:"Embed eventi",count:"{{count}} mostrati",openPreview:"Anteprima embed",openPreviewHint:"Apre la superficie eventi ospitata dall'hub accanto a questa pagina. Non sostituisce nulla.",view_reel:"Striscia",view_gallery:"Galleria",error:"Impossibile caricare gli eventi",retry:"Riprova",empty:"Nessun evento",emptyFiltered:"Nessun evento corrisponde a questo filtro",end:"\xb7 fine \xb7"},eventsShare:{title:"Link embed eventi",openBuilder:"Crea link embed",openBuilderHint:"Costruisci un URL autonomo per una dashboard o un iframe.",view:"Vista",viewReel:"Striscia",viewGallery:"Galleria",columns:"Colonne",rows:"Righe",auto:"Auto",thumb:"Dimensione miniature",thumbSmall:"Piccola",thumbMedium:"Media",thumbLarge:"Grande",theme:"Tema",themeAuto:"Auto",themeDark:"Scuro",themeLight:"Chiaro",fields:"Testo della card",field_label:"Titolo",field_sublabel:"Classe",field_camera:"Telecamera",field_time:"Ora",field_badges:"Badge",cameras:"Telecamere",camerasAll:"Tutte le telecamere visibili al link",camerasCount:"{{count}} selezionate",preview:"Anteprima del link",shareMediaNotice:"Un link di condivisione non riesce a caricare le miniature. I token di condivisione non hanno alcun accesso all'endpoint dei media: la pagina elenca gli eventi, senza le immagini.",copyLink:"Crea link",chip:"Link embed",semanticScopeNotice:"La ricerca semantica gira su tutte le telecamere e viene poi ristretta a questo link: un link con poche telecamere pu\xf2 quindi restituire pochi risultati su un cluster grande."},eventsCard:{unassignedFace:"volto non assegnato",reviewed:"analizzata",debug:"debug",train:"addestramento",favourite:"preferito",active:"attivo",loadingMore:"Caricamento altri eventi"},gridTile:{play:"Riproduci",pause:"Pausa",listen:"Ascolta",mute:"Silenzia",talk:"Parla",stopTalk:"Termina",ptz:"PTZ",linkedDevices:"Dispositivi collegati",viewOptions:"Opzioni di visualizzazione",moreActions:"Altre azioni",open:"Apri",removeFromView:"Togli dalla vista",resizeWidth:"Ridimensiona larghezza",resizeHeight:"Ridimensiona altezza",noActiveCameras:"Nessuna videocamera attiva",camera:"Videocamera"},battery:{holdHint:"La camera \xe8 a batteria: premi play per avviare lo stream e svegliarla.",startStreamA11y:"Avvia lo stream e sveglia la camera a batteria"},faceReview:{loading:"Caricamento volti\u2026",loadError:"Impossibile caricare i volti.",empty:"Nessun volto da rivedere al momento.",previewClose:"Chiudi",pickIdentityTitle:"Assegna a\u2026",assignFailed:"Impossibile assegnare questo volto.",assign:"Assegna",assignedSuccess:"Assegnato a {{name}}.",confirmAssignTitle:"Assegna volti",confidence:"Affidabilit\xe0",groupSize:"{{count}} volti in questo gruppo",filterAssigned:"Assegnate",filterSuggested:"Suggerite",filterUnassigned:"Non assegnate",certaintyCertain:"quasi certo",certaintyProbable:"probabile",certaintyUncertain:"incerto",analyzeButton:"Analizza le ultime {{count}} non assegnate",analyzeModalTitle:"Gruppi simili",analyzeLoading:"Ricerca gruppi simili\u2026",analyzeEmpty:"Nessun gruppo simile trovato.",analyzeConfirmBody:"Assegnare {{count}} volti in {{groups}} gruppi?",analyzeResult:"Assegnati {{assigned}} di {{count}} volti.",analyzeAssignFailed:"Alcuni volti sono stati rifiutati e restano non assegnati.",recomputeButton:"Ricalcola i suggerimenti",recomputeProgress:"Ricalcolo {{done}}/{{total}}\u2026",recomputeDone:"Ricalcolati {{count}} volti.",analyzeCoverage:"{{grouped}} volti su {{pool}} rientrano in {{groups}} gruppi simili. Gli altri, sui {{requested}} analizzati, qui non hanno un simile.",groupExcludeFace:"Escludi questo volto dal gruppo",groupIncludeFace:"Rimetti questo volto nel gruppo",groupPickPerson:"Assegna questo gruppo a",groupShowDetail:"Mostra questo volto ingrandito",groupDetailExclude:"Escludi dal gruppo",groupDetailInclude:"Rimetti nel gruppo",assignedManySuccess:"Assegnati {{count}} volti a {{name}}.",detailTitleMany:"Assegna {{count}} volti selezionati a\u2026",knownPeople:"Persone conosciute",filtersButton:"Filtri",filtersButtonActive:"Filtri ({{count}})",sortLabel:"Ordina per",sortByCertainty:"Certezza",sortByDate:"Data",sortAscending:"Ordine crescente \u2014 tocca per decrescente",sortDescending:"Ordine decrescente \u2014 tocca per crescente",dateLabel:"Intervallo di date",rangeAll:"Tutte",rangeToday:"Oggi",rangeYesterday:"Ieri",rangeLast7:"7 giorni",rangeLast30:"30 giorni",cameraLabel:"Telecamera",cameraNone:"Nessuna telecamera nei volti caricati.",selectButton:"Seleziona",selectDone:"Fatto",selectionCount:"{{count}} selezionati",applySuggestions:"Applica {{count}} suggerimenti",applySuggestionsBlocked:"{{count}} dei volti selezionati non ha un suggerimento \u2014 deselezionali, oppure usa Assegna.",applySuggestionsResult:"Applicati {{count}} suggerimenti su {{total}}, per {{groups}} persone.",emptyFiltered:"Nessun volto corrisponde a questi filtri.",partialWindowHint:"Stai filtrando i {{count}} volti caricati finora \u2014 scorri in basso per caricarne di pi\xf9 vecchi.",auditTitle:"Rianalizza i campioni di {{name}}",auditSummary:"{{flagged}} campioni su {{total}} da guardare",auditLooksLike:"Somiglia a {{name}} ({{foreign}}) pi\xf9 che a questa persona ({{self}})",auditSelfOnly:"Concorda con gli altri campioni di questa persona: {{self}}",auditNotComparable:"Arruolato con un altro modello di volto \u2014 non \xe8 confrontabile, nemmeno per dire che va bene.",auditFromPhoto:"foto",auditRemoveTitle:"Rimuovi questo campione",auditRemoveBody:"Il campione smette di insegnare al riconoscimento. Non cambia nient\u2019altro, e la faccia da cui proviene resta dov\u2019\xe8.",auditUnavailable:"Questo hub non sa ancora rianalizzare una galleria.",auditOpen:"Rianalizza campioni"},statusDetail:{batteryTitle:"Batteria",linkTitle:"Collegamento",openBatteryA11y:"Dettagli batteria",openLinkA11y:"Dettagli collegamento",close:"Chiudi",label:{charge:"Carica",charging:"Alimentazione",state:"Stato",linkType:"Collegamento",signal:"Segnale",ssid:"Rete"},value:{unknown:"Non noto",notApplicable:"Non applicabile",binary:"Solo scarica / ok, senza percentuale",sleeping:"In sospensione",chargingDc:"In carica (rete)",chargingSolar:"In carica (solare)",chargingNone:"Non in carica",wifi:"Wi-Fi",ethernet:"Cavo (Ethernet)",cellular:"Cellulare",linkUnknown:"Non noto"}}},prototype:{today:"Oggi",yesterday:"Ieri",now:"ORA",endOfDay:"FINE GIORNATA",loading:"Caricamento...",timeline:"Timeline",events:"Eventi",playClip:"Riproduci clip",goToNow:"ORA",noEvents:"Nessun evento"},eventKind:{motion:"Movimento",audio:"Audio",person:"Persona",vehicle:"Veicolo",animal:"Animale",package:"Pacco",sensor:"Sensore",control:"Controllo",car:"Auto",truck:"Camion",bus:"Autobus",motorcycle:"Motocicletta",bicycle:"Bicicletta",airplane:"Aereo",boat:"Barca",train:"Treno",bird:"Uccello",cat:"Gatto",dog:"Cane",horse:"Cavallo",sheep:"Pecora",cow:"Mucca",elephant:"Elefante",bear:"Orso",zebra:"Zebra",giraffe:"Giraffa",contact:"Contatto","motion-sensor":"Sensore movimento",smoke:"Fumo",flood:"Allagamento",gas:"Gas","carbon-monoxide":"Monossido di carbonio",vibration:"Vibrazione",tamper:"Manomissione",presence:"Presenza","enum-sensor":"Stato sensore","device-event":"Evento dispositivo",lock:"Serratura",switch:"Interruttore",siren:"Sirena",button:"Pulsante",doorbell:"Campanello","package-delivered":"Pacco consegnato","package-picked-up":"Pacco ritirato","audio-speech":"Voce","audio-music":"Musica","audio-dog":"Cane","audio-doorbell":"Campanello","audio-siren":"Sirena","audio-alarm":"Allarme","audio-animal":"Animale (altro)","audio-bird":"Uccello","audio-cat":"Gatto","audio-crowd":"Folla / Chiacchiericcio","audio-crying":"Pianto / Neonato","audio-door":"Porta","audio-engine":"Motore","audio-fire":"Fuoco / Fumo","audio-footsteps":"Passi","audio-glass_breaking":"Vetro rotto","audio-gunshot":"Sparo / Esplosione","audio-laughter":"Risata","audio-scream":"Urlo","audio-silence":"Silenzio","audio-telephone":"Telefono","audio-tools":"Utensili / Lavori","audio-vehicle":"Veicolo","audio-water":"Acqua","audio-wind":"Vento / Maltempo"}}},2300,[]);
3676
3676
  __d(function(g,r,i,a,m,_e,_d){"use strict";var e,t=r(_d[0]),n=(e=t)&&e.__esModule?e:{default:e},u=(function(e){if(e&&e.__esModule)return e;var t={};return e&&Object.keys(e).forEach(function(n){var u=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,u.get?u:{enumerable:!0,get:function(){return e[n]}})}),t.default=e,t})(r(_d[1])),c=r(_d[2]);(0,c.setEmbedCacheBust)((0,c.deriveEmbedCacheBust)({updateId:(function(){try{return u.updateId}catch{return null}})(),appVersion:(function(){try{return n.default.expoConfig?.version??null}catch{return null}})()}))},2301,[288,2051,1673]);
3677
3677
  __d(function(g,r,i,a,m,e,d){"use strict";var t=r(d[0]),s=r(d[1]),S=r(d[2]);t.useCameraPrefsStore.getState().hydrate(),s.useGridStore.getState().hydrate(),S.useLastCameraStore.getState().hydrate()},2302,[1565,1566,1124]);
3678
3678
  __d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),_e.RootProviders=function(t){const f=(0,e.c)(7),{children:v}=t;let b,P,S,M,C,E;f[0]===Symbol.for("react.memo_cache_sentinel")?(b={flex:1},f[0]=b):b=f[0];f[1]===Symbol.for("react.memo_cache_sentinel")?(P=(0,R.jsx)(c.ThemedStatusBar,{}),f[1]=P):P=f[1];f[2]===Symbol.for("react.memo_cache_sentinel")?(S=(0,R.jsx)(x.OtaUpdateGate,{}),M=(0,R.jsx)(j.WhatsNewGate,{}),C=(0,R.jsx)(h.EmbedWarmup,{}),f[2]=S,f[3]=M,f[4]=C):(S=f[2],M=f[3],C=f[4]);f[5]!==v?(E=(0,R.jsx)(p.RootErrorBoundary,{children:(0,R.jsx)(n.GestureHandlerRootView,{style:b,children:(0,R.jsx)(o.SafeAreaProvider,{initialMetrics:o.initialWindowMetrics,children:(0,R.jsx)(s.QueryClientProvider,{client:B,children:(0,R.jsxs)(l.ThemeProvider,{children:[P,(0,R.jsx)(y.ConfirmProvider,{children:(0,R.jsx)(u.ServerProvider,{children:(0,R.jsxs)(_.LoggerBridge,{children:[S,M,C,v]})})})]})})})})}),f[5]=v,f[6]=E):E=f[6];return E};var e=r(d[0]);r(d[1]);var t,n=r(d[2]),o=r(d[3]),s=r(d[4]),l=r(d[5]),c=r(d[6]),u=r(d[7]),h=r(d[8]),x=r(d[9]),j=r(d[10]),_=r(d[11]),f=r(d[12]),v=r(d[13]),p=r(d[14]),y=r(d[15]),b=r(d[16]),P=(t=b)&&t.__esModule?t:{default:t},S=r(d[17]),M=r(d[18]),R=r(d[19]);const B=(0,f.createQueryClient)();(0,v.bindQueryFocusToAppState)(),(0,M.publishRunningBundle)(),(0,S.installCrashReporter)(),(0,S.reportPreviousExit)(),(0,S.bindExitMarkerToAppState)(P.default)},2303,[15,17,1685,466,1513,782,2304,1575,2305,2311,2312,2313,1580,2314,2315,1815,223,2063,2062,10]);