- 22 Sep, 2026 29 commits
-
-
PLN: "part of the migration also: no d7 when d6 is free. d7 often was sefcond melo, should be a d6 now d6 ids not a shitty mapped knob, but a proper column like others". That is the history exactly. d6's knob used to be somewhere useless, so a second melody went to d7 and d6 was left empty; since the column remap every one of d4-d8 owns a fader, a B knob and a C knob, so the reason is gone and only the habit remains. A set with a hole at d6 wastes a whole column. 150 moves in 133 files. `d7 -> d6` is most of it; a lone melody with both slots free compacts to d5. THE BAND IS {5, 6, 7} AND IT IS DERIVED, NOT DECREED. An orbit number decides which family DJ filter and which family mute the part answers to. From the authored grid, d5/d6/d7 share both maps, so a move between them changes nothing about the sound — while d4 is the bass (gF2) and d8 is percussion (gF1/gM2), so compacting into or out of those would silently re-assign which filter sweeps the part and which button drops it. The tool computes the band by asking lcxl_grid which orbits agree with d6 on both families, so if the grid ever changes, the band follows instead of rotting. It refuses rather than guesses: 7 orbits carry an explicit `# orbit N`, which overrides the output orbit independently of the `dN` name, so renaming the declaration alone would move the pattern's identity and leave its AUDIO behind. Comments are never rewritten — a commented `-- d7 $ …` is an alternative to re-enable mid-set. Bus slots (`crushbus 71`) and `cut` groups stay put: a bus id is an audio-graph edit and a cut group is a choke group, not an orbit. VERIFIED: re-plan reports 0 moves left. silent-eval --seeded re-run over all 703 files and diffed per-file against the pre-migration baseline — zero verdict changes, 703/703 joined. And the declaration multiset of every one of the 133 files is a pure permutation inside the band, with nothing outside it touched: no pattern was dropped and no orbit was declared twice where it was not already. That last check exists because a naive compaction fusing two blocks' melodies onto one orbit would be silent, not loud — the later declaration wins.PLN (Algolia) authored -
PLN's edit from tonight, saved before he stepped away. The file declared d5 twice ('v1 magic repeat' then 'v1 science of repeat') in one block, where the later declaration silently wins and the earlier is dead code — pvlint PV005. The dead one is gone, and a `(0.125 ~>)` is parked as a comment. wap is out of the Thursday set anyway ("too sample heavy"), so this is housekeeping rather than set work.PLN (Algolia) authored -
PLN settled it: "the set is ready i thinki for now i settled on … i can play longer/shorter, might add some, but a good setup for now". Three movements — START, NUJAZZ PARADIZE, FINALE COMEDOWN — 17 tracks over 120 min, ~9 each. The shape moved with his ear, not with the tooling: cyber_hump, wap and bombe_dj are out ("not adequate too sample heavy its a nujazz/chill dnb set"), and ten tracks came in that were never in a candidate list — salut_nu, love_first, take_5_drops, bain_electrique, haunted_house, chere_mireille, cafe_bouillant, cafe_tiede, force_motrice, revolution. All 17 pass `silent-eval --seeded`: every declared orbit emits. Ten of them had never been validated for this gig at all. His two in-file TODOs are carried into the comments rather than dropped: ete_a_mauerpark wants its d9 effects confirmed, and sept1 wants fixing to the new controller. "Liquid Nite TODO finish convert" is now done — that was the column remap, applied this evening. Declared BPM is in the comments, and the three tracks that declare no setcps say "inherits" instead of borrowing a number they never set.PLN (Algolia) authored -
PLN: "midimon unusable in the sun in light mode :') can we have a basic menu for midimon, maybe a tray presence when runnig, with scaling, theme, etc options ? to help sets in all context, robust, antifragile". Colours leave the paint loop and become data: three themes resolved once per change, so a frame still constructs no QColor and the 30/5 fps split is intact. The cut that made it work is INK versus SURFACE — recency (digits, bars, pens) against cell bodies, column glow and gutter — because the docstring's own invariant is that a mapped-but-idle cell must never read as a hardware fault. On dark that is a glow above black; on light and sun it is a wash below the page. A test asserts the floor tint differs from the page on all three. `sun` needed two passes and only a screenshot said so: the first render climbed to a saturated mid-tone panel and the digits lost the fight against it — light with fatter bars, not a sun theme. Flattened tint, near-black ink at every decay level, and a bold face, which outdoors is the cheapest contrast there is. The decayed state was shot on purpose, since "no subtle dim states" is exactly about the moment after a movement ends. Menu and tray are one QMenu, and every entry calls the same method the key does — no second code path, and no setShortcut, which would have taken the keys off keyPressEvent and out of the selftest's reach. Tray guarded on isSystemTrayAvailable and silently absent otherwise; a hidden window drops to idle fps and X/q/Quit still really exit. Config at $XDG_CONFIG_HOME/parvagues/midiviz.json, temp-file plus os.replace, and load cannot raise: missing, corrupt, not-a-dict, unknown-theme, NaN scale and unwritable are each exercised. A monitor that dies on a bad config file is worse than one with no config, and this one is meant for the middle of a set. Verified: bridge tests 105 -> 121 passing (the single failure is the inherited test_gearbox dash case, identical before and after); selftest PASS on all three themes; and dark proven pixel-identical to HEAD at four scales by rendering both versions side by side. NOT verified, and not to be claimed: the tray on a real desktop. Headless has no status area, so only the degrade path was proven. One known follow-up — a window hidden to the tray is still alive, so the hub's focus_window does nothing for it and the tray is the only recall path.
PLN (Algolia) authored -
PLN: "lets do the migration tbh i want to trust all tracks, lets indeed make that proper." The #94 remap had only ever been run against a setlist, so conformance was a property of having been listed, not of being a track. 685 moves across 148 files, one simultaneous permutation per file, zero clashes. Button conformance, measured by tools/button-column-audit.py before and after: **2154/2729 on the orbit's own column (78.9%) -> 2544/2726 (93.3%)**. The remaining 182 are overflow — an orbit with more controls than the grid gives it, left in place under a FIXME pointing at gSel, because moving them would put two orbits on one physical control. VERIFIED, and this is the part that matters for trusting 703 files: * silent-eval --seeded re-run over the WHOLE corpus, 703/703, and diffed per-file against the pre-migration baseline in docs/2026-09-22-catalog-playability.tsv: **zero verdict changes**. Same 597 playable, same 85 compile-fail, same 21 silent-orbit, and not one file swapped sides. Run at nice 19 / ionice -c3 so it could not preempt the live rig mid-rehearsal. * re-plan over all 703: 0 moves left. * not one CC reference landed in a protected range — 378 refs gained, none of them in the Ardour-learned faders (77-84), the A1-A4 level knobs (13-16), or the gF1-3 family filters (49-51). Checked as a multiset diff of every CC in every changed line, not by reading the tool's promise. * every effect BUS slot is byte-identical before and after (`crushbus 41` and friends): the tool rewrites quoted `"^NN"` refs only. So the 37 corpus pvlint errors, 36 of them PV011 bus-slot sharing, are untouched by this and were there before it. AND THE TOOL STOPPED VANDALISING COMMENTS. The overflow pass expands a hit to the whole chain segment, so the closing parens of a multi-line step are not left dangling — and that expansion swallowed comments inside the step. First corpus run: 18 lines grew a second `--`, three grew a third, and two of the tool's own FIXME warnings were commented out by the tool that wrote them. A warning the tool hides on its next run is worse than no warning. Fixed, the corpus reverted, and re-applied: the two diffs now differ in exactly those lines and nothing else.PLN (Algolia) authored -
PLN asked for the rendering to show where things REST, not only what just moved, and asked that the wire not pay any cost twice. Written down before any of it is built, because the interesting part is not the drawing: state has exactly one legitimate owner. The surface has no readback and in relative mode sends deltas, so the driver's integrated value is not a cache of something else — it is the only copy. A viewer cannot derive it, and at boot there is nothing on the wire at all. The design: level and edge as two channels, state as last-value-wins in one small atomically-replaced file with a seq counter so an unchanged frame parses and paints nothing, and dirty-cell repaint so the layer costs nothing at rest. Explicitly NOT built: a fan-out daemon for the duplicate aseqdump subscriptions, which buys microseconds at the price of a process and a failure mode. Two findings worth the doc on their own. Zero on a DJF is the CENTRE detent, so the readout wants three zones with the detent drawn, not a 0-127 bar. And the Pulsar-style feed needs no new producer: ~/.cache/parvagues/eval-events.jsonl is already being written, one line per ctrl+enter with the orbits it touched, and the driver already reads it.
PLN (Algolia) authored -
`declared_bpm` defaults to 120 when a track sets no setcps, which is right for the driver — the OLED has to breathe at some rate — and wrong for a picker. 221 of the 703 tracks declare no setcps at all, so a third of the cards were showing a confident 120 that came from nowhere. That is the worst shape a wrong number can take: plausible, and load-bearing for the arc he is about to order tonight. Now the generator passes default=0 and those cards read "inherits bpm", which is not a gap but the actual behaviour — a track with no setcps runs at whatever tempo the previous one left behind, and for building a ramp that is worth knowing. They sort last on the BPM axis, since they have no place on a ramp until you decide what they inherit.
PLN (Algolia) authored -
PLN, at the desk: "cyber hump and wap and bombe dj not adequate too sample heavy its a nujazz/chill dnb set i think is the right one." That is an ear judgement the tooling cannot make, but it can hand him the two handles the judgement needs. Every card now carries the BPM the track declares and how many distinct sample banks it pulls from, and the list sorts by hands first, lightest on samples, or slowest BPM. Bank count is a proxy and it is labelled as one — it is not busyness or loudness, just breadth of folders. It does separate the three he named (wap 11, cafe_glace 10, bombe_dj 9) from the light end, which is the job. BPM is DECLARED, never measured, and the legend says so: tempo-lens.py opens by warning that setcps is not the tempo, since a track at setcps 80 with everything on the half-note performs at 160. Right handle for ordering an arc, wrong one for claiming a speed. `declared_bpm` goes into setlist_samples.py, where corpus syntax belongs, not into the generator — a second private regex for the corpus's own idiom is how the parser rule gets broken one convenience at a time. tools/lcxl3-driver.py carries an identical `parse_bpm`; it predates this and it is load-bearing two days out, so the duplication is recorded in a comment and collapses after Thursday rather than tonight.
PLN (Algolia) authored -
Desk edit from tonight's rehearsal. `|- note 36` -> `|- note 12` on acidOto3092, and the mask(16,32)+ply gate commented out so d7 runs the arp clean.
PLN (Algolia) authored -
PLN: "deliberate killed tail was just a agent log or srth, capture that removed as learning, nut then let me clean that backlog indeed was gboing tedious." The tail is cleared and the new AI ENGINEER candidate section stands. But the 543 lines were not a log: they were two sessions of rig notes from 6-7 September, and six items in them were still open. Losing them to a backlog cleanup is the quiet kind of loss — nobody misses a note they have forgotten writing. So the whole block is archived verbatim in docs/, with the open items hoisted to the top of it where they can be read without scrolling. The one that matters: `sudo tools/install-protect.sh` was never run, so the OOM-protection daemon has never actually protected anything — it reported ok only because scsynth and sclang already sat at the target value, and no write was attempted.
PLN (Algolia) authored -
The remap commit carried counts. Counts do not help at the desk: a knob that moved from C5 to B4 is a knob that does nothing when you reach for it. The tracker now holds the was/now table for every one of the 24 moves, because PLN is rehearsing jeudrill and rose_rouge tonight and both of them moved. Also recorded: techno_orage's ^58 firing across d5 and d6, the corpus-wide 154-file job that is explicitly NOT for tonight, the 114 duplicate FIXME lines left behind by the old non-idempotent tool, and the fact that "the set" still resolves to the Opal list through backlog.md while Thursday's arc lives only in armada/setlist_thu24.txt — a default nobody should trust this week. Two fixes in the tool itself: * the FIXME dedupe was a snapshot taken before the insert loop, so one run could still stack two identical notes when an orbit is split across two blocks. It now learns as it writes. * the docstring still promised that buttons were "Phase 2, after the gig". They were folded in when #94 shipped, and the tool has been moving BT/BL cells ever since. A docstring that defers work the code already does is the one place a reader can learn the wrong scope.PLN (Algolia) authored -
The #94 remap was run against a setlist, not the catalog, so conformance was never a property of a track — it was a property of having been on that list. Two days of desk edits then pushed listed tracks back out: swapping jeudrill's d9 and d10 bodies moved the orbits but not their knobs, so d4's effect was sitting in d5's column again. Migrated, one simultaneous permutation per file, 24 moves across six tracks: jeudrill 6 the d9/d10 swap's knobs follow their orbits liquid_nite 4 the four PLN had not reached by hand rose_rouge 3 techno_orage 9 cyber_hump 1 siberie_samuel 1 liquid_nite is the one that prompted this — PLN saw it in the catalog, wanted it in the set, and found it half-migrated: he had walked the buttons down a column by hand (^42 -> ^41, ^43 -> ^42) and stopped. The knobs are now on their own columns too, and it evaluates clean. VERIFIED, not assumed: re-plan reports 0 moves on all six; silent-eval --seeded is OK on five. techno_orage still FAILS, on the same d2 that was already silent before this commit — unchanged, and still PLN's call to fix or cut. pvlint: 0 errors, 21 warnings, all pre-existing shapes (PV013 missing family mutes, PV005 double declarations). One is worth reading: PV008 says techno_orage's ^58 drives d5 AND d6, which is the overflow the tool annotated rather than commented — a $-step cannot be commented out without breaking the block's arity, so that button really does fire across two columns until gSel folds it. AND THE TOOL NO LONGER TALKS TO ITSELF. Every run stacked another byte-identical FIXME paragraph above the same line: cafe_glace carried the same note three times, and 90 files in the corpus carry 114 duplicate lines between them. An overflow is a standing condition, not an event, so it earns one note. The comment-out still runs on a repeat pass — if a line came back to life it is firing across columns again whatever the note says — only the note is deduplicated. Proven by applying twice and diffing: 15/13 both times. Corpus-wide, 154 files still want 709 moves with zero clashes. Not tonight.
PLN (Algolia) authored -
Everything here was already in the working tree — played, kept, never committed. Written down now so the gig runs off the repo and not off one laptop's dirty tree. siberie_samuel NEW FILE, and it is in the Thursday candidate arc. It existed only as an untracked file: nothing outside this filesystem knew the track was real. liquid_nite the buttons walked down a column by hand (^42 -> ^41, ^43 -> ^42) and a long tail of commented-out orbits was cut. The button axis is Phase 2 of the #94 remap, so this is hand work ahead of the tool, not a conflict with it. jeudrill d9 and d10 swapped bodies; the d9 crushbus commented out. you_my_sunshine cut 3 and the legato sweep off; room 0.14 -> 0.8, sz 0.9. techno_orage back to the Children Holiday line, slow 4 on the notes, cut 3 dropped. esperluette the bassWarsaw d5 removed. sept1 resetCycles dropped from the top. piment_bresilien whitespace. setlist_opal2026.txt loses its SOUNDCHECK section, so the pairwise walk in orphan-orbits.py starts on the real opener. That file is a record of a past gig, so the removal is visible here on purpose rather than folded into a larger commit.PLN (Algolia) authored -
The sweep evaluated all 703 tracks on Sunday night and found 597 that compile and emit. The picker still carried fourteen hand-written entries, so the page said the library was fourteen deep — the measurement existed and the surface that needed it did not have it. gen_setbuilder_catalog.py turns the sweep into the page's data, joined against two things the verdict alone does not tell you: how often the driver journal saw the track loaded (what the hands know), and how many of its sample banks the preload plan already warms (a cold bank is not a fault, it just hiccups on the first bar). Sample names come from setlist_samples.py, never a fresh regex. The sweep results now live in docs/ instead of a scratchpad that dies with the session — an artifact nobody can compare against is the preload.scd story. Ids are repo-relative paths, not stems. Sixteen stems collide across folders (major_nostalgia in chill and techno, all four FFF tracks in two trees) and a stem key merged each pair into one card, silently. Picks stored under the old stem keys are migrated on load where the stem is unambiguous. And the Thu-24 list is a candidate arc, not a locked set. It was exported from the builder, not decided at the desk; rehearsal decides.
PLN (Algolia) authored -
docs(tasks): the set is locked, the preload covers it, and the gate that would have undone both is fixed
PLN (Algolia) authored -
gig-up runs check-preload --fix whenever the check fails, so a plan that was a deliberate superset scored STALE and got silently narrowed — bass2 would have been dropped on gig night and ete_a_mauerpark would have lazy-loaded mid-set. Membership now uses comm -13/-23 (missing is a fault, extra is information), counts join on shared banks, and --fix emits the union so it can never shrink. Second hole, latent: under en_US.UTF-8 a whole-line sort orders 'bass2 5' before 'bass 4' while join compares field 1, so join dropped a pair (123 of 124 shared banks) and 2>/dev/null ate its warning — a count check with a hole reports ok. LC_ALL=C and sort -k1,1 on every set operation; join now equals comm -12. Extras are also count-checked against disk: SuperDirt asserts the recorded count at boot whether or not the bank is in the set.
PLN (Algolia) authored -
Not sampled: every .tidal under live/ evaluated with silent-eval --seeded. 85 do not compile and 21 have a genuinely silent orbit; the failures are diffuse helper/API drift (scope errors on g, jchord; Pattern String type mismatches), not one rotten folder. Playable is still not gig-ready — the play log remains the better signal for a set.
PLN (Algolia) authored -
From PLN's Set Builder export, 120/120 min. All ten pass silent-eval seeded; the set needs 46 banks, all present on disk. preload.scd (gitignored, generated) regenerated as a superset — 125 banks, adding bass2 for ete_a_mauerpark.
PLN (Algolia) authored -
The row existed but bare, and libjack.so.0 resolves to jackd2's — an unwrapped qjackctl shows an empty jackd2 graph instead of PipeWire's. Same wrap as Ardour.
PLN (Algolia) authored -
Three rig items and two of the three next moves closed while the page was being built; SOUND now carries the measured Master reading instead of the wrong -inf claim.
PLN (Algolia) authored -
Where Thursday stands on paper: rig, set, sound, stage, rehearsal, each with an honest figure and the items only PLN can do, over a live countdown to doors.
PLN (Algolia) authored -
check-mix against the running session: twelve orbit faders between +0.0 and +6.0 dB, none muted, all routed to master. The overnight -inf reading does not hold. Master -30.2 dB is the real finding, and with OSC off only PLN's eyes can confirm the live value.
PLN (Algolia) authored -
A hard DJF swing froze the readout: the 20 Hz door dropped events without parking one, and the 0.9 s re-arm then replayed the cached strings, so a value the glass never caught was reprinted indefinitely — pinned at 127 the 'end stop' continue skipped the display entirely and 5.6kHz (value ~108) stayed on screen for good. The re-arm now recomputes from self.values, so any dropped event heals within 0.9 s whatever ate it; the door parks instead of dropping; the flush takes the freshest value. Momentary family_mute lines still replay — mutes_held() is transient state, not durable.
PLN (Algolia) authored -
Cream ground, warm brown ink, sage for OK, amber for WARN, terracotta for the played-recently badge. Screenshot-verified over HTTP at 1400px.
PLN (Algolia) authored -
Fourteen candidates: the nine from the overnight sweep plus the five the driver journal shows PLN actually played this week, each with its silent-eval verdict. Per-track minutes against the 120-minute target, reorder, copy the paths out. One static file, no build, renders offline, LAN-reachable for phone picking.
PLN (Algolia) authored -
docs(tasks): Tue-22 gig state — the latency cut is not live, the CPU is capped, and the play log names the set Three corrections from measurement: sclang predates the s.latency edit (still 0.2 in the process), max_perf_pct is 55 so every audio number is suspect, and the driver journal shows 12 tracks actually played in 5 days — five of them outside the overnight sweep.
PLN (Algolia) authored -
rel_delta caps one message at +-63 (7-bit offset-64); firmware acceleration compresses a fast flick to 1-2 messages, so flick-to-max landed at ~125. A saturated delta in the end-stop band (>=115 up / <=12 down) now snaps to 127/0 — slow turns never saturate, precise control untouched. Feel bands, PLN vetoes at rehearsal.
PLN (Algolia) authored -
The firmware's per-control value row never shows driver-integrated values for relative encoders (stuck at 0 — probe H5 unresolved); PLN chose one coherent fast overlay over 29 firmware-drawn fictions. Overlay-only mode (promoted from --oled-overlay fallback to default) draws every knob on the global 0x36 target with bring-up-after-write; --oled-native restores the old firmware-drawn mode.
PLN (Algolia) authored -
PLN (Algolia) authored
-
- 21 Sep, 2026 4 commits
-
-
s.latency 0.1 (oLatency 0.1 on top = 0.2 total; the old padding defended against watchdog-restart bursts, not latency). Regression check in-file: journal late-count must stay 0, revert on any late. gig-up --bt-off/--bt-on: a phone or BLE lamp churning wireplumber can kill the fold links — rfkill the radio before doors.
PLN (Algolia) authored -
Eye-in-the-loop probe (lcxl3-probe-display, 2026-09-21) falsified the 'a field write needs no re-summon' assumption: bare set_text on a visible target (0x35 AND 0x36) never reaches the glass. Every text path now ends in configure_display(target, 0x7F): touch overlay, 2s home tick, zero-anim. Plus: ~10 Hz rate gate with latest-value-wins pending flush (H2 ceiling untested — conservative), and the at-rest overlay re-arms every 0.9s indefinitely so DJF state/zero stops self-destructing after 1.2s.
PLN (Algolia) authored -
PLN (Algolia) authored
-
Overnight silent-eval sweep of 9 WIP set candidates: 7/9 can play with the standard #55 seed; techno_orage d2 is a real silent orbit to debug; bass2 and humps banks not warmed by preload.
PLN (Algolia) authored
-
- 20 Sep, 2026 5 commits
-
-
PLN (Algolia) authored
-
docs(tasks): park the card-profile learnings — wireplumber 0.4 lua rules, DMIC guard, ardour sink follow
PLN (Algolia) authored -
PLN (Algolia) authored
-
5 CC moves the buffer-clobber detector wanted (the gate went NO-GO over it): the track was committed on the pre-remap grid, so its d3/d4/d7 buttons fired across columns into other orbits' controls. Mechanical remap only; the ^44 step keeps its FIXME(#94) note.
PLN (Algolia) authored -
The Bridge's RIG UP ran tools/gig-up.sh --converge, whose converge never starts lcxl3-driver (boot policy manual), and whose LCXL checks grep the v2 name 'Launch Control XL' — so a v3 board plugged in read as absent, painted by nobody, and the gate still said GO. Meanwhile the desktop launcher runs the ROOT gig-up.sh, a second launcher with the leds() the gate lacks — two launchers, each owning half the surface story. - launchers: Ardour launches under pw-jack like gig-up does (bare ardour starts its own jackd and splits the graph from scsynth) - gig-up: 'LCXL present' matches LCXL3 too; 'LCXL LEDs' is generation-aware (LCXL3 -> lcxl3-driver, original -> lcxl-leds-watch) - lcxl-path: follows the v3 path LCXL3 -> driver's 'ParVagues LCXL3' virtual port -> SC, falling back to the Midi Through road for v2
PLN (Algolia) authored
-
- 18 Sep, 2026 1 commit
-
-
Every tray GIG UP click POSTed to the Bridge, which ran 'gig-up.sh --converge --quiet' — flags this script never parsed, so the arg guard rejected it with 'unknown option' and exit 2, output swallowed by the Bridge's capture. Net effect: Pulsar opened (PRE_APPS, before the POST) and nothing else ever booted. The script and its caller had drifted apart on paper only — this is the contract, written down.
PLN (Algolia) authored
-
- 17 Sep, 2026 1 commit
-
-
The double click was the appindicator extension's, not ours: it reserves double-click for SNI Activate (instant menu) and delays single-click by 400 ms, so a single click feels dead. Nothing to fix tray-side; documented in the changelog. - BRIDGE_QSS restyles the Qt-drawn popup on dark desktops: tonal surfaces, hairline borders, hover pill, magenta on the engaged radio; circles for radio groups, squares for boolean toggles. Contrast measured: body 14.7:1, disabled 6.4:1, radio ring 3.3:1 (bumped from 2.3:1 in review). - stat rows and the thermal tooltip read in tabular digits. - every user-visible string loses its em dash (colons, parens, middots); same pass on gearbox.py labels (shared with the web Bridge) and the launcher blurbs; unknown gearbox placeholder is now n/a, not a bare dash. - mnemonics on the action rows (&Open Bridge, &GIG UP, &Restart SuperDirt, R&ig, &Start at login, Cut G&PU, &Quit); verified over DBusMenu that Qt exports them as underscores, so the shell-drawn twin gets them too. Literal ampersand does not survive the export, so the copy avoids it.
PLN (Algolia) authored
-