PageSourceSearch

https://atsminiradio.com/_next/static/chunks/04m38yigtkbl7.js

js atsminiradio.com collected 2026-10-09 22:05:08 UTC 34,777 bytes, 1 lines download raw bytes

1(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,26569,32340,e=>{"use strict";var t=e.i(43476),r=e.i(71645),a=e.i(69877),n=e.i(74314),o=e.i(55634);let u=()=>()=>{},l=()=>!1,s=()=>"u">typeof navigator&&void 0!==navigator.bluetooth,i=()=>"u">typeof navigator&&void 0!==navigator.serial,d="ats-mini:transport-changed",c=()=>{try{let e=window.localStorage.getItem(o.default.transport.storageKey);if("usb"===e||"ble"===e){if("ble"===e&&!s())return"usb";return e}}catch{}return o.default.transport.default},m=()=>o.default.transport.default,f=e=>(window.addEventListener(d,e),window.addEventListener("storage",e),()=>{window.removeEventListener(d,e),window.removeEventListener("storage",e)});var g=e.i(12186);e.i(78441);var p=e.i(59802),y=e.i(91993);let b=(e,t=null)=>{if(!e)return;let r=document.createElement("a");r.href=e,r.download=t||`ats-screenshot-${Date.now()}.bmp`,document.body.appendChild(r),r.click(),document.body.removeChild(r)};function h({autoScreenshot:e,connected:t,capabilities:r}){return!!e&&!!t&&r?.screenshotSlow!==!0}function S(e){return e?.screenshot==="binary-bmp"&&e?.screenshotSlow!==!0}e.s(["default",0,b],32340);var v=e.i(61145),w=e.i(98236);function C(){return v.default.idle(2e3+w.PACED_MAX_PENDING*(a.default.commandGapMs||0))}var k=e.i(84497),M=e.i(35256);let E=async(e,t,r=!1,a,{names:o=!1}={})=>{if(!Number.isInteger(a)||a<=0)throw Error(`loadMemorySlots: slotCount is required and must be a positive integer (received ${a})`);if(!e)return;let u=new FileReader;u.onload=e=>{try{let u=JSON.parse(e.target.result);if(!Array.isArray(u))return void n.default.emit("addLog",{message:(0,p.t)("memorySlots.load.invalidFormat")});let l=u.slice(0,a).map((e,t)=>{let r={slotNumber:e.slotNumber||t+1,band:(0,k.toDeviceBandName)(e.band||""),frequency:Number(e.freq)||0,mode:e.mode||"",name:o?(e=>{if("string"!=typeof e)return"";let t=e.trim();return(0,M.memoryNameError)(t)?(0,M.toMemoryName)(t):t})(e.name):""};return r.frequency>0&&r.band&&r.mode?{...r,modified:!0}:r});r?(t(e=>{let t=[...e];return l.forEach((e,r)=>{e.frequency>0&&e.band&&e.mode&&(t[r]=e)}),t.slice(0,a)}),n.default.emit("addLog",{message:(0,p.t)("memorySlots.load.appended",{count:l.filter(e=>e.frequency>0).length})})):(t(l),n.default.emit("addLog",{message:(0,p.t)("memorySlots.load.loaded",{count:l.filter(e=>e.frequency>0).length})}))}catch(e){n.default.emit("addLog",{message:(0,p.t)("memorySlots.load.fileError",{message:e.message})})}},u.onerror=()=>{n.default.emit("addLog",{message:(0,p.t)("memorySlots.load.readError")})},u.readAsText(e)},q=1500,F=(e,t=q)=>new Promise(r=>{let a=setTimeout(()=>{n.default.off("memorySlot",o),r({ok:!1,data:null})},t),o=t=>{t.index===e&&(clearTimeout(a),n.default.off("memorySlot",o),r({ok:!0,data:t}))};n.default.on("memorySlot",o)}),N=async(e,t,r,{names:a=!1}={})=>{if(!t||!t.writer)return n.default.emit("addLog",{message:(0,p.t)("memorySlots.upload.notConnected")}),{success:!1,uploadedCount:0,errorCount:1,errorMessages:[(0,p.t)("memorySlots.upload.notConnectedReason")]};let o=new TextEncoder,u=0,l=0,s=0,i=0,d=[],c=e.filter(e=>e&&e.frequency&&e.frequency>0&&e.band&&e.mode),m=e.map(e=>e?.slotNumber||0).filter(e=>e>0),f=m.length>0?Math.max(...m):0;if(0===c.length&&0===f){let e=(0,p.t)("memorySlots.upload.nothingToUpload");return n.default.emit("addLog",{message:e}),{success:!1,uploadedCount:0,errorCount:0,errorMessages:[e]}}let g=new Set(c.map(e=>e.slotNumber).filter(e=>e>0));try{let e,m=f-g.size,y=c.length>0,b=m>0;e=y&&b?(0,p.t)("memorySlots.upload.startingBoth",{updateCount:c.length,clearCount:m}):y?(0,p.t)("memorySlots.upload.startingUpdateOnly",{updateCount:c.length}):(0,p.t)("memorySlots.upload.startingClearOnly",{clearCount:m}),n.default.emit("addLog",{message:e});for(let e=1;e<=f;e++){let m,y=e.toString().padStart(2,"0"),b=g.has(e)?c.find(t=>t.slotNumber===e):null;if(b&&b.frequency>0?m=(0,M.formatMemoryWrite)(b,{names:a}):(m=(0,M.formatMemoryWrite)({slotNumber:e},{names:a}),s++),m){try{let r=o.encode(m),a=F(e);await t.writer.write(r);let{ok:n}=await a;n&&i++}catch(t){l++;let e=(0,p.t)("memorySlots.upload.slotError",{slotIndex:y,message:t.message});d.push(e),n.default.emit("addLog",{message:(0,p.t)("memorySlots.upload.errorUploading",{slotIndex:y,message:t.message})})}u++,r&&r(u,f),u%10==0&&n.default.emit("addLog",{message:(0,p.t)("memorySlots.upload.progress",{current:u,total:f})}),await new Promise(e=>setTimeout(e,50))}}let h=(0,p.t)("memorySlots.upload.complete",{updatedCount:c.length,clearedCount:s,ackedCount:i,errorCount:l});return n.default.emit("addLog",{message:h}),{success:0===l,uploadedCount:c.length,errorCount:l,clearedCount:s,errorMessages:d}}catch(t){let e=(0,p.t)("memorySlots.upload.fatalError",{message:t.message});return n.default.emit("addLog",{message:e}),d.push(e),{success:!1,uploadedCount:u,errorCount:l+1,clearedCount:s,errorMessages:d}}},x=[];var R=e.i(78383);let T=()=>()=>{},L=()=>"documentPictureInPicture"in window,D=()=>!1;var H=e.i(22539),z=e.i(13462),I=e.i(9730);let B="Apply cancelled",P=async(e,t)=>{await a.default.writeRaw(e);try{return await ((e,t=3e3)=>new Promise((r,a)=>{let o=!1,u=()=>{o=!0,clearInterval(l),clearTimeout(s),n.default.off("serialLog",i)},l=setInterval(()=>{e?.current&&!o&&(u(),a(Error(B)))},100),s=setTimeout(()=>{o||(u(),a(Error((0,p.t)("shareConfig.timeoutWaitingForData"))))},t),i=e=>{o||(u(),r(e))};n.default.on("serialLog",i)}))(t,3e3)}catch(e){if(e.message===B)throw e;return null}},A=(e,t,r)=>{if(t===r||t<0||r<0||e<=1)return{dir:"next",count:0};let a=(r-t+e)%e,n=(t-r+e)%e;return a<=n?{dir:"next",count:a}:{dir:"prev",count:n}},O=async(e,t,r,a)=>{let n=null;for(let o=0;o<t;o++){if(r?.current)throw Error(B);let t=await P(e,r);if(t&&(n=t),a&&n&&a(n))break}return n},U=async({upChar:e,downChar:t,current:r,target:a,readField:n,abortRef
1:o})=>{let u=r,l=a>u?"up":"down",s=0;for(let r=0;r<128&&u!==a;r++){if(o?.current)throw Error(B);let r=await P("up"===l?e:t,o),i=r?n(r):null;if(!Number.isFinite(i)){if(++s>=3)break;continue}if(s=0,i===u)break;Math.abs(i-a)>Math.abs(u-a)&&(l="up"===l?"down":"up"),u=i}return u};async function j(e,t,r,n,o=(0,I.getDevice)(I.DEFAULT_DEVICE_ID)){if(!1===(o.resolveCapabilities?.()||o.capabilities||{}).burstCommands)throw Error((0,p.t)("tuning.cascadeRefusedGated"));let u=t();if(!u)return;let l=o.commands;if(e.step){let a=(0,z.getStepTable)(u.mode),o=a.findIndex(e=>e.label===u.stepIdx),s=a.findIndex(t=>t.label===e.step);if(o>=0&&s>=0&&o!==s){n?.((0,p.t)("shareConfig.settingStep",{step:e.step}));let{dir:i,count:d}=A(a.length,o,s);await O("next"===i?l.nextStep:l.previousStep,d,r,t=>t.stepIdx===e.step),u=t()||u}}if(e.bw&&"FM"!==u.mode){let a=(0,z.getBandwidthTable)(u.mode),o=a.findIndex(e=>e.desc===u.bandwidthIdx),s=a.findIndex(t=>t.desc===e.bw);if(o>=0&&s>=0&&o!==s){n?.((0,p.t)("shareConfig.settingBandwidth",{bw:e.bw}));let{dir:i,count:d}=A(a.length,o,s);await O("next"===i?l.nextBandwidth:l.previousBandwidth,d,r,t=>t.bandwidthIdx===e.bw),u=t()||u}}Number.isFinite(e.agc)&&Number.isFinite(u.agcIdx)&&e.agc!==u.agcIdx&&(n?.((0,p.t)("shareConfig.settingAgc",{agc:e.agc})),await U({upChar:l.agcUp,downChar:l.agcDown,current:u.agcIdx,target:e.agc,readField:e=>e.agcIdx,abortRef:r}),u=t()||u),Number.isFinite(e.vol)&&Number.isFinite(u.volume)&&e.vol!==u.volume&&!a.default.volumeLock?.locked&&(n?.((0,p.t)("shareConfig.settingVolume",{vol:e.vol})),await U({upChar:l.volumeUp,downChar:l.volumeDown,current:u.volume,target:e.vol,readField:e=>e.volume,abortRef:r}))}var $=e.i(70768);let _=(0,r.createContext)(null);e.s(["DeviceControlProvider",0,function({children:e}){let{deviceStatus:v,device:w,capabilities:q,firmwareType:F}=(0,$.useDeviceStatusContext)(),{toasts:z,showToast:I,dismissToast:B,pauseToast:P,resumeToast:A}=(0,g.default)(),O=(0,r.useMemo)(()=>({toasts:z,showToast:I,dismissToast:B,pauseToast:P,resumeToast:A}),[z,I,B,P,A]),{connected:U,baudRate:K,setBaudRate:W,transport:G,setTransport:V,bleAvailable:J,usbAvailable:Q,connect:X,disconnect:Y}=function(){let[e,t]=(0,r.useState)(()=>a.default.connected),[g,p]=(0,r.useState)(()=>a.default.connected&&a.default.baudRate||o.default.serial.defaultBaudRate),y=(0,r.useSyncExternalStore)(u,s,l),b=(0,r.useSyncExternalStore)(u,i,l),h=(0,r.useSyncExternalStore)(f,c,m);(0,r.useEffect)(()=>{let e=e=>t(e),r=e=>{"number"==typeof e&&e>0&&p(e)},o=async()=>{try{await a.default.disconnect()}catch{}t(!1)};return n.default.on("connectionChange",e),n.default.on("deviceLost",o),n.default.on("baudRateChange",r),()=>{n.default.off("connectionChange",e),n.default.off("deviceLost",o),n.default.off("baudRateChange",r)}},[]);let S=(0,r.useCallback)(e=>{if(("usb"===e||"ble"===e)&&("ble"!==e||s())&&("usb"!==e||i()))try{window.localStorage.setItem(o.default.transport.storageKey,e),window.dispatchEvent(new Event(d))}catch{}},[]),v=(0,r.useCallback)(async()=>{let e="usb"===h?{baudRate:g}:{};return await a.default.connect(h,e)},[h,g]);return{connected:e,baudRate:g,setBaudRate:p,transport:h,setTransport:S,bleAvailable:y,usbAvailable:b,connect:v,disconnect:(0,r.useCallback)(async()=>{try{await a.default.disconnect()}catch{}t(!1)},[])}}(),Z=(0,r.useMemo)(()=>({connected:U,baudRate:K,setBaudRate:W,transport:G,setTransport:V,bleAvailable:J,usbAvailable:Q,connect:X,disconnect:Y}),[U,K,W,G,V,J,Q,X,Y]),{screenshot:ee,screenshotLoading:et,screenshotProgress:er,screenshotTotalBytes:ea,screenshotGallery:en,screenshotAnnouncement:eo,screenshotSeq:eu,autoScreenshot:el,setAutoScreenshot:es,takeScreenshot:ei,cancelScreenshot:ed,handleCommandWithAutoScreenshot:ec,saveCurrentScreenshot:em,clearGallery:ef,removeFromGallery:eg,clearScreenshot:ep}=function(e,t,u){let[l,s]=(0,r.useState)(""),[i,d]=(0,r.useState)(!1),[c,m]=(0,r.useState)(0),[f,g]=(0,r.useState)([]),[v,w]=(0,r.useState)(!1),C=(0,r.useRef)({applied:!1,active:!1,captureDue:!1,captured:!1}),k=(0,r.useRef)(!1),M=(0,r.useRef)(null),E=(0,r.useCallback)(e=>{C.current.active=!1,w(e)},[]),[q,F]=(0,r.useState)(0),[N,x]=(0,r.useState)(null),[R,T]=(0,r.useState)(""),L=(0,r.useRef)(null),D=(0,r.useRef)(null),H=(0,r.useRef)(u);(0,r.useEffect)(()=>{H.current=u},[u]);let z=(0,r.useCallback)(()=>{L.current&&(clearTimeout(L.current),L.current=null)},[]),I=(0,r.useCallback)(()=>{D.current&&(clearTimeout(D.current.timer),n.default.off("serialLog",D.current.probe),D.current=null)},[]),B=(0,r.useCallback)(()=>{I();let e={sawFrame:!1},t=()=>{e.sawFrame=!0};n.default.on("serialLog",t);let r=setTimeout(()=>{n.default.off("serialLog",t),D.current=null,H.current?.screenshotDisablesLog&&!e.sawFrame&&a.default.connected&&!a.default.screenshotMode&&(a.default.sendCommand("toggleLog"),n.default.emit("addLog",{message:(0,p.t)("screenshot.remoteLoggingRestored")}))},o.default.screenshot.logRestoreProbeMs);D.current={timer:r,probe:t}},[I]),P=(0,r.useCallback)((e,r="error")=>{k.current=!1,a.default.cancelScreenshot(),d(!1),F(0),x(null),T(""),n.default.emit("addLog",{message:e}),t?.(e,r),B()},[B,t]),A=(0,r.useCallback)(()=>{z(),L.current=setTimeout(()=>{L.current=null,a.default.screenshotMode&&P((0,p.t)("screenshot.aborted"))},o.default.screenshot.watchdogMs)},[z,P]),O=(0,r.useCallback)(async()=>
1{if(e){if(a.default.asleep)return void t?.((0,p.t)("screenshot.deviceAsleep"),"error");if(a.default.screenshotMode){k.current=!0;return}(I(),a.default.screenshotMode=u?.screenshot==="binary-bmp"?"binary":"hex",d(!0),F(0),x(null),T((0,p.t)("screenshot.captureStarted")),!0!==await a.default.sendCommand(u?.screenshotCommand??"screenshot"))?P((0,p.t)("screenshot.commandNotSent")):a.default.screenshotMode&&A()}},[e,A,P,I,t,u]);(0,r.useEffect)(()=>{M.current=O},[O]);let U=(0,r.useCallback)(()=>{z(),P((0,p.t)("DisplayPanel.binaryTransfer.cancelled"),"info")},[z,P]);(0,r.useEffect)(()=>{let e=e=>{F(e?.bytesReceived||0),e&&"number"==typeof e.totalBytes&&x(e.totalBytes),A()},t=e=>{z();let t="string"==typeof e?(e=>{let t=e.replace(/\s+/g,"").replace(/[^0-9a-fA-F]/g,"");t.length%2!=0&&(t=t.slice(0,-1));let r=t.indexOf("424d"),a=t.indexOf("424D"),o=-1===r?a:-1===a?r:Math.min(r,a);if(-1!==o&&(t=t.substring(o)),t.length<108)return n.default.emit("addLog",{message:(0,p.t)("screenshot.failedTooShort")}),"";try{let e=new Uint8Array(t.length/2);for(let r=0;r<e.length;r++)e[r]=parseInt(t.substr(2*r,2),16);return(0,y.bytesToBmpDataUrl)(e)}catch(e){return n.default.emit("addLog",{message:(0,p.t)("screenshot.processingError",{error:e.message})}),""}})(e):(0,y.bytesToBmpDataUrl)(e);s(t),t&&m(e=>e+1),a.default.screenshotMode=!1,d(!1),F(0),x(null),T(t?(0,p.t)("screenshot.captureComplete"):(0,p.t)("screenshot.captureFailed")),B(),t&&g(e=>[...e,{data:t,timestamp:Date.now()}].slice(-o.default.screenshot.galleryMaxItems)),k.current&&(k.current=!1,M.current?.())};return n.default.on("screenshotProgress",e),n.default.on("screenshotEnd",t),()=>{n.default.off("screenshotProgress",e),n.default.off("screenshotEnd",t),z(),I()}},[A,z,B,I]),(0,r.useEffect)(()=>{let t=t=>{let r=C.current;t?.initial&&r.captured||h({autoScreenshot:v,connected:e,capabilities:u})&&(t?.initial&&(r.captured=!0),setTimeout(()=>O(),o.default.screenshot.autoScreenshotDelay))};return n.default.on("autoScreenshotRequest",t),()=>n.default.off("autoScreenshotRequest",t)},[v,e,O,u]);let j=(0,r.useCallback)(({command:t,screenshot:r=!0})=>{if(!e)return void n.default.emit("addLog",{message:(0,p.t)("screenshot.notConnected")});let l=a.default.sendCommand(t);h({autoScreenshot:v,connected:e,capabilities:u})&&r&&Promise.resolve(l).then(e=>{!1!==e&&setTimeout(()=>O(),o.default.screenshot.autoScreenshotDelay)})},[e,v,O,u]),$=(0,r.useCallback)(()=>{l&&(b(l),n.default.emit("addLog",{message:(0,p.t)("screenshot.saved")}))},[l]),_=(0,r.useCallback)(()=>g([]),[]),K=(0,r.useCallback)(e=>g(t=>t.filter(t=>t.timestamp!==e)),[]),W=(0,r.useCallback)(()=>s(""),[]);return(0,r.useEffect)(()=>{let e=e=>j(e),t=()=>O();return n.default.on("command",e),n.default.on("screenshot",t),()=>{n.default.off("command",e),n.default.off("screenshot",t)}},[j,O]),(0,r.useEffect)(()=>{let t=C.current;if(!e){t.active&&w(!1),Object.assign(t,{applied:!1,active:!1,captureDue:!1,captured:!1}),k.current=!1;return}if(!t.applied&&S(u)){t.applied=!0;let e=function({transportType:e,capabilities:t}){return"usb"===e&&S(t)}({transportType:a.default.transportType,capabilities:u});if(t.captureDue=e||v,e&&!v){t.active=!0,w(!0),n.default.emit("addLog",{message:(0,p.t)("screenshot.autoEnabledByDefault")});return}}t.captureDue&&h({autoScreenshot:v,connected:e,capabilities:u})&&(t.captureDue=!1,t.captured||(t.captured=!0,O()))},[e,u,v,O]),(0,r.useEffect)(()=>{e||W()},[e,W]),{screenshot:l,screenshotLoading:i,screenshotProgress:q,screenshotTotalBytes:N,screenshotGallery:f,screenshotAnnouncement:R,screenshotSeq:c,autoScreenshot:v,setAutoScreenshot:E,takeScreenshot:O,cancelScreenshot:U,handleCommandWithAutoScreenshot:j,saveCurrentScreenshot:$,clearGallery:_,removeFromGallery:K,clearScreenshot:W}}(U,I,q),ey=(0,r.useMemo)(()=>({screenshot:ee,screenshotLoading:et,screenshotProgress:er,screenshotTotalBytes:ea,screenshotGallery:en,screenshotAnnouncement:eo,screenshotSeq:eu,autoScreenshot:el,setAutoScreenshot:es,takeScreenshot:ei,cancelScreenshot:ed,handleCommandWithAutoScreenshot:ec,saveCurrentScreenshot:em,clearGallery:ef,removeFromGallery:eg,clearScreenshot:ep}),[ee,et,er,ea,en,eo,eu,el,es,ei,ed,ec,em,ef,eg,ep]),{memorySlots:eb,setMemorySlots:eh,editingSlot:eS,setEditingSlot:ev,deleteSlotIndex:ew,setDeleteSlotIndex:eC,uploadResult:ek,setUploadResult:eM,isUploading:eE,uploadProgress:eq,frequencyUnit:eF,selectedBand:eN,setSelectedBand:ex,selectedMode:eR,setSelectedMode:eT,frequencyValue:eL,setFrequencyValue:eD,validationError:eH,slotName:ez,setSlotName:eI,nameError:eB,clearSlots:eP,refreshMemorySlots:eA,handleEditSlot:eO,handleSaveSlot:eU,handleDeleteSlot:ej,handleUnit
1Change:e$,validateAndSave:e_,handleUpload:eK,handleSave:eW,handleLoad:eG,addNewSlot:eV,saveStationToSlot:eJ,recallSlot:eQ}=function(e,t,o=null,u=null,l=null){let[s,i]=(0,r.useState)(()=>e&&a.default.connected?x:[]);(0,r.useEffect)(()=>{x=s},[s]),(0,r.useEffect)(()=>()=>{a.default.connected||(x=[])},[]);let[d,c]=(0,r.useState)(null),[m,f]=(0,r.useState)(null),[g,y]=(0,r.useState)(null),[b,h]=(0,r.useState)(!1),[S,v]=(0,r.useState)(null),[w,q]=(0,r.useState)("Hz"),[F,R]=(0,r.useState)(""),[T,L]=(0,r.useState)(""),[D,H]=(0,r.useState)(""),[z,I]=(0,r.useState)(""),[B,P]=(0,r.useState)(""),[A,O]=(0,r.useState)(""),U=(0,r.useRef)(null);(0,r.useEffect)(()=>{U.current=t},[t]);let j=l?.memory?.slots??0,$=!!l?.memory?.names;(0,r.useEffect)(()=>{let e=({index:e,band:t,frequency:r,mode:a,name:n=""})=>{null!=e&&i(o=>{let u=[...o];return u[e-1]={slotNumber:e,band:t,frequency:r,mode:a,name:n},u})};return n.default.on("memorySlot",e),()=>n.default.off("memorySlot",e)},[]);let _=(0,r.useCallback)(()=>i([]),[]);(0,r.useEffect)(()=>{e||_()},[e,_]);let K=(0,r.useCallback)(async()=>{e&&(i([]),await a.default.sendCommand("showMemorySlots"),n.default.emit("addLog",{message:(0,p.t)("memorySlots.refreshed")}))},[e]),W=(0,r.useCallback)(async t=>!!e&&!!u?.buildSlotRecall&&t?.slotNumber!=null&&(await C(),await a.default.writeRaw(u.buildSlotRecall(t.slotNumber)),n.default.emit("radio:tuneStarted",{freqHz:t.frequency}),!0),[e,u]),G=(0,r.useCallback)(e=>{let t=s[e],r=U.current,a=t?.mode||"",n=t?.frequency||0,u=(0,k.bandKeyFromDevice)(t?.band||"",n);if(r&&r.frequencyHz>0){n=r.frequencyHz,a=r.mode||a;let e=(0,k.findBandForFrequency)(r.frequencyHz,r.bandName,r.mode,o);u=e?.name||u}let l="Hz",i=n;n>=1e6?(l="MHz",i=(n/1e6).toFixed(6)):n>=1e3&&(l="kHz",i=(n/1e3).toFixed(3)),q(l),R(u),L(a),H(i.toString()),I(""),P(t?.name??""),O(""),c(e)},[s,o]),V=(0,r.useCallback)(e=>{let t=e?.freqHz;if(!t||t<=0)return{ok:!1,error:(0,p.t)("memorySlots.saveStation.noFrequency")};let r=e.mode||"AM",a=(0,k.findBandForFrequency)(t,U.current?.bandName||"",r,o);if(!a){let t=e.station||(0,p.t)("memorySlots.saveStation.defaultName");return{ok:!1,error:(0,p.t)("memorySlots.saveStation.outsideBand",{name:t})}}let n=null;for(let e=1;e<=j;e++){let t=s.find(t=>t?.slotNumber===e);if(!t||!t.band||!t.mode||!t.frequency||t.frequency<=0){n=e;break}}return null===n?{ok:!1,error:(0,p.t)("memorySlots.saveStation.allSlotsFull",{count:j})}:(i(o=>{let u=[...o],l={slotNumber:n,band:(0,k.toDeviceBandName)(a.name),frequency:t,mode:r,name:$?(0,M.toMemoryName)(e.station):"",modified:!0},s=u.findIndex(e=>e?.slotNumber===n);return s>=0?u[s]=l:u.push(l),u}),{ok:!0,slotNumber:n})},[s,o,j,$]),J=(0,r.useCallback)(e=>{i(t=>{let r=[...t];return r[d]={...t[d],...e,modified:!0},r}),c(null)},[d]),Q=(0,r.useCallback)(()=>{i(e=>{let t=[...e],r=t[m];return r&&(t[m]={...r,frequency:0,band:"",mode:"",name:"",modified:!0}),t}),f(null)},[m]),X=(0,r.useCallback)(e=>{H(t=>{if(!t||""===t)return t;let r=parseFloat(t);if(isNaN(r))return t;let a=r;"kHz"===w?a=1e3*r:"MHz"===w&&(a=1e6*r);return("kHz"===e?(a/1e3).toFixed(3):"MHz"===e?(a/1e6).toFixed(6):Math.round(a)).toString()}),q(e)},[w]),Y=(0,r.useCallback)(e=>{I(""),O("");let t=$?String(e.name??"").trim():"",r=$?(0,M.memoryNameError)(t):null;if(r)return O("tooLong"===r?(0,p.t)("memorySlots.validation.nameTooLong",{max:M.MEMORY_NAME_MAX}):(0,p.t)("memorySlots.validation.nameNotAscii")),!1;let a=String(e.frequency).trim().replace(/\s+/g,"").replace(/[^0-9.]/g,""),n=parseFloat(a=a.replace(/^0+(?=\d)/,""));if(!a||isNaN(n)||n<=0)return I((0,p.t)("memorySlots.validation.invalidNumber")),!1;let u=n;"kHz"===e.unit?u=1e3*n:"MHz"===e.unit&&(u=1e6*n);let l=Math.round(u);if(l<=0)return I((0,p.t)("memorySlots.validation.mustBePositive")),!1;let s=(0,k.getBandRange)(e.band,o);if(!s)return I((0,p.t)("memorySlots.validation.unknownBand",{band:e.band})),!1;if(l<s.min||l>s.max){let t=(s.min/1e6).toFixed(3),r=(s.max/1e6).toFixed(3);return I((0,p.t)("memorySlots.validation.outOfRange",{freq:(l/1e6).toFixed(3),band:e.band,min:t,max:r})),!1}return s.modes.includes(e.mode)?(J({band:(0,k.toDeviceBandName)(e.band),frequency:l,mode:e.mode,...$?{name:t}:{}}
1),!0):(I((0,p.t)("memorySlots.validation.modeIncompatible",{mode:e.mode,band:e.band,modes:s.modes.join(", ")})),!1)},[J,o,$]),Z=(0,r.useCallback)(async()=>{if(!e)return;h(!0),y(null);let t=s.filter(e=>e&&e.frequency>0&&e.band&&e.mode).map(e=>({slotNumber:e.slotNumber,band:e.band,frequency:e.frequency,mode:e.mode,name:e.name??""}));try{let e={writer:a.default.writer},r=await N(s,e,(e,t)=>{v({current:e,total:t})},{names:$});v(null),await new Promise(e=>setTimeout(e,1e3));let o=new Map,u=({index:e,band:t,frequency:r,mode:a,name:n=""})=>{o.set(e,{slotNumber:e,band:t,frequency:r,mode:a,name:n})};n.default.on("memorySlot",u),i([]),await a.default.sendCommand("showMemorySlots"),await new Promise(e=>setTimeout(e,2e3)),n.default.off("memorySlot",u);let l=0,d=[];for(let e of t){let t=o.get(e.slotNumber);t&&t.band===e.band&&t.frequency===e.frequency&&t.mode===e.mode&&(!$||t.name===e.name)?l++:d.push(e.slotNumber)}d.length>0?n.default.emit("addLog",{message:(0,p.t)("memorySlots.verify.mismatch",{verified:l,total:t.length,slots:d.join(", ")})}):n.default.emit("addLog",{message:(0,p.t)("memorySlots.verify.allConfirmed",{count:l})}),y({...r,verifiedCount:l,totalExpected:t.length,success:0===r.errorCount&&0===d.length})}catch{v(null),y({success:!1,uploadedCount:0,errorCount:1}),await new Promise(e=>setTimeout(e,1e3)),await K()}finally{h(!1)}},[e,s,K,$]),ee=(0,r.useCallback)(()=>((e,t)=>{if(!Number.isInteger(t)||t<=0)throw Error(`saveMemorySlots: slotCount is required and must be a positive integer (received ${t})`);let r=new Blob([JSON.stringify(Array(t).fill(null).map((t,r)=>{let a=r+1,n=e.find(e=>e?.slotNumber===a);return n?{slotNumber:a,band:n.band||"",freq:n.frequency||0,mode:n.mode||"",...n.name?{name:n.name}:{}}:{slotNumber:a,band:"",freq:0,mode:""}}),null,2)],{type:"application/json"}),a=document.createElement("a");a.href=URL.createObjectURL(r),a.download=`ats-memories-${Date.now()}.json`,a.click(),URL.revokeObjectURL(a.href)})(s,j),[s,j]),et=(0,r.useCallback)(e=>{E(e,i,!1,j,{names:$})},[j,$]),er=(0,r.useCallback)(e=>{let t={slotNumber:e,band:"",frequency:0,mode:"",name:""},r=s.length;i(e=>[...e,t]),G(r)},[s,G]);return{memorySlots:s,setMemorySlots:i,editingSlot:d,setEditingSlot:c,deleteSlotIndex:m,setDeleteSlotIndex:f,uploadResult:g,setUploadResult:y,isUploading:b,uploadProgress:S,frequencyUnit:w,selectedBand:F,setSelectedBand:R,selectedMode:T,setSelectedMode:L,frequencyValue:D,setFrequencyValue:H,validationError:z,slotName:B,setSlotName:P,nameError:A,clearSlots:_,refreshMemorySlots:K,handleEditSlot:G,handleSaveSlot:J,handleDeleteSlot:Q,handleUnitChange:X,validateAndSave:Y,handleUpload:Z,handleSave:ee,handleLoad:et,addNewSlot:er,saveStationToSlot:V,recallSlot:W}}(U,v,F,w,q),eX=(0,r.useMemo)(()=>({memorySlots:eb,setMemorySlots:eh,editingSlot:eS,setEditingSlot:ev,deleteSlotIndex:ew,setDeleteSlotIndex:eC,uploadResult:ek,setUploadResult:eM,isUploading:eE,uploadProgress:eq,frequencyUnit:eF,selectedBand:eN,setSelectedBand:ex,selectedMode:eR,setSelectedMode:eT,frequencyValue:eL,setFrequencyValue:eD,validationError:eH,slotName:ez,setSlotName:eI,nameError:eB,clearSlots:eP,refreshMemorySlots:eA,handleEditSlot:eO,handleSaveSlot:eU,handleDeleteSlot:ej,handleUnitChange:e$,validateAndSave:e_,handleUpload:eK,handleSave:eW,handleLoad:eG,addNewSlot:eV,saveStationToSlot:eJ,recallSlot:eQ}),[eb,eh,eS,ev,ew,eC,ek,eM,eE,eq,eF,eN,ex,eR,eT,eL,eD,eH,ez,eI,eB,eP,eA,eO,eU,ej,e$,e_,eK,eW,eG,eV,eJ,eQ]),{tuneInput:eY,setTuneInput:eZ,tuneUnit:e0,tuningInProgress:e1,tuningStatus:e3,handleTuneToFrequency:e6,tuneToFreqHz:e2,cancelTuning:e4,switchUnit:e8}=function(e,t,o,u=null,l=null){let[s,i]=(0,r.useState)(""),[d,c]=(0,r.useState)("MHz"),[m,f]=(0,r.useState)(!1),[g,y]=(0,r.useState)(""),b=(0,r.useRef)(!1),h=(0,r.useRef)(!1),S=(0,r.useRef)(t);(0,r.useEffect)(()=>{S.current=t},[t]);let v=(0,r.useCallback)(async(e,t=null,{screenshot:r=!0,notify:s=!0}={})=>{let i=s?o:()=>{},d=S.current;if(!d)return i((0,p.t)("tuning.noDeviceStatus"),"error"),{ok:!1,reason:"no-status"};let c=t||d.mode;if(l?.capabilities?.statusStream==="sparse"&&!c)return i((0,p.t)("tuning.modeRequiredSparse"),"error",8e3),{ok:!1,reason:"mode-unknown"};let m=(0,k.findBandForFrequency)(e,d.bandName,c,u);if(!m){let t=(0,p.t)("tuning.outOfRangeToast",{freq:(0,k.formatFrequencyForMode)(e,c),mode:c,rangeMessage:(0,k.getValidRangeMessage)(c)});return i(t,"error",8e3),{ok:!1,reason:"out-of-range",message:t}}t||m.modes.includes(d.mode)||i((0,p.t)("tuning.modeAutoSwitchToast",{mode:d.mode,band:(0,k.toDeviceBandName)(m.name),defaultMode:m.defaultMode}),"warning",6e3),h.current=!0;try{n.default.emit("radio:tuneStarted",{freqHz:e}),f(!0),y((0,p.t)("tuning.tuningStarting")),b.current=!1,await C();let o=d.frequencyHz,s={writer:a.default.writer,get screenshotMode(){return a.default.screenshotMode}},m=await (0,R.default)(e,s,{currentBand:d.bandName,currentFreqHz:d.frequencyHz,currentMode:d.mode,targetMode:t,firmwareType:u,profile:l,currentVersion:d.version,abortRef
1:b,onStep:e=>y(e.message),onProgress:(e,t,r)=>{let a=Math.abs(r-o),n=Math.abs(r-t),u=a>0?Math.min(99,Math.round((1-n/a)*100)):99;y((0,p.t)("tuning.tuningProgress",{freq:(0,k.formatFrequencyForMode)(t,c),pct:u,count:e}))}}),g=m.tunedMode||c;return m.success?i((0,p.t)("tuning.tunedSuccessToast",{freq:(0,k.formatFrequencyForMode)(m.finalFreqHz,g),snapped:m.snapped?"yes":"no",mode:m.tunedMode,grid:"FM"===m.tunedMode?"10 kHz":"1 kHz"}),"success",m.snapped?7e3:4e3):m.error?i(m.error,"error",8e3):m.frequencyUnverifiable?i((0,p.t)("tuning.sentUnverifiableToast",{target:(0,k.formatFrequencyForMode)(e,g)}),"info",6e3):i("band"===m.stopReason?(0,p.t)("tuning.wrongBandToast",{band:m.stopBand,target:(0,k.formatFrequencyForMode)(e,g)}):"mode"===m.stopReason?(0,p.t)("tuning.wrongModeToast",{mode:m.stopMode,wanted:m.wantedMode}):"capped"===m.stopReason?(0,p.t)("tuning.cascadeCappedToast",{count:m.commandsSent,freq:(0,k.formatFrequencyForMode)(m.finalFreqHz,g),target:(0,k.formatFrequencyForMode)(e,g)}):(0,p.t)("tuning.reachedPartialToast",{freq:(0,k.formatFrequencyForMode)(m.finalFreqHz,g),target:(0,k.formatFrequencyForMode)(e,g)}),"warning",8e3),r&&!m.error&&n.default.emit("autoScreenshotRequest"),{ok:!!m.success,reason:m.success?null:m.frequencyUnverifiable?"unverifiable":"partial",stopReason:m.stopReason||null,error:m.error||null,finalFreqHz:m.finalFreqHz,tunedMode:g,snapped:!!m.snapped}}catch(e){return i(e.message,"error"),{ok:!1,reason:"error",error:e.message}}finally{h.current=!1,f(!1),y("")}},[o,u,l]),w=(0,r.useCallback)(async()=>{if(!e||h.current)return;let t=parseFloat(s);if(!s||isNaN(t)||t<=0)return void o((0,p.t)("tuning.invalidFrequency"),"error");let r=Math.round("MHz"===d?1e6*t:1e3*t);r<=0?o((0,p.t)("tuning.frequencyMustBePositive"),"error"):await v(r)},[e,s,d,o,v]),M=(0,r.useCallback)(async(t,r=null,a)=>!e||h.current||!t||t<=0?{ok:!1,reason:h.current?"busy":"not-ready"}:v(t,r,a),[e,v]),E=(0,r.useCallback)(()=>{b.current=!0},[]),q=(0,r.useCallback)(e=>{if(s){let t=parseFloat(s);isNaN(t)||("MHz"===d&&"kHz"===e?i((1e3*t).toString()):"kHz"===d&&"MHz"===e&&i((t/1e3).toString()))}c(e)},[s,d]);return{tuneInput:s,setTuneInput:i,tuneUnit:d,tuningInProgress:m,tuningStatus:g,handleTuneToFrequency:w,tuneToFreqHz:M,cancelTuning:E,switchUnit:q}}(U,v,I,F,w),e9=(0,r.useMemo)(()=>({tuneInput:eY,setTuneInput:eZ,tuneUnit:e0,tuningInProgress:e1,tuningStatus:e3,handleTuneToFrequency:e6,tuneToFreqHz:e2,cancelTuning:e4,switchUnit:e8}),[eY,eZ,e0,e1,e3,e6,e2,e4,e8]),{showSoundPopup:e7,micError:e5,audioRef:te,audioStreamRef:tt,audioActive:tr,inputDevices:ta,outputDevices:tn,inputId:to,outputId:tu,outputSupported:tl,openSoundPopup:ts,closeSoundPopup:ti,handleSoundContinue:td,selectInput:tc,selectOutput:tm,stopAudio:tf}=function(){let[e,t]=(0,r.useState)(!1),[a,n]=(0,r.useState)(""),[o,u]=(0,r.useState)(!1),[l,s]=(0,r.useState)([]),[i,d]=(0,r.useState)([]),[c,m]=(0,r.useState)(""),[f,g]=(0,r.useState)(""),[y]=(0,r.useState)(()=>void 0!==window.HTMLMediaElement&&"setSinkId"in window.HTMLMediaElement.prototype),b=(0,r.useRef)(null),h=(0,r.useRef)(null),S=(0,r.useRef)("");(0,r.useEffect)(()=>()=>{h.current&&(h.current.getTracks().forEach(e=>e.stop()),h.current=null)},[]);let v=(0,r.useCallback)(async()=>{if(navigator.mediaDevices?.enumerateDevices)try{let e=await navigator.mediaDevices.enumerateDevices();s(e.filter(e=>"audioinput"===e.kind)),d(e.filter(e=>"audiooutput"===e.kind))}catch{}},[]),w=(0,r.useCallback)(async e=>{let t=b.current;if(t&&"function"==typeof t.setSinkId)try{await t.setSinkId(e||""),n("")}catch{n((0,p.t)("audio.outputFailed"))}},[]),C=(0,r.useCallback)((e,t)=>{h.current&&h.current!==e&&h.current.getTracks().forEach(e=>e.stop()),h.current=e,u(!0);let r=e.getAudioTracks()[0],a=r&&r.getSettings?r.getSettings():{};m(t||a.deviceId||""),r&&r.addEventListener("ended",()=>{h.current===e&&u(!1)}),b.current&&(b.current.srcObject=e,b.current.play().catch(()=>n((0,p.t)("audio.playbackBlocked"))),w(S.current))},[w]),k=(0,r.useCallback)(async e=>{let t;n("");try{t=await navigator.mediaDevices.getUserMedia({audio:{deviceId:e?{exact:e}:void 0,echoCancellation:!1,noiseSuppression:!1,autoGainControl:!1,channelCount:2}})}catch{try{t=await navigator.mediaDevices.getUserMedia({audio:!e||{deviceId:{exact:e}}})}catch{return n((0,p.t)("audio.micPermissionDenied")),!1}}return C(t,e),await v(),!0},[C,v]),M=(0,r.useCallback)(e=>k(e||void 0),[k]),E=(0,r.useCallback)(e=>(g(e),S.current=e,w(e)),[w]),q=(0,r.useCallback)(()=>t(!0),[]),F=(0,r.useCallback)(()=>{t(!1),n("")},[]),N=(0,r.useCallback)(()=>
1{h.current&&(h.current.getTracks().forEach(e=>e.stop()),h.current=null),b.current&&(b.current.srcObject=null),u(!1),n("")},[]),x=(0,r.useCallback)(async()=>{await k(c||void 0)&&t(!1)},[k,c]);return(0,r.useEffect)(()=>{if(!o||!navigator.mediaDevices?.addEventListener)return;let e=()=>v();return navigator.mediaDevices.addEventListener("devicechange",e),()=>navigator.mediaDevices.removeEventListener("devicechange",e)},[o,v]),{showSoundPopup:e,micError:a,audioRef:b,audioStreamRef:h,audioActive:o,inputDevices:l,outputDevices:i,inputId:c,outputId:f,outputSupported:y,openSoundPopup:q,closeSoundPopup:F,handleSoundContinue:x,selectInput:M,selectOutput:E,stopAudio:N}}(),tg=(0,r.useMemo)(()=>({showSoundPopup:e7,micError:e5,audioRef:te,audioStreamRef:tt,audioActive:tr,inputDevices:ta,outputDevices:tn,inputId:to,outputId:tu,outputSupported:tl,openSoundPopup:ts,closeSoundPopup:ti,handleSoundContinue:td,selectInput:tc,selectOutput:tm,stopAudio:tf}),[e7,e5,te,tt,tr,ta,tn,to,tu,tl,ts,ti,td,tc,tm,tf]),{supported:tp,container:ty,isOpen:tb,toggle:th}=function({width:e=360,height:t=240,title:a=""}={}){let n=(0,r.useSyncExternalStore)(T,L,D),[o,u]=(0,r.useState)(null),[l,s]=(0,r.useState)(!1),i=(0,r.useRef)(null),d=(0,r.useCallback)(async()=>{var r;let n;if(!L())return;if(i.current)return void i.current.focus();try{n=await window.documentPictureInPicture.requestWindow({width:e,height:t})}catch(e){e?.name==="NotSupportedError"&&s(!0);return}r=n,[...document.styleSheets].forEach(e=>{try{let t=[...e.cssRules].map(e=>e.cssText).join(""),a=r.document.createElement("style");a.textContent=t,r.document.head.appendChild(a)}catch{if(e.href){let t=r.document.createElement("link");t.rel="stylesheet",t.href=e.href,e.media?.mediaText&&(t.media=e.media.mediaText),r.document.head.appendChild(t)}}}),n.document.title=a,n.document.documentElement.lang=document.documentElement.lang||"en";let o=()=>{var e;let t,r;return e=n.document.documentElement,void((r=(t=document.documentElement).getAttribute("data-theme"))?e.setAttribute("data-theme",r):e.removeAttribute("data-theme"),e.className=t.className,e.style.background=getComputedStyle(document.body).backgroundColor)};o();let l=new MutationObserver(o);l.observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme","class"]}),n.document.body.style.margin="0";let d=n.document.createElement("div");n.document.body.appendChild(d),n.addEventListener("pagehide",()=>{l.disconnect(),i.current=null,u(null)}),i.current=n,u(d)},[e,t,a]),c=(0,r.useCallback)(()=>{i.current?.close()},[]),m=(0,r.useCallback)(()=>{i.current?i.current.close():d()},[d]);return(0,r.useEffect)(()=>()=>i.current?.close(),[]),{supported:n&&!l,container:o,isOpen:null!=o,open:d,close:c,toggle:m}}({width:380,height:280,title:(0,p.t)("home.pipWindowTitle")}),tS=(0,r.useMemo)(()=>({supported:tp,container:ty,isOpen:tb,toggle:th}),[tp,ty,tb,th]),{pendingConfig:tv,pendingSummary:tw,applying:tC,applyStatus:tk,applyPending:tM,cancelApply:tE,dismissPending:tq,shareCurrentConfig:tF}=function({connected:e,deviceStatus:t,tuneToFreqHz:a,cancelTuning:o,showToast:u,profile:l}){let[s,i]=(0,r.useState)(null),[d,c]=(0,r.useState)(!1),[m,f]=(0,r.useState)(""),g=(0,r.useRef)(!1),y=(0,r.useRef)(t);(0,r.useEffect)(()=>{y.current=t},[t]),(0,r.useEffect)(()=>{let e=(0,H.parseConfigQuery)(window.location.search);e&&i(e)},[]);let b=(0,r.useCallback)(()=>{g.current=!0,i(null)},[]),h=(0,r.useCallback)(()=>{g.current=!0,o?.()},[o]),S=(0,r.useCallback)(async()=>{if(!d&&s){if(!e)return void u((0,p.t)("shareConfig.connectToApply"),"warning");if(!y.current)return void u((0,p.t)("shareConfig.noStatusRetry"),"error");c(!0),f((0,p.t)("shareConfig.tuning")),g.current=!1;try{let e=await a(s.freqHz,s.mode||null,{screenshot:!1});if(g.current||!e.ok&&"partial"!==e.reason)return;if(!e.ok&&e.stopReason)return void u((0,p.t)("shareConfig.stoppedAfterTune"),"warning",7e3);if(await j(s,()=>y.current,g,e=>f(e),l),g.current)return;n.default.emit("autoScreenshotRequest"),u((0,p.t)("shareConfig.applied"),"success"),i(null)}catch(e){"Apply cancelled"!==e.message&&u((0,p.t)("shareConfig.applyFailed",{message:e.message}),"error",7e3)}finally{c(!1),f("")}}},[d,s,e,a,u,l]),v=(0,r.useCallback)(async()=>{let e=y.current;if(!e)return void u((0,p.t)("shareConfig.noStatusToShare"),"warning");let t=(0,H.buildConfigQuery)(e),r=`${window.location.origin}${window.location.pathname}?${t}`;try{await navigator.clipboard.writeText(r),u((0,p.t)("shareConfig.linkCopied"),"success")}catch{try{window.history.replaceState(null,"",`?${t}`)}catch{}u((0,p.t)("shareConfig.copyFailed"),"warning",7e3)}},[u]);return{pendingConfig:s,pendingSummary:s?(0,H.describeConfig)(s):"",applying:d,applyStatus:m,applyPending:S,cancelApply:h,dismissPending:b,shareCurrentConfig:v}}({connected:U,deviceStatus:v,tuneToFreqHz:e2,cancelTuning:e4,showToast:I,profile:w}),tN=(0,r.useMemo)(()=>({pendingConfig:tv,pendingSummary:tw,applying:tC,applyStatus:tk,applyPending:tM,cancelApply:tE,dismissPending:tq,shareCurrentConfig:tF}),[tv,tw,tC,tk,tM,tE,tq,tF]),tx=(0,r.useMemo)(()=>({serial:Z,tuning:e9,memory:eX,screenshot:ey,toast:O,audio:tg,pip:tS,share:tN}),[Z,e9,eX,ey,O,tg,tS,tN]);return(0,t.jsx)(_.Provider,{value:tx,children:e})},"useDeviceControlContext",0,function(){let e=(0,r.useContext)(_);if(!e)throw Error("useDeviceControlContext must be used within a DeviceControlProvider");return e}],26569)}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.