{
  "meta": {
    "title": "Ross Video DashBoard 9.16.2 - capability inventory from plugins (incl. undocumented)",
    "version": "v2",
    "generated": "2026-10-15",
    "subject": "Ross Video DashBoard 9.16.2 (Windows build 2026-07-03, Eclipse RCP 3.8). Official current release is DashBoard v10 (2026-09); 9.16.2 is one generation older.",
    "method": "Read-only analysis of c:/DashBoard/plugins (259 bundles: 249 jars + expanded dirs). MANIFEST/plugin.xml/class names indexed with Python zipfile. Selected classes of 7 jars (ogscript/params bridge, CLI, tally, startup switches) decompiled with CFR 0.152 to confirm signatures. Nothing executed. Cross-checked against the bundled CustomPanel Development Guide HTML (8351DR-007, inside graphnav jar) and the official v10 User Guide / CustomPanel Guide / Release Notes tables of contents fetched 2026-10-15.",
    "confidence_legend": {
      "fact": "string/class/signature confirmed in jar, plugin.xml, resource, ini or decompiled source; source bundle given",
      "assumption": "inferred from class or key names; behaviour not verified",
      "unknown": "not investigated or unreadable"
    },
    "undocumented_definition": "Name appears neither in the bundled CustomPanel Development Guide full text nor in the official v10 guides' tables of contents (word match; false negatives possible).",
    "license_note": "Ross Video copyrighted text and source are not reproduced; names and summaries only. Non-official third-party notes. DashBoard, openGear, XPression, Catena, RossTalk are trademarks of Ross Video Ltd.",
    "human_page": "https://dashboard-dekiru.pages.dev/"
  },
  "sections": [
    {
      "id": "startup_switches",
      "title": "Startup switches and internal properties (DashBoard.ini -vmargs or launch properties)",
      "items": [
        {"name": "-Dbeta=true", "undocumented": true, "confidence": "fact", "source": "rice.dashboardsuite ApplicationWorkbenchAdvisor / WindowAdvisor", "detail": "Adds ' Beta' to the window title and enforces a 31-day expiry from build date ('Beta Expired' dialog; skipped if a Ross-internal marker URL is reachable). Not a feature unlock. Shipped ini sets false."},
        {"name": "script.sandbox", "undocumented": true, "confidence": "fact", "source": "common.oglml OGScriptScope", "detail": "true -> Rhino initSafeStandardObjects (restricted scope). Unset (default) -> initStandardObjects (normal scope). Default is NOT sandboxed; Java access from panel scripts is likely (assumption, untested)."},
        {"name": "db.usealternateui=true", "undocumented": true, "confidence": "fact", "source": "common.lnf UIUtils.isTouchUI, gear Device", "detail": "Switches touch-UI mode (Ultritouch-style UI)."},
        {"name": "-cliport / db-cliport", "undocumented": true, "confidence": "fact", "source": "gear.rice.debug.cli CLIBootstrap", "detail": "If the value is numeric, starts the TCP CLI server on that port. Not started otherwise. Bind failure retried every 5 s."},
        {"name": "-layout, -bigfonts, -delaytabs", "undocumented": true, "confidence": "assumption", "source": "rice.dashboardsuite / common.lnf", "detail": "Launch args: startup layout, large fonts, delayed tab rendering."},
        {"name": "db-logjsonconnect, db-shared-devices, -share-password, db-ultritouch-frame", "undocumented": true, "confidence": "assumption", "source": "gear / sharecentre / touch", "detail": "JSON connection logging, shared devices, share password, Ultritouch frame."},
        {"name": "dashboard.swipeout, dashboard.swipesize", "undocumented": true, "confidence": "assumption", "source": "common.lnf.rice AwtEnvironment", "detail": "Swipe gesture tuning."},
        {"name": "debug.nohttp, dashboard.httpMax, dashboard.httpLimited", "undocumented": true, "confidence": "assumption", "source": "common.connection HttpInfoCache", "detail": "Disable/limit HTTP attribute lookup."},
        {"name": "ogp.connect.timeout, ogp.read.timeout", "undocumented": true, "confidence": "assumption", "source": "gear", "detail": "OGP connect/read timeouts."},
        {"name": "db.blockingconnect, db.touch.*, db.uiselector.*", "undocumented": true, "confidence": "assumption", "source": "rice.dashboard.device / gear.rice.selector", "detail": "Blocking connect mode, Touch device info, UI selector mapping."},
        {"name": "-Ddashboard.lnf=AURA, -Dtheme.active=Ice, -Dtouchfix=true, -Durm.prefs.secure=true, -Dworkbench.defaultrestore=true, -Dbundles.autostart=false, -Xmx1024m, LDAP pool settings", "undocumented": false, "confidence": "fact", "source": "DashBoard.ini", "detail": "Shipped defaults. Theme, secure storage, layout restore, memory allocation and LDAP are documented features."}
      ]
    },
    {
      "id": "hidden_debug",
      "title": "Hidden and debug features",
      "items": [
        {"name": "DashBoard CLI Server", "undocumented": true, "confidence": "fact", "source": "gear.rice.debug.cli", "detail": "Line-oriented TCP CLI, no authentication, banner 'Welcome to openGear'. Enabled only with -cliport/db-cliport. Commands: lframe [frame name]; ldevice [frame]; lparam [frame]:[slot] [-h] [param name] (-h = hidden params only); gparam [frame]:[slot]:[oid] [-d] [-v]; sparam [frame]:[slot]:[oid]:[index] [value]; raw [frame]:[slot] [msg type hex] [byte]...; status [frame]:[slot]; refresh [frame]:[slot]; debug [frame]:[slot] [message]; download [frame]:[slot]:[e-oid] [dest]; use [id]:[id]:... (default ids for later commands). Behaviour read from decompiled source, not executed."},
        {"name": "Device / Frame Debug Console", "undocumented": true, "confidence": "fact", "source": "gear.rice.debug", "detail": "Two editors plus view 'openGear Debug Information'; send raw OGP/JSON; context menu 'Dump hidden parameters to file'."},
        {"name": "Parameter Inspector", "undocumented": true, "confidence": "fact", "source": "gear.rice.debug.advanced", "detail": "View 'openGear Parameter Inspector', command Parameter Inspection (Ctrl+I), JFreeChart graphs of parameter values."},
        {"name": "Frame Demo (from file)", "undocumented": true, "confidence": "fact", "source": "gear.rice.demo", "detail": "Wizard simulating an openGear frame connection from a saved file (offline demo)."},
        {"name": "Debugotron9000", "undocumented": true, "confidence": "fact", "source": "camera.sony, camera.panasonic", "detail": "Developer CLI classes not reachable from the product UI. Sony: 'dbg <addr> <port>' sends bytes. Panasonic: builds aw_cam?cmd= test commands."},
        {"name": "NK context menu 'New Action!'", "undocumented": true, "confidence": "fact", "source": "nk.custom.test", "detail": "Test leftover; shows a placeholder dialog only."},
        {"name": "Classic Eclipse update UI", "undocumented": true, "confidence": "fact", "source": "rice.p2.ui", "detail": "Hidden behind activity 'classicUpdate'; unbound command installWait."},
        {"name": "OSGi console", "undocumented": true, "confidence": "assumption", "source": "org.apache.felix.gogo.*, org.eclipse.equinox.console", "detail": "Bundled; whether -console works is unverified."},
        {"name": "Prototype leftovers", "undocumented": true, "confidence": "fact", "source": "midi.rice, joystick.rice, ndi.rice, xpression, webcam", "detail": "Test classes (MidiInputTest, JInputJoystickTest, NDI JavaTest, TestGearFrame), xpression files/orig/* backups, ndi.rice NDIPanelFX.txt (disabled JavaFX panel source), webcam jar ships src/*.java."},
        {"name": "Label copy-paste error", "undocumented": true, "confidence": "fact", "source": "camera.sony.rice plugin.xml", "detail": "Sony tree factory label reads 'Panasonic Camera'."}
      ]
    },
    {
      "id": "ogscript_api",
      "title": "ogscript.* API (public methods of AbstractOGScriptCommands, 123 total; official v10 TOC lists 82)",
      "items": [
        {"name": "OGScriptSystem getSystem()", "undocumented": true, "confidence": "fact", "source": "common.oglml ogscript/system", "detail": "Returned object: readIniFile() (DashBoard.ini as map), updateIniFile(key, value), searchIniFile(key), searchIniFileStartingWith(key), updateKey(oldKey, newKey), addConnection(conn, persist) (accepts 'host:port' string, JS object or array; adds a device connection), removeConnection(o). Panel scripts can rewrite DashBoard's own ini and connection tree."},
        {"name": "void setEnabled(String id, boolean enabled)", "undocumented": true, "confidence": "fact", "source": "common.oglml", "detail": "Enable/disable a component. Used 86 times in Ross-shipped panels."},
        {"name": "void scrollTo(String id)", "undocumented": true, "confidence": "fact", "source": "common.oglml", "detail": "Scroll to component."},
        {"name": "Object post(String url, String data[, boolean includeResponse])", "undocumented": true, "confidence": "fact", "source": "common.oglml", "detail": "Synchronous POST (official has asyncPost and http only)."},
        {"name": "PropertyChangeListener addAttributeListener(String attribute, Function listener) / addAttributeListener(Scriptable obj, String attribute, Function listener)", "undocumented": true, "confidence": "fact", "source": "common.oglml", "detail": "Attribute change listener."},
        {"name": "boolean removeRemoteTrigger(CloseableGPIListener l)", "undocumented": true, "confidence": "fact", "source": "common.oglml", "detail": "Removes a trigger returned by addRemoteTrigger. addRemoteTrigger has 3 forms: (Function), (triggerID, Function), (triggerID, triggerName, Function)."},
        {"name": "String getFullyQualifiedContextId()", "undocumented": true, "confidence": "fact", "source": "common.oglml", "detail": "Fully qualified context id."},
        {"name": "String serializeXML(Object xml)", "undocumented": true, "confidence": "fact", "source": "common.oglml", "detail": "XML node to string."},
        {"name": "boolean pause(long ms)", "undocumented": true, "confidence": "fact", "source": "common.oglml", "detail": "Pause; documented only as a Pause task."},
        {"name": "boolean setXml(id, content) / appendXml(id, content)", "undocumented": true, "confidence": "fact", "source": "common.oglml", "detail": "Lower-case variants exist as separate methods beside official setXML/appendXML; equivalence unverified."},
        {"name": "ogscript.getImageById", "undocumented": false, "confidence": "unknown", "source": "official TOC", "detail": "Documented but not in this class; implementation location unknown."},
        {"name": "setOrAppendXML (editor completion template only)", "undocumented": true, "confidence": "assumption", "source": "common.oglml OGScriptCommands.xml", "detail": "Appears in Ross's editor completion template but no such method exists; probably a template error."},
        {"name": "Official signatures (reference)", "undocumented": false, "confidence": "fact", "source": "common.oglml", "detail": "http(url, method, contentType, data, includeResponse); asyncHTTP(url, method, contentType, data, callback[, includeResponse]); createListener(id, settings, Function); installTimer(id, repeat, delay, rate[, executeInTimer], Function); fireGPI(trigger, state, global); ftp(host, port, user, pass, destPath, destName, binary, data); sendUDPString/sendUDPAsBytes(host, port, String); sendUDPBytes(host, port, byte[]); createAMPSender(); createVDCPSender(); createMessageBuilder(); createMessageParser(input); parseXML(file); runXPath(expr, source); saveToFile(file, data[, overwrite]); getObject/putObject; getString/putString; getPrivateString/putPrivateString(lookupID, id[, value]); subscribe via params."},
        {"name": "Runtime", "undocumented": false, "confidence": "fact", "source": "org.mozilla.javascript", "detail": "Rhino 1.7.7.1 (ES5-level, assumption). Implementation classes AbstractOGScriptCommands / OGScriptScope / OGScriptStatics."}
      ]
    },
    {
      "id": "params_api",
      "title": "params.* API (public methods of AbstractParamScriptCommands, 58 total; official v10 TOC lists 33)",
      "items": [
        {"name": "void executeCommand(commandID, args, Function callback) / executeCommand(contextID, commandID, args, callback)", "undocumented": true, "confidence": "fact", "source": "gear ogscript", "detail": "Execute a device command. Used 74 times in Ross-shipped panels."},
        {"name": "boolean createCommand(commandID, Function f[, Object[] argConstraints])", "undocumented": true, "confidence": "fact", "source": "gear ogscript", "detail": "Define a command on the panel side."},
        {"name": "boolean updateParamView(viewID, oid, index[, Constraint])", "undocumented": true, "confidence": "fact", "source": "gear ogscript", "detail": "Rebind a parameter view. Used 34 times (joystick/midi panels)."},
        {"name": "ConstraintIntRange createIntRangeConstraint(min, max[, step]) / (min, max, displayMin, displayMax, step)", "undocumented": true, "confidence": "fact", "source": "gear ogscript", "detail": "Integer range constraint."},
        {"name": "ConstraintStringStringChoice createStringStringChoiceConstraint(Object list)", "undocumented": true, "confidence": "fact", "source": "gear ogscript", "detail": "Choice constraint with separate display names and values."},
        {"name": "int getAccess(oid); Constraint getViewConstraint(viewID); boolean setBaseOid(a, b); boolean isSubscriptionResponseMissing()", "undocumented": true, "confidence": "fact", "source": "gear ogscript", "detail": "Access level, view constraint, base OID swap, subscription check."},
        {"name": "replaceIdentifiedConstraint(oldID, Constraint|newID); getStrValue(oid, index)", "undocumented": false, "confidence": "fact", "source": "gear ogscript", "detail": "Not in v10 TOC but present in bundled/older docs (legacy API)."},
        {"name": "ParamScriptable (returned by getParam)", "undocumented": false, "confidence": "fact", "source": "gear ogscript ParamScriptable", "detail": "addParamListener(Function[, allElements]); addSubParamListener(obj, Function[, rowIndex]); getValue(); getValueAt(i); setValue(v); setValueAt(i, v); getValueAsString(); getValueAtAsString(i); isArrayParameter(); getOid(); getName(); getIndex(); getElementCount(); getAccess(); setAccess(); getConstraint(); replaceConstraint(); getStream()/setStream(); getRawParam(); createLinkedCopy(newOid); remove(); deleteParam(); resetAllValues(). Official page documents only part."},
        {"name": "MultiSetScriptable (returned by createMultiSet)", "undocumented": false, "confidence": "fact", "source": "gear ogscript", "detail": "setValue(oid, index, value); setAllValues(oid, values); execute()."},
        {"name": "nkglobal.getScriptObject", "undocumented": true, "confidence": "assumption", "source": "VisualLanguage/blocks/Devices/_nkRouter.xml", "detail": "Used by hidden NK router blocks; official object is nkscript. Alias relationship assumed."},
        {"name": "event.getClickCount / getXOnScreen / getYOnScreen", "undocumented": true, "confidence": "fact", "source": "common.oglml OGScriptCommands.xml", "detail": "Mouse event details in completion template; implementing class not checked."}
      ]
    },
    {
      "id": "oglml",
      "title": "OGLML elements and attributes",
      "items": [
        {"name": "<dropspot>", "undocumented": true, "confidence": "fact", "source": "Ross-shipped .grid (7,869 uses)", "detail": "Drag-and-drop target; factories DropSpot / DropGrid."},
        {"name": "<srclist> <dstlist> <lvllist> <lvlstatus> <ipslist> <nkfunction>", "undocumented": true, "confidence": "fact", "source": "nk.rice.oglml, NK .grid", "detail": "NK router source/destination/level lists and function buttons."},
        {"name": "<licensed feature= featureid= description=>", "undocumented": true, "confidence": "fact", "source": "Ross-shipped .grid (118 uses)", "detail": "Gates part of a panel behind a licensed feature."},
        {"name": "Attributes not in help", "undocumented": true, "confidence": "assumption", "source": "Ross-shipped .grid", "detail": "pwidth/pheight, skip, hspace/vspace, preserveaspect, gridaspect/gridwidth/gridheight, acontexttype/aobjectid, param.hname/showtitle/hascontextmenu/constraintstrict, ogscript.scopename, api.contentfunction."},
        {"name": "Event attributes", "undocumented": false, "confidence": "assumption", "source": "common.oglml.swing constants", "detail": "ogscript.onclick / oncontextmenu / ondrag / onkeypress / onkeyrelease / onmousedown / onmouseenter / onmouseexit / onmousemove / onmouseup."},
        {"name": "Ross typos in shipped panels", "undocumented": false, "confidence": "fact", "source": "Ross-shipped .grid", "detail": "irtualheight, heigth, constraingtype; task uses runtaskonload while button uses runtasksonload."},
        {"name": "Official elements (reference)", "undocumented": false, "confidence": "fact", "source": "bundled CustomPanel guide", "detail": "Containers abs, borderlayout, flow, pager, popup, simplegrid, split, tab, table. Widgets reveal, drawer, ext, exit, help, image, label, button, browser, blank, lock, memory, widget, wizard, webcam, NDI. Non-UI api, context, meta, subscription, widgets, widgetdescriptor, lookup, style, color, ogscript, constraint, params, timer, listener, task, timertask, include. Top-level attributes editlock, encrypt, gridsize, keepalive."},
        {"name": "Protecting distributed .grid files", "undocumented": false, "confidence": "fact", "source": "bundled CustomPanel guide; 26/35 Ross panels use encrypt/editlock", "detail": "editlock=\"<password>\" on the top <abs> prompts for a password when entering PanelBuilder Edit Mode; encrypt=\"SimpleEncrypt\" (exact case) stores the file in an unreadable form (header 'encodedA'). Simple scheme; not a secrecy guarantee."},
        {"name": "widgets/*.widgetdescriptor", "undocumented": false, "confidence": "fact", "source": "c:/DashBoard/widgets", "detail": "Three files (common.ogscript, xpression.countdown, xpression.preview) encrypted with the same 'encodedA' header; unreadable."}
      ]
    },
    {
      "id": "visual_logic",
      "title": "Visual Logic block definitions (c:/DashBoard/VisualLanguage/blocks)",
      "items": [
        {"name": "Block counts", "undocumented": false, "confidence": "fact", "source": "VisualLanguage/blocks", "detail": "Control 105, ogScript 114, Objects 36, active Devices 117 (acuity, carbonite, cambot, pbus, tessera, vdcp, xpression; Acuity/Carbonite via RossTalk port 7788)."},
        {"name": "Disabled blocks: 9ErrorHandling.backup, 6Listeners.backup", "undocumented": true, "confidence": "fact", "source": "VisualLanguage/blocks", "detail": "throw / try-catch-finally and createListener wrapper disabled by .backup extension (loader behaviour assumed)."},
        {"name": "Hidden device blocks: _mc1, _nkRouter, _ultrix, _ultricore", "undocumented": true, "confidence": "fact", "source": "VisualLanguage/blocks/Devices", "detail": "Implemented blocks driving devices via OGP params directly (e.g. params.getParam(DEVICEID,'0x5023',0)) for FTB/Take/crosspoint/lock/salvo; hidden by leading underscore."},
        {"name": "Functions without blocks", "undocumented": false, "confidence": "fact", "source": "VisualLanguage/blocks", "detail": "getComponentsById, setEnabled, installTimer, http are only reachable through the Custom Code block."}
      ]
    },
    {
      "id": "devices",
      "title": "Device and protocol support",
      "items": [
        {"name": "PTZ over VISCA/IP", "undocumented": false, "confidence": "fact", "source": "camera.generic (15 <camera> entries, templates/*.ogjson)", "detail": "Ross PTZ-12G/12G+/PTZ-NDI, PIVOTCam-SE, Sony BRC-H900/BRC-X1000/BRC-AM7/ILME-FR7, Lumens VC-A71P/A71PN, Canon CR-N300/CR-N500. UDP."},
        {"name": "PTZ over HTTP", "undocumented": false, "confidence": "fact", "source": "camera.generic, camera.generic.panasonic", "detail": "Canon CR-N700/CR-X300; Panasonic AW-UE150/AW-UE160/AW-HR140 (authenticated HTTP)."},
        {"name": "Ross PT Head (Furio protocol)", "undocumented": false, "confidence": "fact", "source": "camera.generic furio, camera.generic.rice", "detail": "TCP commands + UDP direct control + status; wizard 'Robots > Ross PT Head'."},
        {"name": "VISCA receiver / Furio gateway", "undocumented": true, "confidence": "assumption", "source": "camera.generic ViscaCommandReceiver, FurioGateway", "detail": "DashBoard itself can listen for VISCA / act as a Furio server and translate to cameras. Purpose assumed."},
        {"name": "Canon cinema, Panasonic box, Sony ENG/box, ACID camera", "undocumented": false, "confidence": "fact", "source": "camera.canon, camera.panasonic, camera.sony, camera(.rice)", "detail": "Canon EOS C500 Mark II (HTTP); Panasonic AK-UB300, HK1500/HK1800 with paint box; Sony via CNA-1, RCP, SSP (TCP; models unknown); ACID camera via Telnet/RCP pass-through (Hitachi icon; assumption)."},
        {"name": "Webcam", "undocumented": false, "confidence": "fact", "source": "webcam(.rice), webcam-capture, cnokhwa.dll", "detail": "UVC cameras; OGLML 'Webcam'. v10 release notes list webcam as unsupported in DashBoard 10 (heading only)."},
        {"name": "NDI", "undocumented": false, "confidence": "fact", "source": "ndi, ndi.rice (NDI SDK 6.2.1)", "detail": "Receive (with audio), send (NDISender/NDIDestination), finder, tally. Whether sending is exposed in OGLML is unknown."},
        {"name": "NK routers", "undocumented": false, "confidence": "fact", "source": "nk, nk.rice, nk.rice.oglml, nk.custom.test", "detail": "NK-IPS, NK-3G series, RCP-NK1/NKM/NKQ, NK-VRC, NK-3RD; T-Bus2/GDP; files .cbd/.lbl/.tfi (firmware send); 3 editors + switchboard. nk.custom.test (384 classes) is the real NK editor body despite its name, incl. NKM/NKQ button layout PDF export."},
        {"name": "XPression", "undocumented": false, "confidence": "fact", "source": "xpression(.rice)", "detail": "Scenes, clips, sequences, outputs, assets, Tessera sources; rosstalkex; needs XPression-side 'Dashboard Plugin license'."},
        {"name": "Catena", "undocumented": false, "confidence": "fact", "source": "gear.catena(.rice), catena.core (58 MB shaded Java jar, no natives)", "detail": "gRPC/protobuf client plus proxy server (TLS, OAuth/JWT). rpc: DeviceRequest, GetPopulatedSlots, ExecuteCommand, ExternalObjectRequest, ParamInfoRequest, SetValue, GetValue, MultiSetValue, UpdateSubscriptions, GetParam, Connect, AddLanguage, LanguagePackRequest, ListLanguages, RefreshToken, RevokeAccess. Preference page 'Catena Proxy Server' with proxy.enabled/port/tls.enabled/cert.chain/cert.key."},
        {"name": "openGear / DashBoard Connect", "undocumented": false, "confidence": "fact", "source": "gear, gear.rice, selector, sharecentre", "detail": "OGP binary and OGP-JSON (netstring), SLP discovery, .ogd/.frame/.tvc/.ogjson; OGP over PEAK CAN classes present (PCAN library not bundled; assumption)."},
        {"name": "TSL tally receive", "undocumented": true, "confidence": "fact", "source": "common.tally.rice Activator / TallyPreferencePage", "detail": "TSL UMD 3.1 UDP (default 5001), 3.1 TCP (default 5727), 5.0 UDP (default 5002); all disabled by default; preference page 'Tally'. The preference page's initial values are swapped (5.0 shows 5001, 3.1 UDP shows 5002) relative to the listener defaults. TallyOGScriptObject can raise TSL3/TSL5 events from ogscript."},
        {"name": "Game controller", "undocumented": false, "confidence": "fact", "source": "joystick.rice, JInput", "detail": "HID gamepads/joysticks; axis/button mapping (User Guide ch.10). v10 lists joystick as unsupported (heading only)."},
        {"name": "MIDI", "undocumented": true, "confidence": "fact", "source": "midi.rice", "detail": "javax.sound.midi devices; axis/button/parameter mapping, MidiRecall; shipped grid references 'X-TOUCH COMPACT'. Not in User Guide TOC; v10 lists MIDI as unsupported (heading only)."},
        {"name": "Serial / USB-serial", "undocumented": false, "confidence": "fact", "source": "_summary.tsv (all bundles)", "detail": "No jssc/purejavacomm/usb4java bundled; VISCA has no serial implementation (IP only)."}
      ]
    },
    {
      "id": "licensing",
      "title": "Licensing",
      "items": [
        {"name": "Feature IDs", "undocumented": false, "confidence": "fact", "source": "Ross-shipped .grid <licensed>", "detail": "Panasonic Camera Control 1060865, Sony Camera Control 1060866, PTZ Camera Control 1060867, Canon Camera Control 1060870 (1060868/1060869 unknown)."},
        {"name": "License infrastructure", "undocumented": false, "confidence": "fact", "source": "licensing, keys.rice", "detail": "ActivationAPI, FeatureManager, LicenseServer, GracePeriodManager, LicenseHeartbeatManager, LicenseSyncManager; preference page 'Licensed Features'; extension point LicensedFeature. Server sync + grace period + heartbeat (assumption)."},
        {"name": "Apparently unlicensed", "undocumented": false, "confidence": "assumption", "source": "index scan", "detail": "NK, Catena, tally, MIDI, joystick, webcam, openGear show no <licensed> tag or License classes; runtime checks unverified."}
      ]
    },
    {
      "id": "external_entry_points",
      "title": "Ways to control DashBoard from outside",
      "items": [
        {"name": "RossTalk GPI", "undocumented": false, "confidence": "fact", "source": "graphnav, common.oglml GPIService", "detail": "Functions registered with ogscript.addRemoteTrigger are fired by RossTalk GPI commands; preference page 'RossTalk GPI Listener'."},
        {"name": "OGP-JSON share server", "undocumented": true, "confidence": "assumption", "source": "gear JsonShareServer/OgpShareServer/FrameShareServer, gear.rice.sharecentre", "detail": "'Share Device / Share Frame' turn DashBoard into a server; settings json.port, frames.N.port, frames.http.port (defaults not read); shipped grid uses localhost:5254; official text mentions 5253/5254."},
        {"name": "CLI server", "undocumented": true, "confidence": "fact", "source": "gear.rice.debug.cli", "detail": "See hidden_debug."},
        {"name": "Catena proxy", "undocumented": true, "confidence": "fact", "source": "gear.catena.rice CatenaProxyServer, catena.core OAuthServerInterceptor", "detail": "DashBoard can expose devices as a Catena server (existence confirmed; operation unverified)."},
        {"name": "HTTP / VDCP trigger services", "undocumented": true, "confidence": "assumption", "source": "common.oglml HttpTriggerService, VDCPTriggerService", "detail": "Classes exist; whether an HTTP trigger endpoint is exposed is unverified."},
        {"name": "Generic REST API", "undocumented": false, "confidence": "fact", "source": "scan", "detail": "None found. ogscript.http / asyncPost / post are outbound (DashBoard calling external services). No OSC support; OSC would have to be hand-built over sendUDPBytes."}
      ]
    },
    {
      "id": "platform",
      "title": "Platform features and extension points",
      "items": [
        {"name": "Core UI", "undocumented": false, "confidence": "fact", "source": "rice.dashboardsuite, connection.rice, rice.layouts, navigator, keymaps, i18n.rice, touch, jxb", "detail": "Basic/Advanced Tree View, Progress View, Connect/Disconnect/Reload/Refresh/Save Configuration/Automatically Connect, Manual Connection wizard, SLP NIC selection, Full Screen (Shift+F11/Ctrl+F11), Lock Screen (Shift+F4), Layouts View, Save Layout (Shift+F10), File Navigator, Keyboard Shortcuts, Language, touch window + virtual keyboard, JxBrowser 7.44.2."},
        {"name": "PanelBuilder", "undocumented": false, "confidence": "fact", "source": "rice.graphnav", "detail": ".grid editor, .ogscript/.widgetdescriptor editors, New CustomPanel wizard, Edit Mode (Ctrl+G), Fire GPI Trigger, Browser Preferences; bundled help/html with the CustomPanel Development Guide (831 files)."},
        {"name": "Walkabout", "undocumented": true, "confidence": "unknown", "source": "rice.walkabout", "detail": "File > Show Walkabout and an editor; purpose unknown; absent from User Guide TOC and release-note headings."},
        {"name": "Auth and rights", "undocumented": false, "confidence": "fact", "source": "urm.*, eevee.urm.rice, oauth.rice", "detail": "File > Login (URM), User Rights Administration (Permissions), OAuth 2.0 Login, DashBoard Enterprise 'Publish CustomPanel', LDAP."},
        {"name": "Updates", "undocumented": false, "confidence": "fact", "source": "rice.p2.ui, p2.ui2", "detail": "Help > Install New Software / Update, update sites, Launch Plug-in Installer."},
        {"name": "openGear tooling", "undocumented": false, "confidence": "fact", "source": "gear.rice, selector", "detail": "Device/Frame Editor, Import openGear Help Files, Force Connection, Remove Offline Devices, Rename Frame, Lock/Unlock Access, Restore Configuration, Upload Progress, Device Classes mapping."},
        {"name": "Ross extension points (11)", "undocumented": true, "confidence": "fact", "source": "dashboardsuite, keymaps, keys.rice, gear.rice, touch, camera.generic, nk", "detail": "CSTreeObjectFactories, FileExtensionHandler/SwingFileExtensionHandler, ProductTreeDragListener/DropListener/DnDTransfer, trimContribution, autoStart, WindowManager, commandConfiguration/keymapContributions, LicensedFeature, CustomDeviceNodeFactories, ObjectActionTouch, cameraModel, CustomNKNodeFactories."},
        {"name": "Bundled libraries", "undocumented": false, "confidence": "fact", "source": "plugins", "detail": "Eclipse RCP 3.8/4.2 (osgi 3.8.1, ecf 3.1.3), Jetty 8.1.3, lucene 2.9.1, jxbrowser 7.44.2, rhino 1.7.7.1, zxing 3.5.3, jsonwebtoken 0.12.5, scribejava 8.3.3, gson 2.10.1, flexjson 3.2.0, 'com.google.protobuf 3.25.2' bundle actually containing protobuf-java 4.28.2 + grpc 1.75.0 + guava 33.3.1, batik 1.17.0, webcam-capture 0.3.13, JInput 1.0.0, solers slp 3.0.0, commons (io/net/math3/collections/fileupload/httpclient 3.1), swingx 1.6.4, jfreechart, jna 5.12.1, jdom2, xerces 2.9.0, sat4j 2.3.0, felix gogo 0.8.0, equinox.console, ant 1.8.3, slf4j, BouncyCastle (inside catena.core)."}
      ]
    },
    {
      "id": "limits",
      "title": "Not investigated / limits",
      "items": [
        {"name": "Scope of decompilation", "undocumented": false, "confidence": "fact", "source": "work/decomp", "detail": "Only parts of 7 jars (ogscript/params bridge, CLI, tally, startup switches). OGLML element implementations, HTTP trigger, Catena proxy, share-server defaults, event object class not decompiled."},
        {"name": "Nothing executed", "undocumented": false, "confidence": "fact", "source": "-", "detail": "CLI and getSystem() behaviour read from source only; not run."},
        {"name": "Unread", "undocumented": false, "confidence": "unknown", "source": "-", "detail": "Encrypted widgetdescriptors, NK nested jars (NKSystemLibrary/NKSystemAPI), camera OID lists (GCC_Master*.csv, oidlist.txt), help.rossvideo.com online help, 8.x release notes, v10 release-note body text."}
      ]
    }
  ],
  "sources": [
    "c:/DashBoard (DashBoard.ini -Ddb.version=9.16.2; plugins/ 259 bundles; VisualLanguage/blocks; widgets/)",
    "com.rossvideo.rice.graphnav jar help/html/ (CustomPanel Development Guide 8351DR-007)",
    "https://documentation.rossvideo.com/files/Manuals/Enterprise%20Management/Dashboard/DashBoard%20User%20Guide%20v10.pdf",
    "https://documentation.rossvideo.com/files/Manuals/Enterprise%20Management/Dashboard/DashBoard%20CustomPanel%20Development%20Guide%20v10.pdf",
    "https://documentation.rossvideo.com/files/Manuals/Enterprise%20Management/Dashboard/DashBoard%20Release%20Notes%20v10.pdf",
    "https://www.rossvideo.com/support/product-documentation/dashboard"
  ]
}
