upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBitflash <btf01@proton.me>2026-07-28 12:55:04 -0300
committerGitHub <noreply@github.com>2026-07-28 12:55:04 -0300
commit663784eae9b04ec71e3e1eebf445910e5a8add42 (patch)
tree1482b0778a11c1b46cfbd476a5d91e12ef31204b /src
parent1d0314c0d220231afc56193ba66b70234fa24092 (diff)
Merge PR #6 (large refactor), preserving main's fixes (#9)
* Add Linux GUI installer via Wine * Fix launcher creation and add BTF_RELAY env var support * Pool server, Linux GUI, unified binary, README update * Root Makefile: make linux / make windows, cleaner README * Remove headless.cpp * Fix XPM color count mismatch causing toolbar image errors on Linux * XPM icons: same code on Windows and Linux, no ifdefs around image loading * Fix GTK icon crash and Linux printf format * btfrv: 10s socket timeout on relay connects * Faster peer discovery: more dials per pass, shorter backoff and sleep * Parallel btf peer connections * Fix GetMyExternalIP - was disabled, now uses modern IP echo services * Fix tunnel disconnect on idle and restore external IP detection * Filter stale Nostr descriptors * Sort peers by freshness, fresh first * Pool: add .btf Stratum listener — miners connect via rendezvous, no port forwarding needed * btf pool: self-replacing listeners, one per relay, no queuing between miners * Mining modes: solo/operator/participant — pool server on-demand, participant Stratum client * Status bar: show external IP and .btf address * README: clean rewrite, concept-first, minimal * make linux produces AppImage * make linux produces AppImage * Pool dashboard: connect instructions, tabs, share bars * Perf fixes: GetMyExternalIP threaded, btf listener counted * Perf fixes: GetMyExternalIP threaded, btf listener counted * Fix pool payouts: defer until coinbase maturity * Pool: clean mode switching, IP warning * Pool: clean mode switching * Fix gPoolRunning: remove static * AppImage: use real icon from bitcoin.ico * Fix exit crash; Mining menu * Fix exit crash; Mining menu * Fix exit crash; Mining menu * Fix exit crash; Mining menu * Fix exit crash; Mining menu * Windows build: use mingw32-make * Windows build: simpler make invocation * Add deps-windows target * Windows build fixes * Windows build fixes * Windows makefile: fix obj dir * Windows: output to repo root * Windows: bundle DLLs into zip * Replace wxWidgets with ImGui+GLFW: same build on Linux and Windows * Fix %I64d that slipped back through rebase (main.h, net.h) * MinGW: add _mkdir shim for non-MSVC Windows; fix %I64d * Fix gPoolRunning extern outside ifndef _WIN32 * Remove -lboost_system: boost is header-only in this codebase * Status bar: copy buttons for IP and .btf address * Windows: add app icon via windres, strip wx stuff from rc file * Clean GUI: single Options menu item, bigger font, better spacing, cleaner options dialog; update README * GUI: embed Roboto font at 16px for clear readability on all platforms * Windows: windres depends on obj dir target * Fix balance hidden off-screen: put on own line below address bar * Windows: inline mkdir in every rule, remove dir target that confused make * Windows: move all target to top so it's the default rule * Fix pool server not starting: always start when operator selected, re-sync dialog state on open * Write debug.log to data directory (AppData/Roaming/Bitflash on Windows) * Participant miner: use wallet address as username so payouts go to wallet * Add .gitattributes to lock LF line endings, prevent CRLF drift * Refactor pool mining to btf-only transport * Persist pool settings and startup wiring * Prune stale peers and expose pool queries * Fix build regressions and add CLI mode/arg parity * Fix rpc miner stats declaration order * Centralize pool runtime extern declarations * Separate operator/participant dashboards and restore peer stats * Add live telemetry strip and clearer per-mode runtime metrics * Reduce mining dashboard clutter and remove manual pool entry * Count only authorized pool miners * Seed initial pool job on startup * Use a real share target for pool work * Switch pool accounting to round-based shares * Fix nostr pool announcer stats call sites * Fix pool stats definition order * Improve pool worker status display * Add mutex include for participant status * Replace ImClamp in dashboard layout * Clarify participant work status * Log participant status transitions * Reduce peer discovery log noise * Add participant status badge * Track participant auth acknowledgements * Log and validate pool job delivery * Stop persisting mining mode/pool settings across restarts LoadWallet() runs after CLI flags are parsed in main_gui.cpp, and was restoring nMineMode/strParticipantPool/strPoolName/strPoolDashboardUrl/ dPoolFeePercent/fGenerateBitcoins from wallet.dat every time, silently overwriting whatever was just set on the command line or in the current Options session -- no error, no log line. This is why pool name/address could show correctly in the UI but stay stale in the logs (UI held the in-memory value just set; logs eventually reflected whatever LoadWallet clobbered it back to), and why mode changed behavior across restarts. Mode/pool config is now decided fresh every launch: CLI flags if given, otherwise the compiled-in default. Nothing is written back to wallet.dat for these settings anymore, so there's nothing left to go stale or fight over load order. * Add explicit Relay mode as the new startup default 4th mining mode: node runs/syncs, never mines, no pool server -- an explicit option instead of an implicit side-effect of 'Solo + never click Start Mining'. Now the compiled-in default (was Solo). - main.h: MINE_RELAY = 0, renumbered other modes (nothing compares nMineMode against raw integers elsewhere, verified). - main.cpp: default nMineMode = MINE_RELAY; BitcoinMiner() early-returns for Relay, mirroring the existing Participant-mode guard. - gui.cpp: added Relay radio button, status label, and telemetry-strip text. Start/Stop Mining button is hidden for Relay (meaningless -- it never mines by definition); OK forces fGenerateBitcoins off if you switch into Relay while previously mining. * Announce pool changes immediately instead of waiting up to 60s ThreadBtfPoolAnnouncer re-read strPoolName/dPoolFeePercent/etc live, but only once per iteration of its 60s sleep loop, so a pool name/fee change in Options could take up to a minute to reach other nodes. - nostr.h/.cpp: add gAnnounceNow flag; the announcer's sleep loop now wakes early and publishes immediately when it's set, then clears it. - gui.cpp: Options OK handler sets gAnnounceNow when operator pool settings actually changed (name/dashboard/fee/mode), so a saved change is announced right away instead of on the next tick. * Give each pool miner a distinct extranonce2 so jobs no longer overlap mining.notify previously broadcast one identical 80-byte header (baked from a single server-side extraNonce) to every connected miner, so any two miners on the same job searched the exact same nNonce space instead of disjoint ranges. Each Miner connection is now assigned a unique extranonce2 on connect. BuildMinerBlock() takes the shared job template and appends that miner's extranonce2 to the coinbase scriptSig, recomputing the merkle root, so every miner gets its own header variant of the same job. mining.submit validates and, on a full block, assembles the block using that same miner-specific variant (via m->extranonce2), not the shared template. No client-side protocol change needed: main.cpp's participant miner already just takes whatever header bytes mining.notify hands it and submits (jobId, nonce) back, so it works unmodified against per-miner headers. Still simplified vs standard Stratum (no coinb1/coinb2/merkle-branch wire split, no mining.extranonce.subscribe reply payload) since this protocol was already a custom simplification pre-existing this fix. Syntax-checked with g++ -fsyntax-only (full link needs secp256k1/ RandomX/GLFW not present in this sandbox). * Fix debug.log never being written on the real Windows build printf-to-debug.log routing was gated on: #if defined(_WINDOWS) || !defined(_WIN32) _WINDOWS is only ever defined by the legacy, unused MSVC makefile.vc. The actual Windows build (makefile.mingw) never defines it, and _WIN32 IS defined there (mingw builtin), so on real Windows this condition was always false || false = false. printf() fell through to plain libc printf (stdout only), so debug.log was never created, and output was only visible if the process happened to be run attached to a console. OutputDebugStringF() was already platform-safe internally (always writes debug.log; only echoes to console when not on Windows), so the outer condition was pure dead weight. Made the routing unconditional. * Reduce base UI font size one more step (16px -> 14px) * Remove Start/Stop Mining button; mining state follows selected mode The button let a user configure a pool then click a separate toggle, creating states where the button's label/action didn't match what the selected mode actually needed. OK now starts/stops the miner thread itself based on nMineMode: Relay clears fGenerateBitcoins, the other three modes set it and spawn ThreadBitcoinMiner if it isn't already running (guarded by vfThreadRunning[3]). * Fix participant miner stuck waiting for notify after buffered multi-line recv Root cause of the operator/participant pairing successfully but no work ever flowing: PoolParticipantMiner()'s receive loop only pulled one line out of the socket per select() wakeup. The server sends the authorize reply, mining.set_difficulty, and mining.notify back-to-back on the same connection, and these often land in a single TCP segment — one recv() inside StratumRecvLine() buffers all three lines into 'buf', but only the first was extracted and processed. The remaining lines (frequently mining.notify itself) sat in 'buf' indefinitely, because select() only reports readability of the OS socket, not whether our own buffer still holds unprocessed complete lines — and the server had nothing further to send once the initial burst was over, so select() never fired again. Fix: drain any complete line already sitting in 'buf' first; only fall back to select()+recv() when 'buf' has no complete line left. * Fix mining.submit rejecting every share due to wrong param-count check Server required params.size() >= 4 for mining.submit, but the client only ever sends 3: [username, jobId, nonceHex] (indices 0-2, matching what the handler actually reads: p[1]=jobId, p[2]=nonceHex). Every submission was bounced with 'bad params' before its nonce was ever checked against the job, producing an endless share-sent/share-rejected loop with no other visible cause. Likely a leftover from the standard 5-field Stratum mining.submit shape, which this simplified 3-field protocol never matched. Threshold corrected to size() >= 3. * Fix mining.submit rejecting legitimate shares that weren't also winning blocks Pool share difficulty is intentionally ~256x easier than full network difficulty (MakeShareTarget() shifts the block target left 8 bits), so miners are expected to submit many shares per actual block found. But the handler replied to the miner based on ProcessBlock()/CheckBlock() success — validation against the much harder network target — rather than on whether the share met pool difficulty. Every legitimate share that wasn't also a winning block (the vast majority, by design) failed CheckBlock()'s nBits check and got reported to the miner as rejected. Now: reply(true) as soon as a submission clears pool-share difficulty. Only if it ALSO clears full network difficulty (job.target, not job.shareTarget) does it get submitted as a block — with no second reply sent, since the share was already acknowledged. * Fix dead-peer dial priority: freshness sort was undone by full shuffle ConnectDiscoveredBtfPeers sorted candidates newest-first, then immediately shuffled the whole list, making the freshness sort a no-op — every pass was fully random. Meanwhile g_btfPeerFails was tracked but never used to prioritize, so a peer that had failed 20 times in a row got equal footing with an untried or previously-successful peer; the only effect was backoff, capped at 15 minutes, so dead descriptors cycled back into the dial pool constantly. - Track successful connections (g_btfPeerEverConnected) and use it, plus fail history, to order candidates in tiers: known-good, then untried, then known-bad (worst offenders last). Freshness order is preserved within each tier instead of being discarded. - Raise the backoff cap for chronic failures (6+ in a row) from 15 minutes to 6 hours, so descriptors that are clearly dead stop consuming dial budget every pass while still getting retried eventually. * Batch-resolve .btf descriptors to stop hammering public relays during dial passes Root cause of 'stuck at 1 peer' despite good peer discovery: each parallel dial thread in ConnectDiscoveredBtfPeers called ConnectNodeBtf, which itself walked all configured relays (relay.damus.io, nos.lol, relay.nostr.band, relay.snort.social) to resolve that one peer's descriptor. With up to BTF_DIALS_PER_PASS (12) threads dialing at once, a single pass could fire up to 12 * nNostrRelays near-simultaneous fresh connections at the same handful of public relays -- easily enough to trip rate limits or get handshakes refused (exactly what the logs showed: 'handshake refused by relay.damus.io', repeated connect failures to relay.nostr.band / relay.snort.social). Peers that were genuinely reachable looked dead simply because their descriptor couldn't be fetched under that load, and then got penalized as known-bad by the dial-priority tiering from the previous fix. - Add BtfResolveMany: resolves every still-unresolved candidate's descriptor in a single Nostr REQ per relay (multiple authors in one filter), instead of one relay connection per candidate. A 12-candidate pass now costs at most a few relay round-trips total instead of dozens. - Add ConnectNodeBtfResolved / ConnectNodeBtfTail (net.cpp): given an already-resolved descriptor, dial straight to the peer's rendezvous node with zero further relay contact. ConnectDiscoveredBtfPeers now batch- resolves all candidates up front, then fans out tunnel-only connect threads in parallel -- no thundering herd against the relays. - Candidates that fail to resolve are recorded as a failure immediately (same backoff/fail-count bookkeeping as before) instead of spawning a thread with nothing to dial. * Stop reconnecting to relays constantly: pool one persistent connection per relay Real root cause of the ongoing 'handshake refused' / 'connect failed' spam and peer count stuck at 0-1: every relay-touching operation (startup self- test, per-pass seeding, batch descriptor resolve, pool announce, pool query) opened its own brand-new CWebSocket every single time it ran. Two independent threads (ThreadNostrSeed and ThreadBtfPoolAnnouncer) each reconnect from scratch on their own ~60s cycle, so a node could fire well over a dozen fresh TCP+TLS+WS handshakes at the same 4 public relays inside any given minute. Public relays -- relay.damus.io especially -- rate-limit new connections per source IP fairly aggressively, so this node was effectively DoS-ing itself: peers were genuinely reachable, but their descriptors couldn't be fetched because the relay had already started refusing this node's own repeated reconnects. - Add a small per-relay connection pool (g_relayPool) and an RAII CRelayLease that reuses a relay's live socket across calls instead of reconnecting every time, only reconnecting when a socket actually drops or was never established. - Route every relay call site through it: the startup self-test, the self-test loop, SeedFromRelay, BtfResolve, BtfResolveMany, BtfPublishPoolAnnouncement, BtfQueryPoolAnnouncement. - Only log 'connected to <relay>' on an actual fresh (re)connect, not on every pass that's just reusing an already-live socket, so the log reflects what's really happening instead of implying constant churn. This cuts fresh relay connections from several per minute down to essentially one per relay for the life of the process (until a relay actually drops the connection), which should make the rate-limit-driven refusals go away and let descriptor resolution -- and therefore dialing -- actually succeed at the rate the peer list implies it should. * Fix wallet crash on rejected send; remove legacy IP-based peer discovery - SendMoney() no longer throws when a committed tx is rejected by AcceptTransaction() (e.g. raced input already spent). It now unwinds the wallet state via RollbackTransactionSpent() and returns false, which the GUI already handles as 'Transaction failed.' - Removed the dead IP-based peer discovery/connect path now that discovery is entirely Nostr/.btf: CAddrDB/addr.dat, mapAddresses, AddAddress, ConnectNode(CAddress), FindNode(CAddress), ConnectSocket (SOCKS4 proxy helper), addrProxy, ThreadOpenConnections/2 class-C dialer and its thread spawn, the addr/getaddr P2P handlers, and the dead vAddrToSend/setAddrKnown fields on CNode. - Deleted irc.cpp/irc.h (already-disabled legacy seed code) and scrubbed references from headers_core.h and all four makefiles. * Raise peer connection target and add dial diversity; fix IPv4-only relay connect - BTF_TARGET_CONN: 8 -> 24. With ~100 known .btf peers, average degree needs only to exceed ln(N)~=4.6 for the network to stay connected with overwhelming probability (Erdos-Renyi); 24 is a healthy margin. - ConnectDiscoveredBtfPeers now splits each pass's dial budget ~70/30 between the existing reliability-tiered order and a random sample from the full fresh peer pool. Pure reliability bias means every node converges on the same 'known good' hub set, which correlates peer sets across the network -- a relay outage then drops the same edges everywhere at once instead of independent ones. The random slice keeps a floor of uncorrelated edges. - CWebSocket::Connect (relay websocket) now resolves with AF_UNSPEC and tries every returned address (IPv6 or IPv4) in turn instead of hard-failing on AF_INET-only resolution, which was one plausible cause of the relay.nostr.band:443 connect failures (CDN-fronted relays increasingly rate-limit/filter the v4 path). * Remove accidentally committed build binary; ignore src/bitflash * Fix pool participants getting stuck after the first job JobWatcherFn only rebuilt/broadcast a new Stratum job when a new block arrived on this node or no job existed yet. Once a job was built after startup, gHaveJob stayed true forever unless *this* node found the block, so with no new block (slow interval, or this node just not seeing one) every connected miner sat hashing the exact same job -- stale timestamp, stale mempool snapshot -- indefinitely. From the miner's side that's indistinguishable from being stuck: it worked at connect (gets the one-time job sent on authorize) and then nothing ever arrives again. Added a 60s periodic refresh so the job (and therefore mining.notify) gets rebroadcast on a timer too, same as a normal stratum pool, not only on new-block/no-job events. * Diversify Nostr discovery relay list Went from 4 relays to 7, and reduced Cloudflare concentration: previously 2 of 4 (damus.io, snort.social) sat behind the same CDN, so a Cloudflare- side issue could take out half the list even though they're nominally independent relays. Kept damus.io (most established) as the one CF-fronted entry and filled the rest with different hosts (nos.lol, nostr.band on Hetzner, nostr21.com, offchain.pub, nostr.mom, primal.net) so peer discovery doesn't have a single shared upstream as a point of failure. 7 relays is within the commonly recommended 5-10 range for redundancy. * Fix data race in RebuildJob: chain-state reads weren't holding cs_main pindexBest, nBestHeight, GetNextWorkRequired() and GetMedianTimePast() were all read without cs_main. A block being accepted concurrently by the P2P thread could interleave with this: pindexPrev captured from the old best block, but nBestHeight already bumped to the new one by the time job.height is computed, or pindexBest reassigned mid-read. That mismatch would make QueuePayouts() schedule a payout for the wrong maturity height for whatever block gets found against that job. Wrapped the whole chain-state snapshot in one CRITICAL_BLOCK(cs_main), consistent with how the rest of the codebase touches this state. * add operator fee * Add categorized, burst-collapsing logging for pool/worker/payout flow debug.log was growing unboundedly because every printf() call wrote unconditionally, so loops that log once per item (discovered peers, connect attempts) produced a near-identical line per address with no cap. Add LogPrint(category, ...): a drop-in printf replacement that tags each call with a subsystem (pool/worker/payout/net/nostr) and collapses repeated calls from the same call site into one line per 3s window plus a '(xN similar in 3s)' summary, so log growth is bounded by elapsed time instead of event count. Wire it through the whole pool -> work -> payout pipeline (rpc.cpp operator side, main.cpp participant/worker side, net.cpp/nostr.cpp peer & relay discovery), and along the way fix several previously *silent* failure points that produced exactly the reported symptom (worker stuck asking for work, nothing logged): - Relay listener registration failing: no log at all, so a pool with every relay down looked identical to a healthy idle pool. - No relays configured: silent infinite 5s retry loop. - Initial job seed failing at pool startup: silent. - JobWatcher: added a stuck-job watchdog that, after 15s with no job available, logs a specific diagnosis (no chain tip yet vs. RebuildJob() failing) instead of retrying forever in silence. - QueuePayouts(): a block found with zero recorded shares queued no payout and logged nothing. - FlushMaturePayouts(): an unparseable payout address was skipped with no log. - Participant miner: the 'waiting for pool notify' stall was only ever shown as a transient GUI status string, never written to debug.log. Now logs on a 15s cadence while stalled, and after 120s proactively drops the tunnel so the existing reconnect-in-10s loop gets a fresh attempt instead of hanging indefinitely. - Participant miner: share rejections were only a transient GUI status string; now logged with the pool's rejection reason. All edited files verified with g++ -fsyntax-only (gnu++14). * Fix two bugs causing worker stuck + log bloat 1. Worker stuck asking for work (main.cpp): The participant miner checked msg["result"].is_boolean() to detect the mining.subscribe acknowledgement (id==1), but the pool sends an array ([[["mining.notify",sid],sid,4]]) as per Stratum spec, not a boolean. is_boolean() always returned false, so gotSubscribeAck was never set true. This didn't directly block authorize (id==2 path is independent), but it did mean the status never advanced through "subscribed", leaving the progress logging misleading. More importantly, the same wrong assumption meant any pool that also gated job dispatch on a prior subscribe confirmation would leave the worker stuck forever with no diagnosis. Fix: accept any non-null result for id==1 (the array is the session/extranonce info; its contents don't matter for our use case). 2. Log bloat from ProcessMessages (main.cpp): ProcessMessages() used a bare printf() which fired unconditionally for every P2P message received -- the bulk of debug.log was this one line repeating thousands of times. Convert to LogPrint("net", ...) so it is gated behind fDebug (off by default) and burst-collapsed by the dedup introduced in the previous commit. * Fix log bloat, em-dashes, dead code, status bar, Connected/Detected peers Log bloat: - Gate all per-message/per-block/per-loop printf in main.cpp, net.h, net.cpp behind LogAcceptsCategory("net") -- only visible with -debug. This includes: received:/sending: hex dumps, got inventory, askfor, getblocks, getdata, received block, AddToWallet, RelayWalletTransactions, ProcessMessage FAILED, mining loop N-transactions line, retarget block, socket recv/send errors. AddToBlockIndex new best and ProcessBlock ACCEPTED intentionally left always-on (one line per block). - PoolParticipantMiner: status -> now LogPrint(worker) not printf. Em-dashes: - Replace all UTF-8 em-dashes (0xE2 0x80 0x94) with ASCII '--' in every source file (rpc.cpp, gui.cpp, main.cpp, main_gui.cpp, net.cpp, nostr.cpp, util.cpp, btfrv.cpp, db.cpp, db.h, main.h, headers.h, headers_core.h, util.h). 40 occurrences across 14 files. Dead code: - Remove unused gJobSeq atomic from rpc.cpp (written, never read). - Fix minerReward: was computed but payout loop used blockReward directly (operator fee was advertised but never deducted). Now payout correctly uses minerReward = blockReward * (1 - feeFrac). Status bar / peers: - Add GetDiscoveredPeerCount() to nostr.cpp/nostr.h (reads g_btfPeers size under cs_btfPeers). - Replace scrollable inline status text with DrawStatusBar(): a separate ImGui overlay window pinned to bottom of screen (NoScrollbar, NoBringToDisplayFront). Labels changed from 'Peers N' to 'Connected peers: N Detected peers: N'. * Rewrite gui.cpp: proper fixed status bar, scrollable content child Layout architecture: - DrawMainWindow() covers the full display width, height minus STATUS_BAR_H (22px). NoScrollbar + NoScrollWithMouse on the outer window so the chrome (menu, address/balance strip, telemetry strip, separators) never scrolls. - A BeginChild("##scroll") fills the remaining height after the fixed chrome, sized to GetContentRegionAvail().y -- which is already the space between the cursor and the bottom of the outer window. All mode-specific content (transaction table, participant pool list, operator workers/payouts) lives inside this child. Content that overflows gets a scrollbar; nothing bleeds past the outer window edge. - DrawStatusBar() is a separate overlay window pinned to the bottom 22px, drawn last so it is always on top. NoBringToDisplayFront is NOT used here -- drawing last is sufficient and avoids interaction issues with dialogs. - Status bar background is fully opaque (not alpha-blended) so it never shows content behind it. Labels and content: - 'Peers N' replaced with 'Connected peers: N Detected peers: N' using GetDiscoveredPeerCount(). - Mining indicator: '* Mode' instead of the 'filled circle' Unicode glyph that renders as boxes on some Linux font configs. - FmtAge used consistently; 'blocks deep' shortened to 'N deep' in tx list. - Options dialog: em-dashes removed from RadioButton labels (ASCII '--'). - Removed usedY dead variable (GetCursorPosY() result was unused). * Fix blocking bugs, dead code, pool/participant flow correctness Bugs fixed: StratumRecvLine blocking (main.cpp): The participant miner's recv loop called recv() with no timeout after select() said the socket was readable. If the server sent a partial line (split across two TCP segments), the second recv() would block indefinitely waiting for the rest -- the classic 'stuck asking for work' hang even though the pool was alive and had sent data. Fix: single non-blocking recv() pass (MSG_DONTWAIT on Linux, FIONREAD+recv on Windows). If no complete line is in the buffer yet, return false; the outer select() loop retries when more data arrives. BroadcastJob holding mutex during send() (rpc.cpp): BroadcastJob() held gMinersMutex across all SendLine() calls. send() can block if a slow miner's TCP receive buffer is full. With the mutex held, MinerThreadFn could not acquire it to remove a disconnecting miner, causing a deadlock-adjacent stall: broadcast blocked on slow miner, disconnect blocked on broadcast, new jobs not delivered. Fix: snapshot {fd, authorised, address, extranonce2} under the mutex, release it, then send to each fd outside the lock. Dead code removed (rpc.cpp): - gRpcUser, gRpcPassword: defined, never read or set by anything. - dHashesPerSec, nHPSTimerStart: leftover Bitcoin 0.1 stubs, unused. - IsInitialBlockDownload(): stub that returned pindexBest==NULL, never called anywhere in this codebase. - struct Share: declared with three fields, never instantiated. - Duplicate comment block before payout section. Other cleanup (main.cpp): - STUCK_NO_JOB_TIMEOUT_SECS moved from inside the loop body to file scope (was 'static const' inside a loop -- correct but confusing). - pblock->print() in solo miner gated behind LogAcceptsCategory("net") -- was unconditionally dumping a full block to stdout on every solve. - ERROR in BitcoinMiner printf converted to LogPrint("net"). * Pool/participant: fix recv blocking, BroadcastJob mutex, listener spawn, escaped em-dash main.cpp -- StratumRecvLine rewrite: The previous version called recv() in a while loop -- if select() said the socket was readable but only a partial line had arrived, the second recv() call would block indefinitely waiting for the rest of the line. This was the root cause of the recurring stuck-worker bug. Rewrite: single non-blocking recv (MSG_DONTWAIT on Linux, FIONREAD+recv on Windows). If no complete newline is in the buffer yet, return false immediately; the outer 50ms select() loop retries when more data arrives. This means the hash loop always stays responsive regardless of network fragmentation. rpc.cpp -- BroadcastJob mutex held across send(): BroadcastJob held gMinersMutex for the entire duration of sending jobs to all connected miners. send() can block if a slow miner's TCP buffer is full. With the mutex held, MinerThreadFn could not acquire it to clean up a disconnecting miner, stalling the whole broadcast. Fix: snapshot {fd, authorised, address, extranonce2} under the mutex, release it, then send to each fd without holding any lock. rpc.cpp -- LaunchThread failure not handled in BtfStratumAcceptOneFn: The replacement listener thread was launched via LaunchThread() which wraps _beginthread() but discarded the return value. If _beginthread fails (thread limit, OOM), the listener count stayed at 1 with no thread behind it -- that relay would get no new listener until the 30s outer loop in BtfStratumAcceptFn fired. Fix: call _beginthread() directly, check the return value, decrement and log on failure. rpc.cpp -- escaped em-dash in log string: BtfStratumAcceptFn had a literal \xe2\x80\x94 in a LogPrint format string that survived the em-dash sweep (it was source-encoded, not a UTF-8 byte in the file). Replaced with '--'. * Rewrite pool server: single event loop, no per-miner threads Replace the old architecture (one thread per connected miner + separate JobWatcher thread + BtfStratumAcceptFn thread with listener count tracking) with a clean two-layer design: Accept layer (one thread per relay, AcceptOneFn): Each relay gets exactly one persistent thread. It loops: calls blocking RvServiceRegister (waits for a miner to knock), then BtfServiceWrap (echan handshake), then pushes the finished plain socket to a small lock-protected queue, then loops immediately to accept the next miner. No listener count tracking. No replacement thread spawning. No races around spawn failure. The relay always has exactly one pending accept. Event loop (PoolEventLoop, runs on the ThreadRPCServer thread): Single thread owns all connected miner sockets. Each tick: 1. Drain the accept queue -- pick up any newly-connected miners. 2. Check for a new block -- rebuild job and broadcast if so. 3. No-job watchdog -- log and retry if job is missing too long. 4. Periodic job refresh -- restamp nTime every 60s. 5. select() over all miner fds with 50ms timeout. 6. For each readable fd: non-blocking RecvLine, drain all complete lines, dispatch each to HandleLine, collect dead fds. 7. Refresh GUI stats snapshot every 2s. Because the event loop is the only writer to gMiners, no mutex is needed on the miner list. The only mutexes remaining are: - gStatsMutex: guards the GUI-visible snapshot (StatsSnapshot, gWorkerStats, gPayoutViews) written by the event loop and read by GUI threads via GetPoolOperatorStats/GetPoolWorkerStats/GetPendingPayouts. - gReadyMutex: guards the accept queue between AcceptOneFn threads and the event loop. Other improvements in this rewrite: - gPendingPayouts is event-loop-only (no mutex needed). - Round share tracking lives in the event loop (roundShareCount map + roundShareTotal counter) -- zeroed on block found, no per-miner stat mutex needed mid-round. - QueuePayouts takes the share snapshot as a parameter instead of reaching into gMinerStats under a separate mutex. - BroadcastJob no longer snapshots miners to avoid a mutex -- it runs directly in the event loop with exclusive access to gMiners. - AcceptOneFn backs off 30s on relay registration failure instead of returning -- one relay going down doesn't kill the accept thread. - No goto. No per-thread dynamic allocation for listener contexts on each accepted connection. * Thorough logging and correctness fixes across the full pool/participant flow Every failure point in the operator->miner->payout chain now logs exactly what broke, with enough context to diagnose without a debugger. Operator side (rpc.cpp): RebuildJob: logs 'no chain tip (pindexBest is null)' on failure instead of silently returning false. HandleLine: - JSON parse errors logged with the raw line (first 80 chars) - subscribe: logs fd and session id - authorize: logs address, worker, and whether the address is valid - submit: logs stale-job case with submitted vs current job id; logs high-hash with actual hash and target values; logs valid shares with nonce and running session count; logs BLOCK CANDIDATE separately from BLOCK ACCEPTED/REJECTED so a ProcessBlock failure is unambiguous - unknown method logged (reveals miner software quirks) - reply() logs send failures with method name QueuePayouts: logs total payout amount, miner count, fee applied, and how many miners were below dust threshold. FlushMaturePayouts: logs 'insufficient funds or wallet locked?' on SendMoney failure instead of just 'FAILED'. BroadcastJob: logs job id and miner count on every broadcast. Event loop: logs when each new miner socket enters the loop; logs disconnect with session and round share counts. No-job watchdog: RebuildJob retried every 5s (not every 50ms tick), eliminating cs_main hammering when there is no chain tip. AcceptLoopFn: re-polls BtfAllRelays every 60s so relays discovered after startup are picked up; logs each new relay thread spawned. AcceptOneFn: logs relay name on start/stop; logs BtfServiceWrap (echan handshake) failure separately from RvServiceRegister failure. RecvLine: disconnected out-param distinguishes 'socket closed' from 'no complete line yet', preventing incorrect disconnection on partial recv. Participant side (main.cpp): StratumRecvLine: same disconnected out-param fix as RecvLine in rpc.cpp. Previously a false return could mean either 'disconnect' or 'no data yet', causing spurious reconnects when a partial line arrived. PoolParticipantMiner rewritten with step-by-step logging: Step 1 resolve: logs specific failure (no descriptor vs bad format) Step 2 tunnel: logs relay and failure reason Step 3 address: warns explicitly if payout address cannot be determined Step 4 subscribe/authorize: logs each send and each response Step 5 RandomX: logs VM mode Step 6 main loop: - malformed mining.notify (wrong param count or short header/target) logged with sizes instead of silently ignored - authorize rejected: logs reason, does not disconnect (some pools reject bad addresses but still send work) - share accepted/rejected: logs share id and rejection reason - unknown server method logged - pool disconnect logged with handshake state at that moment (gotSubscribeAck, gotAuthorizeAck, haveJob) so you know exactly how far the connection got - nonce space exhausted logged (was silent before) - on exit: logs total hashes, shares sent, shares accepted * Fix build error: ImGuiWindowFlags_NoBringToDisplayFront -> NoBringToFrontOnFocus NoBringToDisplayFront does not exist in this version of ImGui (v1.89.x). The correct flag is ImGuiWindowFlags_NoBringToFrontOnFocus (bit 13). Used in two places: ##statusbar and ##main windows. Also remove dead variable usedY (GetCursorPosY() result assigned but never read) and replace the confusing 'ImGuiWindowFlags_NoScrollbar * 0' expression (evaluates to 0 but looks like a mistake) with a plain 0 in the BeginChild call. * Remove duplicate status logging from SetParticipantMiningStatus Every transition in PoolParticipantMiner already has a direct LogPrint with full context (addresses, job ids, nonces, error reasons). The LogPrint inside SetParticipantMiningStatus was firing on top of those, producing redundant 'PoolParticipantMiner: status -> ...' lines after every meaningful log entry. SetParticipantMiningStatus now just updates the GUI string silently. * Implement vardiff: stable share rate instead of fixed difficulty Previously the pool set shareTarget = blockTarget >> 8 for every miner forever. This meant at low network difficulty a fast miner found shares every few nonces (dozens per second), while at high difficulty a slow miner might go hours without one -- both are bad for fair payout accounting and pool stability. Pool (rpc.cpp): Per-miner difficulty that adjusts to target one share every 15 seconds. After every 5 shares, check actual seconds/share vs target. If the ratio is off by more than 50% (VARDIFF_RETARGET_RATIO), recompute: new_difficulty = current_difficulty / (actual_secs_per_share / target) i.e. shares coming too fast -> difficulty goes up; too slow -> down. Only apply if the change exceeds 10% to avoid jitter. Difficulty is bounded to [0.001, 1e12]. Each miner gets their own shareTarget derived from their difficulty via ShareTargetFromDifficulty(), which maps Stratum difficulty to a uint256 target using the Bitcoin difficulty-1 base (0x1d00ffff compact). New difficulty is sent to the miner via mining.set_difficulty. Participant (main.cpp): Apply the received difficulty value from mining.set_difficulty. Previously the handler was a no-op ('acknowledge only'); now it parses the difficulty double and logs the change. The share target used for comparison comes from the pool's mining.notify p[3] field, which the pool updates after each vardiff adjustment -- this is the standard approach and matches how cpuminer, xmrig etc. handle it. With vardiff, share rate is roughly constant regardless of miner speed or network difficulty. Payouts are proportional to shares submitted, so each miner's payout accurately reflects their CPU contribution. * Fix share target mismatch: pool rejected shares it should have accepted Root cause: the pool put job.shareTarget (from blockTarget<<8, a fixed per-job value) into mining.notify p[3], but checked m->shareTarget (from ShareTargetFromDifficulty, the vardiff value) on submit. With difficulty=1.0, ShareTargetFromDifficulty gives a much HARDER target than blockTarget<<8, so shares that the participant thought were valid (passed the easier notify target) were rejected by the pool (failed the harder difficulty-1 target). Fix: MakeNotifyParams now takes the per-miner shareTarget as an explicit parameter. SendJob passes m->shareTarget. Both sides -- the participant reading p[3] and HandleLine checking m->shareTarget on submit -- now use exactly the same value. Single source of truth. Cleanup: - Remove shareTarget field from StratumJob (was only set, never read after the MakeNotifyParams call was fixed). - Remove MakeShareTarget() function (was only used to populate that now-dead field). - Participant set_difficulty log: 'initial' vs 'updated' instead of 'unchanged' (first connect sends 1.0 which matches the default 1.0, so it was misleadingly logged as 'unchanged'). * Fix double broadcast, correct block reward calculation, improve payout log Double broadcast (event loop vs HandleLine): When a pool miner finds a block, HandleLine calls RebuildJob() + BroadcastJob(true) immediately. The event loop then detects nBestHeight changed (step 2) and was calling RebuildJob() + BroadcastJob(true) again -- miners received duplicate job broadcasts. Fix: step 2 now checks gHaveJob before rebuilding. If HandleLine already built and broadcast a job for this height (gHaveJob=true), step 2 just logs 'job already broadcast by submit handler' and skips. If the block came from an external peer (not our miner), gHaveJob is false and step 2 handles it as before. Block reward calculation in QueuePayouts: Was calling CBlock().GetBlockValue(0) on an empty block object. GetBlockValue uses nBestHeight globally, which by the time QueuePayouts runs has already been incremented to the height AFTER the found block. Fix: compute subsidy directly as '50 COIN >> (blockHeight / 210000)' using the actual found height. At current scale this makes no difference (same subsidy for thousands of blocks) but is now correct by construction. Payout log now shows: - Full block subsidy - Miner share after fee - Operator fee amount in BTF (not just percentage) - Number of recipients, maturity height, dust-filtered count Example: '[payout] block 2096: subsidy 50.00 BTF, miners get 49.00 (fee 2.00% = 1.00 to operator), 3 recipients, matures height 2196' * Fix 6 bugs found in full flow re-read Bug 1 -- Double broadcast (re-applied fix that was lost): When HandleLine accepted a block it called RebuildJob()+BroadcastJob(true). The event loop then detected nBestHeight changed and did it again. Miners received two back-to-back mining.notify clean=true, wasting their work. Fix: step 2 of event loop checks gHaveJob before rebuilding. If HandleLine already built a fresh job (gHaveJob=true), step 2 just logs and skips. Bug 3 -- Disconnect log showed global totals, not session totals: gParticipantSharesSent/Accepted accumulate since node start, not since the last connect. Added sessionSharesSent/sessionSharesAccepted local counters that reset each time PoolParticipantMiner() is called. Bug 4 -- Dead function ParticipantShareTargetFromDiff (main.cpp): Defined but never called anywhere. Removed. Bug 5 -- Invalid-address miner shares silently burned: If a miner authorized with an invalid address, their share of the block reward was neither paid out nor logged -- it just vanished. QueuePayouts now validates addresses up front, logs the forfeited amount explicitly ('X BTF forfeited (bad address)'), and excludes those entries so the payout log is accurate. Bug 6 -- SendMoney called from event loop (stalls miner I/O): FlushMaturePayouts called SendMoney which takes cs_main. If the P2P thread held cs_main (processing a block), the event loop would stall for seconds, causing all connected miners to time out waiting for responses. Fix: FlushMaturePayouts now only moves matured entries to gPayoutExecQueue (fast, no locks except a brief mutex). A new PayoutThreadFn thread drains the queue and calls SendMoney independently, so the event loop is never blocked by wallet I/O. Bug 7 -- Dead goto + dead HandleLine return-false path: HandleLine always returns true; the goto next_miner path was never reached. Removed goto and simplified the select drain loop. * Fix share-target scale mismatch and dead pool hashrate reporting - ShareTargetFromDifficulty() based Stratum difficulty 1 on Bitcoin's SHA256 diff-1 constant (0x1d00ffff, ~2^32 hashes/share) instead of this chain's actual PoW floor (bnProofOfWorkLimit = ~uint256(0)>>12, ~2^12 hashes/share). That's a ~2^20 (~1,048,576x) mismatch: at the supposedly-easy difficulty of 1.0, workers were being asked for shares roughly a million times harder than the chain's own easiest target. Vardiff never gets a chance to correct this because it only retargets after real shares come in, and none were coming in. Fixed by basing the diff-1 reference on bnProofOfWorkLimit instead. - Pool hashrate was never computed anywhere despite the data (per-miner difficulty + share timing) being available: ThreadBtfPoolAnnouncer in nostr.cpp hardcoded ann.hashRate = 0.0, PoolWorkerStatView had no hashrate field, and the GUI workers table had no column for it. Added an EWMA hashrate estimate per miner (updated on each accepted share from expected-hashes-at-difficulty / time-since-last-share), threaded it through GetPoolOperatorStats/GetPoolWorkerStats, the pool announcement payload, and the GUI (new Hashrate column + totals in the telemetry line). Verified: full clean build via src/Makefile (secp256k1 + RandomX deps built from source, g++ 13, all four touched files compile and link). * Remove stale wxWidgets-era build files and orphaned assets These predate the ImGui/GLFW migration (83af065) and are dead weight: - src/makefile.linux, build-linux.sh: superseded by src/Makefile + root Makefile (make linux). The old ones reference obj/uibase.o and obj/ui.o, which don't exist -- they never worked post-migration. - src/makefile.vc: MSVC build for the old wx UI (obj\ui.obj, obj\uibase.obj, obj\irc.obj) -- irc.cpp doesn't even exist anymore, and nothing invokes this makefile. Windows builds go through makefile.mingw via the root Makefile's target. - src/ui.rc, src/uiproject.fbp: wxFormBuilder project/resource files for the old wx UI. The current Windows resource file is bitflash.rc. - src/rc/{addressbook,send}*.bmp, check.ico, bitcoin_bc_original.ico: icons used only by the old wx UI. bitcoin.ico (used by bitflash.rc) is kept. Verified nothing includes uibase.h/ui.h/irc.h anywhere, and did a full clean rebuild afterward (secp256k1 + RandomX from source, src/Makefile) to confirm removal doesn't break the real build. * Mine with RandomX fast (2GB dataset) mode instead of light mode forever RandomXInitDataset() was fully implemented and ready to switch mining into fast mode, but nothing ever called it -- not in PoolParticipantMiner() (pool worker), not in the solo BitcoinMiner() loop. RandomXCreateMinerVM() falls back to light mode whenever the dataset isn't built, so every miner, participant or solo, has always been hashing in light/cache-only mode. Light mode exists for cheap single-hash verification (which is why the pool's own share verification correctly stays on it) -- it recomputes dataset items on the fly for every hash, which is dramatically slower than fast mode's direct dataset lookups. Combined with the share-target scale bug fixed in e87a905, this compounds into exactly the symptom reported: a participant sitting there hashing for many minutes per share instead of the vardiff-targeted ~15s, even after the target fix landed. Fix: build the ~2GB dataset once (multi-threaded, sized to hardware_concurrency) before mining starts, in both the participant and solo paths, so RandomXCreateMinerVM() actually gets to use fast mode. Verified: full clean rebuild via src/Makefile. * Add vardiff stall watchdog: force difficulty down on zero shares, not just share count ShareTargetFromDifficulty already fixed the diff-1 scale mismatch (chain floor vs Bitcoin's SHA256 diff-1), so difficulty 1 correctly means ~4096 expected hashes on this chain, not ~2^32. That part was already correct. But the normal vardiff retarget in HandleLine only runs after VARDIFF_SHARES_PER_CHECK (5) shares arrive. A miner that never finds even one share -- e.g. stuck in RandomX light/cache mode instead of the fast 2GB dataset, or just slower hardware than the target assumes -- never reaches that check, so it can sit at its initial/current difficulty indefinitely with vardiff having no samples to act on. Add a time-based fallback in PoolEventLoop: if a miner's vardiff window has been open for VARDIFF_STALL_SECS (90s, 6x the 15s target) with zero shares, force difficulty down by VARDIFF_STALL_CUT (4x) regardless of share count, and re-notify via mining.set_difficulty. Once a miner is already at VARDIFF_MIN, log it plainly as a hashrate/connectivity issue instead of a difficulty issue, so it's not confused with the same-looking but different problem this was actually fixed for before. * Fix PrintException rethrow killing the whole node on any transient exception The uploaded participant log shows the real bug behind the mining stalls: the node process itself was dying and restarting from scratch every minute or two ('UNKNOWN EXCEPTION ... in ThreadMessageHandler()' / 'ThreadSocketHandler()'), wiping the RandomX dataset/cache and losing all progress toward a share -- not a difficulty problem. Every background thread (ThreadMessageHandler, ThreadSocketHandler, ThreadBtfConnect, the Nostr helpers) wraps its real work in a 'try { Foo2() } catch(...) { log, sleep 5s, loop again }' self-healing retry pattern specifically so one bad exception doesn't take the whole node down. But PrintException(), called from inside every one of those catch blocks, ended with 'if (!fShutdown) throw;' -- re-throwing the just- caught exception during ordinary operation. Nothing above the retry loop catches it, so it escapes the thread and std::terminate()s the entire process on the very first transient error (a flaky relay connect, a malformed message, whatever). The comment's intent (suppress noise while already shutting down) was inverted from what the surrounding retry loops actually need. Removed the rethrow. Threads now log the exception and let their own retry loop handle it, as designed. * Push a fresh job immediately after any difficulty change, not just on next broadcast mining.set_difficulty alone doesn't change what the worker actually hashes against -- the participant only reads its share target from mining.notify's params[3] (see main.cpp's mining.notify handler); the set_difficulty message just updates a locally-logged currentDifficulty value. So both the normal vardiff retarget (in HandleLine, on 5 shares) and the new stall watchdog were updating m->shareTarget and telling the worker about the new difficulty, but the worker kept hashing against its old target until the next natural job broadcast -- a new block, or the 60s trickle refresh. That could delay any difficulty correction by up to a minute for no reason. Call SendJob(m, false) right after each set_difficulty send so the updated shareTarget reaches the worker in the very next tick instead of waiting on the next unrelated broadcast. * Build RandomX dataset before stratum handshake, not after Worker was sending mining.subscribe/authorize, then blocking for the duration of the synchronous ~2GB RandomX dataset build, and only then reading the socket. The pool's replies (subscribe ack, authorize ack, set_difficulty, first job) sat unread in the OS receive buffer for that entire window -- nothing was lost, but with the build taking anywhere from seconds to a couple minutes depending on core count, the worker looked and logged as permanently stuck on 'waiting for pool response' when it just wasn't listening yet. Move the dataset build ahead of the subscribe/authorize sends so the socket is actively being read the moment the pool replies. Also add missing RandomXDestroyMinerVM cleanup on the two early-return paths that now happen after VM creation. * Reset round shares on externally-found blocks, not just our own Round shares were only cleared in HandleLine() after our own miner's block got accepted. When the chain height advanced because someone else found the block, the main loop rebuilt the job but left roundShareCount/roundShareTotal/Miner::roundShares untouched, so they kept accumulating across rounds instead of resetting. * Show pool hashrate in participant view; show immature coinbase value with maturity countdown * Persist pending payouts to disk -- survive operator restarts * Fix log escapes, stall timeout 90->45s, save-before-exec ordering, Immature tx status * Sort transactions by nTimeReceived not chain median time -- new txs always on top * Sort txs by chain depth not nTimeReceived -- survives resync, unconfirmed always first * Fix orphan block false-positive payout; meaningful tx status instead of raw depth * Show Orphaned status in red for orphaned coinbases; distinguish from genuinely unconfirmed --------- Co-authored-by: Vic-Nas <nasci.victorio@gmail.com> Co-authored-by: Bitflash Pool Dev <pool@bitflash> Co-authored-by: Victorio Nascimento <155357371+Vic-Nas@users.noreply.github.com> Co-authored-by: Claude <claude@anthropic.com>
Diffstat (limited to 'src')
-rw-r--r--src/Makefile4
-rw-r--r--src/btfrv.cpp4
-rw-r--r--src/db.cpp97
-rw-r--r--src/db.h15
-rw-r--r--src/gui.cpp701
-rw-r--r--src/headers.h2
-rw-r--r--src/headers_core.h5
-rw-r--r--src/irc.cpp271
-rw-r--r--src/irc.h7
-rw-r--r--src/main.cpp631
-rw-r--r--src/main.h23
-rw-r--r--src/main_gui.cpp4
-rw-r--r--src/makefile.linux55
-rw-r--r--src/makefile.mingw4
-rw-r--r--src/makefile.vc77
-rw-r--r--src/net.cpp391
-rw-r--r--src/net.h31
-rw-r--r--src/nostr.cpp518
-rw-r--r--src/nostr.h26
-rw-r--r--src/rc/addressbook16.bmpbin1334 -> 0 bytes
-rw-r--r--src/rc/addressbook16mask.bmpbin126 -> 0 bytes
-rw-r--r--src/rc/addressbook20.bmpbin1478 -> 0 bytes
-rw-r--r--src/rc/addressbook20mask.bmpbin142 -> 0 bytes
-rw-r--r--src/rc/bitcoin_bc_original.icobin22486 -> 0 bytes
-rw-r--r--src/rc/check.icobin766 -> 0 bytes
-rw-r--r--src/rc/send16.bmpbin1334 -> 0 bytes
-rw-r--r--src/rc/send16mask.bmpbin126 -> 0 bytes
-rw-r--r--src/rc/send16masknoshadow.bmpbin126 -> 0 bytes
-rw-r--r--src/rc/send20.bmpbin1478 -> 0 bytes
-rw-r--r--src/rc/send20mask.bmpbin142 -> 0 bytes
-rw-r--r--src/rpc.cpp1544
-rw-r--r--src/ui.rc14
-rw-r--r--src/uiproject.fbp11825
-rw-r--r--src/util.cpp108
-rw-r--r--src/util.h42
35 files changed, 2647 insertions, 13752 deletions
diff --git a/src/Makefile b/src/Makefile
index 3280fd3..c0b6e1d 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -21,14 +21,14 @@ LIBS = -L$(SECP_LIB) -lsecp256k1 \
21 -lglfw -lGL 21 -lglfw -lGL
22 22
23HEADERS = headers_core.h headers.h util.h main.h serialize.h uint256.h \ 23HEADERS = headers_core.h headers.h util.h main.h serialize.h uint256.h \
24 key.h bignum.h script.h db.h base58.h net.h irc.h nostr.h \ 24 key.h bignum.h script.h db.h base58.h net.h nostr.h \
25 randomx_pow.h btfaddr.h btfchan.h btfrv.h btftunnel.h market.h compat.h 25 randomx_pow.h btfaddr.h btfchan.h btfrv.h btftunnel.h market.h compat.h
26 26
27IMGUI_OBJS = obj/imgui.o obj/imgui_draw.o obj/imgui_tables.o \ 27IMGUI_OBJS = obj/imgui.o obj/imgui_draw.o obj/imgui_tables.o \
28 obj/imgui_widgets.o obj/imgui_impl_glfw.o obj/imgui_impl_opengl3.o 28 obj/imgui_widgets.o obj/imgui_impl_glfw.o obj/imgui_impl_opengl3.o
29 29
30NODE_OBJS = obj/util.o obj/script.o obj/db.o obj/net.o obj/main.o \ 30NODE_OBJS = obj/util.o obj/script.o obj/db.o obj/net.o obj/main.o \
31 obj/market.o obj/sha.o obj/irc.o obj/nostr.o obj/randomx_pow.o \ 31 obj/market.o obj/sha.o obj/nostr.o obj/randomx_pow.o \
32 obj/btfaddr.o obj/btfchan.o obj/btfrv.o obj/btftunnel.o obj/rpc.o 32 obj/btfaddr.o obj/btfchan.o obj/btfrv.o obj/btftunnel.o obj/rpc.o
33 33
34GUI_OBJS = obj/gui.o obj/main_gui.o 34GUI_OBJS = obj/gui.o obj/main_gui.o
diff --git a/src/btfrv.cpp b/src/btfrv.cpp
index 812d077..0d02ca8 100644
--- a/src/btfrv.cpp
+++ b/src/btfrv.cpp
@@ -101,7 +101,7 @@ static SOCKET ConnectTo(const char* host, unsigned short port)
101 101
102 // Apply a short timeout only for the connect() and initial handshake so an 102 // Apply a short timeout only for the connect() and initial handshake so an
103 // unresponsive relay doesn't block the thread. Once the tunnel is live the 103 // unresponsive relay doesn't block the thread. Once the tunnel is live the
104 // timeout is cleared — a forwarding pipe must block indefinitely on recv(). 104 // timeout is cleared -- a forwarding pipe must block indefinitely on recv().
105#ifdef _WIN32 105#ifdef _WIN32
106 DWORD tvShort = 10000; 106 DWORD tvShort = 10000;
107 setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tvShort, sizeof(tvShort)); 107 setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tvShort, sizeof(tvShort));
@@ -118,7 +118,7 @@ static SOCKET ConnectTo(const char* host, unsigned short port)
118 } 118 }
119 freeaddrinfo(res); 119 freeaddrinfo(res);
120 120
121 // Clear the timeout — the socket is now a live tunnel and must not 121 // Clear the timeout -- the socket is now a live tunnel and must not
122 // time out when idle. recv() will block until data arrives or peer closes. 122 // time out when idle. recv() will block until data arrives or peer closes.
123#ifdef _WIN32 123#ifdef _WIN32
124 DWORD tvOff = 0; 124 DWORD tvOff = 0;
diff --git a/src/db.cpp b/src/db.cpp
index de71a57..199fa44 100644
--- a/src/db.cpp
+++ b/src/db.cpp
@@ -392,77 +392,8 @@ bool CTxDB::LoadBlockIndex()
392 392
393 393
394 394
395// 395// Legacy IP-based peer address database (CAddrDB / addr.dat) removed --
396// CAddrDB 396// peer discovery is entirely Nostr/.btf-based now.
397//
398
399bool CAddrDB::WriteAddress(const CAddress& addr)
400{
401 return Write(make_pair(string("addr"), addr.GetKey()), addr);
402}
403
404bool CAddrDB::LoadAddresses()
405{
406 CRITICAL_BLOCK(cs_mapAddresses)
407 {
408 // Load user provided addresses
409 CAutoFile filein = fopen("addr.txt", "rt");
410 if (filein)
411 {
412 try
413 {
414 char psz[1000];
415 while (fgets(psz, sizeof(psz), filein))
416 {
417 CAddress addr(psz, NODE_NETWORK);
418 if (addr.ip != 0)
419 AddAddress(*this, addr);
420 }
421 }
422 catch (...) { }
423 }
424
425 // Get cursor
426 Dbc* pcursor = GetCursor();
427 if (!pcursor)
428 return false;
429
430 loop
431 {
432 // Read next record
433 CDataStream ssKey;
434 CDataStream ssValue;
435 int ret = ReadAtCursor(pcursor, ssKey, ssValue);
436 if (ret == DB_NOTFOUND)
437 break;
438 else if (ret != 0)
439 return false;
440
441 // Unserialize
442 string strType;
443 ssKey >> strType;
444 if (strType == "addr")
445 {
446 CAddress addr;
447 ssValue >> addr;
448 mapAddresses.insert(make_pair(addr.GetKey(), addr));
449 }
450 }
451
452 //// debug print
453 printf("mapAddresses:\n");
454 foreach(const PAIRTYPE(vector<unsigned char>, CAddress)& item, mapAddresses)
455 item.second.print();
456 printf("-----\n");
457 }
458
459 return true;
460}
461
462bool LoadAddresses()
463{
464 return CAddrDB("cr+").LoadAddresses();
465}
466 397
467 398
468 399
@@ -563,24 +494,28 @@ bool CWalletDB::LoadWallet(vector<unsigned char>& vchDefaultKeyRet)
563 { 494 {
564 string strKey; 495 string strKey;
565 ssKey >> strKey; 496 ssKey >> strKey;
566 if (strKey == "fGenerateBitcoins") ssValue >> fGenerateBitcoins;
567 if (strKey == "nTransactionFee") ssValue >> nTransactionFee; 497 if (strKey == "nTransactionFee") ssValue >> nTransactionFee;
568 if (strKey == "addrIncoming") ssValue >> addrIncoming; 498 if (strKey == "addrIncoming") ssValue >> addrIncoming;
569 if (strKey == "nMineMode") ssValue >> nMineMode; 499 // Mining-mode/pool settings (nMineMode, strParticipantPool, strPoolName,
570 if (strKey == "strParticipantPool") ssValue >> strParticipantPool; 500 // strPoolDashboardUrl, dPoolFeePercent, fGenerateBitcoins) are intentionally
571 if (strKey == "strPoolName") ssValue >> strPoolName; 501 // NOT restored here. They used to be, and LoadWallet() runs after CLI flags
572 if (strKey == "strPoolDashboardUrl") ssValue >> strPoolDashboardUrl; 502 // are parsed in main_gui.cpp, so a saved value would silently overwrite
573 if (strKey == "dPoolFeePercent") ssValue >> dPoolFeePercent; 503 // whatever was just requested on the command line or in a previous Options
504 // session -- no error, no log line. That's what caused pool name/address to
505 // show correctly in the UI but stay stale in the logs, and mode to change
506 // behavior across restarts. Mode/pool config is decided fresh every launch
507 // instead: CLI flags if given, otherwise the compiled-in default. Nothing to
508 // go stale, nothing to fight over load order.
574 } 509 }
575 } 510 }
576 } 511 }
577 512
578 printf("fGenerateBitcoins = %d\n", fGenerateBitcoins);
579 printf("nTransactionFee = %lld\n", nTransactionFee); 513 printf("nTransactionFee = %lld\n", nTransactionFee);
580 printf("addrIncoming = %s\n", addrIncoming.ToString().c_str()); 514 printf("addrIncoming = %s\n", addrIncoming.ToString().c_str());
581 printf("nMineMode = %d, strParticipantPool = %s\n", nMineMode, strParticipantPool.c_str()); 515 printf("nMineMode = %d, strParticipantPool = %s, fGenerateBitcoins = %d (from CLI/default, not wallet.dat)\n",
582 printf("strPoolName = %s, dPoolFeePercent = %.2f\n", strPoolName.c_str(), dPoolFeePercent); 516 nMineMode, strParticipantPool.c_str(), fGenerateBitcoins);
583 printf("strPoolDashboardUrl = %s\n", strPoolDashboardUrl.c_str()); 517 printf("strPoolName = %s, dPoolFeePercent = %.2f, strPoolDashboardUrl = %s (from CLI/default, not wallet.dat)\n",
518 strPoolName.c_str(), dPoolFeePercent, strPoolDashboardUrl.c_str());
584 519
585 return true; 520 return true;
586} 521}
diff --git a/src/db.h b/src/db.h
index feaa45e..6dc3a4f 100644
--- a/src/db.h
+++ b/src/db.h
@@ -316,19 +316,8 @@ private:
316 316
317 317
318 318
319class CAddrDB : public CDB 319// Legacy IP-based peer address database (CAddrDB / addr.dat) removed --
320{ 320// peer discovery is entirely Nostr/.btf-based now.
321public:
322 CAddrDB(const char* pszMode="r+", bool fTxn=false) : CDB("addr.dat", pszMode, fTxn) { }
323private:
324 CAddrDB(const CAddrDB&);
325 void operator=(const CAddrDB&);
326public:
327 bool WriteAddress(const CAddress& addr);
328 bool LoadAddresses();
329};
330
331bool LoadAddresses();
332 321
333 322
334 323
diff --git a/src/gui.cpp b/src/gui.cpp
index 2210296..a1a0698 100644
--- a/src/gui.cpp
+++ b/src/gui.cpp
@@ -1,4 +1,4 @@
1// Bitflash GUI — ImGui + GLFW + OpenGL3 1// Bitflash GUI -- ImGui + GLFW + OpenGL3
2// Same source on Linux and Windows. No platform ifdefs. 2// Same source on Linux and Windows. No platform ifdefs.
3 3
4#include "imgui/imgui.h" 4#include "imgui/imgui.h"
@@ -25,6 +25,7 @@ extern std::string strParticipantPool;
25extern CAddress addrLocalHost; 25extern CAddress addrLocalHost;
26 26
27void MainFrameRepaint(); 27void MainFrameRepaint();
28int GetDiscoveredPeerCount();
28string DateTimeStr(int64 nTime); 29string DateTimeStr(int64 nTime);
29bool SendMoney(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew); 30bool SendMoney(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew);
30int64 GetBalance(); 31int64 GetBalance();
@@ -34,15 +35,20 @@ void ThreadBitcoinMiner(void*);
34void ThreadRPCServer(void*); 35void ThreadRPCServer(void*);
35 36
36// --------------------------------------------------------------------------- 37// ---------------------------------------------------------------------------
37// State 38// Layout constants
39// ---------------------------------------------------------------------------
40static const float STATUS_BAR_H = 22.0f;
41
42// ---------------------------------------------------------------------------
43// GUI state
38// --------------------------------------------------------------------------- 44// ---------------------------------------------------------------------------
39static std::string g_myAddress; 45static std::string g_myAddress;
40static int64 g_balance = 0; 46static int64 g_balance = 0;
41static int64 g_lastWalletRefresh = 0; 47static int64 g_lastWalletRefresh = 0;
42static bool g_showSend = false; 48static bool g_showSend = false;
43static bool g_showOptions = false; 49static bool g_showOptions = false;
44static bool g_showAbout = false; 50static bool g_showAbout = false;
45static bool g_needRefresh = true; 51static bool g_needRefresh = true;
46 52
47static char g_sendAddr[128] = {}; 53static char g_sendAddr[128] = {};
48static char g_sendAmount[32] = {}; 54static char g_sendAmount[32] = {};
@@ -73,36 +79,34 @@ static std::string FmtMoney(int64 n)
73static std::string FmtAge(int64 createdAt) 79static std::string FmtAge(int64 createdAt)
74{ 80{
75 int64 age = GetTime() - createdAt; 81 int64 age = GetTime() - createdAt;
76 if (age < 0) 82 if (age < 0) age = 0;
77 age = 0; 83 if (age < 60) return strprintf("%llds", (long long)age);
78 if (age < 60) 84 if (age < 3600) return strprintf("%lldm", (long long)(age / 60));
79 return strprintf("%llds", (long long)age); 85 return strprintf("%lldh", (long long)(age / 3600));
80 if (age < 3600)
81 return strprintf("%lldm", (long long)(age / 60));
82 return strprintf("%lldh", (long long)(age / 3600));
83} 86}
84 87
85static ImVec4 ParticipantStatusColor(const std::string& status) 88static ImVec4 StatusColor(const std::string& s)
86{ 89{
87 if (status.find("failed") != std::string::npos || 90 if (s.find("failed") != std::string::npos ||
88 status.find("rejected") != std::string::npos || 91 s.find("rejected") != std::string::npos ||
89 status.find("stopped") != std::string::npos) 92 s.find("stopped") != std::string::npos)
90 return ImVec4(1.0f, 0.38f, 0.38f, 1.0f); 93 return ImVec4(1.0f, 0.38f, 0.38f, 1.0f); // red
91 if (status.find("hashing") != std::string::npos || 94 if (s.find("hashing") != std::string::npos ||
92 status.find("accepted") != std::string::npos || 95 s.find("accepted") != std::string::npos ||
93 status.find("connected") != std::string::npos) 96 s.find("connected")!= std::string::npos)
94 return ImVec4(0.35f, 1.0f, 0.45f, 1.0f); 97 return ImVec4(0.35f, 1.0f, 0.45f, 1.0f); // green
95 if (status.find("asking") != std::string::npos || 98 if (s.find("asking") != std::string::npos ||
96 status.find("authoriz") != std::string::npos || 99 s.find("authoriz") != std::string::npos ||
97 status.find("subscrib") != std::string::npos) 100 s.find("subscrib") != std::string::npos)
98 return ImVec4(1.0f, 0.75f, 0.25f, 1.0f); 101 return ImVec4(1.0f, 0.75f, 0.25f, 1.0f); // amber
99 return ImVec4(0.55f, 0.80f, 1.0f, 1.0f); 102 return ImVec4(0.55f, 0.80f, 1.0f, 1.0f); // blue-grey
100} 103}
101 104
102static std::string PoolLabel(const BtfPoolAnnouncement& ann) 105static std::string PoolLabel(const BtfPoolAnnouncement& ann)
103{ 106{
104 std::ostringstream o; 107 std::ostringstream o;
105 o << ann.poolName << " - " << std::fixed << std::setprecision(2) << ann.feePercent << "%"; 108 o << ann.poolName << " - "
109 << std::fixed << std::setprecision(2) << ann.feePercent << "%";
106 if (ann.connectedMiners > 0) 110 if (ann.connectedMiners > 0)
107 o << " - " << ann.connectedMiners << " miners"; 111 o << " - " << ann.connectedMiners << " miners";
108 return o.str(); 112 return o.str();
@@ -118,19 +122,47 @@ static void RefreshWallet()
118 g_txRows.clear(); 122 g_txRows.clear();
119 TRY_CRITICAL_BLOCK(cs_mapWallet) 123 TRY_CRITICAL_BLOCK(cs_mapWallet)
120 { 124 {
121 std::vector<std::pair<int64,uint256>> vs; 125 // Sort: unconfirmed first (depth 0), then by depth ascending (least
122 for (auto& kv : mapWallet) vs.push_back({kv.second.GetTxTime(), kv.first}); 126 // deep = most recent). We can't use nTimeReceived because a node
123 std::sort(vs.rbegin(), vs.rend()); 127 // resync re-stamps all txs with the same time. Depth is always correct.
128 std::vector<std::pair<int,uint256>> vs;
129 for (auto& kv : mapWallet)
130 vs.push_back({kv.second.GetDepthInMainChain(), kv.second.GetHash()});
131 std::sort(vs.begin(), vs.end(),
132 [](const std::pair<int,uint256>& a, const std::pair<int,uint256>& b) {
133 return a.first < b.first; // 0 (unconfirmed) first, then shallowest
134 });
124 for (auto& sv : vs) { 135 for (auto& sv : vs) {
125 auto mi = mapWallet.find(sv.second); 136 auto mi = mapWallet.find(sv.second);
126 if (mi == mapWallet.end()) continue; 137 if (mi == mapWallet.end()) continue;
127 CWalletTx& wtx = mi->second; 138 CWalletTx& wtx = mi->second;
128 int64 net = wtx.GetCredit() - wtx.GetDebit(); 139 int depth = wtx.GetDepthInMainChain();
129 int depth = wtx.GetDepthInMainChain(); 140 int toMature = wtx.IsCoinBase() ? wtx.GetBlocksToMaturity() : 0;
141 // An orphaned coinbase has hashBlock set but depth=0 (block not in main chain).
142 // A genuinely unconfirmed tx has hashBlock==0.
143 bool isOrphaned = wtx.IsCoinBase() && wtx.hashBlock != 0 && depth == 0;
144 int64 net;
130 std::string desc; 145 std::string desc;
131 if (wtx.IsCoinBase()) desc = depth<1 ? "Generated (unconfirmed)" : "Generated"; 146 if (wtx.IsCoinBase()) {
132 else if (wtx.GetDebit() > 0) desc = "Sent"; 147 if (isOrphaned) {
133 else desc = "Received"; 148 net = 0;
149 desc = "Generated (orphaned -- block not in main chain)";
150 } else if (toMature > 0) {
151 net = wtx.GetValueOut();
152 char buf[64];
153 snprintf(buf, sizeof(buf), "Generated (matures in %d blocks)", toMature);
154 desc = buf;
155 } else {
156 net = wtx.GetCredit() - wtx.GetDebit();
157 desc = depth < 1 ? "Generated (unconfirmed)" : "Generated";
158 }
159 } else if (wtx.GetDebit() > 0) {
160 net = wtx.GetCredit() - wtx.GetDebit();
161 desc = "Sent";
162 } else {
163 net = wtx.GetCredit() - wtx.GetDebit();
164 desc = "Received";
165 }
134 g_txRows.push_back({DateTimeStr(wtx.GetTxTime()), desc, net, depth}); 166 g_txRows.push_back({DateTimeStr(wtx.GetTxTime()), desc, net, depth});
135 } 167 }
136 } 168 }
@@ -149,18 +181,103 @@ string DateTimeStr(int64 nTime)
149} 181}
150 182
151// --------------------------------------------------------------------------- 183// ---------------------------------------------------------------------------
184// Status bar -- separate fullscreen-width overlay pinned to bottom edge.
185// Drawn last so it always sits on top of everything else.
186// ---------------------------------------------------------------------------
187static void DrawStatusBar()
188{
189 ImGuiIO& io = ImGui::GetIO();
190 ImGui::SetNextWindowPos(ImVec2(0.0f, io.DisplaySize.y - STATUS_BAR_H));
191 ImGui::SetNextWindowSize(ImVec2(io.DisplaySize.x, STATUS_BAR_H));
192 ImGui::SetNextWindowBgAlpha(1.0f);
193 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(10.0f, 3.0f));
194 ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
195 ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
196 ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0.13f, 0.13f, 0.13f, 1.0f));
197 ImGui::Begin("##statusbar", nullptr,
198 ImGuiWindowFlags_NoTitleBar |
199 ImGuiWindowFlags_NoResize |
200 ImGuiWindowFlags_NoMove |
201 ImGuiWindowFlags_NoScrollbar |
202 ImGuiWindowFlags_NoScrollWithMouse|
203 ImGuiWindowFlags_NoSavedSettings |
204 ImGuiWindowFlags_NoBringToFrontOnFocus);
205 ImGui::PopStyleVar(3);
206 ImGui::PopStyleColor();
207
208 int connected = (int)vNodes.size();
209 int discovered = GetDiscoveredPeerCount();
210
211 if (nMineMode == MINE_PARTICIPANT) {
212 uint64 sent = 0, accepted = 0;
213 double hashRate = 0.0;
214 std::string st = GetParticipantMiningStatus();
215 GetParticipantMiningStats(sent, accepted, hashRate);
216 if (sent > 0 || accepted > 0 || hashRate > 0.0)
217 ImGui::TextDisabled(
218 "Connected peers: %d Detected peers: %d Height: %d"
219 " Shares: %llu sent / %llu accepted %.2f H/s",
220 connected, discovered, nBestHeight,
221 (unsigned long long)sent, (unsigned long long)accepted, hashRate);
222 else if (!st.empty())
223 ImGui::TextDisabled(
224 "Connected peers: %d Detected peers: %d Height: %d %s",
225 connected, discovered, nBestHeight, st.c_str());
226 else
227 ImGui::TextDisabled(
228 "Connected peers: %d Detected peers: %d Height: %d",
229 connected, discovered, nBestHeight);
230 } else if (nMineMode == MINE_OPERATOR) {
231 int miners = 0, blocksFound = 0;
232 uint64 roundShares = 0;
233 double totalHashRate = 0.0;
234 GetPoolOperatorStats(miners, blocksFound, roundShares, totalHashRate);
235 ImGui::TextDisabled(
236 "Connected peers: %d Detected peers: %d Height: %d"
237 " Miners: %d Round shares: %llu Blocks found: %d %.2f H/s",
238 connected, discovered, nBestHeight,
239 miners, (unsigned long long)roundShares, blocksFound, totalHashRate);
240 } else {
241 ImGui::TextDisabled(
242 "Connected peers: %d Detected peers: %d Height: %d",
243 connected, discovered, nBestHeight);
244 }
245
246 ImGui::End();
247}
248
249// ---------------------------------------------------------------------------
152// Main window 250// Main window
251//
252// Layout:
253// [menu bar] -- ImGui built-in menu
254// [header strip] -- address, balance, send button, mine status
255// [separator]
256// [telemetry strip] -- mode-specific live stats (never scrolls)
257// [separator]
258// [scrollable content child] -- transactions + mode panels
259//
260// The scrollable child ends at the top of the status bar so content never
261// hides behind it. The child is explicitly sized to fill the remaining space.
153// --------------------------------------------------------------------------- 262// ---------------------------------------------------------------------------
154static void DrawMainWindow() 263static void DrawMainWindow()
155{ 264{
156 ImGuiIO& io = ImGui::GetIO(); 265 ImGuiIO& io = ImGui::GetIO();
157 ImGui::SetNextWindowPos(ImVec2(0,0)); 266
158 ImGui::SetNextWindowSize(io.DisplaySize); 267 // Full display height minus the status bar at the bottom.
159 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(12,12)); 268 const float winH = io.DisplaySize.y - STATUS_BAR_H;
269
270 ImGui::SetNextWindowPos(ImVec2(0.0f, 0.0f));
271 ImGui::SetNextWindowSize(ImVec2(io.DisplaySize.x, winH));
272 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(12.0f, 12.0f));
160 ImGui::Begin("##main", nullptr, 273 ImGui::Begin("##main", nullptr,
161 ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | 274 ImGuiWindowFlags_NoTitleBar |
162 ImGuiWindowFlags_NoMove | ImGuiWindowFlags_MenuBar | 275 ImGuiWindowFlags_NoResize |
163 ImGuiWindowFlags_NoFocusOnAppearing); 276 ImGuiWindowFlags_NoMove |
277 ImGuiWindowFlags_NoScrollbar |
278 ImGuiWindowFlags_NoScrollWithMouse |
279 ImGuiWindowFlags_MenuBar |
280 ImGuiWindowFlags_NoBringToFrontOnFocus);
164 ImGui::SetWindowFontScale(0.92f); 281 ImGui::SetWindowFontScale(0.92f);
165 ImGui::PopStyleVar(); 282 ImGui::PopStyleVar();
166 283
@@ -170,179 +287,209 @@ static void DrawMainWindow()
170 if (ImGui::MenuItem("Exit")) glfwSetWindowShouldClose(glfwGetCurrentContext(), true); 287 if (ImGui::MenuItem("Exit")) glfwSetWindowShouldClose(glfwGetCurrentContext(), true);
171 ImGui::EndMenu(); 288 ImGui::EndMenu();
172 } 289 }
173 if (ImGui::MenuItem("Options")) g_showOptions = true; 290 if (ImGui::MenuItem("Options")) g_showOptions = true;
174 if (ImGui::MenuItem("About")) g_showAbout = true; 291 if (ImGui::MenuItem("About")) g_showAbout = true;
175 ImGui::EndMenuBar(); 292 ImGui::EndMenuBar();
176 } 293 }
177 294
178 // ---- Address bar ---- 295 // ---- Header strip (never scrolls) ----
179 ImGui::Spacing(); 296 ImGui::Spacing();
180 ImGui::TextDisabled("Address:"); 297 ImGui::TextDisabled("Address:");
181 ImGui::SameLine(); 298 ImGui::SameLine();
182 ImGui::SetNextItemWidth(-80); 299 ImGui::SetNextItemWidth(-80.0f);
183 ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4(0.14f,0.14f,0.14f,1)); 300 ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4(0.14f, 0.14f, 0.14f, 1.0f));
184 ImGui::InputText("##addr", (char*)g_myAddress.c_str(), g_myAddress.size()+1, 301 ImGui::InputText("##addr", (char*)g_myAddress.c_str(), g_myAddress.size()+1,
185 ImGuiInputTextFlags_ReadOnly); 302 ImGuiInputTextFlags_ReadOnly);
186 ImGui::PopStyleColor(); 303 ImGui::PopStyleColor();
187 ImGui::SameLine(); 304 ImGui::SameLine();
188 if (ImGui::Button("Copy##a")) ImGui::SetClipboardText(g_myAddress.c_str()); 305 if (ImGui::Button("Copy##a")) ImGui::SetClipboardText(g_myAddress.c_str());
189 306
190 // ---- Balance on its own line ----
191 ImGui::TextDisabled("Balance:"); 307 ImGui::TextDisabled("Balance:");
192 ImGui::SameLine(); 308 ImGui::SameLine();
193 ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.35f,1.0f,0.35f,1.0f)); 309 ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.35f, 1.0f, 0.35f, 1.0f));
194 ImGui::Text("%s BTF", FmtMoney(g_balance).c_str()); 310 ImGui::Text("%s BTF", FmtMoney(g_balance).c_str());
195 ImGui::PopStyleColor(); 311 ImGui::PopStyleColor();
196 312
197 // ---- Toolbar ----
198 ImGui::Spacing(); 313 ImGui::Spacing();
199 ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.15f,0.40f,0.15f,1)); 314 ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.15f, 0.40f, 0.15f, 1.0f));
200 ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0.20f,0.55f,0.20f,1)); 315 ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0.20f, 0.55f, 0.20f, 1.0f));
201 if (ImGui::Button(" Send Coins ")) g_showSend = true; 316 if (ImGui::Button(" Send Coins ")) g_showSend = true;
202 ImGui::PopStyleColor(2); 317 ImGui::PopStyleColor(2);
203 318
204 // Mining status indicator 319 ImGui::SameLine(0.0f, 20.0f);
205 ImGui::SameLine(0, 20);
206 if (fGenerateBitcoins) { 320 if (fGenerateBitcoins) {
207 ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f,0.6f,0.0f,1.0f)); 321 ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 0.6f, 0.0f, 1.0f));
208 const char* modeLabel = nMineMode==MINE_OPERATOR ? "Mining (operator)" : 322 const char* modeLabel =
209 nMineMode==MINE_PARTICIPANT ? "Mining (pool)" : "Mining"; 323 nMineMode == MINE_OPERATOR ? "Mining (operator)" :
210 ImGui::Text("⬤ %s", modeLabel); 324 nMineMode == MINE_PARTICIPANT ? "Mining (pool)" :
325 nMineMode == MINE_RELAY ? "Relay" : "Mining";
326 ImGui::Text("* %s", modeLabel);
211 ImGui::PopStyleColor(); 327 ImGui::PopStyleColor();
212 if (nMineMode == MINE_PARTICIPANT) { 328 if (nMineMode == MINE_PARTICIPANT) {
213 std::string mineStatus = GetParticipantMiningStatus(); 329 std::string st = GetParticipantMiningStatus();
214 if (!mineStatus.empty()) { 330 if (!st.empty()) {
215 ImGui::SameLine(0, 12); 331 ImGui::SameLine(0.0f, 12.0f);
216 ImGui::PushStyleColor(ImGuiCol_Text, ParticipantStatusColor(mineStatus)); 332 ImGui::PushStyleColor(ImGuiCol_Text, StatusColor(st));
217 ImGui::Text("[%s]", mineStatus.c_str()); 333 ImGui::Text("[%s]", st.c_str());
218 ImGui::PopStyleColor(); 334 ImGui::PopStyleColor();
219 } 335 }
220 } 336 }
221 } else { 337 } else {
222 ImGui::TextDisabled("○ Not mining"); 338 ImGui::TextDisabled("Not mining");
223 } 339 }
224 340
225 ImGui::Spacing(); 341 ImGui::Spacing();
226 ImGui::Separator(); 342 ImGui::Separator();
227 ImGui::Spacing();
228 343
229 // ---- Live telemetry strip ---- 344 // ---- Telemetry strip (never scrolls) ----
230 { 345 {
231 const char* modeName = nMineMode==MINE_OPERATOR ? "Operator" : 346 ImGui::Spacing();
232 nMineMode==MINE_PARTICIPANT ? "Participant" : "Solo"; 347 const char* modeName =
233 int64 age = g_lastWalletRefresh > 0 ? (GetTime() - g_lastWalletRefresh) : -1; 348 nMineMode == MINE_OPERATOR ? "Operator" :
234 if (age < 0) age = 0; 349 nMineMode == MINE_PARTICIPANT ? "Participant" :
350 nMineMode == MINE_RELAY ? "Relay" : "Solo";
351 int64 age = g_lastWalletRefresh > 0 ? GetTime() - g_lastWalletRefresh : 0;
235 352
236 ImGui::Text("Mode: %s", modeName); 353 ImGui::Text("Mode: %s", modeName);
237 ImGui::SameLine(0, 16); 354 ImGui::SameLine(0.0f, 16.0f);
238 ImGui::Text("Wallet refresh: %llds ago", (long long)age); 355 ImGui::TextDisabled("Wallet refreshed %llds ago", (long long)age);
239 356
240 if (nMineMode == MINE_PARTICIPANT) { 357 if (nMineMode == MINE_PARTICIPANT) {
241 uint64 sent = 0, accepted = 0; 358 uint64 sent = 0, accepted = 0;
242 double hashRate = 0.0; 359 double hashRate = 0.0;
243 std::string mineStatus = GetParticipantMiningStatus(); 360 std::string st = GetParticipantMiningStatus();
244 GetParticipantMiningStats(sent, accepted, hashRate); 361 GetParticipantMiningStats(sent, accepted, hashRate);
245 if (sent > 0 || accepted > 0 || hashRate > 0.0) { 362 if (sent > 0 || accepted > 0 || hashRate > 0.0) {
246 double acceptPct = sent ? (100.0 * (double)accepted / (double)sent) : 0.0; 363 double pct = sent ? (100.0 * (double)accepted / (double)sent) : 0.0;
247 ImGui::TextDisabled("Your mining: sent %llu, accepted %llu (%.1f%%), %.2f H/s", 364 ImGui::TextDisabled(
248 (unsigned long long)sent, 365 "Sent %llu shares, accepted %llu (%.1f%%), %.2f H/s",
249 (unsigned long long)accepted, 366 (unsigned long long)sent, (unsigned long long)accepted, pct, hashRate);
250 acceptPct, 367 } else if (!st.empty()) {
251 hashRate); 368 ImGui::TextDisabled("Status: %s", st.c_str());
252 } else if (!mineStatus.empty()) {
253 ImGui::TextDisabled("Your mining: %s", mineStatus.c_str());
254 } else { 369 } else {
255 ImGui::TextDisabled("Your mining: asking pool for work"); 370 ImGui::TextDisabled("Waiting for pool work...");
256 } 371 }
257 } else if (nMineMode == MINE_OPERATOR) { 372 } else if (nMineMode == MINE_OPERATOR) {
258 int miners = 0, blocksFound = 0; 373 int miners = 0, blocksFound = 0;
259 uint64 roundShares = 0; 374 uint64 roundShares = 0;
260 GetPoolOperatorStats(miners, blocksFound, roundShares); 375 double totalHashRate = 0.0;
376 GetPoolOperatorStats(miners, blocksFound, roundShares, totalHashRate);
261 if (miners > 0 || blocksFound > 0 || roundShares > 0) 377 if (miners > 0 || blocksFound > 0 || roundShares > 0)
262 ImGui::TextDisabled("Pool runtime: %d authorized miners, %llu round shares, %d blocks found", miners, (unsigned long long)roundShares, blocksFound); 378 ImGui::TextDisabled(
379 "Authorized miners: %d Round shares: %llu Blocks found: %d %.2f H/s",
380 miners, (unsigned long long)roundShares, blocksFound, totalHashRate);
263 else 381 else
264 ImGui::TextDisabled("Pool runtime: waiting for miners"); 382 ImGui::TextDisabled("Pool server running, waiting for miners");
383 } else if (nMineMode == MINE_RELAY) {
384 ImGui::TextDisabled("Relay mode: syncing, not mining");
265 } else { 385 } else {
266 ImGui::TextDisabled("Solo runtime: local wallet mining telemetry"); 386 ImGui::TextDisabled("Solo mining");
267 } 387 }
268 ImGui::Spacing(); 388 ImGui::Spacing();
269 ImGui::Separator(); 389 ImGui::Separator();
270 ImGui::Spacing(); 390 ImGui::Spacing();
271 } 391 }
272 392
393 // ---- Scrollable content child ----
394 // Fills all remaining height in the window (cursor Y to bottom of window).
395 // Content that overflows scrolls; nothing leaks past the window edge.
396 // Size the scrollable child to fill exactly the remaining window height.
397 // GetContentRegionAvail() already accounts for padding/borders.
398 const float availH = ImGui::GetContentRegionAvail().y;
399 ImGui::BeginChild("##scroll", ImVec2(0.0f, availH), false, 0);
400
273 // ---- Transaction list ---- 401 // ---- Transaction list ----
274 float listHeight = io.DisplaySize.y * 0.26f; 402 float txH = io.DisplaySize.y * 0.26f;
275 if (listHeight < 190.0f) listHeight = 190.0f; 403 if (txH < 180.0f) txH = 180.0f;
276 if (listHeight > 260.0f) listHeight = 260.0f; 404 if (txH > 260.0f) txH = 260.0f;
405
277 if (ImGui::BeginTable("txlist", 4, 406 if (ImGui::BeginTable("txlist", 4,
278 ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | 407 ImGuiTableFlags_Borders |
279 ImGuiTableFlags_ScrollY | ImGuiTableFlags_SizingStretchProp, 408 ImGuiTableFlags_RowBg |
280 ImVec2(0, listHeight))) 409 ImGuiTableFlags_ScrollY |
410 ImGuiTableFlags_SizingStretchProp,
411 ImVec2(0.0f, txH)))
281 { 412 {
282 ImGui::TableSetupScrollFreeze(0, 1); 413 ImGui::TableSetupScrollFreeze(0, 1);
283 ImGui::TableSetupColumn("Status", ImGuiTableColumnFlags_WidthFixed, 110); 414 ImGui::TableSetupColumn("Status", ImGuiTableColumnFlags_WidthFixed, 110.0f);
284 ImGui::TableSetupColumn("Date", ImGuiTableColumnFlags_WidthFixed, 130); 415 ImGui::TableSetupColumn("Date", ImGuiTableColumnFlags_WidthFixed, 130.0f);
285 ImGui::TableSetupColumn("Description", ImGuiTableColumnFlags_WidthStretch); 416 ImGui::TableSetupColumn("Description", ImGuiTableColumnFlags_WidthStretch);
286 ImGui::TableSetupColumn("Amount", ImGuiTableColumnFlags_WidthFixed, 140); 417 ImGui::TableSetupColumn("Amount", ImGuiTableColumnFlags_WidthFixed, 140.0f);
287 ImGui::TableHeadersRow(); 418 ImGui::TableHeadersRow();
288 419
289 for (auto& row : g_txRows) { 420 for (auto& row : g_txRows) {
290 ImGui::TableNextRow(); 421 ImGui::TableNextRow();
291 ImGui::TableSetColumnIndex(0); 422 ImGui::TableSetColumnIndex(0);
292 if (row.depth < 1) 423 bool isImmatureCoinbase = (row.desc.find("matures in") != std::string::npos);
293 ImGui::TextColored(ImVec4(1,0.6f,0,1), "Unconfirmed"); 424 bool isOrphaned = (row.desc.find("orphaned") != std::string::npos);
425 if (isOrphaned)
426 ImGui::TextColored(ImVec4(1.0f, 0.3f, 0.3f, 1.0f), "Orphaned");
427 else if (row.depth < 1)
428 ImGui::TextColored(ImVec4(1.0f, 0.6f, 0.0f, 1.0f), "Unconfirmed");
429 else if (isImmatureCoinbase)
430 ImGui::TextColored(ImVec4(1.0f, 0.75f, 0.25f, 1.0f), "Immature");
431 else if (row.depth < 6)
432 ImGui::TextColored(ImVec4(1.0f, 0.85f, 0.3f, 1.0f), "%d confirm%s",
433 row.depth, row.depth == 1 ? "" : "s");
294 else 434 else
295 ImGui::Text("%d blocks deep", row.depth); 435 ImGui::TextColored(ImVec4(0.5f, 0.9f, 0.5f, 1.0f), "Confirmed");
296 ImGui::TableSetColumnIndex(1); 436 ImGui::TableSetColumnIndex(1);
297 ImGui::TextDisabled("%s", row.date.c_str()); 437 ImGui::TextDisabled("%s", row.date.c_str());
298 ImGui::TableSetColumnIndex(2); 438 ImGui::TableSetColumnIndex(2);
299 ImGui::TextUnformatted(row.desc.c_str()); 439 ImGui::TextUnformatted(row.desc.c_str());
300 ImGui::TableSetColumnIndex(3); 440 ImGui::TableSetColumnIndex(3);
301 if (row.amount >= 0) 441 if (row.amount >= 0)
302 ImGui::TextColored(ImVec4(0.35f,1,0.35f,1), "+%s BTF", FmtMoney(row.amount).c_str()); 442 ImGui::TextColored(ImVec4(0.35f, 1.0f, 0.35f, 1.0f),
443 "+%s BTF", FmtMoney(row.amount).c_str());
303 else 444 else
304 ImGui::TextColored(ImVec4(1,0.4f,0.4f,1), "%s BTF", FmtMoney(row.amount).c_str()); 445 ImGui::TextColored(ImVec4(1.0f, 0.4f, 0.4f, 1.0f),
446 "%s BTF", FmtMoney(row.amount).c_str());
305 } 447 }
306 ImGui::EndTable(); 448 ImGui::EndTable();
307 } 449 }
308 450
451 // ---- Mode panels ----
309 std::vector<BtfPoolAnnouncement> pools; 452 std::vector<BtfPoolAnnouncement> pools;
310 BtfGetPoolAnnouncements(pools); 453 BtfGetPoolAnnouncements(pools);
311 454
312 if (nMineMode == MINE_PARTICIPANT) { 455 if (nMineMode == MINE_PARTICIPANT) {
313 ImGui::Spacing(); 456 ImGui::Spacing();
314 ImGui::SeparatorText("Participant Mining"); 457 ImGui::SeparatorText("Participant Mining");
315 ImGui::Text("Selected pool:"); 458
459 ImGui::TextDisabled("Selected pool:");
460 ImGui::SameLine();
316 if (strParticipantPool.empty()) 461 if (strParticipantPool.empty())
317 ImGui::TextDisabled("No pool selected yet"); 462 ImGui::TextDisabled("none");
318 else 463 else
319 ImGui::TextWrapped("%s", strParticipantPool.c_str()); 464 ImGui::TextWrapped("%s", strParticipantPool.c_str());
320 465
321 const BtfPoolAnnouncement* selected = NULL; 466 const BtfPoolAnnouncement* sel = nullptr;
322 for (size_t i = 0; i < pools.size(); i++) 467 for (size_t i = 0; i < pools.size(); i++)
323 if (pools[i].btfAddress == strParticipantPool) { selected = &pools[i]; break; } 468 if (pools[i].btfAddress == strParticipantPool) { sel = &pools[i]; break; }
324 469
325 if (selected) { 470 if (sel) {
326 ImGui::Text("Pool name: %s", selected->poolName.c_str()); 471 ImGui::Text("Pool: %s Fee: %.2f%% Miners: %d Blocks: %d %.2f H/s",
327 ImGui::Text("Fee: %.2f%%", selected->feePercent); 472 sel->poolName.c_str(), sel->feePercent,
328 ImGui::Text("Live stats: %d miners, %d blocks", selected->connectedMiners, selected->blocksFound); 473 sel->connectedMiners, sel->blocksFound, sel->hashRate);
329 if (!selected->dashboardUrl.empty()) 474 if (!sel->dashboardUrl.empty())
330 ImGui::TextWrapped("Dashboard: %s", selected->dashboardUrl.c_str()); 475 ImGui::TextDisabled("Dashboard: %s", sel->dashboardUrl.c_str());
331 } else if (!strParticipantPool.empty()) { 476 } else if (!strParticipantPool.empty()) {
332 ImGui::TextDisabled("No fresh announcement found for this pool yet"); 477 ImGui::TextDisabled("No live announcement for this pool yet.");
333 } 478 }
334 479
335 if (!pools.empty()) { 480 if (!pools.empty()) {
336 ImGui::Spacing(); 481 ImGui::Spacing();
337 ImGui::SeparatorText("Live Pools"); 482 ImGui::SeparatorText("Live Pools");
338 if (ImGui::BeginTable("livepools", 5, 483 if (ImGui::BeginTable("livepools", 5,
339 ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingStretchProp)) 484 ImGuiTableFlags_Borders |
485 ImGuiTableFlags_RowBg |
486 ImGuiTableFlags_SizingStretchProp))
340 { 487 {
341 ImGui::TableSetupColumn("Pool", ImGuiTableColumnFlags_WidthStretch); 488 ImGui::TableSetupColumn("Pool", ImGuiTableColumnFlags_WidthStretch);
342 ImGui::TableSetupColumn("Fee", ImGuiTableColumnFlags_WidthFixed, 70); 489 ImGui::TableSetupColumn("Fee", ImGuiTableColumnFlags_WidthFixed, 60.0f);
343 ImGui::TableSetupColumn("Stats", ImGuiTableColumnFlags_WidthFixed, 160); 490 ImGui::TableSetupColumn("Stats", ImGuiTableColumnFlags_WidthFixed, 150.0f);
344 ImGui::TableSetupColumn("Dashboard", ImGuiTableColumnFlags_WidthStretch); 491 ImGui::TableSetupColumn("Dashboard", ImGuiTableColumnFlags_WidthStretch);
345 ImGui::TableSetupColumn("Use", ImGuiTableColumnFlags_WidthFixed, 60); 492 ImGui::TableSetupColumn("Use", ImGuiTableColumnFlags_WidthFixed, 50.0f);
346 ImGui::TableHeadersRow(); 493 ImGui::TableHeadersRow();
347 for (size_t i = 0; i < pools.size(); i++) { 494 for (size_t i = 0; i < pools.size(); i++) {
348 const BtfPoolAnnouncement& ann = pools[i]; 495 const BtfPoolAnnouncement& ann = pools[i];
@@ -353,15 +500,19 @@ static void DrawMainWindow()
353 ImGui::TableSetColumnIndex(1); 500 ImGui::TableSetColumnIndex(1);
354 ImGui::Text("%.2f%%", ann.feePercent); 501 ImGui::Text("%.2f%%", ann.feePercent);
355 ImGui::TableSetColumnIndex(2); 502 ImGui::TableSetColumnIndex(2);
356 ImGui::Text("%d miners, %d blocks, %s old", ann.connectedMiners, ann.blocksFound, FmtAge(ann.createdAt).c_str()); 503 ImGui::Text("%d miners %d blocks %.2f H/s %s",
504 ann.connectedMiners, ann.blocksFound, ann.hashRate,
505 FmtAge(ann.createdAt).c_str());
357 ImGui::TableSetColumnIndex(3); 506 ImGui::TableSetColumnIndex(3);
358 if (!ann.dashboardUrl.empty()) 507 if (!ann.dashboardUrl.empty())
359 ImGui::TextWrapped("%s", ann.dashboardUrl.c_str()); 508 ImGui::TextWrapped("%s", ann.dashboardUrl.c_str());
360 else 509 else
361 ImGui::TextDisabled("-"); 510 ImGui::TextDisabled("-");
362 ImGui::TableSetColumnIndex(4); 511 ImGui::TableSetColumnIndex(4);
363 if (ImGui::SmallButton((std::string("Use##") + ann.btfAddress).c_str())) { 512 std::string btnId = "Use##" + ann.btfAddress;
364 strncpy(g_participantPool, ann.btfAddress.c_str(), sizeof(g_participantPool)-1); 513 if (ImGui::SmallButton(btnId.c_str())) {
514 strncpy(g_participantPool, ann.btfAddress.c_str(),
515 sizeof(g_participantPool)-1);
365 strParticipantPool = ann.btfAddress; 516 strParticipantPool = ann.btfAddress;
366 CWalletDB().WriteSetting("strParticipantPool", strParticipantPool); 517 CWalletDB().WriteSetting("strParticipantPool", strParticipantPool);
367 g_needRefresh = true; 518 g_needRefresh = true;
@@ -375,55 +526,60 @@ static void DrawMainWindow()
375 if (nMineMode == MINE_OPERATOR) { 526 if (nMineMode == MINE_OPERATOR) {
376 ImGui::Spacing(); 527 ImGui::Spacing();
377 ImGui::SeparatorText("Operator Overview"); 528 ImGui::SeparatorText("Operator Overview");
378 ImGui::Text("Pool .btf address:"); 529
379 std::string opAddr = BtfLocalAddress(); 530 std::string opAddr = BtfLocalAddress();
531 ImGui::TextDisabled("Pool .btf address:");
532 ImGui::SameLine();
380 if (opAddr.empty()) 533 if (opAddr.empty())
381 ImGui::TextDisabled("Identity not ready yet"); 534 ImGui::TextDisabled("identity not ready");
382 else 535 else
383 ImGui::TextWrapped("%s", opAddr.c_str()); 536 ImGui::TextWrapped("%s", opAddr.c_str());
384 537
538 // Pending payouts
385 std::vector<PendingPayoutView> owed; 539 std::vector<PendingPayoutView> owed;
386 GetPendingPayouts(owed); 540 GetPendingPayouts(owed);
387 ImGui::Spacing(); 541 ImGui::Spacing();
388 ImGui::SeparatorText("Pending Pool Payouts (you owe miners)"); 542 ImGui::SeparatorText("Pending Payouts (owed to miners)");
389 if (owed.empty()) { 543 if (owed.empty()) {
390 ImGui::TextDisabled("No pending pool payouts"); 544 ImGui::TextDisabled("No pending payouts");
391 } else if (ImGui::BeginTable("owedpayouts", 4, 545 } else if (ImGui::BeginTable("owedpayouts", 4,
392 ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingStretchProp)) 546 ImGuiTableFlags_Borders |
547 ImGuiTableFlags_RowBg |
548 ImGuiTableFlags_SizingStretchProp))
393 { 549 {
394 ImGui::TableSetupColumn("Matures At", ImGuiTableColumnFlags_WidthFixed, 100); 550 ImGui::TableSetupColumn("Matures At", ImGuiTableColumnFlags_WidthFixed, 90.0f);
395 ImGui::TableSetupColumn("Blocks Left", ImGuiTableColumnFlags_WidthFixed, 90); 551 ImGui::TableSetupColumn("Blocks left", ImGuiTableColumnFlags_WidthFixed, 80.0f);
396 ImGui::TableSetupColumn("Recipients", ImGuiTableColumnFlags_WidthFixed, 90); 552 ImGui::TableSetupColumn("Recipients", ImGuiTableColumnFlags_WidthFixed, 80.0f);
397 ImGui::TableSetupColumn("Total", ImGuiTableColumnFlags_WidthStretch); 553 ImGui::TableSetupColumn("Total", ImGuiTableColumnFlags_WidthStretch);
398 ImGui::TableHeadersRow(); 554 ImGui::TableHeadersRow();
399 for (const PendingPayoutView& row : owed) { 555 for (const PendingPayoutView& row : owed) {
400 int remaining = std::max(0, row.matureAtHeight - nBestHeight); 556 int left = std::max(0, row.matureAtHeight - nBestHeight);
401 ImGui::TableNextRow(); 557 ImGui::TableNextRow();
402 ImGui::TableSetColumnIndex(0); 558 ImGui::TableSetColumnIndex(0); ImGui::Text("%d", row.matureAtHeight);
403 ImGui::Text("%d", row.matureAtHeight); 559 ImGui::TableSetColumnIndex(1); ImGui::Text("%d", left);
404 ImGui::TableSetColumnIndex(1); 560 ImGui::TableSetColumnIndex(2); ImGui::Text("%d", row.recipients);
405 ImGui::Text("%d", remaining); 561 ImGui::TableSetColumnIndex(3); ImGui::Text("%s BTF", FmtMoney(row.totalAmount).c_str());
406 ImGui::TableSetColumnIndex(2);
407 ImGui::Text("%d", row.recipients);
408 ImGui::TableSetColumnIndex(3);
409 ImGui::Text("%s BTF", FmtMoney(row.totalAmount).c_str());
410 } 562 }
411 ImGui::EndTable(); 563 ImGui::EndTable();
412 } 564 }
413 565
566 // Workers
414 std::vector<PoolWorkerStatView> workers; 567 std::vector<PoolWorkerStatView> workers;
415 GetPoolWorkerStats(workers); 568 GetPoolWorkerStats(workers);
416 ImGui::Spacing(); 569 ImGui::Spacing();
417 ImGui::SeparatorText("Current Round Workers"); 570 ImGui::SeparatorText("Current Round Workers");
418 if (workers.empty()) { 571 if (workers.empty()) {
419 ImGui::TextDisabled("No active workers in this round"); 572 ImGui::TextDisabled("No active workers this round");
420 } else if (ImGui::BeginTable("workers", 4, 573 } else if (ImGui::BeginTable("workers", 5,
421 ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingStretchProp)) 574 ImGuiTableFlags_Borders |
575 ImGuiTableFlags_RowBg |
576 ImGuiTableFlags_SizingStretchProp))
422 { 577 {
423 ImGui::TableSetupColumn("Payout Addr", ImGuiTableColumnFlags_WidthStretch); 578 ImGui::TableSetupColumn("Payout Address", ImGuiTableColumnFlags_WidthStretch);
424 ImGui::TableSetupColumn("Worker", ImGuiTableColumnFlags_WidthStretch); 579 ImGui::TableSetupColumn("Worker", ImGuiTableColumnFlags_WidthStretch);
425 ImGui::TableSetupColumn("Round Shares", ImGuiTableColumnFlags_WidthFixed, 90); 580 ImGui::TableSetupColumn("Hashrate", ImGuiTableColumnFlags_WidthFixed, 90.0f);
426 ImGui::TableSetupColumn("Last Seen", ImGuiTableColumnFlags_WidthFixed, 100); 581 ImGui::TableSetupColumn("Round shares", ImGuiTableColumnFlags_WidthFixed, 90.0f);
582 ImGui::TableSetupColumn("Last seen", ImGuiTableColumnFlags_WidthFixed, 90.0f);
427 ImGui::TableHeadersRow(); 583 ImGui::TableHeadersRow();
428 for (const PoolWorkerStatView& row : workers) { 584 for (const PoolWorkerStatView& row : workers) {
429 ImGui::TableNextRow(); 585 ImGui::TableNextRow();
@@ -432,53 +588,19 @@ static void DrawMainWindow()
432 ImGui::TableSetColumnIndex(1); 588 ImGui::TableSetColumnIndex(1);
433 ImGui::TextDisabled("%s", row.worker.empty() ? "worker" : row.worker.c_str()); 589 ImGui::TextDisabled("%s", row.worker.empty() ? "worker" : row.worker.c_str());
434 ImGui::TableSetColumnIndex(2); 590 ImGui::TableSetColumnIndex(2);
435 ImGui::Text("%llu", (unsigned long long)row.roundShares); 591 ImGui::Text("%.2f H/s", row.hashRate);
436 ImGui::TableSetColumnIndex(3); 592 ImGui::TableSetColumnIndex(3);
437 ImGui::TextDisabled("%s", FmtAge(row.lastSeen).c_str()); 593 ImGui::Text("%llu", (unsigned long long)row.roundShares);
594 ImGui::TableSetColumnIndex(4);
595 ImGui::TextDisabled("%s ago", FmtAge(row.lastSeen).c_str());
438 } 596 }
439 ImGui::EndTable(); 597 ImGui::EndTable();
440 } 598 }
441 } 599 }
442 600
443 // ---- Status bar ---- 601 ImGui::EndChild(); // ##scroll
444 {
445 ImGui::Spacing();
446 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(4,2));
447
448 int peers = (int)vNodes.size();
449 if (nMineMode == MINE_PARTICIPANT) {
450 uint64 sent = 0, accepted = 0;
451 double hashRate = 0.0;
452 std::string mineStatus = GetParticipantMiningStatus();
453 GetParticipantMiningStats(sent, accepted, hashRate);
454 if (sent > 0 || accepted > 0 || hashRate > 0.0)
455 ImGui::TextDisabled("Peers %d height %d shares sent %llu accepted %llu hash rate %.2f H/s",
456 peers,
457 nBestHeight,
458 (unsigned long long)sent,
459 (unsigned long long)accepted,
460 hashRate);
461 else if (!mineStatus.empty())
462 ImGui::TextDisabled("Peers %d height %d %s", peers, nBestHeight, mineStatus.c_str());
463 else
464 ImGui::TextDisabled("Peers %d height %d asking pool for work", peers, nBestHeight);
465 } else if (nMineMode == MINE_OPERATOR) {
466 int miners = 0, blocksFound = 0;
467 uint64 roundShares = 0;
468 GetPoolOperatorStats(miners, blocksFound, roundShares);
469 if (miners > 0 || blocksFound > 0 || roundShares > 0)
470 ImGui::TextDisabled("Peers %d height %d authorized miners %d round shares %llu blocks found %d",
471 peers, nBestHeight, miners, (unsigned long long)roundShares, blocksFound);
472 else
473 ImGui::TextDisabled("Peers %d height %d waiting for miners", peers, nBestHeight);
474 } else {
475 ImGui::TextDisabled("Peers %d height %d", peers, nBestHeight);
476 }
477 ImGui::PopStyleVar();
478 }
479
480 ImGui::SetWindowFontScale(1.0f); 602 ImGui::SetWindowFontScale(1.0f);
481 ImGui::End(); 603 ImGui::End(); // ##main
482} 604}
483 605
484// --------------------------------------------------------------------------- 606// ---------------------------------------------------------------------------
@@ -487,42 +609,53 @@ static void DrawMainWindow()
487static void DrawSendDialog() 609static void DrawSendDialog()
488{ 610{
489 if (!g_showSend) return; 611 if (!g_showSend) return;
490 ImGui::SetNextWindowSize(ImVec2(500, 180), ImGuiCond_Always); 612 ImGui::SetNextWindowSize(ImVec2(500.0f, 180.0f), ImGuiCond_Always);
491 ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(), ImGuiCond_Always, ImVec2(.5f,.5f)); 613 ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(),
614 ImGuiCond_Always, ImVec2(0.5f, 0.5f));
492 if (ImGui::Begin("Send Coins", &g_showSend, 615 if (ImGui::Begin("Send Coins", &g_showSend,
493 ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse)) 616 ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse))
494 { 617 {
495 ImGui::Text("Recipient address:"); 618 ImGui::Text("Recipient address:");
496 ImGui::SetNextItemWidth(-1); 619 ImGui::SetNextItemWidth(-1.0f);
497 ImGui::InputText("##sa", g_sendAddr, sizeof(g_sendAddr)); 620 ImGui::InputText("##sa", g_sendAddr, sizeof(g_sendAddr));
498 621
499 ImGui::Text("Amount (BTF):"); 622 ImGui::Text("Amount (BTF):");
500 ImGui::SetNextItemWidth(180); 623 ImGui::SetNextItemWidth(180.0f);
501 ImGui::InputText("##sm", g_sendAmount, sizeof(g_sendAmount)); 624 ImGui::InputText("##sm", g_sendAmount, sizeof(g_sendAmount));
502 625
503 if (!g_sendStatus.empty()) { 626 if (!g_sendStatus.empty()) {
504 ImGui::Spacing(); 627 ImGui::Spacing();
505 ImGui::TextColored(ImVec4(1,.4f,.4f,1), "%s", g_sendStatus.c_str()); 628 ImGui::TextColored(ImVec4(1.0f, 0.4f, 0.4f, 1.0f),
629 "%s", g_sendStatus.c_str());
506 } 630 }
507 631
508 ImGui::Spacing(); ImGui::Separator(); ImGui::Spacing(); 632 ImGui::Spacing(); ImGui::Separator(); ImGui::Spacing();
509 if (ImGui::Button("Send", ImVec2(90,0))) { 633 if (ImGui::Button("Send", ImVec2(90.0f, 0.0f))) {
510 uint160 h; int64 nv = 0; 634 uint160 h; int64 nv = 0;
511 if (!AddressToHash160(g_sendAddr, h)) g_sendStatus = "Invalid address."; 635 if (!AddressToHash160(g_sendAddr, h))
512 else if (!ParseMoney(g_sendAmount,nv)||nv<=0) g_sendStatus = "Invalid amount."; 636 g_sendStatus = "Invalid address.";
637 else if (!ParseMoney(g_sendAmount, nv) || nv <= 0)
638 g_sendStatus = "Invalid amount.";
513 else { 639 else {
514 CScript s; s << OP_DUP << OP_HASH160 << h << OP_EQUALVERIFY << OP_CHECKSIG; 640 CScript sc;
641 sc << OP_DUP << OP_HASH160 << h << OP_EQUALVERIFY << OP_CHECKSIG;
515 CWalletTx wtx; 642 CWalletTx wtx;
516 if (SendMoney(s, nv, wtx)) { 643 if (SendMoney(sc, nv, wtx)) {
517 g_showSend=false; g_sendStatus=""; 644 g_showSend = false;
518 memset(g_sendAddr,0,sizeof(g_sendAddr)); 645 g_sendStatus = "";
519 memset(g_sendAmount,0,sizeof(g_sendAmount)); 646 memset(g_sendAddr, 0, sizeof(g_sendAddr));
647 memset(g_sendAmount, 0, sizeof(g_sendAmount));
520 g_needRefresh = true; 648 g_needRefresh = true;
521 } else g_sendStatus = "Transaction failed."; 649 } else {
650 g_sendStatus = "Transaction failed.";
651 }
522 } 652 }
523 } 653 }
524 ImGui::SameLine(); 654 ImGui::SameLine();
525 if (ImGui::Button("Cancel", ImVec2(90,0))) { g_showSend=false; g_sendStatus=""; } 655 if (ImGui::Button("Cancel", ImVec2(90.0f, 0.0f))) {
656 g_showSend = false;
657 g_sendStatus = "";
658 }
526 } 659 }
527 ImGui::End(); 660 ImGui::End();
528} 661}
@@ -534,7 +667,6 @@ static void DrawOptionsDialog()
534{ 667{
535 if (!g_showOptions) return; 668 if (!g_showOptions) return;
536 669
537 // Always sync from current globals when dialog opens
538 static bool wasOpen = false; 670 static bool wasOpen = false;
539 if (!wasOpen) { 671 if (!wasOpen) {
540 g_mineRadio = nMineMode; 672 g_mineRadio = nMineMode;
@@ -544,42 +676,46 @@ static void DrawOptionsDialog()
544 strncpy(g_poolDash, strPoolDashboardUrl.c_str(), sizeof(g_poolDash)-1); 676 strncpy(g_poolDash, strPoolDashboardUrl.c_str(), sizeof(g_poolDash)-1);
545 } 677 }
546 wasOpen = true; 678 wasOpen = true;
547 ImGui::SetNextWindowSize(ImVec2(500, 310), ImGuiCond_Always); 679
548 ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(), ImGuiCond_Always, ImVec2(.5f,.5f)); 680 ImGui::SetNextWindowSize(ImVec2(500.0f, 335.0f), ImGuiCond_Always);
681 ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(),
682 ImGuiCond_Always, ImVec2(0.5f, 0.5f));
549 if (ImGui::Begin("Options", &g_showOptions, 683 if (ImGui::Begin("Options", &g_showOptions,
550 ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse)) 684 ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse))
551 { 685 {
552 // Transaction fee 686 // Transaction fee
553 ImGui::SeparatorText("Transaction Fee"); 687 ImGui::SeparatorText("Transaction Fee");
554 static char feeStr[32] = {}; 688 static char feeStr[32] = {};
555 if (feeStr[0]=='\0') snprintf(feeStr,sizeof(feeStr),"%s",FmtMoney(nTransactionFee).c_str()); 689 if (feeStr[0] == '\0')
556 ImGui::SetNextItemWidth(180); 690 snprintf(feeStr, sizeof(feeStr), "%s", FmtMoney(nTransactionFee).c_str());
691 ImGui::SetNextItemWidth(180.0f);
557 ImGui::InputText("BTF per transaction##fee", feeStr, sizeof(feeStr)); 692 ImGui::InputText("BTF per transaction##fee", feeStr, sizeof(feeStr));
558 693
559 // Mining 694 // Mining mode
560 ImGui::SeparatorText("Mining Mode"); 695 ImGui::SeparatorText("Mining Mode");
561 ImGui::RadioButton("Solo — rewards go to your wallet", &g_mineRadio, MINE_SOLO); 696 ImGui::RadioButton("Relay -- just run the node, don't mine", &g_mineRadio, MINE_RELAY);
562 ImGui::RadioButton("Operator — run a pool for other miners", &g_mineRadio, MINE_OPERATOR); 697 ImGui::RadioButton("Solo -- rewards go to your wallet", &g_mineRadio, MINE_SOLO);
563 ImGui::RadioButton("Participant — mine to someone's pool", &g_mineRadio, MINE_PARTICIPANT); 698 ImGui::RadioButton("Operator -- run a pool for other miners", &g_mineRadio, MINE_OPERATOR);
699 ImGui::RadioButton("Participant -- mine to someone's pool", &g_mineRadio, MINE_PARTICIPANT);
564 700
565 if (g_mineRadio == MINE_OPERATOR) { 701 if (g_mineRadio == MINE_OPERATOR) {
566 ImGui::Spacing(); 702 ImGui::Spacing();
567 ImGui::SeparatorText("Pool Announcement"); 703 ImGui::SeparatorText("Pool Announcement");
568 ImGui::Text("Pool name:"); 704 ImGui::Text("Pool name:");
569 ImGui::SetNextItemWidth(-1); 705 ImGui::SetNextItemWidth(-1.0f);
570 ImGui::InputText("##poolname", g_poolName, sizeof(g_poolName)); 706 ImGui::InputText("##poolname", g_poolName, sizeof(g_poolName));
571 ImGui::Text("Fee %%:"); 707 ImGui::Text("Fee %%:");
572 ImGui::SetNextItemWidth(120); 708 ImGui::SetNextItemWidth(120.0f);
573 ImGui::InputText("##poolfee", g_poolFee, sizeof(g_poolFee)); 709 ImGui::InputText("##poolfee", g_poolFee, sizeof(g_poolFee));
574 ImGui::Text("Dashboard URL:"); 710 ImGui::Text("Dashboard URL:");
575 ImGui::SetNextItemWidth(-1); 711 ImGui::SetNextItemWidth(-1.0f);
576 ImGui::InputText("##pooldash", g_poolDash, sizeof(g_poolDash)); 712 ImGui::InputText("##pooldash", g_poolDash, sizeof(g_poolDash));
577 } 713 }
578 714
579 if (g_mineRadio == MINE_PARTICIPANT) { 715 if (g_mineRadio == MINE_PARTICIPANT) {
580 ImGui::Spacing(); 716 ImGui::Spacing();
581 ImGui::SeparatorText("Pool Selection"); 717 ImGui::SeparatorText("Pool Selection");
582 ImGui::TextDisabled("Pick from live discovered pools. Manual entry is disabled here."); 718 ImGui::TextDisabled("Pick from live discovered pools.");
583 719
584 std::vector<BtfPoolAnnouncement> pools; 720 std::vector<BtfPoolAnnouncement> pools;
585 BtfGetPoolAnnouncements(pools); 721 BtfGetPoolAnnouncements(pools);
@@ -591,46 +727,49 @@ static void DrawOptionsDialog()
591 break; 727 break;
592 } 728 }
593 } 729 }
594 if (ImGui::BeginCombo("Discovered pools", current.c_str())) { 730 if (ImGui::BeginCombo("Discovered pools##combo", current.c_str())) {
595 for (size_t i = 0; i < pools.size(); i++) { 731 for (size_t i = 0; i < pools.size(); i++) {
596 const BtfPoolAnnouncement& ann = pools[i]; 732 const BtfPoolAnnouncement& ann = pools[i];
597 std::string label = PoolLabel(ann); 733 bool selected = (ann.btfAddress == g_participantPool);
598 bool selected = ann.btfAddress == g_participantPool; 734 if (ImGui::Selectable(PoolLabel(ann).c_str(), selected))
599 if (ImGui::Selectable(label.c_str(), selected)) { 735 strncpy(g_participantPool, ann.btfAddress.c_str(),
600 strncpy(g_participantPool, ann.btfAddress.c_str(), sizeof(g_participantPool)-1); 736 sizeof(g_participantPool)-1);
601 }
602 } 737 }
603 ImGui::EndCombo(); 738 ImGui::EndCombo();
604 } 739 }
605 } else { 740 } else {
606 ImGui::TextDisabled("No live pools discovered yet"); 741 ImGui::TextDisabled("No live pools discovered yet.");
607 } 742 }
608 } 743 }
609 744
610 ImGui::Spacing();
611 const char* genLabel = fGenerateBitcoins ? "Stop Mining" : "Start Mining";
612 if (ImGui::Button(genLabel, ImVec2(130,0))) {
613 fGenerateBitcoins = fGenerateBitcoins ? 0 : 1;
614 if (fGenerateBitcoins) _beginthread(ThreadBitcoinMiner, 0, NULL);
615 CWalletDB().WriteSetting("fGenerateBitcoins", fGenerateBitcoins);
616 }
617
618 ImGui::Spacing(); ImGui::Separator(); ImGui::Spacing(); 745 ImGui::Spacing(); ImGui::Separator(); ImGui::Spacing();
619 if (ImGui::Button("OK", ImVec2(90,0))) { 746 if (ImGui::Button("OK", ImVec2(90.0f, 0.0f))) {
620 int64 fee=0; 747 int64 fee = 0;
621 if (ParseMoney(feeStr,fee)) { nTransactionFee=fee; CWalletDB().WriteSetting("nTransactionFee",nTransactionFee); } 748 if (ParseMoney(feeStr, fee)) {
622 749 nTransactionFee = fee;
623 bool changed = (g_mineRadio != nMineMode); 750 CWalletDB().WriteSetting("nTransactionFee", nTransactionFee);
624 nMineMode = g_mineRadio; 751 }
625 strParticipantPool = g_participantPool; 752
626 strPoolName = g_poolName[0] ? g_poolName : "Bitflash Pool"; 753 bool poolChanged =
627 strPoolDashboardUrl = g_poolDash; 754 nMineMode != g_mineRadio ||
628 dPoolFeePercent = atof(g_poolFee); 755 strPoolName != (g_poolName[0] ? g_poolName : "Bitflash Pool") ||
629 CWalletDB().WriteSetting("nMineMode", nMineMode); 756 strPoolDashboardUrl != g_poolDash ||
630 CWalletDB().WriteSetting("strParticipantPool", strParticipantPool); 757 dPoolFeePercent != atof(g_poolFee);
631 CWalletDB().WriteSetting("strPoolName", strPoolName); 758
632 CWalletDB().WriteSetting("strPoolDashboardUrl", strPoolDashboardUrl); 759 nMineMode = g_mineRadio;
633 CWalletDB().WriteSetting("dPoolFeePercent", dPoolFeePercent); 760 strParticipantPool = g_participantPool;
761 strPoolName = g_poolName[0] ? g_poolName : "Bitflash Pool";
762 strPoolDashboardUrl = g_poolDash;
763 dPoolFeePercent = atof(g_poolFee);
764
765 if (nMineMode == MINE_OPERATOR && poolChanged) gAnnounceNow = true;
766
767 if (nMineMode == MINE_RELAY) {
768 fGenerateBitcoins = 0;
769 } else {
770 fGenerateBitcoins = 1;
771 if (!vfThreadRunning[3]) _beginthread(ThreadBitcoinMiner, 0, NULL);
772 }
634 773
635 if (nMineMode == MINE_OPERATOR) { 774 if (nMineMode == MINE_OPERATOR) {
636 if (!gPoolServerRunning) { 775 if (!gPoolServerRunning) {
@@ -645,7 +784,7 @@ static void DrawOptionsDialog()
645 g_showOptions = false; 784 g_showOptions = false;
646 } 785 }
647 ImGui::SameLine(); 786 ImGui::SameLine();
648 if (ImGui::Button("Cancel", ImVec2(90,0))) g_showOptions = false; 787 if (ImGui::Button("Cancel", ImVec2(90.0f, 0.0f))) g_showOptions = false;
649 } 788 }
650 if (!g_showOptions) wasOpen = false; 789 if (!g_showOptions) wasOpen = false;
651 ImGui::End(); 790 ImGui::End();
@@ -657,18 +796,21 @@ static void DrawOptionsDialog()
657static void DrawAboutDialog() 796static void DrawAboutDialog()
658{ 797{
659 if (!g_showAbout) return; 798 if (!g_showAbout) return;
660 ImGui::SetNextWindowSize(ImVec2(380, 170), ImGuiCond_Always); 799 ImGui::SetNextWindowSize(ImVec2(380.0f, 170.0f), ImGuiCond_Always);
661 ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(), ImGuiCond_Always, ImVec2(.5f,.5f)); 800 ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(),
801 ImGuiCond_Always, ImVec2(0.5f, 0.5f));
662 if (ImGui::Begin("About Bitflash", &g_showAbout, 802 if (ImGui::Begin("About Bitflash", &g_showAbout,
663 ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse)) 803 ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse))
664 { 804 {
665 ImGui::TextColored(ImVec4(1,.6f,0,1), "Bitflash BTF v1.1.0"); 805 ImGui::TextColored(ImVec4(1.0f, 0.6f, 0.0f, 1.0f), "Bitflash BTF v1.1.0");
666 ImGui::Spacing(); 806 ImGui::Spacing();
667 ImGui::TextWrapped("CPU-only cryptocurrency. RandomX proof of work. Anonymous .btf addressing over Nostr. No premine."); 807 ImGui::TextWrapped(
808 "CPU-only cryptocurrency. RandomX proof of work. "
809 "Anonymous .btf addressing over Nostr. No premine.");
668 ImGui::Spacing(); 810 ImGui::Spacing();
669 ImGui::TextDisabled("Based on Bitcoin 0.1.0 (Satoshi Nakamoto, 2009)"); 811 ImGui::TextDisabled("Based on Bitcoin 0.1.0 (Satoshi Nakamoto, 2009)");
670 ImGui::Spacing(); 812 ImGui::Spacing();
671 if (ImGui::Button("OK", ImVec2(90,0))) g_showAbout = false; 813 if (ImGui::Button("OK", ImVec2(90.0f, 0.0f))) g_showAbout = false;
672 } 814 }
673 ImGui::End(); 815 ImGui::End();
674} 816}
@@ -705,34 +847,33 @@ int RunGUI(int argc, char* argv[])
705 ImGuiIO& io = ImGui::GetIO(); 847 ImGuiIO& io = ImGui::GetIO();
706 io.IniFilename = nullptr; 848 io.IniFilename = nullptr;
707 849
708 // Load Roboto at 16px — clean, readable on all platforms
709 io.Fonts->AddFontFromMemoryCompressedTTF( 850 io.Fonts->AddFontFromMemoryCompressedTTF(
710 RobotoMedium_compressed_data, RobotoMedium_compressed_size, 16.0f); 851 RobotoMedium_compressed_data, RobotoMedium_compressed_size, 14.0f);
711 852
712 ImGui::StyleColorsDark(); 853 ImGui::StyleColorsDark();
713 ImGuiStyle& s = ImGui::GetStyle(); 854 ImGuiStyle& st = ImGui::GetStyle();
714 s.WindowRounding = s.FrameRounding = s.PopupRounding = 4.0f; 855 st.WindowRounding = st.FrameRounding = st.PopupRounding = 4.0f;
715 s.ItemSpacing = ImVec2(10, 7); 856 st.ItemSpacing = ImVec2(10.0f, 7.0f);
716 s.FramePadding = ImVec2(8, 5); 857 st.FramePadding = ImVec2(8.0f, 5.0f);
717 s.WindowPadding = ImVec2(12, 12); 858 st.WindowPadding = ImVec2(12.0f, 12.0f);
718 // Orange accent 859 // Orange accent
719 s.Colors[ImGuiCol_TitleBgActive] = ImVec4(.80f,.45f,.00f,1); 860 st.Colors[ImGuiCol_TitleBgActive] = ImVec4(.80f, .45f, .00f, 1.0f);
720 s.Colors[ImGuiCol_CheckMark] = ImVec4(1.0f,.60f,.00f,1); 861 st.Colors[ImGuiCol_CheckMark] = ImVec4(1.0f, .60f, .00f, 1.0f);
721 s.Colors[ImGuiCol_SliderGrab] = ImVec4(.80f,.45f,.00f,1); 862 st.Colors[ImGuiCol_SliderGrab] = ImVec4(.80f, .45f, .00f, 1.0f);
722 s.Colors[ImGuiCol_Button] = ImVec4(.25f,.25f,.25f,1); 863 st.Colors[ImGuiCol_Button] = ImVec4(.25f, .25f, .25f, 1.0f);
723 s.Colors[ImGuiCol_ButtonHovered] = ImVec4(.80f,.45f,.00f,1); 864 st.Colors[ImGuiCol_ButtonHovered] = ImVec4(.80f, .45f, .00f, 1.0f);
724 s.Colors[ImGuiCol_ButtonActive] = ImVec4(.60f,.30f,.00f,1); 865 st.Colors[ImGuiCol_ButtonActive] = ImVec4(.60f, .30f, .00f, 1.0f);
725 s.Colors[ImGuiCol_Header] = ImVec4(.80f,.45f,.00f,.40f); 866 st.Colors[ImGuiCol_Header] = ImVec4(.80f, .45f, .00f, .40f);
726 s.Colors[ImGuiCol_HeaderHovered] = ImVec4(.80f,.45f,.20f,.80f); 867 st.Colors[ImGuiCol_HeaderHovered] = ImVec4(.80f, .45f, .20f, .80f);
727 s.Colors[ImGuiCol_Tab] = ImVec4(.20f,.20f,.20f,1); 868 st.Colors[ImGuiCol_Tab] = ImVec4(.20f, .20f, .20f, 1.0f);
728 s.Colors[ImGuiCol_TabHovered] = ImVec4(.80f,.45f,.00f,1); 869 st.Colors[ImGuiCol_TabHovered] = ImVec4(.80f, .45f, .00f, 1.0f);
729 s.Colors[ImGuiCol_TabActive] = ImVec4(.80f,.45f,.00f,1); 870 st.Colors[ImGuiCol_TabActive] = ImVec4(.80f, .45f, .00f, 1.0f);
730 s.Colors[ImGuiCol_SeparatorHovered]=ImVec4(.80f,.45f,.00f,1); 871 st.Colors[ImGuiCol_SeparatorHovered]= ImVec4(.80f, .45f, .00f, 1.0f);
731 s.Colors[ImGuiCol_FrameBg] = ImVec4(.14f,.14f,.14f,1); 872 st.Colors[ImGuiCol_FrameBg] = ImVec4(.14f, .14f, .14f, 1.0f);
732 s.Colors[ImGuiCol_FrameBgHovered] = ImVec4(.20f,.20f,.20f,1); 873 st.Colors[ImGuiCol_FrameBgHovered] = ImVec4(.20f, .20f, .20f, 1.0f);
733 s.Colors[ImGuiCol_TableHeaderBg] = ImVec4(.18f,.18f,.18f,1); 874 st.Colors[ImGuiCol_TableHeaderBg] = ImVec4(.18f, .18f, .18f, 1.0f);
734 s.Colors[ImGuiCol_TableRowBg] = ImVec4(.11f,.11f,.11f,1); 875 st.Colors[ImGuiCol_TableRowBg] = ImVec4(.11f, .11f, .11f, 1.0f);
735 s.Colors[ImGuiCol_TableRowBgAlt] = ImVec4(.14f,.14f,.14f,1); 876 st.Colors[ImGuiCol_TableRowBgAlt] = ImVec4(.14f, .14f, .14f, 1.0f);
736 877
737 ImGui_ImplGlfw_InitForOpenGL(window, true); 878 ImGui_ImplGlfw_InitForOpenGL(window, true);
738 ImGui_ImplOpenGL3_Init("#version 330"); 879 ImGui_ImplOpenGL3_Init("#version 330");
@@ -744,22 +885,28 @@ int RunGUI(int argc, char* argv[])
744 while (!glfwWindowShouldClose(window) && !fShutdown) 885 while (!glfwWindowShouldClose(window) && !fShutdown)
745 { 886 {
746 glfwPollEvents(); 887 glfwPollEvents();
747 if (g_needRefresh || (frame % 120 == 0)) { RefreshWallet(); g_needRefresh = false; } 888 if (g_needRefresh || (frame % 120 == 0)) {
889 RefreshWallet();
890 g_needRefresh = false;
891 }
748 frame++; 892 frame++;
749 893
750 ImGui_ImplOpenGL3_NewFrame(); 894 ImGui_ImplOpenGL3_NewFrame();
751 ImGui_ImplGlfw_NewFrame(); 895 ImGui_ImplGlfw_NewFrame();
752 ImGui::NewFrame(); 896 ImGui::NewFrame();
753 897
898 // Draw order matters: status bar last so it is always on top.
754 DrawMainWindow(); 899 DrawMainWindow();
755 DrawSendDialog(); 900 DrawSendDialog();
756 DrawOptionsDialog(); 901 DrawOptionsDialog();
757 DrawAboutDialog(); 902 DrawAboutDialog();
903 DrawStatusBar();
758 904
759 ImGui::Render(); 905 ImGui::Render();
760 int w, h; glfwGetFramebufferSize(window, &w, &h); 906 int w, h;
907 glfwGetFramebufferSize(window, &w, &h);
761 glViewport(0, 0, w, h); 908 glViewport(0, 0, w, h);
762 glClearColor(.08f,.08f,.08f,1); 909 glClearColor(.08f, .08f, .08f, 1.0f);
763 glClear(GL_COLOR_BUFFER_BIT); 910 glClear(GL_COLOR_BUFFER_BIT);
764 ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); 911 ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
765 glfwSwapBuffers(window); 912 glfwSwapBuffers(window);
diff --git a/src/headers.h b/src/headers.h
index bb252c7..367e9b0 100644
--- a/src/headers.h
+++ b/src/headers.h
@@ -1,4 +1,4 @@
1// Bitflash — main include file. 1// Bitflash -- main include file.
2// Includes core node headers. GUI is handled separately in gui.cpp. 2// Includes core node headers. GUI is handled separately in gui.cpp.
3#pragma once 3#pragma once
4#include "headers_core.h" 4#include "headers_core.h"
diff --git a/src/headers_core.h b/src/headers_core.h
index 089b67f..6c0c602 100644
--- a/src/headers_core.h
+++ b/src/headers_core.h
@@ -1,4 +1,4 @@
1// Core node headers — no GUI framework dependency. 1// Core node headers -- no GUI framework dependency.
2// Included by gui.cpp and all non-GUI source files. 2// Included by gui.cpp and all non-GUI source files.
3 3
4#ifdef _MSC_VER 4#ifdef _MSC_VER
@@ -63,12 +63,11 @@ inline typename std::common_type<T1,T2>::type max(const T1& a, const T2& b)
63#include "script.h" 63#include "script.h"
64#include "db.h" 64#include "db.h"
65#include "net.h" 65#include "net.h"
66#include "irc.h"
67#include "nostr.h" 66#include "nostr.h"
68#include "randomx_pow.h" 67#include "randomx_pow.h"
69#include "main.h" 68#include "main.h"
70#include "market.h" 69#include "market.h"
71 70
72// GUI callback — implemented in gui.cpp (or as no-op in headless builds) 71// GUI callback -- implemented in gui.cpp (or as no-op in headless builds)
73void MainFrameRepaint(); 72void MainFrameRepaint();
74string DateTimeStr(int64 nTime); 73string DateTimeStr(int64 nTime);
diff --git a/src/irc.cpp b/src/irc.cpp
deleted file mode 100644
index ff82c66..0000000
--- a/src/irc.cpp
+++ /dev/null
@@ -1,271 +0,0 @@
1// Copyright (c) 2009 Satoshi Nakamoto
2// Distributed under the MIT/X11 software license, see the accompanying
3// file license.txt or http://www.opensource.org/licenses/mit-license.php.
4
5#include "headers.h"
6
7
8
9
10#pragma pack(1)
11struct ircaddr
12{
13 int ip;
14 short port;
15};
16
17string EncodeAddress(const CAddress& addr)
18{
19 struct ircaddr tmp;
20 tmp.ip = addr.ip;
21 tmp.port = addr.port;
22
23 vector<unsigned char> vch(UBEGIN(tmp), UEND(tmp));
24 return string("u") + EncodeBase58Check(vch);
25}
26
27bool DecodeAddress(string str, CAddress& addr)
28{
29 vector<unsigned char> vch;
30 if (!DecodeBase58Check(str.substr(1), vch))
31 return false;
32
33 struct ircaddr tmp;
34 if (vch.size() != sizeof(tmp))
35 return false;
36 memcpy(&tmp, &vch[0], sizeof(tmp));
37
38 addr = CAddress(tmp.ip, tmp.port);
39 return true;
40}
41
42
43
44
45
46
47static bool Send(SOCKET hSocket, const char* pszSend)
48{
49 if (strstr(pszSend, "PONG") != pszSend)
50 printf("SENDING: %s\n", pszSend);
51 const char* psz = pszSend;
52 const char* pszEnd = psz + strlen(psz);
53 while (psz < pszEnd)
54 {
55 int ret = send(hSocket, psz, pszEnd - psz, 0);
56 if (ret < 0)
57 return false;
58 psz += ret;
59 }
60 return true;
61}
62
63bool RecvLine(SOCKET hSocket, string& strLine)
64{
65 strLine = "";
66 loop
67 {
68 char c;
69 int nBytes = recv(hSocket, &c, 1, 0);
70 if (nBytes > 0)
71 {
72 if (c == '\n')
73 continue;
74 if (c == '\r')
75 return true;
76 strLine += c;
77 }
78 else if (nBytes <= 0)
79 {
80 if (!strLine.empty())
81 return true;
82 // socket closed
83 printf("IRC socket closed\n");
84 return false;
85 }
86 else
87 {
88 // socket error
89 int nErr = WSAGetLastError();
90 if (nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS)
91 {
92 printf("IRC recv failed: %d\n", nErr);
93 return false;
94 }
95 }
96 }
97}
98
99bool RecvLineIRC(SOCKET hSocket, string& strLine)
100{
101 loop
102 {
103 bool fRet = RecvLine(hSocket, strLine);
104 if (fRet)
105 {
106 if (fShutdown)
107 return false;
108 vector<string> vWords;
109 ParseString(strLine, ' ', vWords);
110 if (vWords[0] == "PING")
111 {
112 strLine[1] = 'O';
113 strLine += '\r';
114 Send(hSocket, strLine.c_str());
115 continue;
116 }
117 }
118 return fRet;
119 }
120}
121
122bool RecvUntil(SOCKET hSocket, const char* psz1, const char* psz2=NULL, const char* psz3=NULL)
123{
124 loop
125 {
126 string strLine;
127 if (!RecvLineIRC(hSocket, strLine))
128 return false;
129 printf("IRC %s\n", strLine.c_str());
130 if (psz1 && strLine.find(psz1) != -1)
131 return true;
132 if (psz2 && strLine.find(psz2) != -1)
133 return true;
134 if (psz3 && strLine.find(psz3) != -1)
135 return true;
136 }
137}
138
139
140
141
142bool fRestartIRCSeed = false;
143
144void ThreadIRCSeed(void* parg)
145{
146 // IRC peer discovery disabled: the 2009 IRC network no longer exists (and
147 // what answers today crashes the parser). Replaced by Nostr relay
148 // discovery.
149 printf("ThreadIRCSeed: IRC peer discovery disabled (using Nostr)\n");
150 return;
151
152 loop
153 {
154 struct hostent* phostent = gethostbyname("chat.freenode.net");
155 CAddress addrConnect(*(u_long*)phostent->h_addr_list[0], htons(6667));
156
157 SOCKET hSocket;
158 if (!ConnectSocket(addrConnect, hSocket))
159 {
160 printf("IRC connect failed\n");
161 return;
162 }
163
164 if (!RecvUntil(hSocket, "Found your hostname", "using your IP address instead", "Couldn't look up your hostname"))
165 {
166 closesocket(hSocket);
167 return;
168 }
169
170 string strMyName = EncodeAddress(addrLocalHost);
171
172 if (!addrLocalHost.IsRoutable())
173 strMyName = strprintf("x%u", GetRand(1000000000));
174
175 Send(hSocket, strprintf("NICK %s\r", strMyName.c_str()).c_str());
176 Send(hSocket, strprintf("USER %s 8 * : %s\r", strMyName.c_str(), strMyName.c_str()).c_str());
177
178 if (!RecvUntil(hSocket, " 004 "))
179 {
180 closesocket(hSocket);
181 return;
182 }
183 Sleep(500);
184
185 Send(hSocket, "JOIN #bitcoin\r");
186 Send(hSocket, "WHO #bitcoin\r");
187
188 while (!fRestartIRCSeed)
189 {
190 string strLine;
191 if (fShutdown || !RecvLineIRC(hSocket, strLine))
192 {
193 closesocket(hSocket);
194 return;
195 }
196 if (strLine.empty() || strLine[0] != ':')
197 continue;
198 printf("IRC %s\n", strLine.c_str());
199
200 vector<string> vWords;
201 ParseString(strLine, ' ', vWords);
202 if (vWords.size() < 2)
203 continue;
204
205 char pszName[10000];
206 pszName[0] = '\0';
207
208 if (vWords[1] == "352" && vWords.size() >= 8)
209 {
210 // index 7 is limited to 16 characters
211 // could get full length name at index 10, but would be different from join messages
212 strcpy(pszName, vWords[7].c_str());
213 printf("GOT WHO: [%s] ", pszName);
214 }
215
216 if (vWords[1] == "JOIN")
217 {
218 // :username!username@50000007.F000000B.90000002.IP JOIN :#channelname
219 strcpy(pszName, vWords[0].c_str() + 1);
220 if (strchr(pszName, '!'))
221 *strchr(pszName, '!') = '\0';
222 printf("GOT JOIN: [%s] ", pszName);
223 }
224
225 if (pszName[0] == 'u')
226 {
227 CAddress addr;
228 if (DecodeAddress(pszName, addr))
229 {
230 CAddrDB addrdb;
231 if (AddAddress(addrdb, addr))
232 printf("new ");
233 addr.print();
234 }
235 else
236 {
237 printf("decode failed\n");
238 }
239 }
240 }
241
242 fRestartIRCSeed = false;
243 closesocket(hSocket);
244 }
245}
246
247
248
249
250
251
252
253
254
255
256#ifdef TEST
257int main(int argc, char *argv[])
258{
259 WSADATA wsadata;
260 if (WSAStartup(MAKEWORD(2,2), &wsadata) != NO_ERROR)
261 {
262 printf("Error at WSAStartup()\n");
263 return false;
264 }
265
266 ThreadIRCSeed(NULL);
267
268 WSACleanup();
269 return 0;
270}
271#endif
diff --git a/src/irc.h b/src/irc.h
deleted file mode 100644
index 1ae4ffc..0000000
--- a/src/irc.h
+++ /dev/null
@@ -1,7 +0,0 @@
1// Copyright (c) 2009 Satoshi Nakamoto
2// Distributed under the MIT/X11 software license, see the accompanying
3// file license.txt or http://www.opensource.org/licenses/mit-license.php.
4
5extern bool RecvLine(SOCKET hSocket, string& strLine);
6extern void ThreadIRCSeed(void* parg);
7extern bool fRestartIRCSeed;
diff --git a/src/main.cpp b/src/main.cpp
index f3de4d3..aff7bab 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -13,6 +13,7 @@
13#include "sha.h" 13#include "sha.h"
14#include <atomic> 14#include <atomic>
15#include <mutex> 15#include <mutex>
16#include <thread>
16#include "btfaddr.h" 17#include "btfaddr.h"
17#include "btftunnel.h" 18#include "btftunnel.h"
18#ifndef _WIN32 19#ifndef _WIN32
@@ -73,7 +74,7 @@ bool fSoloMineTest = false; // /solomine: mine without requiring a peer (local t
73int fGenerateBitcoins; 74int fGenerateBitcoins;
74int64 nTransactionFee = 0; 75int64 nTransactionFee = 0;
75CAddress addrIncoming; 76CAddress addrIncoming;
76int nMineMode = MINE_SOLO; 77int nMineMode = MINE_RELAY;
77string strParticipantPool; // participant mode: pool .btf address 78string strParticipantPool; // participant mode: pool .btf address
78string strPoolName = "Bitflash Pool"; 79string strPoolName = "Bitflash Pool";
79string strPoolDashboardUrl; 80string strPoolDashboardUrl;
@@ -88,11 +89,10 @@ static std::string gParticipantStatus;
88 89
89void SetParticipantMiningStatus(const std::string& status) 90void SetParticipantMiningStatus(const std::string& status)
90{ 91{
92 // Updates the GUI status string only. Logging is done at each call site
93 // with full context; duplicating it here just adds noise to the log.
91 std::lock_guard<std::mutex> lk(gParticipantStatusMutex); 94 std::lock_guard<std::mutex> lk(gParticipantStatusMutex);
92 if (gParticipantStatus == status)
93 return;
94 gParticipantStatus = status; 95 gParticipantStatus = status;
95 printf("PoolParticipantMiner: status -> %s\n", status.c_str());
96} 96}
97 97
98std::string GetParticipantMiningStatus() 98std::string GetParticipantMiningStatus()
@@ -159,7 +159,7 @@ bool AddToWallet(const CWalletTx& wtxIn)
159 wtx.nTimeReceived = GetAdjustedTime(); 159 wtx.nTimeReceived = GetAdjustedTime();
160 160
161 //// debug print 161 //// debug print
162 printf("AddToWallet %s %s\n", wtxIn.GetHash().ToString().substr(0,6).c_str(), fInsertedNew ? "new" : "update"); 162 if (LogAcceptsCategory("net")) printf("AddToWallet %s %s\n", wtxIn.GetHash().ToString().substr(0,6).c_str(), fInsertedNew ? "new" : "update");
163 163
164 if (!fInsertedNew) 164 if (!fInsertedNew)
165 { 165 {
@@ -372,7 +372,7 @@ int CMerkleTx::SetMerkleBranch(const CBlock* pblock)
372 { 372 {
373 vMerkleBranch.clear(); 373 vMerkleBranch.clear();
374 nIndex = -1; 374 nIndex = -1;
375 printf("ERROR: SetMerkleBranch() : couldn't find tx in block\n"); 375 if (LogAcceptsCategory("net")) printf("ERROR: SetMerkleBranch() : couldn't find tx in block\n");
376 return 0; 376 return 0;
377 } 377 }
378 378
@@ -433,7 +433,7 @@ void CWalletTx::AddSupportingTransactions(CTxDB& txdb)
433 } 433 }
434 else 434 else
435 { 435 {
436 printf("ERROR: AddSupportingTransactions() : unsupported transaction\n"); 436 if (LogAcceptsCategory("net")) printf("ERROR: AddSupportingTransactions() : unsupported transaction\n");
437 continue; 437 continue;
438 } 438 }
439 439
@@ -519,7 +519,7 @@ bool CTransaction::AcceptTransaction(CTxDB& txdb, bool fCheckInputs, bool* pfMis
519 { 519 {
520 if (ptxOld) 520 if (ptxOld)
521 { 521 {
522 printf("mapTransaction.erase(%s) replacing with new version\n", ptxOld->GetHash().ToString().c_str()); 522 if (LogAcceptsCategory("net")) printf("mapTransaction.erase(%s) replacing with new version\n", ptxOld->GetHash().ToString().c_str());
523 mapTransactions.erase(ptxOld->GetHash()); 523 mapTransactions.erase(ptxOld->GetHash());
524 } 524 }
525 AddToMemoryPool(); 525 AddToMemoryPool();
@@ -530,7 +530,7 @@ bool CTransaction::AcceptTransaction(CTxDB& txdb, bool fCheckInputs, bool* pfMis
530 if (ptxOld) 530 if (ptxOld)
531 EraseFromWallet(ptxOld->GetHash()); 531 EraseFromWallet(ptxOld->GetHash());
532 532
533 printf("AcceptTransaction(): accepted %s\n", hash.ToString().substr(0,6).c_str()); 533 if (LogAcceptsCategory("net")) printf("AcceptTransaction(): accepted %s\n", hash.ToString().substr(0,6).c_str());
534 return true; 534 return true;
535} 535}
536 536
@@ -669,7 +669,7 @@ void CWalletTx::RelayWalletTransaction(CTxDB& txdb)
669 uint256 hash = GetHash(); 669 uint256 hash = GetHash();
670 if (!txdb.ContainsTx(hash)) 670 if (!txdb.ContainsTx(hash))
671 { 671 {
672 printf("Relaying wtx %s\n", hash.ToString().substr(0,6).c_str()); 672 if (LogAcceptsCategory("net")) printf("Relaying wtx %s\n", hash.ToString().substr(0,6).c_str());
673 RelayMessage(CInv(MSG_TX, hash), (CTransaction)*this); 673 RelayMessage(CInv(MSG_TX, hash), (CTransaction)*this);
674 } 674 }
675 } 675 }
@@ -683,7 +683,7 @@ void RelayWalletTransactions()
683 nLastTime = GetTime(); 683 nLastTime = GetTime();
684 684
685 // Rebroadcast any of our txes that aren't in a block yet 685 // Rebroadcast any of our txes that aren't in a block yet
686 printf("RelayWalletTransactions()\n"); 686 if (LogAcceptsCategory("net")) printf("RelayWalletTransactions()\n");
687 CTxDB txdb("r"); 687 CTxDB txdb("r");
688 CRITICAL_BLOCK(cs_mapWallet) 688 CRITICAL_BLOCK(cs_mapWallet)
689 { 689 {
@@ -764,7 +764,7 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast)
764 764
765 // Limit adjustment step 765 // Limit adjustment step
766 unsigned int nActualTimespan = pindexLast->nTime - pindexFirst->nTime; 766 unsigned int nActualTimespan = pindexLast->nTime - pindexFirst->nTime;
767 printf(" nActualTimespan = %d before bounds\n", nActualTimespan); 767 if (LogAcceptsCategory("net")) printf(" nActualTimespan = %d before bounds\n", nActualTimespan);
768 if (nActualTimespan < nTargetTimespan/4) 768 if (nActualTimespan < nTargetTimespan/4)
769 nActualTimespan = nTargetTimespan/4; 769 nActualTimespan = nTargetTimespan/4;
770 if (nActualTimespan > nTargetTimespan*4) 770 if (nActualTimespan > nTargetTimespan*4)
@@ -780,10 +780,7 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast)
780 bnNew = bnProofOfWorkLimit; 780 bnNew = bnProofOfWorkLimit;
781 781
782 /// debug print 782 /// debug print
783 printf("\n\n\nGetNextWorkRequired RETARGET *****\n"); 783 if (LogAcceptsCategory("net")) { printf("\n\n\nGetNextWorkRequired RETARGET *****\n"); printf("nTargetTimespan = %d nActualTimespan = %d\n", nTargetTimespan, nActualTimespan); printf("Before: %08x %s\n", pindexLast->nBits, CBigNum().SetCompact(pindexLast->nBits).getuint256().ToString().c_str()); printf("After: %08x %s\n", bnNew.GetCompact(), bnNew.getuint256().ToString().c_str()); }
784 printf("nTargetTimespan = %d nActualTimespan = %d\n", nTargetTimespan, nActualTimespan);
785 printf("Before: %08x %s\n", pindexLast->nBits, CBigNum().SetCompact(pindexLast->nBits).getuint256().ToString().c_str());
786 printf("After: %08x %s\n", bnNew.GetCompact(), bnNew.getuint256().ToString().c_str());
787 784
788 return bnNew.GetCompact(); 785 return bnNew.GetCompact();
789} 786}
@@ -1037,7 +1034,7 @@ bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex)
1037 1034
1038bool Reorganize(CTxDB& txdb, CBlockIndex* pindexNew) 1035bool Reorganize(CTxDB& txdb, CBlockIndex* pindexNew)
1039{ 1036{
1040 printf("*** REORGANIZE ***\n"); 1037 LogPrint("net", "*** REORGANIZE ***\n");
1041 1038
1042 // Find the fork 1039 // Find the fork
1043 CBlockIndex* pfork = pindexBest; 1040 CBlockIndex* pfork = pindexBest;
@@ -1712,7 +1709,7 @@ bool ProcessMessages(CNode* pfrom)
1712 CDataStream& vRecv = pfrom->vRecv; 1709 CDataStream& vRecv = pfrom->vRecv;
1713 if (vRecv.empty()) 1710 if (vRecv.empty())
1714 return true; 1711 return true;
1715 printf("ProcessMessages(%d bytes)\n", vRecv.size()); 1712 LogPrint("net", "ProcessMessages(%d bytes)\n", vRecv.size());
1716 1713
1717 // 1714 //
1718 // Message format 1715 // Message format
@@ -1730,13 +1727,13 @@ bool ProcessMessages(CNode* pfrom)
1730 { 1727 {
1731 if (vRecv.size() > sizeof(CMessageHeader)) 1728 if (vRecv.size() > sizeof(CMessageHeader))
1732 { 1729 {
1733 printf("\n\nPROCESSMESSAGE MESSAGESTART NOT FOUND\n\n"); 1730 if (LogAcceptsCategory("net")) printf("\n\nPROCESSMESSAGE MESSAGESTART NOT FOUND\n\n");
1734 vRecv.erase(vRecv.begin(), vRecv.end() - sizeof(CMessageHeader)); 1731 vRecv.erase(vRecv.begin(), vRecv.end() - sizeof(CMessageHeader));
1735 } 1732 }
1736 break; 1733 break;
1737 } 1734 }
1738 if (pstart - vRecv.begin() > 0) 1735 if (pstart - vRecv.begin() > 0)
1739 printf("\n\nPROCESSMESSAGE SKIPPED %d BYTES\n\n", pstart - vRecv.begin()); 1736 if (LogAcceptsCategory("net")) printf("\n\nPROCESSMESSAGE SKIPPED %d BYTES\n\n", pstart - vRecv.begin());
1740 vRecv.erase(vRecv.begin(), pstart); 1737 vRecv.erase(vRecv.begin(), pstart);
1741 1738
1742 // Read header 1739 // Read header
@@ -1744,7 +1741,7 @@ bool ProcessMessages(CNode* pfrom)
1744 vRecv >> hdr; 1741 vRecv >> hdr;
1745 if (!hdr.IsValid()) 1742 if (!hdr.IsValid())
1746 { 1743 {
1747 printf("\n\nPROCESSMESSAGE: ERRORS IN HEADER %s\n\n\n", hdr.GetCommand().c_str()); 1744 if (LogAcceptsCategory("net")) printf("\n\nPROCESSMESSAGE: ERRORS IN HEADER %s\n\n\n", hdr.GetCommand().c_str());
1748 continue; 1745 continue;
1749 } 1746 }
1750 string strCommand = hdr.GetCommand(); 1747 string strCommand = hdr.GetCommand();
@@ -1755,7 +1752,7 @@ bool ProcessMessages(CNode* pfrom)
1755 { 1752 {
1756 // Rewind and wait for rest of message 1753 // Rewind and wait for rest of message
1757 ///// need a mechanism to give up waiting for overlong message size error 1754 ///// need a mechanism to give up waiting for overlong message size error
1758 printf("MESSAGE-BREAK 2\n"); 1755 if (LogAcceptsCategory("net")) printf("MESSAGE-BREAK 2\n");
1759 vRecv.insert(vRecv.begin(), BEGIN(hdr), END(hdr)); 1756 vRecv.insert(vRecv.begin(), BEGIN(hdr), END(hdr));
1760 Sleep(100); 1757 Sleep(100);
1761 break; 1758 break;
@@ -1776,7 +1773,7 @@ bool ProcessMessages(CNode* pfrom)
1776 } 1773 }
1777 CATCH_PRINT_EXCEPTION("ProcessMessage()") 1774 CATCH_PRINT_EXCEPTION("ProcessMessage()")
1778 if (!fRet) 1775 if (!fRet)
1779 printf("ProcessMessage(%s, %d bytes) from %s to %s FAILED\n", strCommand.c_str(), nMessageSize, pfrom->addr.ToString().c_str(), addrLocalHost.ToString().c_str()); 1776 if (LogAcceptsCategory("net")) printf("ProcessMessage(%s, %d bytes) from %s to %s FAILED\n", strCommand.c_str(), nMessageSize, pfrom->addr.ToString().c_str(), addrLocalHost.ToString().c_str());
1780 } 1777 }
1781 1778
1782 vRecv.Compact(); 1779 vRecv.Compact();
@@ -1789,13 +1786,10 @@ bool ProcessMessages(CNode* pfrom)
1789bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) 1786bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
1790{ 1787{
1791 static map<unsigned int, vector<unsigned char> > mapReuseKey; 1788 static map<unsigned int, vector<unsigned char> > mapReuseKey;
1792 printf("received: %-12s (%d bytes) ", strCommand.c_str(), vRecv.size()); 1789 if (LogAcceptsCategory("net")) { printf("received: %-12s (%d bytes) ", strCommand.c_str(), vRecv.size()); for (int i = 0; i < min(vRecv.size(), (unsigned int)25); i++) printf("%02x ", vRecv[i] & 0xff); printf("\n"); }
1793 for (int i = 0; i < min(vRecv.size(), (unsigned int)25); i++)
1794 printf("%02x ", vRecv[i] & 0xff);
1795 printf("\n");
1796 if (nDropMessagesTest > 0 && GetRand(nDropMessagesTest) == 0) 1790 if (nDropMessagesTest > 0 && GetRand(nDropMessagesTest) == 0)
1797 { 1791 {
1798 printf("dropmessages DROPPING RECV MESSAGE\n"); 1792 if (LogAcceptsCategory("net")) printf("dropmessages DROPPING RECV MESSAGE\n");
1799 return true; 1793 return true;
1800 } 1794 }
1801 1795
@@ -1833,7 +1827,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
1833 pfrom->PushMessage("getblocks", CBlockLocator(pindexBest), uint256(0)); 1827 pfrom->PushMessage("getblocks", CBlockLocator(pindexBest), uint256(0));
1834 } 1828 }
1835 1829
1836 printf("version addrMe = %s\n", addrMe.ToString().c_str()); 1830 if (LogAcceptsCategory("net")) printf("version addrMe = %s\n", addrMe.ToString().c_str());
1837 } 1831 }
1838 1832
1839 1833
@@ -1844,30 +1838,6 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
1844 } 1838 }
1845 1839
1846 1840
1847 else if (strCommand == "addr")
1848 {
1849 vector<CAddress> vAddr;
1850 vRecv >> vAddr;
1851
1852 // Store the new addresses
1853 CAddrDB addrdb;
1854 foreach(const CAddress& addr, vAddr)
1855 {
1856 if (fShutdown)
1857 return true;
1858 if (AddAddress(addrdb, addr))
1859 {
1860 // Put on lists to send to other nodes
1861 pfrom->setAddrKnown.insert(addr);
1862 CRITICAL_BLOCK(cs_vNodes)
1863 foreach(CNode* pnode, vNodes)
1864 if (!pnode->setAddrKnown.count(addr))
1865 pnode->vAddrToSend.push_back(addr);
1866 }
1867 }
1868 }
1869
1870
1871 else if (strCommand == "inv") 1841 else if (strCommand == "inv")
1872 { 1842 {
1873 vector<CInv> vInv; 1843 vector<CInv> vInv;
@@ -1881,7 +1851,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
1881 pfrom->AddInventoryKnown(inv); 1851 pfrom->AddInventoryKnown(inv);
1882 1852
1883 bool fAlreadyHave = AlreadyHave(txdb, inv); 1853 bool fAlreadyHave = AlreadyHave(txdb, inv);
1884 printf(" got inventory: %s %s\n", inv.ToString().c_str(), fAlreadyHave ? "have" : "new"); 1854 if (LogAcceptsCategory("net")) printf(" got inventory: %s %s\n", inv.ToString().c_str(), fAlreadyHave ? "have" : "new");
1885 1855
1886 if (!fAlreadyHave) 1856 if (!fAlreadyHave)
1887 pfrom->AskFor(inv); 1857 pfrom->AskFor(inv);
@@ -1900,7 +1870,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
1900 { 1870 {
1901 if (fShutdown) 1871 if (fShutdown)
1902 return true; 1872 return true;
1903 printf("received getdata for: %s\n", inv.ToString().c_str()); 1873 if (LogAcceptsCategory("net")) printf("received getdata for: %s\n", inv.ToString().c_str());
1904 1874
1905 if (inv.type == MSG_BLOCK) 1875 if (inv.type == MSG_BLOCK)
1906 { 1876 {
@@ -1940,12 +1910,12 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
1940 // Send the rest of the chain 1910 // Send the rest of the chain
1941 if (pindex) 1911 if (pindex)
1942 pindex = pindex->pnext; 1912 pindex = pindex->pnext;
1943 printf("getblocks %d to %s\n", (pindex ? pindex->nHeight : -1), hashStop.ToString().substr(0,14).c_str()); 1913 if (LogAcceptsCategory("net")) printf("getblocks %d to %s\n", (pindex ? pindex->nHeight : -1), hashStop.ToString().substr(0,14).c_str());
1944 for (; pindex; pindex = pindex->pnext) 1914 for (; pindex; pindex = pindex->pnext)
1945 { 1915 {
1946 if (pindex->GetBlockHash() == hashStop) 1916 if (pindex->GetBlockHash() == hashStop)
1947 { 1917 {
1948 printf(" getblocks stopping at %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString().substr(0,14).c_str()); 1918 if (LogAcceptsCategory("net")) printf(" getblocks stopping at %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString().substr(0,14).c_str());
1949 break; 1919 break;
1950 } 1920 }
1951 1921
@@ -1997,7 +1967,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
1997 1967
1998 if (tx.AcceptTransaction(true)) 1968 if (tx.AcceptTransaction(true))
1999 { 1969 {
2000 printf(" accepted orphan tx %s\n", inv.hash.ToString().substr(0,6).c_str()); 1970 if (LogAcceptsCategory("net")) printf(" accepted orphan tx %s\n", inv.hash.ToString().substr(0,6).c_str());
2001 AddToWalletIfMine(tx, NULL); 1971 AddToWalletIfMine(tx, NULL);
2002 RelayMessage(inv, vMsg); 1972 RelayMessage(inv, vMsg);
2003 mapAlreadyAskedFor.erase(inv); 1973 mapAlreadyAskedFor.erase(inv);
@@ -2011,7 +1981,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
2011 } 1981 }
2012 else if (fMissingInputs) 1982 else if (fMissingInputs)
2013 { 1983 {
2014 printf("storing orphan tx %s\n", inv.hash.ToString().substr(0,6).c_str()); 1984 if (LogAcceptsCategory("net")) printf("storing orphan tx %s\n", inv.hash.ToString().substr(0,6).c_str());
2015 AddOrphanTx(vMsg); 1985 AddOrphanTx(vMsg);
2016 } 1986 }
2017 } 1987 }
@@ -2041,7 +2011,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
2041 vRecv >> *pblock; 2011 vRecv >> *pblock;
2042 2012
2043 //// debug print 2013 //// debug print
2044 printf("received block:\n"); pblock->print(); 2014 if (LogAcceptsCategory("net")) { printf("received block:\n"); pblock->print(); }
2045 2015
2046 CInv inv(MSG_BLOCK, pblock->GetHash()); 2016 CInv inv(MSG_BLOCK, pblock->GetHash());
2047 pfrom->AddInventoryKnown(inv); 2017 pfrom->AddInventoryKnown(inv);
@@ -2051,25 +2021,6 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
2051 } 2021 }
2052 2022
2053 2023
2054 else if (strCommand == "getaddr")
2055 {
2056 pfrom->vAddrToSend.clear();
2057 //// need to expand the time range if not enough found
2058 int64 nSince = GetAdjustedTime() - 60 * 60; // in the last hour
2059 CRITICAL_BLOCK(cs_mapAddresses)
2060 {
2061 foreach(const PAIRTYPE(vector<unsigned char>, CAddress)& item, mapAddresses)
2062 {
2063 if (fShutdown)
2064 return true;
2065 const CAddress& addr = item.second;
2066 if (addr.nTime > nSince)
2067 pfrom->vAddrToSend.push_back(addr);
2068 }
2069 }
2070 }
2071
2072
2073 else if (strCommand == "checkorder") 2024 else if (strCommand == "checkorder")
2074 { 2025 {
2075 uint256 hashReply; 2026 uint256 hashReply;
@@ -2134,12 +2085,12 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
2134 else 2085 else
2135 { 2086 {
2136 // Ignore unknown commands for extensibility 2087 // Ignore unknown commands for extensibility
2137 printf("ProcessMessage(%s) : Ignored unknown message\n", strCommand.c_str()); 2088 if (LogAcceptsCategory("net")) printf("ProcessMessage(%s) : Ignored unknown message\n", strCommand.c_str());
2138 } 2089 }
2139 2090
2140 2091
2141 if (!vRecv.empty()) 2092 if (!vRecv.empty())
2142 printf("ProcessMessage(%s) : %d extra bytes\n", strCommand.c_str(), vRecv.size()); 2093 if (LogAcceptsCategory("net")) printf("ProcessMessage(%s) : %d extra bytes\n", strCommand.c_str(), vRecv.size());
2143 2094
2144 return true; 2095 return true;
2145} 2096}
@@ -2163,19 +2114,6 @@ bool SendMessages(CNode* pto)
2163 2114
2164 2115
2165 // 2116 //
2166 // Message: addr
2167 //
2168 vector<CAddress> vAddrToSend;
2169 vAddrToSend.reserve(pto->vAddrToSend.size());
2170 foreach(const CAddress& addr, pto->vAddrToSend)
2171 if (!pto->setAddrKnown.count(addr))
2172 vAddrToSend.push_back(addr);
2173 pto->vAddrToSend.clear();
2174 if (!vAddrToSend.empty())
2175 pto->PushMessage("addr", vAddrToSend);
2176
2177
2178 //
2179 // Message: inventory 2117 // Message: inventory
2180 // 2118 //
2181 vector<CInv> vInventoryToSend; 2119 vector<CInv> vInventoryToSend;
@@ -2204,7 +2142,7 @@ bool SendMessages(CNode* pto)
2204 while (!pto->mapAskFor.empty() && (*pto->mapAskFor.begin()).first <= nNow) 2142 while (!pto->mapAskFor.empty() && (*pto->mapAskFor.begin()).first <= nNow)
2205 { 2143 {
2206 const CInv& inv = (*pto->mapAskFor.begin()).second; 2144 const CInv& inv = (*pto->mapAskFor.begin()).second;
2207 printf("sending getdata: %s\n", inv.ToString().c_str()); 2145 if (LogAcceptsCategory("net")) printf("sending getdata: %s\n", inv.ToString().c_str());
2208 if (!AlreadyHave(txdb, inv)) 2146 if (!AlreadyHave(txdb, inv))
2209 vAskFor.push_back(inv); 2147 vAskFor.push_back(inv);
2210 pto->mapAskFor.erase(pto->mapAskFor.begin()); 2148 pto->mapAskFor.erase(pto->mapAskFor.begin());
@@ -2280,13 +2218,21 @@ void BlockSHA256(const void* pin, unsigned int nBlocks, void* pout)
2280 2218
2281 2219
2282// --------------------------------------------------------------------------- 2220// ---------------------------------------------------------------------------
2283// Participant pool miner — connects to an external Stratum server, receives 2221// Participant pool miner -- connects to an external Stratum server, receives
2284// RandomX jobs, hashes with the local CPU, and submits shares. 2222// RandomX jobs, hashes with the local CPU, and submits shares.
2285// Called from BitcoinMiner() when nMineMode == MINE_PARTICIPANT. 2223// Called from BitcoinMiner() when nMineMode == MINE_PARTICIPANT.
2286// --------------------------------------------------------------------------- 2224// ---------------------------------------------------------------------------
2287 2225
2288using json = nlohmann::json; 2226using json = nlohmann::json;
2289 2227
2228
2229// ---------------------------------------------------------------------------
2230// Participant miner -- connects to a pool over a .btf tunnel, runs Stratum,
2231// hashes with RandomX, submits shares. Called from BitcoinMiner().
2232// ---------------------------------------------------------------------------
2233
2234using json = nlohmann::json;
2235
2290static std::string ToHexStr(const void* p, size_t n) 2236static std::string ToHexStr(const void* p, size_t n)
2291{ 2237{
2292 const unsigned char* b = (const unsigned char*)p; 2238 const unsigned char* b = (const unsigned char*)p;
@@ -2300,10 +2246,10 @@ static std::vector<unsigned char> FromHexStr(const std::string& s)
2300{ 2246{
2301 std::vector<unsigned char> v; 2247 std::vector<unsigned char> v;
2302 for (size_t i = 0; i+1 < s.size(); i += 2) { 2248 for (size_t i = 0; i+1 < s.size(); i += 2) {
2303 auto h=[](char c)->int{ 2249 auto h = [](char c)->int{
2304 if(c>='0'&&c<='9')return c-'0'; 2250 if(c>='0'&&c<='9') return c-'0';
2305 if(c>='a'&&c<='f')return c-'a'+10; 2251 if(c>='a'&&c<='f') return c-'a'+10;
2306 if(c>='A'&&c<='F')return c-'A'+10; 2252 if(c>='A'&&c<='F') return c-'A'+10;
2307 return 0; 2253 return 0;
2308 }; 2254 };
2309 v.push_back((unsigned char)((h(s[i])<<4)|h(s[i+1]))); 2255 v.push_back((unsigned char)((h(s[i])<<4)|h(s[i+1])));
@@ -2313,14 +2259,13 @@ static std::vector<unsigned char> FromHexStr(const std::string& s)
2313 2259
2314static void UpdateParticipantHashRate(uint64 hashesSinceSample, int64 sampleStart) 2260static void UpdateParticipantHashRate(uint64 hashesSinceSample, int64 sampleStart)
2315{ 2261{
2316 int64 now = GetTime(); 2262 int64 elapsed = GetTime() - sampleStart;
2317 int64 elapsed = now - sampleStart; 2263 if (elapsed <= 0) elapsed = 1;
2318 if (elapsed <= 0) 2264 gParticipantHashRateX1000.store(
2319 elapsed = 1; 2265 (uint64)((double)hashesSinceSample / (double)elapsed * 1000.0));
2320 double rate = (double)hashesSinceSample / (double)elapsed;
2321 gParticipantHashRateX1000.store((uint64)(rate * 1000.0));
2322} 2266}
2323 2267
2268// Blocking send of a JSON line to the pool.
2324static bool StratumSendLine(SOCKET s, const json& j) 2269static bool StratumSendLine(SOCKET s, const json& j)
2325{ 2270{
2326 std::string line = j.dump() + "\n"; 2271 std::string line = j.dump() + "\n";
@@ -2333,38 +2278,59 @@ static bool StratumSendLine(SOCKET s, const json& j)
2333 return true; 2278 return true;
2334} 2279}
2335 2280
2336static bool StratumRecvLine(SOCKET s, std::string& buf, std::string& line) 2281// Non-blocking recv into carry buffer. Returns true + fills line when a
2282// complete newline-terminated message is ready. Returns false in two cases:
2283// disconnected=true -- socket closed by peer; caller must stop
2284// disconnected=false -- no complete line yet; caller should select() and retry
2285static bool StratumRecvLine(SOCKET s, std::string& buf,
2286 std::string& line, bool& disconnected)
2337{ 2287{
2338 while (true) { 2288 disconnected = false;
2339 size_t pos = buf.find('\n'); 2289 char tmp[4096];
2340 if (pos != std::string::npos) { 2290#ifdef _WIN32
2341 line = buf.substr(0, pos); 2291 u_long avail = 0;
2342 if (!line.empty() && line.back()=='\r') line.pop_back(); 2292 ioctlsocket(s, FIONREAD, &avail);
2343 buf = buf.substr(pos+1); 2293 if (avail > 0) {
2344 return true; 2294 int r = recv(s, tmp, (int)std::min((u_long)(sizeof(tmp)-1), avail), 0);
2345 } 2295 if (r > 0) { tmp[r] = 0; buf += tmp; }
2346 char tmp[4096]; 2296 else if (r == 0) { disconnected = true; return false; }
2347 int r = recv(s, tmp, sizeof(tmp)-1, 0); 2297 }
2348 if (r <= 0) return false; 2298#else
2349 tmp[r] = 0; 2299 {
2350 buf += tmp; 2300 int r = recv(s, tmp, sizeof(tmp)-1, MSG_DONTWAIT);
2301 if (r > 0) { tmp[r] = 0; buf += tmp; }
2302 else if (r == 0) { disconnected = true; return false; }
2303 // r < 0: EAGAIN -- no data right now
2351 } 2304 }
2305#endif
2306 size_t pos = buf.find('\n');
2307 if (pos == std::string::npos) return false;
2308 line = buf.substr(0, pos);
2309 if (!line.empty() && line.back() == '\r') line.pop_back();
2310 buf = buf.substr(pos + 1);
2311 return true;
2352} 2312}
2353 2313
2314// How long to wait for a mining.notify after authorize before giving up
2315static const int64 STUCK_NO_JOB_TIMEOUT_SECS = 120;
2316
2354static bool PoolParticipantMiner() 2317static bool PoolParticipantMiner()
2355{ 2318{
2356 printf("PoolParticipantMiner: connecting to %s\n", strParticipantPool.c_str()); 2319 // ------------------------------------------------------------------
2357 SetParticipantMiningStatus("resolving pool address"); 2320 // Step 1: resolve .btf address -> meeting node
2358 2321 // ------------------------------------------------------------------
2359 if (strParticipantPool.empty()) { 2322 if (strParticipantPool.empty()) {
2360 printf("PoolParticipantMiner: no pool selected\n"); 2323 LogPrint("worker", "[worker] no pool selected\n");
2361 SetParticipantMiningStatus("no pool selected"); 2324 SetParticipantMiningStatus("no pool selected");
2362 return false; 2325 return false;
2363 } 2326 }
2364 2327
2328 LogPrint("worker", "[worker] connecting to pool %s\n", strParticipantPool.c_str());
2329 SetParticipantMiningStatus("resolving pool address");
2330
2365 unsigned char target_pubkey[32]; 2331 unsigned char target_pubkey[32];
2366 if (!btf::ParseAddress(strParticipantPool, target_pubkey)) { 2332 if (!btf::ParseAddress(strParticipantPool, target_pubkey)) {
2367 printf("PoolParticipantMiner: invalid .btf address %s\n", strParticipantPool.c_str()); 2333 LogPrint("worker", "[worker] invalid .btf address: %s\n", strParticipantPool.c_str());
2368 SetParticipantMiningStatus("invalid pool address"); 2334 SetParticipantMiningStatus("invalid pool address");
2369 return false; 2335 return false;
2370 } 2336 }
@@ -2372,35 +2338,48 @@ static bool PoolParticipantMiner()
2372 std::string meetingHostPort; 2338 std::string meetingHostPort;
2373 unsigned char service_enc_pub[32]; 2339 unsigned char service_enc_pub[32];
2374 if (!BtfResolve(strParticipantPool, meetingHostPort, service_enc_pub)) { 2340 if (!BtfResolve(strParticipantPool, meetingHostPort, service_enc_pub)) {
2375 printf("PoolParticipantMiner: failed to resolve %s\n", strParticipantPool.c_str()); 2341 LogPrint("worker", "[worker] failed to resolve pool %s"
2342 " (no Nostr descriptor found -- pool may be offline or relays down)\n",
2343 strParticipantPool.c_str());
2376 SetParticipantMiningStatus("failed to resolve pool"); 2344 SetParticipantMiningStatus("failed to resolve pool");
2377 return false; 2345 return false;
2378 } 2346 }
2347 LogPrint("worker", "[worker] pool resolved to meeting node %s\n", meetingHostPort.c_str());
2379 2348
2380 size_t colon = meetingHostPort.rfind(':'); 2349 size_t colon = meetingHostPort.rfind(':');
2381 if (colon == std::string::npos) { 2350 if (colon == std::string::npos) {
2382 printf("PoolParticipantMiner: bad meeting node %s\n", meetingHostPort.c_str()); 2351 LogPrint("worker", "[worker] bad meeting node format '%s'\n", meetingHostPort.c_str());
2383 SetParticipantMiningStatus("bad pool endpoint"); 2352 SetParticipantMiningStatus("bad pool endpoint");
2384 return false; 2353 return false;
2385 } 2354 }
2386 std::string host = meetingHostPort.substr(0, colon); 2355 std::string host = meetingHostPort.substr(0, colon);
2387 int port = atoi(meetingHostPort.substr(colon + 1).c_str()); 2356 int port = atoi(meetingHostPort.substr(colon + 1).c_str());
2388 if (port <= 0 || port > 65535) { 2357 if (port <= 0 || port > 65535) {
2389 printf("PoolParticipantMiner: bad meeting port %d\n", port); 2358 LogPrint("worker", "[worker] bad meeting port %d in '%s'\n",
2359 port, meetingHostPort.c_str());
2390 SetParticipantMiningStatus("bad pool port"); 2360 SetParticipantMiningStatus("bad pool port");
2391 return false; 2361 return false;
2392 } 2362 }
2393 2363
2394 btf_socket_t s = btf::BtfClientTunnel(host.c_str(), (unsigned short)port, target_pubkey, service_enc_pub); 2364 // ------------------------------------------------------------------
2365 // Step 2: open encrypted tunnel to pool
2366 // ------------------------------------------------------------------
2367 SetParticipantMiningStatus("opening tunnel");
2368 btf_socket_t s = btf::BtfClientTunnel(host.c_str(), (unsigned short)port,
2369 target_pubkey, service_enc_pub);
2395 if (s == INVALID_SOCKET) { 2370 if (s == INVALID_SOCKET) {
2396 printf("PoolParticipantMiner: tunnel connect failed via %s\n", meetingHostPort.c_str()); 2371 LogPrint("worker", "[worker] tunnel connect FAILED via %s"
2372 " (relay unreachable or pool not listening)\n",
2373 meetingHostPort.c_str());
2397 SetParticipantMiningStatus("tunnel connect failed"); 2374 SetParticipantMiningStatus("tunnel connect failed");
2398 return false; 2375 return false;
2399 } 2376 }
2400 printf("PoolParticipantMiner: connected via %s\n", meetingHostPort.c_str()); 2377 LogPrint("worker", "[worker] tunnel open via %s\n", meetingHostPort.c_str());
2401 SetParticipantMiningStatus("tunnel connected"); 2378 SetParticipantMiningStatus("tunnel open");
2402 2379
2403 // Use our wallet address as mining username so payouts go to our wallet 2380 // ------------------------------------------------------------------
2381 // Step 3: determine our payout address (mining username)
2382 // ------------------------------------------------------------------
2404 std::string username; 2383 std::string username;
2405 { 2384 {
2406 std::vector<unsigned char> vchPubKey; 2385 std::vector<unsigned char> vchPubKey;
@@ -2408,102 +2387,260 @@ static bool PoolParticipantMiner()
2408 username = PubKeyToAddress(vchPubKey); 2387 username = PubKeyToAddress(vchPubKey);
2409 } 2388 }
2410 if (username.empty()) username = BtfLocalAddress(); 2389 if (username.empty()) username = BtfLocalAddress();
2411 if (username.empty()) username = "unknown"; 2390 if (username.empty()) {
2412 2391 LogPrint("worker", "[worker] WARNING: could not determine wallet address"
2392 " -- shares will not pay out\n");
2393 username = "unknown";
2394 }
2395 LogPrint("worker", "[worker] payout address: %s\n", username.c_str());
2396
2397 // ------------------------------------------------------------------
2398 // Step 4: build the fast (~2 GB dataset) RandomX mode if not already
2399 // built, then start our VM. Without this, RandomXCreateMinerVM() falls
2400 // back to "light" mode (cache only) forever, which is dramatically
2401 // slower per hash than fast mode -- it recomputes dataset items on the
2402 // fly for every single hash instead of a direct memory lookup. That
2403 // alone can turn a "few seconds per share" pool into "many minutes per
2404 // share" regardless of how easy the share target is.
2405 //
2406 // This MUST happen before we send mining.subscribe/authorize, not
2407 // after: it's a synchronous, single-threaded-per-call build that can
2408 // take anywhere from several seconds to a couple of minutes depending
2409 // on core count. If it runs after the handshake messages are sent,
2410 // the pool's replies (subscribe ack, authorize ack, set_difficulty,
2411 // and the first job) all land in the OS socket buffer while we're
2412 // not reading -- nothing is lost, but we sit there looking (and
2413 // logging) like we're "stuck waiting for pool response" for the
2414 // entire build duration, when really we're just not listening yet.
2415 // Building the dataset first means that by the time we say
2416 // "subscribing", we're genuinely ready to read the reply the instant
2417 // it arrives.
2418 // ------------------------------------------------------------------
2419 if (!RandomXFastReady()) {
2420 SetParticipantMiningStatus("building RandomX dataset (~2GB, one-time)");
2421 unsigned int nThreads = std::thread::hardware_concurrency();
2422 RandomXInitDataset(nThreads > 0 ? (int)nThreads : 1);
2423 }
2424 void* rxvm = RandomXCreateMinerVM();
2425 if (!rxvm) {
2426 LogPrint("worker", "[worker] failed to create RandomX VM\n");
2427 SetParticipantMiningStatus("RandomX init failed");
2428 closesocket(s); return false;
2429 }
2430 LogPrint("worker", "[worker] RandomX VM ready (%s)\n",
2431 RandomXFastReady() ? "fast 2GB" : "light 256MB");
2432
2433 // ------------------------------------------------------------------
2434 // Step 5: Stratum subscribe + authorize. The socket is read from
2435 // immediately after this, in the main loop below, so nothing sits
2436 // unread behind a blocking dataset build anymore.
2437 // ------------------------------------------------------------------
2413 std::string buf; 2438 std::string buf;
2414 int msgId = 1; 2439 int msgId = 1;
2415 std::set<int> pendingSubmitIds; 2440 std::set<int> pendingSubmitIds;
2416 2441
2417 // Subscribe
2418 SetParticipantMiningStatus("subscribing"); 2442 SetParticipantMiningStatus("subscribing");
2419 if (!StratumSendLine(s, json{{"id",msgId++},{"method","mining.subscribe"},{"params",json::array()}})) 2443 LogPrint("worker", "[worker->pool] sending mining.subscribe\n");
2420 { SetParticipantMiningStatus("subscribe failed"); closesocket(s); return false; } 2444 if (!StratumSendLine(s, json{{"id",msgId++},{"method","mining.subscribe"},
2445 {"params",json::array()}})) {
2446 LogPrint("worker", "[worker] subscribe send FAILED -- pool dropped connection\n");
2447 SetParticipantMiningStatus("subscribe send failed");
2448 RandomXDestroyMinerVM(rxvm);
2449 closesocket(s); return false;
2450 }
2421 2451
2422 // Authorize
2423 SetParticipantMiningStatus("authorizing"); 2452 SetParticipantMiningStatus("authorizing");
2453 LogPrint("worker", "[worker->pool] sending mining.authorize as %s\n", username.c_str());
2424 if (!StratumSendLine(s, json{{"id",msgId++},{"method","mining.authorize"}, 2454 if (!StratumSendLine(s, json{{"id",msgId++},{"method","mining.authorize"},
2425 {"params",json::array({username,"x"})}})) 2455 {"params",json::array({username,"x"})}})) {
2426 { SetParticipantMiningStatus("authorize failed"); closesocket(s); return false; } 2456 LogPrint("worker", "[worker] authorize send FAILED -- pool dropped connection\n");
2457 SetParticipantMiningStatus("authorize send failed");
2458 RandomXDestroyMinerVM(rxvm);
2459 closesocket(s); return false;
2460 }
2427 2461
2428 // Job state 2462 // ------------------------------------------------------------------
2463 // Step 6: main loop -- receive messages, hash, submit shares
2464 // ------------------------------------------------------------------
2429 std::string jobId; 2465 std::string jobId;
2430 unsigned char header[80]; 2466 unsigned char header[80] = {};
2431 uint256 target; 2467 uint256 target;
2432 bool haveJob = false; 2468 double currentDifficulty = 1.0; // updated by mining.set_difficulty from pool
2469 bool haveJob = false;
2433 bool gotSubscribeAck = false; 2470 bool gotSubscribeAck = false;
2434 bool gotAuthorizeAck = false; 2471 bool gotAuthorizeAck = false;
2435 int64 authWaitStart = 0; 2472 int64 authWaitStart = 0;
2436 unsigned int nNonce = 1; 2473 int64 lastStuckLog = 0;
2437 uint64 hashesSinceSample = 0; 2474 unsigned int nNonce = 1;
2438 int64 sampleStart = GetTime(); 2475 uint64 hashesSinceSample = 0;
2476 uint64 sessionSharesSent = 0; // this connection only
2477 uint64 sessionSharesAccepted = 0;
2478 int64 sampleStart = GetTime();
2439 2479
2440 void* rxvm = RandomXCreateMinerVM(); 2480 SetParticipantMiningStatus("waiting for pool response");
2441 if (!rxvm) { SetParticipantMiningStatus("failed to start RandomX miner"); closesocket(s); return false; }
2442 printf("PoolParticipantMiner: RandomX VM ready (%s)\n",
2443 RandomXFastReady() ? "fast 2GB" : "light 256MB");
2444 SetParticipantMiningStatus("authorized; asking pool for work");
2445 2481
2446 while (fGenerateBitcoins && nMineMode == MINE_PARTICIPANT && !fShutdown) 2482 while (fGenerateBitcoins && nMineMode == MINE_PARTICIPANT && !fShutdown)
2447 { 2483 {
2448 // Non-blocking receive check 2484 // -- Receive: check buffer first, then select --
2449 { 2485 {
2450 fd_set fds; FD_ZERO(&fds); FD_SET(s, &fds); 2486 bool haveBuffered = buf.find('\n') != std::string::npos;
2451 struct timeval tv={0,50000}; // 50ms 2487 bool readable = false;
2452 if (select((int)s+1, &fds, NULL, NULL, &tv) > 0) { 2488 if (!haveBuffered) {
2489 fd_set fds; FD_ZERO(&fds); FD_SET(s, &fds);
2490 struct timeval tv = {0, 50000}; // 50ms
2491 readable = select((int)s+1, &fds, NULL, NULL, &tv) > 0;
2492 }
2493
2494 if (haveBuffered || readable) {
2453 std::string line; 2495 std::string line;
2454 if (!StratumRecvLine(s, buf, line)) break; 2496 bool disc = false;
2455 try { 2497 while (StratumRecvLine(s, buf, line, disc)) {
2456 json msg = json::parse(line); 2498 json msg;
2457 if (msg.contains("id") && msg["id"].is_number_integer() && msg.contains("result")) { 2499 try { msg = json::parse(line); } catch (...) {
2458 int id = msg["id"].get<int>(); 2500 LogPrint("worker", "[pool->worker] JSON parse error: %.80s\n",
2459 if (id == 1 && msg["result"].is_boolean() && msg["result"].get<bool>()) { 2501 line.c_str());
2460 gotSubscribeAck = true; 2502 continue;
2461 SetParticipantMiningStatus("subscribed; authorizing"); 2503 }
2462 } else if (id == 2 && msg["result"].is_boolean()) { 2504
2463 gotAuthorizeAck = msg["result"].get<bool>(); 2505 // -- Response to our subscribe (id=1) --
2464 authWaitStart = GetTime(); 2506 if (msg.contains("id") && msg["id"].is_number_integer()
2465 SetParticipantMiningStatus(gotAuthorizeAck ? "authorized; asking pool for work" : "authorization rejected"); 2507 && msg["id"].get<int>() == 1
2508 && msg.contains("result") && !msg["result"].is_null()) {
2509 gotSubscribeAck = true;
2510 LogPrint("worker", "[pool->worker] subscribe ack received\n");
2511 SetParticipantMiningStatus("subscribed; waiting for authorize ack");
2512 }
2513
2514 // -- Response to our authorize (id=2) --
2515 else if (msg.contains("id") && msg["id"].is_number_integer()
2516 && msg["id"].get<int>() == 2
2517 && msg.contains("result")) {
2518 bool ok = msg["result"].is_boolean() && msg["result"].get<bool>();
2519 authWaitStart = GetTime();
2520 if (ok) {
2521 gotAuthorizeAck = true;
2522 LogPrint("worker", "[pool->worker] authorize OK -- waiting for job\n");
2523 SetParticipantMiningStatus("authorized; waiting for job");
2524 } else {
2525 std::string reason = msg.value("error", json("unspecified")).is_string()
2526 ? msg["error"].get<std::string>() : "unspecified";
2527 LogPrint("worker", "[pool->worker] authorize REJECTED: %s\n",
2528 reason.c_str());
2529 SetParticipantMiningStatus("authorization rejected");
2530 // Don't break -- pool might still send a job (some pools
2531 // reject bad addresses but still send work)
2466 } 2532 }
2467 if (pendingSubmitIds.erase(id) > 0) { 2533 }
2468 if (msg["result"].is_boolean() && msg["result"].get<bool>()) { 2534
2535 // -- Share submission response --
2536 else if (msg.contains("id") && msg["id"].is_number_integer()) {
2537 int rid = msg["id"].get<int>();
2538 if (pendingSubmitIds.erase(rid) > 0) {
2539 bool accepted = msg.contains("result")
2540 && msg["result"].is_boolean()
2541 && msg["result"].get<bool>();
2542 if (accepted) {
2469 gParticipantSharesAccepted.fetch_add(1); 2543 gParticipantSharesAccepted.fetch_add(1);
2544 sessionSharesAccepted++;
2545 LogPrint("worker", "[pool->worker] share id=%d ACCEPTED\n", rid);
2470 SetParticipantMiningStatus("share accepted"); 2546 SetParticipantMiningStatus("share accepted");
2471 } else { 2547 } else {
2472 SetParticipantMiningStatus("share rejected"); 2548 std::string reason = (msg.contains("error")
2549 && msg["error"].is_string())
2550 ? msg["error"].get<std::string>() : "unspecified";
2551 LogPrint("worker", "[pool->worker] share id=%d REJECTED: %s\n",
2552 rid, reason.c_str());
2553 SetParticipantMiningStatus("share rejected: " + reason);
2473 } 2554 }
2474 } 2555 }
2475 } 2556 }
2476 std::string method = msg.value("method",""); 2557
2477 if (method == "mining.notify") { 2558 // -- Server notification --
2478 auto& p = msg["params"]; 2559 else {
2479 jobId = p[0].get<std::string>(); 2560 std::string method = msg.value("method", "");
2480 // p[1] = full 80-byte header hex 2561
2481 auto hdrBytes = FromHexStr(p[1].get<std::string>()); 2562 if (method == "mining.notify") {
2482 if (hdrBytes.size() >= 80) 2563 auto& p = msg["params"];
2483 memcpy(header, hdrBytes.data(), 80); 2564 if (!p.is_array() || p.size() < 4) {
2484 // p[3] = share target hex (little-endian uint256) 2565 LogPrint("worker", "[pool->worker] malformed mining.notify"
2485 auto tgtBytes = FromHexStr(p[3].get<std::string>()); 2566 " (params size=%zu)\n", p.is_array() ? p.size() : 0);
2486 if (tgtBytes.size() >= 32) 2567 } else {
2487 memcpy(&target, tgtBytes.data(), 32); 2568 std::string newJobId = p[0].get<std::string>();
2488 haveJob = true; 2569 auto hdrBytes = FromHexStr(p[1].get<std::string>());
2489 nNonce = 1; 2570 auto tgtBytes = FromHexStr(p[3].get<std::string>());
2490 SetParticipantMiningStatus("job received; hashing"); 2571
2491 printf("PoolParticipantMiner: new job %s\n", jobId.c_str()); 2572 if (hdrBytes.size() < 80) {
2492 } else if (method == "mining.set_difficulty") { 2573 LogPrint("worker", "[pool->worker] mining.notify:"
2493 // acknowledged, we use the target from notify 2574 " header too short (%zu bytes)\n",
2575 hdrBytes.size());
2576 } else if (tgtBytes.size() < 32) {
2577 LogPrint("worker", "[pool->worker] mining.notify:"
2578 " target too short (%zu bytes)\n",
2579 tgtBytes.size());
2580 } else {
2581 jobId = newJobId;
2582 memcpy(header, hdrBytes.data(), 80);
2583 memcpy(&target, tgtBytes.data(), 32);
2584 haveJob = true;
2585 nNonce = 1;
2586 LogPrint("worker", "[pool->worker] new job %s received\n",
2587 jobId.c_str());
2588 SetParticipantMiningStatus("hashing job " + jobId);
2589 }
2590 }
2591 } else if (method == "mining.set_difficulty") {
2592 // Pool adjusts our share difficulty via vardiff.
2593 // Apply it immediately so we start hashing at the new target.
2594 if (msg.contains("params") && msg["params"].is_array()
2595 && msg["params"].size() > 0
2596 && msg["params"][0].is_number()) {
2597 double newDiff = msg["params"][0].get<double>();
2598 if (newDiff > 0.0) {
2599 bool changed = (newDiff != currentDifficulty);
2600 currentDifficulty = newDiff;
2601 LogPrint("worker", "[pool->worker] set_difficulty %.6f%s\n",
2602 newDiff, changed ? " (updated)" : " (initial)");
2603 }
2604 } else {
2605 LogPrint("worker", "[pool->worker] set_difficulty"
2606 " received (no valid params)\n");
2607 }
2608 } else if (!method.empty()) {
2609 LogPrint("worker", "[pool->worker] unknown server method: %s\n",
2610 method.c_str());
2611 }
2494 } 2612 }
2495 } catch(...) {} 2613 }
2614
2615 if (disc) {
2616 LogPrint("worker", "[worker] pool closed the connection"
2617 " (gotSubscribeAck=%d gotAuthorizeAck=%d haveJob=%d)\n",
2618 gotSubscribeAck, gotAuthorizeAck, haveJob);
2619 break;
2620 }
2496 } 2621 }
2497 } 2622 }
2498 2623
2499 if (gotAuthorizeAck && !haveJob && authWaitStart > 0 && GetTime() - authWaitStart > 10) { 2624 // -- Stuck watchdog: authorized but no job arriving --
2500 SetParticipantMiningStatus("authorized; waiting for pool notify"); 2625 if (gotAuthorizeAck && !haveJob && authWaitStart > 0) {
2501 authWaitStart = 0; 2626 int64 waited = GetTime() - authWaitStart;
2627 if (waited > 10 && GetTime() - lastStuckLog >= 15) {
2628 LogPrint("worker", "[worker] authorized but no job after %llds"
2629 " -- pool tunnel is live, waiting on mining.notify\n",
2630 (long long)waited);
2631 lastStuckLog = GetTime();
2632 }
2633 if (waited > STUCK_NO_JOB_TIMEOUT_SECS) {
2634 LogPrint("worker", "[worker] no job received after %llds -- disconnecting"
2635 " and reconnecting\n", (long long)STUCK_NO_JOB_TIMEOUT_SECS);
2636 SetParticipantMiningStatus("timeout waiting for job; reconnecting");
2637 break;
2638 }
2502 } 2639 }
2503 2640
2504 if (!haveJob) { Sleep(100); continue; } 2641 if (!haveJob) { Sleep(100); continue; }
2505 2642
2506 // Hash one nonce 2643 // -- Hash one nonce --
2507 memcpy(header+76, &nNonce, 4); 2644 memcpy(header+76, &nNonce, 4);
2508 uint256 hash = RandomXHashWithVM(rxvm, header, 80); 2645 uint256 hash = RandomXHashWithVM(rxvm, header, 80);
2509 hashesSinceSample++; 2646 hashesSinceSample++;
@@ -2512,38 +2649,59 @@ static bool PoolParticipantMiner()
2512 UpdateParticipantHashRate(hashesSinceSample, sampleStart); 2649 UpdateParticipantHashRate(hashesSinceSample, sampleStart);
2513 2650
2514 if (hash <= target) { 2651 if (hash <= target) {
2515 printf("PoolParticipantMiner: share found! nonce=%u\n", nNonce); 2652 LogPrint("worker", "[worker] share found! nonce=%u job=%s difficulty=%.4f\n",
2653 nNonce, jobId.c_str(), currentDifficulty);
2516 SetParticipantMiningStatus("share found; submitting"); 2654 SetParticipantMiningStatus("share found; submitting");
2517 int submitId = msgId++; 2655 int submitId = msgId++;
2518 pendingSubmitIds.insert(submitId); 2656 pendingSubmitIds.insert(submitId);
2519 gParticipantSharesSent.fetch_add(1); 2657 gParticipantSharesSent.fetch_add(1);
2658 sessionSharesSent++;
2520 json submit = {{"id",submitId},{"method","mining.submit"}, 2659 json submit = {{"id",submitId},{"method","mining.submit"},
2521 {"params",json::array({username, jobId, 2660 {"params",json::array({username, jobId, ToHexStr(&nNonce,4)})}};
2522 ToHexStr(&nNonce,4)})}}; 2661 if (!StratumSendLine(s, submit)) {
2523 if (!StratumSendLine(s, submit)) break; 2662 LogPrint("worker", "[worker] share submit send FAILED"
2663 " -- pool connection lost\n");
2664 break;
2665 }
2524 } 2666 }
2525 2667
2526 nNonce++; 2668 nNonce++;
2527 if (nNonce == 0) { haveJob = false; } // exhausted, wait for new job 2669 if (nNonce == 0) {
2670 LogPrint("worker", "[worker] nonce space exhausted for job %s"
2671 " -- waiting for new job\n", jobId.c_str());
2672 haveJob = false;
2673 }
2528 } 2674 }
2529 2675
2676 // ------------------------------------------------------------------
2677 // Cleanup
2678 // ------------------------------------------------------------------
2530 RandomXDestroyMinerVM(rxvm); 2679 RandomXDestroyMinerVM(rxvm);
2531 closesocket(s); 2680 closesocket(s);
2532 UpdateParticipantHashRate(hashesSinceSample, sampleStart); 2681 UpdateParticipantHashRate(hashesSinceSample, sampleStart);
2533 SetParticipantMiningStatus("participant miner stopped"); 2682 SetParticipantMiningStatus("disconnected");
2534 printf("PoolParticipantMiner: disconnected\n"); 2683 LogPrint("worker", "[worker] disconnected from pool"
2684 " (hashes this session: %llu, shares sent: %llu, accepted: %llu)\n",
2685 (unsigned long long)hashesSinceSample,
2686 (unsigned long long)sessionSharesSent,
2687 (unsigned long long)sessionSharesAccepted);
2535 return true; 2688 return true;
2536} 2689}
2537 2690
2538bool BitcoinMiner() 2691bool BitcoinMiner()
2539{ 2692{
2693 // Relay mode: never mines, just relays/syncs. (Shouldn't normally get here
2694 // since the GUI hides Start Mining for Relay, but guard it regardless.)
2695 if (nMineMode == MINE_RELAY)
2696 return true;
2697
2540 // Participant mode: connect to external pool instead of mining solo/operator 2698 // Participant mode: connect to external pool instead of mining solo/operator
2541 if (nMineMode == MINE_PARTICIPANT) 2699 if (nMineMode == MINE_PARTICIPANT)
2542 { 2700 {
2543 while (fGenerateBitcoins && nMineMode == MINE_PARTICIPANT && !fShutdown) { 2701 while (fGenerateBitcoins && nMineMode == MINE_PARTICIPANT && !fShutdown) {
2544 PoolParticipantMiner(); 2702 PoolParticipantMiner();
2545 if (fGenerateBitcoins && nMineMode == MINE_PARTICIPANT && !fShutdown) { 2703 if (fGenerateBitcoins && nMineMode == MINE_PARTICIPANT && !fShutdown) {
2546 printf("PoolParticipantMiner: reconnecting in 10s\n"); 2704 LogPrint("worker", "PoolParticipantMiner: reconnecting in 10s\n");
2547 for (int i = 0; i < 10 && !fShutdown; i++) Sleep(1000); 2705 for (int i = 0; i < 10 && !fShutdown; i++) Sleep(1000);
2548 } 2706 }
2549 } 2707 }
@@ -2554,9 +2712,16 @@ bool BitcoinMiner()
2554 if (nMineMode == MINE_OPERATOR) 2712 if (nMineMode == MINE_OPERATOR)
2555 return true; 2713 return true;
2556 2714
2557 printf("BitcoinMiner started\n"); 2715 LogPrint("net", "BitcoinMiner started\n");
2558 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST); 2716 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST);
2559 2717
2718 // Build the fast (~2 GB dataset) RandomX mode once, up front, so we're
2719 // not stuck mining in the much slower light/cache-only mode forever.
2720 if (!RandomXFastReady()) {
2721 unsigned int nThreads = std::thread::hardware_concurrency();
2722 RandomXInitDataset(nThreads > 0 ? (int)nThreads : 1);
2723 }
2724
2560 CKey key; 2725 CKey key;
2561 key.MakeNewKey(); 2726 key.MakeNewKey();
2562 CBigNum bnExtraNonce = 0; 2727 CBigNum bnExtraNonce = 0;
@@ -2639,7 +2804,7 @@ bool BitcoinMiner()
2639 } 2804 }
2640 pblock->nBits = nBits; 2805 pblock->nBits = nBits;
2641 pblock->vtx[0].vout[0].nValue = pblock->GetBlockValue(nFees); 2806 pblock->vtx[0].vout[0].nValue = pblock->GetBlockValue(nFees);
2642 printf("\n\nRunning BitcoinMiner with %d transactions in block\n", pblock->vtx.size()); 2807 if (LogAcceptsCategory("net")) printf("\n\nRunning BitcoinMiner with %d transactions in block\n", pblock->vtx.size());
2643 2808
2644 2809
2645 // 2810 //
@@ -2658,11 +2823,11 @@ bool BitcoinMiner()
2658 void* rxvm = RandomXCreateMinerVM(); 2823 void* rxvm = RandomXCreateMinerVM();
2659 if (!rxvm) 2824 if (!rxvm)
2660 { 2825 {
2661 printf("BitcoinMiner: failed to create RandomX VM\n"); 2826 LogPrint("net", "BitcoinMiner: failed to create RandomX VM\n");
2662 Sleep(1000); 2827 Sleep(1000);
2663 continue; 2828 continue;
2664 } 2829 }
2665 printf("BitcoinMiner: mining with RandomX (%s)\n", 2830 LogPrint("net", "BitcoinMiner: mining with RandomX (%s)\n",
2666 RandomXFastReady() ? "fast 2GB" : "light 256MB"); 2831 RandomXFastReady() ? "fast 2GB" : "light 256MB");
2667 2832
2668 unsigned int nStart = GetTime(); 2833 unsigned int nStart = GetTime();
@@ -2675,9 +2840,9 @@ bool BitcoinMiner()
2675 if (hash <= hashTarget) 2840 if (hash <= hashTarget)
2676 { 2841 {
2677 //// debug print 2842 //// debug print
2678 printf("BitcoinMiner:\n"); 2843 if (LogAcceptsCategory("net")) printf("BitcoinMiner:\n");
2679 printf("RandomX proof-of-work found \n powhash: %s \ntarget: %s\n", hash.GetHex().c_str(), hashTarget.GetHex().c_str()); 2844 if (LogAcceptsCategory("net")) printf("RandomX proof-of-work found \n powhash: %s \ntarget: %s\n", hash.GetHex().c_str(), hashTarget.GetHex().c_str());
2680 pblock->print(); 2845 if (LogAcceptsCategory("net")) pblock->print();
2681 2846
2682 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL); 2847 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);
2683 CRITICAL_BLOCK(cs_main) 2848 CRITICAL_BLOCK(cs_main)
@@ -2692,7 +2857,7 @@ bool BitcoinMiner()
2692 2857
2693 // Process this block the same as if we had received it from another node 2858 // Process this block the same as if we had received it from another node
2694 if (!ProcessBlock(NULL, pblock.release())) 2859 if (!ProcessBlock(NULL, pblock.release()))
2695 printf("ERROR in BitcoinMiner, ProcessBlock, block not accepted\n"); 2860 LogPrint("net", "ERROR in BitcoinMiner, ProcessBlock, block not accepted\n");
2696 } 2861 }
2697 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST); 2862 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST);
2698 2863
@@ -2860,11 +3025,11 @@ bool SelectCoins(int64 nTargetValue, set<CWalletTx*>& setCoinsRet)
2860 setCoinsRet.insert(vValue[i].second); 3025 setCoinsRet.insert(vValue[i].second);
2861 3026
2862 //// debug print 3027 //// debug print
2863 printf("SelectCoins() best subset: "); 3028 if (LogAcceptsCategory("net")) printf("SelectCoins() best subset: ");
2864 for (int i = 0; i < vValue.size(); i++) 3029 for (int i = 0; i < vValue.size(); i++)
2865 if (vfBest[i]) 3030 if (vfBest[i])
2866 printf("%s ", FormatMoney(vValue[i].first).c_str()); 3031 if (LogAcceptsCategory("net")) printf("%s ", FormatMoney(vValue[i].first).c_str());
2867 printf("total %s\n", FormatMoney(nBest).c_str()); 3032 if (LogAcceptsCategory("net")) printf("total %s\n", FormatMoney(nBest).c_str());
2868 } 3033 }
2869 3034
2870 return true; 3035 return true;
@@ -2953,6 +3118,34 @@ bool CreateTransaction(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew, in
2953 return true; 3118 return true;
2954} 3119}
2955 3120
3121// Undo what CommitTransactionSpent did: unmark the inputs it marked spent
3122// and erase the half-committed wallet entry. Used when a transaction is
3123// accepted into the wallet but then rejected by the mempool/chain, so we
3124// don't end up with a wallet that thinks money is spent that never left.
3125void RollbackTransactionSpent(const CWalletTx& wtxNew)
3126{
3127 CRITICAL_BLOCK(cs_main)
3128 CRITICAL_BLOCK(cs_mapWallet)
3129 {
3130 set<CWalletTx*> setCoins;
3131 foreach(const CTxIn& txin, wtxNew.vin)
3132 {
3133 map<uint256, CWalletTx>::iterator mi = mapWallet.find(txin.prevout.hash);
3134 if (mi != mapWallet.end())
3135 setCoins.insert(&mi->second);
3136 }
3137 foreach(CWalletTx* pcoin, setCoins)
3138 {
3139 pcoin->fSpent = false;
3140 pcoin->WriteToDisk();
3141 vWalletUpdated.push_back(make_pair(pcoin->GetHash(), false));
3142 }
3143
3144 EraseFromWallet(wtxNew.GetHash());
3145 }
3146 MainFrameRepaint();
3147}
3148
2956// Call after CreateTransaction unless you want to abort 3149// Call after CreateTransaction unless you want to abort
2957bool CommitTransactionSpent(const CWalletTx& wtxNew) 3150bool CommitTransactionSpent(const CWalletTx& wtxNew)
2958{ 3151{
@@ -3003,13 +3196,17 @@ bool SendMoney(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew)
3003 return error("SendMoney() : Error finalizing transaction"); 3196 return error("SendMoney() : Error finalizing transaction");
3004 } 3197 }
3005 3198
3006 printf("SendMoney: %s\n", wtxNew.GetHash().ToString().substr(0,6).c_str()); 3199 if (LogAcceptsCategory("net")) printf("SendMoney: %s\n", wtxNew.GetHash().ToString().substr(0,6).c_str());
3007 3200
3008 // Broadcast 3201 // Broadcast
3009 if (!wtxNew.AcceptTransaction()) 3202 if (!wtxNew.AcceptTransaction())
3010 { 3203 {
3011 // This must not fail. The transaction has already been signed and recorded. 3204 // The transaction was already signed and committed to the wallet
3012 throw runtime_error("SendMoney() : wtxNew.AcceptTransaction() failed\n"); 3205 // above, but the chain/mempool just rejected it (e.g. a raced
3206 // input already spent by another transaction). Unwind the
3207 // wallet state we just wrote instead of crashing the app.
3208 RollbackTransactionSpent(wtxNew);
3209 return error("SendMoney() : wtxNew.AcceptTransaction() failed");
3013 } 3210 }
3014 wtxNew.RelayWalletTransaction(); 3211 wtxNew.RelayWalletTransaction();
3015 } 3212 }
diff --git a/src/main.h b/src/main.h
index 3d7d6dd..8bb8609 100644
--- a/src/main.h
+++ b/src/main.h
@@ -48,13 +48,17 @@ extern CBlockIndex* pindexBest;
48extern unsigned int nTransactionsUpdated; 48extern unsigned int nTransactionsUpdated;
49extern string strSetDataDir; 49extern string strSetDataDir;
50extern int nDropMessagesTest; 50extern int nDropMessagesTest;
51// Mining mode — persisted in wallet.dat 51// Mining mode -- persisted in wallet.dat
52// MINE_SOLO (0): mine to own wallet, no pool server 52// Mining mode -- decided fresh every launch (CLI flags, else default). Never
53// MINE_OPERATOR (1): run pool server, mine to own wallet, distribute to miners 53// restored from wallet.dat; see LoadWallet() in db.cpp.
54// MINE_PARTICIPANT (2): connect to external pool, submit shares, receive payouts 54// MINE_RELAY (0): default. Node runs/syncs, never mines, no pool server.
55#define MINE_SOLO 0 55// MINE_SOLO (1): mine to own wallet, no pool server
56#define MINE_OPERATOR 1 56// MINE_OPERATOR (2): run pool server, mine to own wallet, distribute to miners
57#define MINE_PARTICIPANT 2 57// MINE_PARTICIPANT (3): connect to external pool, submit shares, receive payouts
58#define MINE_RELAY 0
59#define MINE_SOLO 1
60#define MINE_OPERATOR 2
61#define MINE_PARTICIPANT 3
58extern int nMineMode; 62extern int nMineMode;
59extern string strParticipantPool; // participant: pool .btf address 63extern string strParticipantPool; // participant: pool .btf address
60extern string strPoolName; // operator: announced pool name 64extern string strPoolName; // operator: announced pool name
@@ -78,6 +82,7 @@ struct PoolWorkerStatView
78 uint64 totalShares; 82 uint64 totalShares;
79 uint64 roundShares; 83 uint64 roundShares;
80 int64 lastSeen; 84 int64 lastSeen;
85 double hashRate; // estimated H/s, derived from share difficulty + submit rate
81}; 86};
82 87
83// Settings 88// Settings
@@ -102,11 +107,11 @@ void RelayWalletTransactions();
102bool LoadBlockIndex(bool fAllowNew=true); 107bool LoadBlockIndex(bool fAllowNew=true);
103void PrintBlockTree(); 108void PrintBlockTree();
104bool BitcoinMiner(); 109bool BitcoinMiner();
105void ThreadRPCServer(void* parg); // rpc.cpp — .btf pool server 110void ThreadRPCServer(void* parg); // rpc.cpp -- .btf pool server
106void GetParticipantMiningStats(uint64& sharesSent, uint64& sharesAccepted, double& hashRate); 111void GetParticipantMiningStats(uint64& sharesSent, uint64& sharesAccepted, double& hashRate);
107void SetParticipantMiningStatus(const std::string& status); 112void SetParticipantMiningStatus(const std::string& status);
108std::string GetParticipantMiningStatus(); 113std::string GetParticipantMiningStatus();
109void GetPoolOperatorStats(int& authorizedMiners, int& blocksFound, uint64& roundShares); 114void GetPoolOperatorStats(int& authorizedMiners, int& blocksFound, uint64& roundShares, double& totalHashRate);
110void GetPoolWorkerStats(std::vector<PoolWorkerStatView>& out); 115void GetPoolWorkerStats(std::vector<PoolWorkerStatView>& out);
111void GetPendingPayouts(std::vector<PendingPayoutView>& out); 116void GetPendingPayouts(std::vector<PendingPayoutView>& out);
112bool ProcessMessages(CNode* pfrom); 117bool ProcessMessages(CNode* pfrom);
diff --git a/src/main_gui.cpp b/src/main_gui.cpp
index b7377da..842b0d5 100644
--- a/src/main_gui.cpp
+++ b/src/main_gui.cpp
@@ -1,4 +1,4 @@
1// Bitflash entry point — starts node threads then runs GUI (or headless). 1// Bitflash entry point -- starts node threads then runs GUI (or headless).
2 2
3#include "headers_core.h" 3#include "headers_core.h"
4#ifndef _WIN32 4#ifndef _WIN32
@@ -126,8 +126,6 @@ int main(int argc, char* argv[])
126 126
127 ParseStartupArguments(argc, argv); 127 ParseStartupArguments(argc, argv);
128 128
129 printf("Loading addresses...\n");
130 if (!LoadAddresses()) printf("Warning: error loading addr.dat\n");
131 printf("Loading block index...\n"); 129 printf("Loading block index...\n");
132 string strErrors; 130 string strErrors;
133 if (!LoadBlockIndex()) { fprintf(stderr,"LoadBlockIndex failed\n"); return 1; } 131 if (!LoadBlockIndex()) { fprintf(stderr,"LoadBlockIndex failed\n"); return 1; }
diff --git a/src/makefile.linux b/src/makefile.linux
deleted file mode 100644
index 9e63f7d..0000000
--- a/src/makefile.linux
+++ /dev/null
@@ -1,55 +0,0 @@
1# Bitflash Linux build — GUI wallet + pool server + daemon mode.
2# Requires: bash build-linux.sh (installs deps, builds secp256k1 + RandomX)
3# Result: src/bitflash
4#
5# ./bitflash — GUI wallet
6# ./bitflash /nogui /gen — headless daemon (same binary, no window)
7
8CXX ?= g++
9
10SECP_INC ?= /usr/local/include
11SECP_LIB ?= /usr/local/lib
12RANDOMX_DIR ?= $(HOME)/RandomX
13
14WX_CFLAGS := $(shell wx-config --cxxflags)
15WX_LIBS := $(shell wx-config --libs)
16
17CXXFLAGS = -std=gnu++14 -O2 -w -fpermissive -pthread \
18 -DSECP256K1_STATIC \
19 -I$(SECP_INC) -I$(RANDOMX_DIR)/src \
20 -I/usr/include/nlohmann \
21 $(WX_CFLAGS)
22
23LIBS = -L$(SECP_LIB) -lsecp256k1 \
24 -L$(RANDOMX_DIR)/build -lrandomx \
25 -lsodium -lssl -lcrypto -ldb_cxx -lpthread \
26 -lboost_system \
27 $(WX_LIBS)
28
29HEADERS = headers.h util.h main.h serialize.h uint256.h key.h bignum.h script.h \
30 db.h base58.h net.h irc.h nostr.h randomx_pow.h btfaddr.h btfchan.h \
31 btfrv.h btftunnel.h market.h compat.h uibase.h ui.h
32
33OBJS = obj/util.o obj/script.o obj/db.o obj/net.o obj/main.o obj/market.o \
34 obj/sha.o obj/irc.o obj/nostr.o obj/randomx_pow.o \
35 obj/btfaddr.o obj/btfchan.o obj/btfrv.o obj/btftunnel.o \
36 obj/rpc.o obj/uibase.o obj/ui.o
37
38all: bitflash
39
40obj/%.o: %.cpp $(HEADERS)
41 @mkdir -p obj
42 $(CXX) -c $(CXXFLAGS) -o $@ $<
43
44obj/sha.o: sha.cpp sha.h
45 @mkdir -p obj
46 $(CXX) -c $(CXXFLAGS) -O3 -o $@ $<
47
48bitflash: $(OBJS)
49 $(CXX) $(CXXFLAGS) -o $@ $(OBJS) $(LIBS)
50 @echo "Built: bitflash"
51 @echo " GUI: ./bitflash"
52 @echo " Daemon: ./bitflash /nogui /gen"
53
54clean:
55 rm -rf obj bitflash
diff --git a/src/makefile.mingw b/src/makefile.mingw
index d381653..7d35d92 100644
--- a/src/makefile.mingw
+++ b/src/makefile.mingw
@@ -28,13 +28,13 @@ IMGUI_OBJS = obj/imgui.o obj/imgui_draw.o obj/imgui_tables.o \
28 obj/imgui_widgets.o obj/imgui_impl_glfw.o obj/imgui_impl_opengl3.o 28 obj/imgui_widgets.o obj/imgui_impl_glfw.o obj/imgui_impl_opengl3.o
29 29
30NODE_OBJS = obj/util.o obj/script.o obj/db.o obj/net.o obj/main.o \ 30NODE_OBJS = obj/util.o obj/script.o obj/db.o obj/net.o obj/main.o \
31 obj/market.o obj/sha.o obj/irc.o obj/nostr.o obj/randomx_pow.o \ 31 obj/market.o obj/sha.o obj/nostr.o obj/randomx_pow.o \
32 obj/btfaddr.o obj/btfchan.o obj/btfrv.o obj/btftunnel.o obj/rpc.o 32 obj/btfaddr.o obj/btfchan.o obj/btfrv.o obj/btftunnel.o obj/rpc.o
33 33
34GUI_OBJS = obj/gui.o obj/main_gui.o obj/bitflash_res.o 34GUI_OBJS = obj/gui.o obj/main_gui.o obj/bitflash_res.o
35 35
36HEADERS = headers_core.h headers.h util.h main.h serialize.h uint256.h \ 36HEADERS = headers_core.h headers.h util.h main.h serialize.h uint256.h \
37 key.h bignum.h script.h db.h base58.h net.h irc.h nostr.h \ 37 key.h bignum.h script.h db.h base58.h net.h nostr.h \
38 randomx_pow.h btfaddr.h btfchan.h btfrv.h btftunnel.h market.h 38 randomx_pow.h btfaddr.h btfchan.h btfrv.h btftunnel.h market.h
39 39
40all: bitflash.exe 40all: bitflash.exe
diff --git a/src/makefile.vc b/src/makefile.vc
deleted file mode 100644
index 60dca78..0000000
--- a/src/makefile.vc
+++ /dev/null
@@ -1,77 +0,0 @@
1# Copyright (c) 2009 Satoshi Nakamoto
2# Distributed under the MIT/X11 software license, see the accompanying
3# file license.txt or http://www.opensource.org/licenses/mit-license.php.
4
5
6!IF "$(BUILD)" != "debug" && "$(BUILD)" != "release"
7BUILD=debug
8!ENDIF
9!IF "$(BUILD)" == "debug"
10D=d
11DEBUGFLAGS=/Zi /Od /D__WXDEBUG__
12!ENDIF
13
14
15
16INCLUDEPATHS=/I"/boost" /I"/DB/build_windows" /I"/OpenSSL/include" /I"/wxWidgets/lib/vc_lib/mswd" /I"/wxWidgets/include"
17LIBPATHS=/LIBPATH:"/DB/build_windows/$(BUILD)" /LIBPATH:"/OpenSSL/out" /LIBPATH:"/wxWidgets/lib/vc_lib"
18LIBS= \
19 libdb47s$(D).lib \
20 libeay32.lib \
21 wxmsw28$(D)_richtext.lib wxmsw28$(D)_html.lib wxmsw28$(D)_core.lib wxbase28$(D).lib wxtiff$(D).lib wxjpeg$(D).lib wxpng$(D).lib wxzlib$(D).lib wxregex$(D).lib wxexpat$(D).lib \
22 kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib ws2_32.lib
23WXDEFS=/DWIN32 /D__WXMSW__ /D_WINDOWS /DNOPCH
24CFLAGS=/c /nologo /Ob0 /MD$(D) /EHsc /GR /Zm300 /YX /Fpobj/headers.pch $(DEBUGFLAGS) $(WXDEFS) $(INCLUDEPATHS)
25HEADERS=headers.h util.h main.h serialize.h uint256.h key.h bignum.h script.h db.h base58.h
26
27
28
29all: bitcoin.exe
30
31
32obj\util.obj: util.cpp $(HEADERS)
33 cl $(CFLAGS) /Fo$@ %s
34
35obj\script.obj: script.cpp $(HEADERS)
36 cl $(CFLAGS) /Fo$@ %s
37
38obj\db.obj: db.cpp $(HEADERS) market.h
39 cl $(CFLAGS) /Fo$@ %s
40
41obj\net.obj: net.cpp $(HEADERS) net.h
42 cl $(CFLAGS) /Fo$@ %s
43
44obj\main.obj: main.cpp $(HEADERS) net.h market.h
45 cl $(CFLAGS) /Fo$@ %s
46
47obj\market.obj: market.cpp $(HEADERS) market.h
48 cl $(CFLAGS) /Fo$@ %s
49
50obj\ui.obj: ui.cpp $(HEADERS) net.h uibase.h ui.h market.h
51 cl $(CFLAGS) /Fo$@ %s
52
53obj\uibase.obj: uibase.cpp uibase.h
54 cl $(CFLAGS) /Fo$@ %s
55
56obj\sha.obj: sha.cpp sha.h
57 cl $(CFLAGS) /O2 /Fo$@ %s
58
59obj\irc.obj: irc.cpp $(HEADERS)
60 cl $(CFLAGS) /Fo$@ %s
61
62obj\ui.res: ui.rc rc/bitcoin.ico rc/check.ico rc/send16.bmp rc/send16mask.bmp rc/send16masknoshadow.bmp rc/send20.bmp rc/send20mask.bmp rc/addressbook16.bmp rc/addressbook16mask.bmp rc/addressbook20.bmp rc/addressbook20mask.bmp
63 rc $(INCLUDEPATHS) $(WXDEFS) /Fo$@ %s
64
65
66
67OBJS=obj\util.obj obj\script.obj obj\db.obj obj\net.obj obj\main.obj obj\market.obj \
68 obj\ui.obj obj\uibase.obj obj\sha.obj obj\irc.obj obj\ui.res
69
70bitcoin.exe: $(OBJS)
71 -kill /f bitcoin.exe & sleep 1
72 link /nologo /DEBUG /SUBSYSTEM:WINDOWS /OUT:$@ $(LIBPATHS) $** $(LIBS)
73
74clean:
75 -del /Q obj\*
76 -del *.ilk
77 -del *.pdb
diff --git a/src/net.cpp b/src/net.cpp
index bdfb9c3..ab07f94 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -12,7 +12,6 @@
12 12
13void ThreadMessageHandler2(void* parg); 13void ThreadMessageHandler2(void* parg);
14void ThreadSocketHandler2(void* parg); 14void ThreadSocketHandler2(void* parg);
15void ThreadOpenConnections2(void* parg);
16 15
17 16
18 17
@@ -32,8 +31,6 @@ bool fShutdown = false;
32array<bool, 10> vfThreadRunning; 31array<bool, 10> vfThreadRunning;
33vector<CNode*> vNodes; 32vector<CNode*> vNodes;
34CCriticalSection cs_vNodes; 33CCriticalSection cs_vNodes;
35map<vector<unsigned char>, CAddress> mapAddresses;
36CCriticalSection cs_mapAddresses;
37map<CInv, CDataStream> mapRelay; 34map<CInv, CDataStream> mapRelay;
38deque<pair<int64, CInv> > vRelayExpiration; 35deque<pair<int64, CInv> > vRelayExpiration;
39CCriticalSection cs_mapRelay; 36CCriticalSection cs_mapRelay;
@@ -41,61 +38,6 @@ map<CInv, int64> mapAlreadyAskedFor;
41string strBtfConnect; // .btf peer to keep connected to (from /connectbtf) 38string strBtfConnect; // .btf peer to keep connected to (from /connectbtf)
42 39
43 40
44
45CAddress addrProxy;
46
47bool ConnectSocket(const CAddress& addrConnect, SOCKET& hSocketRet)
48{
49 hSocketRet = INVALID_SOCKET;
50
51 SOCKET hSocket = socket(AF_INET, SOCK_STREAM, 0);
52 if (hSocket == INVALID_SOCKET)
53 return false;
54
55 bool fRoutable = !(addrConnect.GetByte(3) == 10 || (addrConnect.GetByte(3) == 192 && addrConnect.GetByte(2) == 168));
56 bool fProxy = (addrProxy.ip && fRoutable);
57 struct sockaddr_in sockaddr = (fProxy ? addrProxy.GetSockAddr() : addrConnect.GetSockAddr());
58
59 if (connect(hSocket, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) == SOCKET_ERROR)
60 {
61 closesocket(hSocket);
62 return false;
63 }
64
65 if (fProxy)
66 {
67 printf("Proxy connecting to %s\n", addrConnect.ToString().c_str());
68 char pszSocks4IP[] = "\4\1\0\0\0\0\0\0user";
69 memcpy(pszSocks4IP + 2, &addrConnect.port, 2);
70 memcpy(pszSocks4IP + 4, &addrConnect.ip, 4);
71 char* pszSocks4 = pszSocks4IP;
72 int nSize = sizeof(pszSocks4IP);
73
74 int ret = send(hSocket, pszSocks4, nSize, 0);
75 if (ret != nSize)
76 {
77 closesocket(hSocket);
78 return error("Error sending to proxy\n");
79 }
80 char pchRet[8];
81 if (recv(hSocket, pchRet, 8, 0) != 8)
82 {
83 closesocket(hSocket);
84 return error("Error reading proxy response\n");
85 }
86 if (pchRet[1] != 0x5a)
87 {
88 closesocket(hSocket);
89 return error("Proxy returned error %d\n", pchRet[1]);
90 }
91 printf("Proxy connection established %s\n", addrConnect.ToString().c_str());
92 }
93
94 hSocketRet = hSocket;
95 return true;
96}
97
98
99bool GetMyExternalIP(unsigned int& ipRet) 41bool GetMyExternalIP(unsigned int& ipRet)
100{ 42{
101 // Try several plain-text IP echo services in order. 43 // Try several plain-text IP echo services in order.
@@ -178,38 +120,6 @@ bool GetMyExternalIP(unsigned int& ipRet)
178 120
179 121
180 122
181bool AddAddress(CAddrDB& addrdb, const CAddress& addr)
182{
183 if (!addr.IsRoutable())
184 return false;
185 if (addr.ip == addrLocalHost.ip)
186 return false;
187 CRITICAL_BLOCK(cs_mapAddresses)
188 {
189 map<vector<unsigned char>, CAddress>::iterator it = mapAddresses.find(addr.GetKey());
190 if (it == mapAddresses.end())
191 {
192 // New address
193 mapAddresses.insert(make_pair(addr.GetKey(), addr));
194 addrdb.WriteAddress(addr);
195 return true;
196 }
197 else
198 {
199 CAddress& addrFound = (*it).second;
200 if ((addrFound.nServices | addr.nServices) != addrFound.nServices)
201 {
202 // Services have been added
203 addrFound.nServices |= addr.nServices;
204 addrdb.WriteAddress(addrFound);
205 return true;
206 }
207 }
208 }
209 return false;
210}
211
212
213 123
214 124
215 125
@@ -330,64 +240,6 @@ CNode* FindNode(unsigned int ip)
330 return NULL; 240 return NULL;
331} 241}
332 242
333CNode* FindNode(CAddress addr)
334{
335 CRITICAL_BLOCK(cs_vNodes)
336 {
337 foreach(CNode* pnode, vNodes)
338 if (pnode->addr == addr)
339 return (pnode);
340 }
341 return NULL;
342}
343
344CNode* ConnectNode(CAddress addrConnect, int64 nTimeout)
345{
346 if (addrConnect.ip == addrLocalHost.ip)
347 return NULL;
348
349 // Look for an existing connection
350 CNode* pnode = FindNode(addrConnect.ip);
351 if (pnode)
352 {
353 if (nTimeout != 0)
354 pnode->AddRef(nTimeout);
355 else
356 pnode->AddRef();
357 return pnode;
358 }
359
360 if (fDebug)
361 printf("trying %s\n", addrConnect.ToString().c_str());
362
363 // Connect
364 SOCKET hSocket;
365 if (ConnectSocket(addrConnect, hSocket))
366 {
367 if (fDebug)
368 printf("connected %s\n", addrConnect.ToString().c_str());
369
370 // Add node
371 CNode* pnode = new CNode(hSocket, addrConnect, false);
372 if (nTimeout != 0)
373 pnode->AddRef(nTimeout);
374 else
375 pnode->AddRef();
376 CRITICAL_BLOCK(cs_vNodes)
377 vNodes.push_back(pnode);
378
379 CRITICAL_BLOCK(cs_mapAddresses)
380 mapAddresses[addrConnect.GetKey()].nLastFailed = 0;
381 return pnode;
382 }
383 else
384 {
385 CRITICAL_BLOCK(cs_mapAddresses)
386 mapAddresses[addrConnect.GetKey()].nLastFailed = GetTime();
387 return NULL;
388 }
389}
390
391// Synthetic marker address for a tunneled `.btf` peer. The real endpoint is 243// Synthetic marker address for a tunneled `.btf` peer. The real endpoint is
392// unknown by design (the tunnel hides it), so tag the CNode with a non-routable 244// unknown by design (the tunnel hides it), so tag the CNode with a non-routable
393// 10.x.x.x address (fails IsRoutable, so it is never gossiped as a real peer) 245// 10.x.x.x address (fails IsRoutable, so it is never gossiped as a real peer)
@@ -401,20 +253,15 @@ static CAddress BtfMarkerAddr(const unsigned char b5[5])
401 return CAddress(ip, port, nLocalServices); 253 return CAddress(ip, port, nLocalServices);
402} 254}
403 255
404// Connect to a peer by its `.btf` address: resolve the self-certified 256// Shared tail: given a peer's pubkey and already-resolved rendezvous
405// descriptor over Nostr, then tunnel through its meeting node with the 257// coordinates, open the tunnel and register the CNode. Used by both
406// end-to-end channel. Neither side ever learns the other's IP. 258// ConnectNodeBtf (which resolves the descriptor itself) and
407CNode* ConnectNodeBtf(const string& strBtfAddr) 259// ConnectNodeBtfResolved (which takes an already-resolved descriptor, so it
260// makes no Nostr relay calls at all -- see nostr.cpp's BtfResolveMany for why
261// that matters when dialing many candidates in parallel).
262static CNode* ConnectNodeBtfTail(const string& strBtfAddr, const unsigned char pk[32],
263 const string& strMeeting, const unsigned char enc_pub[32])
408{ 264{
409 unsigned char pk[32];
410 if (!btf::ParseAddress(strBtfAddr, pk))
411 {
412 printf("ConnectNodeBtf: invalid address %s\n", strBtfAddr.c_str());
413 return NULL;
414 }
415 if (BtfLocalAddress() == strBtfAddr)
416 return NULL; // ourselves
417
418 CAddress addr = BtfMarkerAddr(pk); 265 CAddress addr = BtfMarkerAddr(pk);
419 CNode* pnode = FindNode(addr.ip); 266 CNode* pnode = FindNode(addr.ip);
420 if (pnode) 267 if (pnode)
@@ -423,17 +270,6 @@ CNode* ConnectNodeBtf(const string& strBtfAddr)
423 return pnode; 270 return pnode;
424 } 271 }
425 272
426 if (fDebug)
427 printf("trying %s\n", strBtfAddr.c_str());
428
429 string strMeeting;
430 unsigned char enc_pub[32];
431 if (!BtfResolve(strBtfAddr, strMeeting, enc_pub))
432 {
433 if (fDebug)
434 printf("ConnectNodeBtf: could not resolve a descriptor for %s\n", strBtfAddr.c_str());
435 return NULL;
436 }
437 size_t colon = strMeeting.rfind(':'); 273 size_t colon = strMeeting.rfind(':');
438 if (colon == string::npos) 274 if (colon == string::npos)
439 return NULL; 275 return NULL;
@@ -446,12 +282,12 @@ CNode* ConnectNodeBtf(const string& strBtfAddr)
446 if (hSocket == INVALID_SOCKET) 282 if (hSocket == INVALID_SOCKET)
447 { 283 {
448 if (fDebug) 284 if (fDebug)
449 printf("ConnectNodeBtf: tunnel to %s via %s failed\n", strBtfAddr.c_str(), strMeeting.c_str()); 285 LogPrint("net", "ConnectNodeBtf: tunnel to %s via %s failed\n", strBtfAddr.c_str(), strMeeting.c_str());
450 return NULL; 286 return NULL;
451 } 287 }
452 288
453 if (fDebug) 289 if (fDebug)
454 printf("connected %s via rendezvous %s\n", strBtfAddr.c_str(), strMeeting.c_str()); 290 LogPrint("net", "connected %s via rendezvous %s\n", strBtfAddr.c_str(), strMeeting.c_str());
455 291
456 // Add node 292 // Add node
457 pnode = new CNode(hSocket, addr, false); 293 pnode = new CNode(hSocket, addr, false);
@@ -461,6 +297,53 @@ CNode* ConnectNodeBtf(const string& strBtfAddr)
461 return pnode; 297 return pnode;
462} 298}
463 299
300// Connect to a peer by its `.btf` address: resolve the self-certified
301// descriptor over Nostr, then tunnel through its meeting node with the
302// end-to-end channel. Neither side ever learns the other's IP.
303CNode* ConnectNodeBtf(const string& strBtfAddr)
304{
305 unsigned char pk[32];
306 if (!btf::ParseAddress(strBtfAddr, pk))
307 {
308 LogPrint("net", "ConnectNodeBtf: invalid address %s\n", strBtfAddr.c_str());
309 return NULL;
310 }
311 if (BtfLocalAddress() == strBtfAddr)
312 return NULL; // ourselves
313
314 if (fDebug)
315 LogPrint("net", "trying %s\n", strBtfAddr.c_str());
316
317 string strMeeting;
318 unsigned char enc_pub[32];
319 if (!BtfResolve(strBtfAddr, strMeeting, enc_pub))
320 {
321 if (fDebug)
322 LogPrint("net", "ConnectNodeBtf: could not resolve a descriptor for %s\n", strBtfAddr.c_str());
323 return NULL;
324 }
325 return ConnectNodeBtfTail(strBtfAddr, pk, strMeeting, enc_pub);
326}
327
328// Same as ConnectNodeBtf, but skips the Nostr resolve step because the caller
329// already resolved the descriptor (e.g. via BtfResolveMany, batching many
330// addresses into one relay round-trip instead of one relay round-trip per
331// address). Makes zero relay connections -- only talks to the peer's
332// rendezvous meeting node.
333CNode* ConnectNodeBtfResolved(const string& strBtfAddr, const string& strMeeting,
334 const unsigned char enc_pub[32])
335{
336 unsigned char pk[32];
337 if (!btf::ParseAddress(strBtfAddr, pk))
338 {
339 LogPrint("net", "ConnectNodeBtf: invalid address %s\n", strBtfAddr.c_str());
340 return NULL;
341 }
342 if (BtfLocalAddress() == strBtfAddr)
343 return NULL; // ourselves
344 return ConnectNodeBtfTail(strBtfAddr, pk, strMeeting, enc_pub);
345}
346
464// Anonymous inbound listener (this node's `.btf` hidden service). Registers at 347// Anonymous inbound listener (this node's `.btf` hidden service). Registers at
465// the meeting relay and blocks until a client dials our address; each pairing 348// the meeting relay and blocks until a client dials our address; each pairing
466// becomes a normal inbound CNode riding the end-to-end channel, then we 349// becomes a normal inbound CNode riding the end-to-end channel, then we
@@ -535,7 +418,7 @@ void ThreadBtfAccept(void* parg)
535 RAND_bytes(rnd, sizeof(rnd)); 418 RAND_bytes(rnd, sizeof(rnd));
536 CAddress addr = BtfMarkerAddr(rnd); 419 CAddress addr = BtfMarkerAddr(rnd);
537 420
538 printf("accepted .btf connection via rendezvous %s\n", strMeeting.c_str()); 421 LogPrint("net", "accepted .btf connection via rendezvous %s\n", strMeeting.c_str());
539 CNode* pnode = new CNode(hSocket, addr, true); 422 CNode* pnode = new CNode(hSocket, addr, true);
540 pnode->AddRef(); 423 pnode->AddRef();
541 CRITICAL_BLOCK(cs_vNodes) 424 CRITICAL_BLOCK(cs_vNodes)
@@ -574,7 +457,7 @@ void ThreadBtfConnect(void* parg)
574 457
575void CNode::Disconnect() 458void CNode::Disconnect()
576{ 459{
577 printf("disconnecting node %s\n", addr.ToString().c_str()); 460 LogPrint("net", "disconnecting node %s\n", addr.ToString().c_str());
578 461
579 closesocket(hSocket); 462 closesocket(hSocket);
580 463
@@ -653,7 +536,7 @@ void ThreadSocketHandler2(void* parg)
653 536
654 if (pnodeExtra->GetRefCount() <= (pnodeExtra->fNetworkNode ? 1 : 0)) 537 if (pnodeExtra->GetRefCount() <= (pnodeExtra->fNetworkNode ? 1 : 0))
655 { 538 {
656 printf("(%d nodes) disconnecting duplicate: %s\n", vNodes.size(), pnodeExtra->addr.ToString().c_str()); 539 LogPrint("net", "(%d nodes) disconnecting duplicate: %s\n", vNodes.size(), pnodeExtra->addr.ToString().c_str());
657 if (pnodeExtra->fNetworkNode && !pnode->fNetworkNode) 540 if (pnodeExtra->fNetworkNode && !pnode->fNetworkNode)
658 { 541 {
659 pnode->AddRef(); 542 pnode->AddRef();
@@ -745,7 +628,7 @@ void ThreadSocketHandler2(void* parg)
745 if (nSelect == SOCKET_ERROR) 628 if (nSelect == SOCKET_ERROR)
746 { 629 {
747 int nErr = WSAGetLastError(); 630 int nErr = WSAGetLastError();
748 printf("select failed: %d\n", nErr); 631 LogPrint("net", "select failed: %d\n", nErr);
749 for (int i = 0; i <= hSocketMax; i++) 632 for (int i = 0; i <= hSocketMax; i++)
750 { 633 {
751 FD_SET(i, &fdsetRecv); 634 FD_SET(i, &fdsetRecv);
@@ -784,7 +667,7 @@ void ThreadSocketHandler2(void* parg)
784 } 667 }
785 else 668 else
786 { 669 {
787 printf("accepted connection from %s\n", addr.ToString().c_str()); 670 LogPrint("net", "accepted connection from %s\n", addr.ToString().c_str());
788 CNode* pnode = new CNode(hSocket, addr, true); 671 CNode* pnode = new CNode(hSocket, addr, true);
789 pnode->AddRef(); 672 pnode->AddRef();
790 CRITICAL_BLOCK(cs_vNodes) 673 CRITICAL_BLOCK(cs_vNodes)
@@ -823,7 +706,7 @@ void ThreadSocketHandler2(void* parg)
823 { 706 {
824 // socket closed gracefully 707 // socket closed gracefully
825 if (!pnode->fDisconnect) 708 if (!pnode->fDisconnect)
826 printf("recv: socket closed\n"); 709 LogPrint("net", "recv: socket closed\n");
827 pnode->fDisconnect = true; 710 pnode->fDisconnect = true;
828 } 711 }
829 else if (nBytes < 0) 712 else if (nBytes < 0)
@@ -833,7 +716,7 @@ void ThreadSocketHandler2(void* parg)
833 if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS) 716 if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS)
834 { 717 {
835 if (!pnode->fDisconnect) 718 if (!pnode->fDisconnect)
836 printf("recv failed: %d\n", nErr); 719 LogPrint("net", "recv failed: %d\n", nErr);
837 pnode->fDisconnect = true; 720 pnode->fDisconnect = true;
838 } 721 }
839 } 722 }
@@ -862,7 +745,7 @@ void ThreadSocketHandler2(void* parg)
862 } 745 }
863 else 746 else
864 { 747 {
865 printf("send error %d\n", nBytes); 748 LogPrint("net", "send error %d\n", nBytes);
866 if (pnode->ReadyToDisconnect()) 749 if (pnode->ReadyToDisconnect())
867 pnode->vSend.clear(); 750 pnode->vSend.clear();
868 } 751 }
@@ -885,141 +768,6 @@ void ThreadSocketHandler2(void* parg)
885 768
886 769
887 770
888void ThreadOpenConnections(void* parg)
889{
890 IMPLEMENT_RANDOMIZE_STACK(ThreadOpenConnections(parg));
891
892 loop
893 {
894 vfThreadRunning[1] = true;
895 CheckForShutdown(1);
896 try
897 {
898 ThreadOpenConnections2(parg);
899 }
900 CATCH_PRINT_EXCEPTION("ThreadOpenConnections()")
901 vfThreadRunning[1] = false;
902 Sleep(5000);
903 }
904}
905
906void ThreadOpenConnections2(void* parg)
907{
908 printf("ThreadOpenConnections started\n");
909
910 // Initiate network connections
911 const int nMaxConnections = 15;
912 loop
913 {
914 // Wait
915 vfThreadRunning[1] = false;
916 Sleep(500);
917 while (vNodes.size() >= nMaxConnections || vNodes.size() >= mapAddresses.size())
918 {
919 CheckForShutdown(1);
920 Sleep(2000);
921 }
922 vfThreadRunning[1] = true;
923 CheckForShutdown(1);
924
925
926 // Make a list of unique class C's
927 unsigned char pchIPCMask[4] = { 0xff, 0xff, 0xff, 0x00 };
928 unsigned int nIPCMask = *(unsigned int*)pchIPCMask;
929 vector<unsigned int> vIPC;
930 CRITICAL_BLOCK(cs_mapAddresses)
931 {
932 vIPC.reserve(mapAddresses.size());
933 unsigned int nPrev = 0;
934 foreach(const PAIRTYPE(vector<unsigned char>, CAddress)& item, mapAddresses)
935 {
936 const CAddress& addr = item.second;
937 if (!addr.IsIPv4())
938 continue;
939
940 // Taking advantage of mapAddresses being in sorted order,
941 // with IPs of the same class C grouped together.
942 unsigned int ipC = addr.ip & nIPCMask;
943 if (ipC != nPrev)
944 vIPC.push_back(nPrev = ipC);
945 }
946 }
947
948 //
949 // The IP selection process is designed to limit vulnerability to address flooding.
950 // Any class C (a.b.c.?) has an equal chance of being chosen, then an IP is
951 // chosen within the class C. An attacker may be able to allocate many IPs, but
952 // they would normally be concentrated in blocks of class C's. They can hog the
953 // attention within their class C, but not the whole IP address space overall.
954 // A lone node in a class C will get as much attention as someone holding all 255
955 // IPs in another class C.
956 //
957 bool fSuccess = false;
958 int nLimit = vIPC.size();
959 while (!fSuccess && nLimit-- > 0)
960 {
961 // Choose a random class C
962 unsigned int ipC = vIPC[GetRand(vIPC.size())];
963
964 // Organize all addresses in the class C by IP
965 map<unsigned int, vector<CAddress> > mapIP;
966 CRITICAL_BLOCK(cs_mapAddresses)
967 {
968 unsigned int nDelay = ((30 * 60) << vNodes.size());
969 if (nDelay > 8 * 60 * 60)
970 nDelay = 8 * 60 * 60;
971 for (map<vector<unsigned char>, CAddress>::iterator mi = mapAddresses.lower_bound(CAddress(ipC, 0).GetKey());
972 mi != mapAddresses.upper_bound(CAddress(ipC | ~nIPCMask, 0xffff).GetKey());
973 ++mi)
974 {
975 const CAddress& addr = (*mi).second;
976 unsigned int nRandomizer = (addr.nLastFailed * addr.ip * 7777U) % 20000;
977 if (GetTime() - addr.nLastFailed > nDelay * nRandomizer / 10000)
978 mapIP[addr.ip].push_back(addr);
979 }
980 }
981 if (mapIP.empty())
982 break;
983
984 // Choose a random IP in the class C
985 map<unsigned int, vector<CAddress> >::iterator mi = mapIP.begin();
986 advance(mi, GetRand(mapIP.size()));
987
988 // Once we've chosen an IP, we'll try every given port before moving on
989 foreach(const CAddress& addrConnect, (*mi).second)
990 {
991 if (addrConnect.ip == addrLocalHost.ip || !addrConnect.IsIPv4() || FindNode(addrConnect.ip))
992 continue;
993
994 CNode* pnode = ConnectNode(addrConnect);
995 if (!pnode)
996 continue;
997 pnode->fNetworkNode = true;
998
999 if (addrLocalHost.IsRoutable())
1000 {
1001 // Advertise our address
1002 vector<CAddress> vAddrToSend;
1003 vAddrToSend.push_back(addrLocalHost);
1004 pnode->PushMessage("addr", vAddrToSend);
1005 }
1006
1007 // Get as many addresses as we can
1008 pnode->PushMessage("getaddr");
1009
1010 ////// should the one on the receiving end do this too?
1011 // Subscribe our local subscription list
1012 const unsigned int nHops = 0;
1013 for (unsigned int nChannel = 0; nChannel < pnodeLocalHost->vfSubscribe.size(); nChannel++)
1014 if (pnodeLocalHost->vfSubscribe[nChannel])
1015 pnode->PushMessage("subscribe", nChannel, nHops);
1016
1017 fSuccess = true;
1018 break;
1019 }
1020 }
1021 }
1022}
1023 771
1024 772
1025 773
@@ -1187,7 +935,7 @@ bool StartNode(string& strError)
1187 return false; 935 return false;
1188 } 936 }
1189 937
1190 // Get our external IP in a background thread — up to 4 HTTP requests with 938 // Get our external IP in a background thread -- up to 4 HTTP requests with
1191 // 5s timeouts each could otherwise delay startup by 20s on first run. 939 // 5s timeouts each could otherwise delay startup by 20s on first run.
1192 // addrIncoming from a previous session is used immediately as a fallback. 940 // addrIncoming from a previous session is used immediately as a fallback.
1193 if (addrIncoming.ip) 941 if (addrIncoming.ip)
@@ -1228,13 +976,6 @@ bool StartNode(string& strError)
1228 return false; 976 return false;
1229 } 977 }
1230 978
1231 if (_beginthread(ThreadOpenConnections, 0, NULL) == -1)
1232 {
1233 strError = "Error: _beginthread(ThreadOpenConnections) failed";
1234 printf("%s\n", strError.c_str());
1235 return false;
1236 }
1237
1238 if (_beginthread(ThreadMessageHandler, 0, NULL) == -1) 979 if (_beginthread(ThreadMessageHandler, 0, NULL) == -1)
1239 { 980 {
1240 strError = "Error: _beginthread(ThreadMessageHandler) failed"; 981 strError = "Error: _beginthread(ThreadMessageHandler) failed";
diff --git a/src/net.h b/src/net.h
index e732eb3..f028c3b 100644
--- a/src/net.h
+++ b/src/net.h
@@ -22,12 +22,10 @@ enum
22 22
23 23
24 24
25bool ConnectSocket(const CAddress& addrConnect, SOCKET& hSocketRet);
26bool GetMyExternalIP(unsigned int& ipRet); 25bool GetMyExternalIP(unsigned int& ipRet);
27bool AddAddress(CAddrDB& addrdb, const CAddress& addr);
28CNode* FindNode(unsigned int ip);
29CNode* ConnectNode(CAddress addrConnect, int64 nTimeout=0);
30CNode* ConnectNodeBtf(const string& strBtfAddr); 26CNode* ConnectNodeBtf(const string& strBtfAddr);
27CNode* ConnectNodeBtfResolved(const string& strBtfAddr, const string& strMeeting,
28 const unsigned char enc_pub[32]);
31void ThreadBtfAccept(void* parg); 29void ThreadBtfAccept(void* parg);
32void ThreadBtfConnect(void* parg); 30void ThreadBtfConnect(void* parg);
33extern string strBtfConnect; 31extern string strBtfConnect;
@@ -120,7 +118,7 @@ public:
120 // Message size 118 // Message size
121 if (nMessageSize > 0x10000000) 119 if (nMessageSize > 0x10000000)
122 { 120 {
123 printf("CMessageHeader::IsValid() : nMessageSize too large %u\n", nMessageSize); 121 if (LogAcceptsCategory("net")) printf("CMessageHeader::IsValid() : nMessageSize too large %u\n", nMessageSize);
124 return false; 122 return false;
125 } 123 }
126 124
@@ -294,7 +292,7 @@ public:
294 292
295 void print() const 293 void print() const
296 { 294 {
297 printf("CAddress(%s)\n", ToString().c_str()); 295 if (LogAcceptsCategory("net")) printf("CAddress(%s)\n", ToString().c_str());
298 } 296 }
299}; 297};
300 298
@@ -387,7 +385,7 @@ public:
387 385
388 void print() const 386 void print() const
389 { 387 {
390 printf("CInv(%s)\n", ToString().c_str()); 388 if (LogAcceptsCategory("net")) printf("CInv(%s)\n", ToString().c_str());
391 } 389 }
392}; 390};
393 391
@@ -426,13 +424,10 @@ extern bool fShutdown;
426extern array<bool, 10> vfThreadRunning; 424extern array<bool, 10> vfThreadRunning;
427extern vector<CNode*> vNodes; 425extern vector<CNode*> vNodes;
428extern CCriticalSection cs_vNodes; 426extern CCriticalSection cs_vNodes;
429extern map<vector<unsigned char>, CAddress> mapAddresses;
430extern CCriticalSection cs_mapAddresses;
431extern map<CInv, CDataStream> mapRelay; 427extern map<CInv, CDataStream> mapRelay;
432extern deque<pair<int64, CInv> > vRelayExpiration; 428extern deque<pair<int64, CInv> > vRelayExpiration;
433extern CCriticalSection cs_mapRelay; 429extern CCriticalSection cs_mapRelay;
434extern map<CInv, int64> mapAlreadyAskedFor; 430extern map<CInv, int64> mapAlreadyAskedFor;
435extern CAddress addrProxy;
436 431
437 432
438 433
@@ -462,10 +457,6 @@ public:
462 map<uint256, CRequestTracker> mapRequests; 457 map<uint256, CRequestTracker> mapRequests;
463 CCriticalSection cs_mapRequests; 458 CCriticalSection cs_mapRequests;
464 459
465 // flood
466 vector<CAddress> vAddrToSend;
467 set<CAddress> setAddrKnown;
468
469 // inventory based relay 460 // inventory based relay
470 set<CInv> setInventoryKnown; 461 set<CInv> setInventoryKnown;
471 set<CInv> setInventoryKnown2; 462 set<CInv> setInventoryKnown2;
@@ -555,7 +546,7 @@ public:
555 // We're using mapAskFor as a priority queue, 546 // We're using mapAskFor as a priority queue,
556 // the key is the earliest time the request can be sent 547 // the key is the earliest time the request can be sent
557 int64& nRequestTime = mapAlreadyAskedFor[inv]; 548 int64& nRequestTime = mapAlreadyAskedFor[inv];
558 printf("askfor %s %lld\n", inv.ToString().c_str(), nRequestTime); 549 if (LogAcceptsCategory("net")) printf("askfor %s %lld\n", inv.ToString().c_str(), nRequestTime);
559 550
560 // Make sure not to reuse time indexes to keep things in the same order 551 // Make sure not to reuse time indexes to keep things in the same order
561 int64 nNow = (GetTime() - 1) * 1000000; 552 int64 nNow = (GetTime() - 1) * 1000000;
@@ -576,7 +567,7 @@ public:
576 AbortMessage(); 567 AbortMessage();
577 nPushPos = vSend.size(); 568 nPushPos = vSend.size();
578 vSend << CMessageHeader(pszCommand, 0); 569 vSend << CMessageHeader(pszCommand, 0);
579 printf("sending: %-12s ", pszCommand); 570 if (LogAcceptsCategory("net")) printf("sending: %-12s ", pszCommand);
580 } 571 }
581 572
582 void AbortMessage() 573 void AbortMessage()
@@ -586,7 +577,7 @@ public:
586 vSend.resize(nPushPos); 577 vSend.resize(nPushPos);
587 nPushPos = -1; 578 nPushPos = -1;
588 LeaveCriticalSection(&cs_vSend); 579 LeaveCriticalSection(&cs_vSend);
589 printf("(aborted)\n"); 580 if (LogAcceptsCategory("net")) printf("(aborted)\n");
590 } 581 }
591 582
592 void EndMessage() 583 void EndMessage()
@@ -594,7 +585,7 @@ public:
594 extern int nDropMessagesTest; 585 extern int nDropMessagesTest;
595 if (nDropMessagesTest > 0 && GetRand(nDropMessagesTest) == 0) 586 if (nDropMessagesTest > 0 && GetRand(nDropMessagesTest) == 0)
596 { 587 {
597 printf("dropmessages DROPPING SEND MESSAGE\n"); 588 if (LogAcceptsCategory("net")) printf("dropmessages DROPPING SEND MESSAGE\n");
598 AbortMessage(); 589 AbortMessage();
599 return; 590 return;
600 } 591 }
@@ -606,10 +597,10 @@ public:
606 unsigned int nSize = vSend.size() - nPushPos - sizeof(CMessageHeader); 597 unsigned int nSize = vSend.size() - nPushPos - sizeof(CMessageHeader);
607 memcpy((char*)&vSend[nPushPos] + offsetof(CMessageHeader, nMessageSize), &nSize, sizeof(nSize)); 598 memcpy((char*)&vSend[nPushPos] + offsetof(CMessageHeader, nMessageSize), &nSize, sizeof(nSize));
608 599
609 printf("(%d bytes) ", nSize); 600 if (LogAcceptsCategory("net")) printf("(%d bytes) ", nSize);
610 //for (int i = nPushPos+sizeof(CMessageHeader); i < min(vSend.size(), nPushPos+sizeof(CMessageHeader)+20U); i++) 601 //for (int i = nPushPos+sizeof(CMessageHeader); i < min(vSend.size(), nPushPos+sizeof(CMessageHeader)+20U); i++)
611 // printf("%02x ", vSend[i] & 0xff); 602 // printf("%02x ", vSend[i] & 0xff);
612 printf("\n"); 603 if (LogAcceptsCategory("net")) printf("\n");
613 604
614 nPushPos = -1; 605 nPushPos = -1;
615 LeaveCriticalSection(&cs_vSend); 606 LeaveCriticalSection(&cs_vSend);
diff --git a/src/nostr.cpp b/src/nostr.cpp
index c2ccc4c..009edd1 100644
--- a/src/nostr.cpp
+++ b/src/nostr.cpp
@@ -45,7 +45,12 @@ static const int64 BTF_POOL_MAX_AGE = 3 * 60; // seconds
45 45
46// Anonymous auto-discovery: how many peers to keep connected via .btf rendezvous 46// Anonymous auto-discovery: how many peers to keep connected via .btf rendezvous
47// before we stop dialing more, and how many new dials to attempt per cycle. 47// before we stop dialing more, and how many new dials to attempt per cycle.
48static const unsigned int BTF_TARGET_CONN = 8; 48// Target outbound peer count. With ~100 known .btf peers on the network,
49// an Erdos-Renyi random graph stays connected with overwhelming probability
50// once average degree exceeds ln(N) (~4.6 here); 24 is ~5x past that
51// threshold, so this is plenty *provided* selection isn't fully correlated
52// across nodes -- see the diversity slice in ConnectDiscoveredBtfPeers.
53static const unsigned int BTF_TARGET_CONN = 24;
49static const int BTF_DIALS_PER_PASS = 12; // try more peers per Nostr cycle 54static const int BTF_DIALS_PER_PASS = 12; // try more peers per Nostr cycle
50 55
51// Nostr descriptor freshness cutoff: skip peers whose descriptor hasn't been 56// Nostr descriptor freshness cutoff: skip peers whose descriptor hasn't been
@@ -58,11 +63,27 @@ static map<string, int64> g_btfPeers;
58static CCriticalSection cs_btfPeers; 63static CCriticalSection cs_btfPeers;
59 64
60// Public discovery relays. Tunable. 65// Public discovery relays. Tunable.
66//
67// Picked for: free/public (no NIP-42 auth or payment wall), track record of
68// high uptime, and *infrastructure* diversity, not just different hostnames.
69// relay.damus.io, relay.snort.social and relay.primal.net are all fronted by
70// Cloudflare -- different operators, same upstream, so a Cloudflare-side
71// incident (or a Cloudflare IP range getting rate-limited/blocked on some
72// network) can take out several of them at once even though they look like
73// independent relays. Kept only one Cloudflare-fronted relay (damus.io, the
74// most established) and filled the rest with relays on different hosts
75// (Hetzner, various independents) so no single upstream provider is a
76// single point of failure for peer discovery. 7 relays lands inside the
77// commonly recommended 5-10 range for redundancy without keeping an
78// excessive number of persistent sockets open per node.
61const char* pszNostrRelays[] = { 79const char* pszNostrRelays[] = {
62 "wss://relay.damus.io", 80 "wss://relay.damus.io",
63 "wss://nos.lol", 81 "wss://nos.lol",
64 "wss://relay.nostr.band", 82 "wss://relay.nostr.band",
65 "wss://relay.snort.social", 83 "wss://nostr21.com",
84 "wss://offchain.pub",
85 "wss://nostr.mom",
86 "wss://relay.primal.net",
66}; 87};
67const int nNostrRelays = ARRAYLEN(pszNostrRelays); 88const int nNostrRelays = ARRAYLEN(pszNostrRelays);
68 89
@@ -317,6 +338,13 @@ std::string BtfLocalAddress()
317 return g_nostrKey.BtfAddress(); 338 return g_nostrKey.BtfAddress();
318} 339}
319 340
341int GetDiscoveredPeerCount()
342{
343 int n = 0;
344 CRITICAL_BLOCK(cs_btfPeers) { n = (int)g_btfPeers.size(); }
345 return n;
346}
347
320void BtfGetPoolAnnouncements(std::vector<BtfPoolAnnouncement>& out) 348void BtfGetPoolAnnouncements(std::vector<BtfPoolAnnouncement>& out)
321{ 349{
322 out.clear(); 350 out.clear();
@@ -425,38 +453,55 @@ public:
425 size_t colon = host.find(':'); 453 size_t colon = host.find(':');
426 if (colon != string::npos) { port = atoi(host.substr(colon + 1).c_str()); host = host.substr(0, colon); } 454 if (colon != string::npos) { port = atoi(host.substr(colon + 1).c_str()); host = host.substr(0, colon); }
427 455
428 // Resolve and connect (TCP) 456 // Resolve and connect (TCP). AF_UNSPEC so we get both A and AAAA
429 struct addrinfo hints, *res = NULL; 457 // records back and try them in the order the resolver prefers,
458 // rather than hard-failing whenever the IPv4 path to a relay is
459 // filtered/rate-limited (increasingly common for CDN-fronted
460 // relays) while a working IPv6 route exists right there in the
461 // same getaddrinfo() result.
462 struct addrinfo hints, *res = NULL, *rp = NULL;
430 memset(&hints, 0, sizeof(hints)); 463 memset(&hints, 0, sizeof(hints));
431 hints.ai_family = AF_INET; 464 hints.ai_family = AF_UNSPEC;
432 hints.ai_socktype = SOCK_STREAM; 465 hints.ai_socktype = SOCK_STREAM;
433 char portstr[16]; sprintf(portstr, "%d", port); 466 char portstr[16]; sprintf(portstr, "%d", port);
434 if (getaddrinfo(host.c_str(), portstr, &hints, &res) != 0 || !res) 467 if (getaddrinfo(host.c_str(), portstr, &hints, &res) != 0 || !res)
435 return error("Nostr: getaddrinfo %s failed", host.c_str()); 468 return error("Nostr: getaddrinfo %s failed", host.c_str());
436 hSocket = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
437 if (hSocket == INVALID_SOCKET) { freeaddrinfo(res); return false; }
438 469
439 // Socket receive/send timeout: Windows takes a DWORD of milliseconds; 470 bool fConnected = false;
440 // POSIX takes a struct timeval. 471 for (rp = res; rp != NULL; rp = rp->ai_next)
472 {
473 hSocket = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
474 if (hSocket == INVALID_SOCKET)
475 continue;
476
477 // Socket receive/send timeout: Windows takes a DWORD of
478 // milliseconds; POSIX takes a struct timeval.
441#ifdef _WIN32 479#ifdef _WIN32
442 DWORD tv = timeoutSec * 1000; 480 DWORD tv = timeoutSec * 1000;
443 setsockopt(hSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(tv)); 481 setsockopt(hSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(tv));
444 setsockopt(hSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&tv, sizeof(tv)); 482 setsockopt(hSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&tv, sizeof(tv));
445#else 483#else
446 struct timeval tv; 484 struct timeval tv;
447 tv.tv_sec = timeoutSec; 485 tv.tv_sec = timeoutSec;
448 tv.tv_usec = 0; 486 tv.tv_usec = 0;
449 setsockopt(hSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(tv)); 487 setsockopt(hSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(tv));
450 setsockopt(hSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&tv, sizeof(tv)); 488 setsockopt(hSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&tv, sizeof(tv));
451#endif 489#endif
452 490
453 if (connect(hSocket, res->ai_addr, (int)res->ai_addrlen) != 0) 491 if (connect(hSocket, rp->ai_addr, (int)rp->ai_addrlen) == 0)
454 { 492 {
455 freeaddrinfo(res); 493 fConnected = true;
456 return error("Nostr: connect %s:%d failed", host.c_str(), port); 494 break;
495 }
496
497 closesocket(hSocket);
498 hSocket = INVALID_SOCKET;
457 } 499 }
458 freeaddrinfo(res); 500 freeaddrinfo(res);
459 501
502 if (!fConnected)
503 return error("Nostr: connect %s:%d failed", host.c_str(), port);
504
460 // TLS 505 // TLS
461 if (fTls) 506 if (fTls)
462 { 507 {
@@ -598,6 +643,88 @@ private:
598}; 643};
599 644
600 645
646// Persistent relay connections. Public relays (relay.damus.io in particular)
647// rate-limit new connections per source IP fairly aggressively. Before this,
648// every single operation -- self-test, per-pass seeding, batch descriptor
649// resolve, pool announce, pool query -- opened its own fresh CWebSocket,
650// meaning a single node could fire a dozen-plus brand-new TCP+TLS+WS
651// handshakes at the same 4 relays within any given minute (ThreadNostrSeed's
652// own loop plus the separate ThreadBtfPoolAnnouncer thread, each reconnecting
653// from scratch every cycle). That's exactly what was showing up as constant
654// "handshake refused by relay.damus.io" and "connect ... failed" -- not
655// necessarily dead relays, just this node getting rate-limited by its own
656// reconnect churn.
657//
658// Now every relay-touching call reuses one long-lived socket per relay via
659// this pool, reconnecting only when a socket actually drops. That cuts fresh
660// connections from several per minute down to essentially one per relay for
661// the life of the process.
662struct RelayConn
663{
664 CWebSocket ws;
665 CCriticalSection cs; // serializes use of this relay's socket
666 bool fConnected;
667 RelayConn() : fConnected(false) {}
668};
669static map<string, RelayConn*> g_relayPool;
670static CCriticalSection cs_relayPool;
671
672static RelayConn* GetRelayConn(const string& relay)
673{
674 CRITICAL_BLOCK(cs_relayPool)
675 {
676 map<string, RelayConn*>::iterator it = g_relayPool.find(relay);
677 if (it != g_relayPool.end())
678 return it->second;
679 RelayConn* rc = new RelayConn();
680 g_relayPool[relay] = rc;
681 return rc;
682 }
683 return NULL; // unreachable
684}
685
686// RAII lease on a relay's pooled connection: connects (if not already
687// connected) on construction, and on destruction either keeps the socket
688// alive for the next caller (if the exchange succeeded) or closes it so the
689// next caller reconnects instead of reusing a socket that may be wedged.
690// Caller must set fOk = true once its exchange with the relay completed
691// cleanly.
692class CRelayLease
693{
694public:
695 RelayConn* rc;
696 bool fOk;
697 bool fJustConnected; // true if this lease had to (re)connect, false if reusing a live socket
698
699 CRelayLease(const string& relay, int timeoutSec) : rc(NULL), fOk(false), fJustConnected(false)
700 {
701 rc = GetRelayConn(relay);
702 rc->cs.Enter();
703 if (!rc->fConnected)
704 {
705 rc->ws.Close();
706 rc->fConnected = rc->ws.Connect(relay, timeoutSec);
707 fJustConnected = rc->fConnected;
708 }
709 }
710 ~CRelayLease()
711 {
712 if (!fOk)
713 {
714 rc->ws.Close();
715 rc->fConnected = false;
716 }
717 rc->cs.Leave();
718 }
719 bool Connected() const { return rc->fConnected; }
720 CWebSocket& Ws() { return rc->ws; }
721
722private:
723 CRelayLease(const CRelayLease&);
724 CRelayLease& operator=(const CRelayLease&);
725};
726
727
601// Publish this node's self-certifying `.btf` descriptor: "reach me (this key) 728// Publish this node's self-certifying `.btf` descriptor: "reach me (this key)
602// via <meeting_node>, encrypting to my x25519 key <enc>". Signed by the node 729// via <meeting_node>, encrypting to my x25519 key <enc>". Signed by the node
603// key so only the address's owner can publish it (no hijacking). 730// key so only the address's owner can publish it (no hijacking).
@@ -673,11 +800,11 @@ bool BtfPublishPoolAnnouncement(const BtfPoolAnnouncement& ann)
673 { 800 {
674 try 801 try
675 { 802 {
676 CWebSocket ws; 803 CRelayLease lease(pszNostrRelays[i], 10);
677 if (!ws.Connect(pszNostrRelays[i], 10)) 804 if (!lease.Connected())
678 continue; 805 continue;
679 if (PublishPoolAnnouncementOnRelay(ws, g_nostrKey, ann)) 806 if (PublishPoolAnnouncementOnRelay(lease.Ws(), g_nostrKey, ann))
680 fPublished = true; 807 fPublished = lease.fOk = true;
681 } 808 }
682 CATCH_PRINT_EXCEPTION("BtfPublishPoolAnnouncement") 809 CATCH_PRINT_EXCEPTION("BtfPublishPoolAnnouncement")
683 } 810 }
@@ -699,9 +826,10 @@ bool BtfQueryPoolAnnouncement(const std::string& poolBtfAddr, BtfPoolAnnouncemen
699 { 826 {
700 try 827 try
701 { 828 {
702 CWebSocket ws; 829 CRelayLease lease(pszNostrRelays[i], 10);
703 if (!ws.Connect(pszNostrRelays[i], 10)) 830 if (!lease.Connected())
704 continue; 831 continue;
832 CWebSocket& ws = lease.Ws();
705 833
706 json filter = json::object(); 834 json filter = json::object();
707 filter["authors"] = json::array({ HexEncode(pk, 32) }); 835 filter["authors"] = json::array({ HexEncode(pk, 32) });
@@ -756,6 +884,7 @@ bool BtfQueryPoolAnnouncement(const std::string& poolBtfAddr, BtfPoolAnnouncemen
756 else if (type == "EOSE") 884 else if (type == "EOSE")
757 break; 885 break;
758 } 886 }
887 lease.fOk = true;
759 } 888 }
760 CATCH_PRINT_EXCEPTION("BtfQueryPoolAnnouncement") 889 CATCH_PRINT_EXCEPTION("BtfQueryPoolAnnouncement")
761 } 890 }
@@ -855,12 +984,16 @@ bool BtfResolve(const std::string& btfAddr, std::string& meetingHostPort,
855 { 984 {
856 try 985 try
857 { 986 {
858 CWebSocket ws; 987 CRelayLease lease(pszNostrRelays[i], 10);
859 if (!ws.Connect(pszNostrRelays[i], 10)) 988 if (!lease.Connected())
860 continue; 989 continue;
861 btf::Descriptor d; 990 btf::Descriptor d;
862 if (!ResolveDescriptor(ws, g_nostrKey.ctx, btfAddr, d)) 991 if (!ResolveDescriptor(lease.Ws(), g_nostrKey.ctx, btfAddr, d))
992 {
993 lease.fOk = true; // exchange completed, just no match
863 continue; 994 continue;
995 }
996 lease.fOk = true;
864 if (d.meeting_node.empty() || d.meeting_node == "rendezvous-pending") 997 if (d.meeting_node.empty() || d.meeting_node == "rendezvous-pending")
865 continue; // descriptor predates the owner's relay config 998 continue; // descriptor predates the owner's relay config
866 if (!HexDecode(d.enc, enc_pub, 32)) 999 if (!HexDecode(d.enc, enc_pub, 32))
@@ -873,14 +1006,115 @@ bool BtfResolve(const std::string& btfAddr, std::string& meetingHostPort,
873 return false; 1006 return false;
874} 1007}
875 1008
1009// Resolve MANY .btf addresses in one pass. A single relay connection carries
1010// a REQ with every still-unresolved address's pubkey in "authors", instead of
1011// opening one relay connection per address. This matters because callers like
1012// ConnectDiscoveredBtfPeers dial many candidates in parallel; without
1013// batching, each of those dial threads independently walks the same handful
1014// of public relays on its own, so a pass of N candidates can fire up to
1015// N * nNostrRelays near-simultaneous connections at the same few relays --
1016// enough to get rate-limited or have handshakes refused, which then looks
1017// like "dead peers" even though the descriptors are perfectly resolvable.
1018bool BtfResolveMany(const std::vector<std::string>& btfAddrs,
1019 std::map<std::string, BtfResolvedPeer>& out)
1020{
1021 if (!EnsureNostrKey() || btfAddrs.empty())
1022 return false;
1023
1024 map<string, string> hexToAddr; // pubkey hex -> .btf addr, for matching events back
1025 set<string> pending;
1026 for (const string& a : btfAddrs)
1027 {
1028 unsigned char pk[32];
1029 if (!btf::ParseAddress(a, pk))
1030 continue;
1031 hexToAddr[HexEncode(pk, 32)] = a;
1032 pending.insert(a);
1033 }
1034 if (pending.empty())
1035 return false;
1036
1037 for (int i = 0; i < nNostrRelays && !fShutdown && !pending.empty(); i++)
1038 {
1039 try
1040 {
1041 CRelayLease lease(pszNostrRelays[i], 10);
1042 if (!lease.Connected())
1043 continue;
1044 CWebSocket& ws = lease.Ws();
1045
1046 json authors = json::array();
1047 for (auto& kv : hexToAddr)
1048 if (pending.count(kv.second))
1049 authors.push_back(kv.first);
1050 if (authors.empty())
1051 {
1052 lease.fOk = true;
1053 break;
1054 }
1055
1056 json filter = json::object();
1057 filter["authors"] = authors;
1058 filter["kinds"] = json::array({ BTF_DESC_KIND });
1059 filter["limit"] = (int)authors.size();
1060 json req = json::array({ "REQ", "btf-resolve-many", filter });
1061 if (!ws.SendText(req.dump()))
1062 continue;
1063
1064 for (;;)
1065 {
1066 string msg;
1067 if (!ws.RecvText(msg))
1068 break;
1069 json j;
1070 try { j = json::parse(msg); } catch (...) { continue; }
1071 if (!j.is_array() || j.empty()) continue;
1072 string t = j[0].get<string>();
1073 if (t == "EVENT" && j.size() >= 3)
1074 {
1075 const json& ev = j[2];
1076 if (!ev.contains("pubkey") || !ev.contains("content"))
1077 continue;
1078 string hexpk = ev["pubkey"].get<string>();
1079 auto ai = hexToAddr.find(hexpk);
1080 if (ai == hexToAddr.end() || !pending.count(ai->second))
1081 continue; // not one we're waiting on (or already resolved)
1082
1083 unsigned char pk[32];
1084 if (!HexDecode(hexpk, pk, 32))
1085 continue;
1086 btf::Descriptor d;
1087 if (!btf::VerifyDescriptor(g_nostrKey.ctx, ev["content"].get<string>(), pk, d))
1088 continue;
1089 if (d.meeting_node.empty() || d.meeting_node == "rendezvous-pending")
1090 continue;
1091 BtfResolvedPeer rp;
1092 if (!HexDecode(d.enc, rp.enc_pub, 32))
1093 continue;
1094 rp.meetingHostPort = d.meeting_node;
1095 out[ai->second] = rp;
1096 pending.erase(ai->second);
1097 }
1098 else if (t == "EOSE")
1099 break;
1100 }
1101 lease.fOk = true;
1102 }
1103 CATCH_PRINT_EXCEPTION("BtfResolveMany")
1104 }
1105 return !out.empty();
1106}
1107
876 1108
877// Connect to a relay: publish our .btf descriptor and collect relay data. 1109// Connect to a relay: publish our .btf descriptor and collect relay data.
878static bool SeedFromRelay(CNostrKey& key, const string& relay) 1110static bool SeedFromRelay(CNostrKey& key, const string& relay)
879{ 1111{
880 CWebSocket ws; 1112 CRelayLease lease(relay, 10);
881 if (!ws.Connect(relay, 10)) 1113 if (!lease.Connected())
882 return false; 1114 return false;
883 printf("Nostr: connected to %s\n", relay.c_str()); 1115 CWebSocket& ws = lease.Ws();
1116 if (lease.fJustConnected)
1117 LogPrint("nostr", "Nostr: connected to %s\n", relay.c_str());
884 1118
885 // Publish our self-certifying .btf descriptor (rendezvous discovery) 1119 // Publish our self-certifying .btf descriptor (rendezvous discovery)
886 PublishDescriptor(ws, key); 1120 PublishDescriptor(ws, key);
@@ -930,7 +1164,7 @@ static bool SeedFromRelay(CNostrKey& key, const string& relay)
930 else if (createdAt > it->second) it->second = createdAt; // refresh 1164 else if (createdAt > it->second) it->second = createdAt; // refresh
931 } 1165 }
932 if (fNew && fDebug) 1166 if (fNew && fDebug)
933 printf("Nostr: discovered .btf peer %s\n", peerAddr.c_str()); 1167 LogPrint("nostr", "Nostr: discovered .btf peer %s\n", peerAddr.c_str());
934 if (++nPeers > 500) break; 1168 if (++nPeers > 500) break;
935 } 1169 }
936 else if (type == "EOSE") 1170 else if (type == "EOSE")
@@ -974,7 +1208,7 @@ static bool SeedFromRelay(CNostrKey& key, const string& relay)
974 if (g_discoveredRelays.size() < BTF_MAX_DISCOVERED_RELAYS) 1208 if (g_discoveredRelays.size() < BTF_MAX_DISCOVERED_RELAYS)
975 fNew = g_discoveredRelays.insert(r).second; 1209 fNew = g_discoveredRelays.insert(r).second;
976 if (fNew && fDebug) 1210 if (fNew && fDebug)
977 printf("Nostr: discovered relay %s\n", r.c_str()); 1211 LogPrint("nostr", "Nostr: discovered relay %s\n", r.c_str());
978 } 1212 }
979 else if (type == "EOSE") 1213 else if (type == "EOSE")
980 break; 1214 break;
@@ -1009,12 +1243,15 @@ static bool SeedFromRelay(CNostrKey& key, const string& relay)
1009 } 1243 }
1010 } 1244 }
1011 } 1245 }
1246 lease.fOk = true;
1012 return true; 1247 return true;
1013} 1248}
1014 1249
1250volatile bool gAnnounceNow = false;
1251
1015void ThreadBtfPoolAnnouncer(void*) 1252void ThreadBtfPoolAnnouncer(void*)
1016{ 1253{
1017 printf("ThreadBtfPoolAnnouncer started\n"); 1254 LogPrint("pool", "ThreadBtfPoolAnnouncer started\n");
1018 while (!fShutdown) 1255 while (!fShutdown)
1019 { 1256 {
1020 if (nMineMode == MINE_OPERATOR && gPoolRunning) 1257 if (nMineMode == MINE_OPERATOR && gPoolRunning)
@@ -1025,15 +1262,17 @@ void ThreadBtfPoolAnnouncer(void*)
1025 ann.dashboardUrl = strPoolDashboardUrl; 1262 ann.dashboardUrl = strPoolDashboardUrl;
1026 ann.feePercent = dPoolFeePercent; 1263 ann.feePercent = dPoolFeePercent;
1027 uint64 roundShares = 0; 1264 uint64 roundShares = 0;
1028 GetPoolOperatorStats(ann.connectedMiners, ann.blocksFound, roundShares); 1265 double totalHashRate = 0.0;
1029 ann.hashRate = 0.0; 1266 GetPoolOperatorStats(ann.connectedMiners, ann.blocksFound, roundShares, totalHashRate);
1267 ann.hashRate = totalHashRate;
1030 ann.createdAt = GetTime(); 1268 ann.createdAt = GetTime();
1031 if (!ann.btfAddress.empty() && !ann.poolName.empty()) 1269 if (!ann.btfAddress.empty() && !ann.poolName.empty())
1032 BtfPublishPoolAnnouncement(ann); 1270 BtfPublishPoolAnnouncement(ann);
1033 } 1271 }
1034 1272
1035 for (int i = 0; i < 60 && !fShutdown; i++) 1273 for (int i = 0; i < 60 && !fShutdown && !gAnnounceNow; i++)
1036 Sleep(1000); 1274 Sleep(1000);
1275 gAnnounceNow = false;
1037 } 1276 }
1038} 1277}
1039 1278
@@ -1042,10 +1281,29 @@ void ThreadBtfPoolAnnouncer(void*)
1042// dead/stale descriptors (e.g. abandoned test identities that linger on the 1281// dead/stale descriptors (e.g. abandoned test identities that linger on the
1043// relays) from consuming the whole per-pass dial budget and starving the live 1282// relays) from consuming the whole per-pass dial budget and starving the live
1044// peers. Backoff grows on repeated failures, capped. 1283// peers. Backoff grows on repeated failures, capped.
1284//
1285// g_btfPeerFails also doubles as the priority signal for dial ordering: a peer
1286// we've connected to before (present in g_btfPeerEverConnected) is known-good
1287// and goes first; a peer we've never tried goes next; a peer with a growing
1288// fail count is known-bad and goes last, worst offenders furthest back. This
1289// replaces the old behavior where the whole candidate list was shuffled right
1290// after being sorted by freshness, which made the freshness sort a no-op and
1291// gave dead peers equal footing with everyone else.
1045static map<string, int64> g_btfPeerBackoff; // addr -> next-try time 1292static map<string, int64> g_btfPeerBackoff; // addr -> next-try time
1046static map<string, int> g_btfPeerFails; // addr -> consecutive failures 1293static map<string, int> g_btfPeerFails; // addr -> consecutive failures
1294static set<string> g_btfPeerEverConnected; // addr -> has succeeded at least once
1047static CCriticalSection cs_btfPeerState; 1295static CCriticalSection cs_btfPeerState;
1048 1296
1297// Backoff cap for repeatedly-dead peers. The old 15-minute cap meant a
1298// descriptor that has failed many times in a row cycles back into the dial
1299// pool just as often as a peer we've never tried, wasting dial budget on
1300// known-dead addresses every pass. Once a peer has failed enough times to
1301// be "chronic", stretch the cap much further so it consumes budget far less
1302// often while still getting retried eventually in case it comes back online.
1303static const int64 BTF_BACKOFF_CAP_SECS = 15 * 60; // 15 min: initial ramp cap
1304static const int64 BTF_BACKOFF_CAP_SECS_DEAD = 6 * 60 * 60; // 6 hr: cap for chronic failures
1305static const int BTF_CHRONIC_FAIL_THRESHOLD = 6; // fails before "chronic" cap kicks in
1306
1049// Dial the .btf peers discovered on the relays, up to a target connection count. 1307// Dial the .btf peers discovered on the relays, up to a target connection count.
1050// Connections are attempted in parallel so a single slow/dead relay doesn't 1308// Connections are attempted in parallel so a single slow/dead relay doesn't
1051// stall the entire pass. Each candidate gets its own thread; all threads start 1309// stall the entire pass. Each candidate gets its own thread; all threads start
@@ -1060,23 +1318,18 @@ static void ConnectDiscoveredBtfPeers()
1060 for (auto& kv : g_btfPeers) 1318 for (auto& kv : g_btfPeers)
1061 peersWithAge.push_back({kv.second, kv.first}); 1319 peersWithAge.push_back({kv.second, kv.first});
1062 } 1320 }
1063 // Sort newest descriptor first — recently-active nodes are much more
1064 // likely to be online right now. Stale ones stay in the list as fallback.
1065 sort(peersWithAge.begin(), peersWithAge.end(),
1066 [](const pair<int64,string>& a, const pair<int64,string>& b){ return a.first > b.first; });
1067
1068 int64 cutoff = GetTime() - BTF_PEER_MAX_AGE; 1321 int64 cutoff = GetTime() - BTF_PEER_MAX_AGE;
1069 int nFresh = 0; 1322 int nFresh = 0;
1070 vector<string> peers; 1323 vector<pair<int64,string>> fresh; // (createdAt, addr), newest first
1071 for (auto& p : peersWithAge) 1324 for (auto& p : peersWithAge)
1072 { 1325 {
1073 if (p.first < cutoff) 1326 if (p.first < cutoff)
1074 continue; 1327 continue;
1075 peers.push_back(p.second); 1328 fresh.push_back(p);
1076 nFresh++; 1329 nFresh++;
1077 } 1330 }
1078 if (!peers.empty()) 1331 if (!fresh.empty())
1079 printf("Nostr: %d fresh peers, %d stale (of %d total)\n", nFresh, nTotal-nFresh, nTotal); 1332 LogPrint("nostr", "Nostr: %d fresh peers, %d stale (of %d total)\n", nFresh, nTotal-nFresh, nTotal);
1080 1333
1081 // Drop stale peers so we stop retrying dead descriptors until they refresh. 1334 // Drop stale peers so we stop retrying dead descriptors until they refresh.
1082 { 1335 {
@@ -1092,42 +1345,164 @@ static void ConnectDiscoveredBtfPeers()
1092 } 1345 }
1093 } 1346 }
1094 1347
1095 // Shuffle so we don't always retry the same dead peers at the front. 1348 // Sort newest descriptor first -- recently-active nodes are much more
1096 for (size_t i = peers.size(); i > 1; i--) 1349 // likely to be online right now.
1097 swap(peers[i - 1], peers[(size_t)GetRand(i)]); 1350 sort(fresh.begin(), fresh.end(),
1351 [](const pair<int64,string>& a, const pair<int64,string>& b){ return a.first > b.first; });
1352
1353 // Reorder into tiers: known-good (succeeded before) first, untried next,
1354 // known-bad (has a fail count) last -- worst offenders furthest back.
1355 // Freshness order is preserved *within* each tier, so recency still
1356 // matters, but a peer we know is dead no longer gets equal footing with
1357 // a peer we've never tried or one that's worked before.
1358 vector<string> tierGood, tierUntried, tierBad;
1359 CRITICAL_BLOCK(cs_btfPeerState)
1360 {
1361 for (auto& p : fresh)
1362 {
1363 const string& addr = p.second;
1364 if (g_btfPeerEverConnected.count(addr))
1365 tierGood.push_back(addr);
1366 else if (g_btfPeerFails.find(addr) == g_btfPeerFails.end())
1367 tierUntried.push_back(addr);
1368 else
1369 tierBad.push_back(addr);
1370 }
1371 // Within known-bad, put fewer-fails peers ahead of chronic offenders.
1372 sort(tierBad.begin(), tierBad.end(),
1373 [](const string& a, const string& b){ return g_btfPeerFails[a] < g_btfPeerFails[b]; });
1374 }
1375
1376 vector<string> peers;
1377 peers.reserve(fresh.size());
1378 peers.insert(peers.end(), tierGood.begin(), tierGood.end());
1379 peers.insert(peers.end(), tierUntried.begin(), tierUntried.end());
1380 peers.insert(peers.end(), tierBad.begin(), tierBad.end());
1098 1381
1099 // Pick candidates for this pass (skip those in backoff, cap at budget). 1382 // Pick candidates for this pass (skip those in backoff, cap at budget).
1383 //
1384 // The tiered order above is deliberately biased toward peers we know
1385 // are good -- that's the right default, since dialing untested/bad
1386 // peers wastes attempts. But if every node on the network applies the
1387 // same bias, everyone converges on the same small set of "known good"
1388 // peers as neighbors: that correlates peer sets across the network,
1389 // which is exactly what standard random-graph connectivity results
1390 // assume you avoid. If that shared hub set has a bad day (e.g. one
1391 // relay outage), many nodes lose the same edges at once instead of
1392 // losing independent, uncorrelated edges.
1393 //
1394 // So: fill most of the pass from the reliable/tiered order, but reserve
1395 // a slice for peers picked at random from the *entire* fresh pool
1396 // (not just the front of the sorted list). Same pattern Bitcoin's own
1397 // peer manager and Kademlia-style DHTs use -- sticky reliable peers
1398 // plus a random sample, not one or the other.
1100 int64 now = GetTime(); 1399 int64 now = GetTime();
1400 int nBudget = (int)BTF_DIALS_PER_PASS;
1401 {
1402 int nRoom = (int)BTF_TARGET_CONN - (int)vNodes.size();
1403 if (nRoom < nBudget) nBudget = nRoom;
1404 }
1405 if (nBudget < 0) nBudget = 0;
1406 int nRandomSlots = (nBudget > 0) ? max(1, nBudget * 3 / 10) : 0;
1407 int nSortedSlots = nBudget - nRandomSlots;
1408
1101 vector<string> candidates; 1409 vector<string> candidates;
1410 set<string> setChosen;
1102 CRITICAL_BLOCK(cs_btfPeerState) 1411 CRITICAL_BLOCK(cs_btfPeerState)
1103 { 1412 {
1413 // Reliability slice: walk the tiered (good -> untried -> bad) order.
1104 for (const string& addr : peers) 1414 for (const string& addr : peers)
1105 { 1415 {
1106 if ((int)vNodes.size() >= (int)BTF_TARGET_CONN) break; 1416 if ((int)vNodes.size() >= (int)BTF_TARGET_CONN) break;
1107 if ((int)candidates.size() >= BTF_DIALS_PER_PASS) break; 1417 if ((int)candidates.size() >= nSortedSlots) break;
1108 map<string, int64>::iterator bi = g_btfPeerBackoff.find(addr); 1418 map<string, int64>::iterator bi = g_btfPeerBackoff.find(addr);
1109 if (bi != g_btfPeerBackoff.end() && now < bi->second) 1419 if (bi != g_btfPeerBackoff.end() && now < bi->second)
1110 continue; 1420 continue;
1111 candidates.push_back(addr); 1421 candidates.push_back(addr);
1422 setChosen.insert(addr);
1423 }
1424
1425 // Diversity slice: random sample from the full fresh pool, so the
1426 // dial isn't limited to whatever the tiered sort put up front.
1427 vector<string> pool;
1428 for (auto& p : fresh)
1429 {
1430 const string& addr = p.second;
1431 if (setChosen.count(addr))
1432 continue;
1433 map<string, int64>::iterator bi = g_btfPeerBackoff.find(addr);
1434 if (bi != g_btfPeerBackoff.end() && now < bi->second)
1435 continue;
1436 pool.push_back(addr);
1437 }
1438 int nWant = min(nRandomSlots, (int)pool.size());
1439 for (int i = 0; i < nWant; i++)
1440 {
1441 if ((int)vNodes.size() + (int)candidates.size() >= (int)BTF_TARGET_CONN) break;
1442 if ((int)candidates.size() >= nBudget) break;
1443 size_t j = i + (size_t)GetRand((uint64)(pool.size() - i));
1444 std::swap(pool[i], pool[j]);
1445 candidates.push_back(pool[i]);
1446 setChosen.insert(pool[i]);
1112 } 1447 }
1113 } 1448 }
1114 1449
1115 if (candidates.empty()) return; 1450 if (candidates.empty()) return;
1116 1451
1117 // Launch one thread per candidate — all connect attempts run in parallel. 1452 // Resolve every candidate's descriptor in one batched pass (a handful of
1453 // relay round-trips total, one REQ per relay covering all candidates)
1454 // instead of each dial thread independently walking the relay list on
1455 // its own. That per-thread approach meant a 12-candidate pass could fire
1456 // up to 12 * nNostrRelays near-simultaneous connections at the same
1457 // handful of public relays -- enough to trip rate limits or get
1458 // handshakes refused, which then looks exactly like "dead peers" even
1459 // though the descriptors were perfectly resolvable.
1460 map<string, BtfResolvedPeer> resolved;
1461 BtfResolveMany(candidates, resolved);
1462
1463 // Candidates whose descriptor didn't resolve this pass are recorded as a
1464 // failure right away (no point spawning a tunnel thread with nothing to
1465 // dial), same bookkeeping as a failed connect attempt.
1466 vector<string> toDial;
1467 CRITICAL_BLOCK(cs_btfPeerState)
1468 {
1469 for (const string& addr : candidates)
1470 {
1471 if (resolved.count(addr))
1472 {
1473 toDial.push_back(addr);
1474 continue;
1475 }
1476 int n = ++g_btfPeerFails[addr];
1477 int64 cap = (n >= BTF_CHRONIC_FAIL_THRESHOLD) ? BTF_BACKOFF_CAP_SECS_DEAD
1478 : BTF_BACKOFF_CAP_SECS;
1479 int64 secs = 30;
1480 for (int k = 1; k < n && secs < cap; k++) secs *= 2;
1481 if (secs > cap) secs = cap;
1482 g_btfPeerBackoff[addr] = GetTime() + secs;
1483 }
1484 }
1485 if (toDial.empty()) return;
1486
1487 // Launch one thread per resolved candidate -- all connect attempts run in
1488 // parallel, but purely against each peer's own rendezvous meeting node,
1489 // not the shared Nostr relays, so there's no thundering-herd effect here.
1118 // Each thread writes its result back via shared state guarded by cs_btfPeerState. 1490 // Each thread writes its result back via shared state guarded by cs_btfPeerState.
1119 struct DialCtx { string addr; }; 1491 struct DialCtx { string addr; BtfResolvedPeer rp; };
1120 vector<DialCtx*> ctxs; 1492 vector<DialCtx*> ctxs;
1121 for (const string& addr : candidates) 1493 for (const string& addr : toDial)
1122 { 1494 {
1123 DialCtx* ctx = new DialCtx{addr}; 1495 DialCtx* ctx = new DialCtx{addr, resolved[addr]};
1124 ctxs.push_back(ctx); 1496 ctxs.push_back(ctx);
1125 _beginthread([](void* arg) { 1497 _beginthread([](void* arg) {
1126 DialCtx* ctx = (DialCtx*)arg; 1498 DialCtx* ctx = (DialCtx*)arg;
1127 string addr = ctx->addr; 1499 string addr = ctx->addr;
1500 string meeting = ctx->rp.meetingHostPort;
1501 unsigned char enc_pub[32];
1502 memcpy(enc_pub, ctx->rp.enc_pub, 32);
1128 delete ctx; 1503 delete ctx;
1129 1504
1130 CNode* pnode = ConnectNodeBtf(addr); 1505 CNode* pnode = ConnectNodeBtfResolved(addr, meeting, enc_pub);
1131 CRITICAL_BLOCK(cs_btfPeerState) 1506 CRITICAL_BLOCK(cs_btfPeerState)
1132 { 1507 {
1133 if (pnode) 1508 if (pnode)
@@ -1138,13 +1513,16 @@ static void ConnectDiscoveredBtfPeers()
1138 pnode->Release(); 1513 pnode->Release();
1139 g_btfPeerBackoff.erase(addr); 1514 g_btfPeerBackoff.erase(addr);
1140 g_btfPeerFails.erase(addr); 1515 g_btfPeerFails.erase(addr);
1516 g_btfPeerEverConnected.insert(addr);
1141 } 1517 }
1142 else 1518 else
1143 { 1519 {
1144 int n = ++g_btfPeerFails[addr]; 1520 int n = ++g_btfPeerFails[addr];
1521 int64 cap = (n >= BTF_CHRONIC_FAIL_THRESHOLD) ? BTF_BACKOFF_CAP_SECS_DEAD
1522 : BTF_BACKOFF_CAP_SECS;
1145 int64 secs = 30; 1523 int64 secs = 30;
1146 for (int k = 1; k < n && secs < 15*60; k++) secs *= 2; 1524 for (int k = 1; k < n && secs < cap; k++) secs *= 2;
1147 if (secs > 15*60) secs = 15*60; 1525 if (secs > cap) secs = cap;
1148 g_btfPeerBackoff[addr] = GetTime() + secs; 1526 g_btfPeerBackoff[addr] = GetTime() + secs;
1149 } 1527 }
1150 } 1528 }
@@ -1160,16 +1538,16 @@ static void ConnectDiscoveredBtfPeers()
1160 1538
1161void ThreadNostrSeed(void* parg) 1539void ThreadNostrSeed(void* parg)
1162{ 1540{
1163 printf("ThreadNostrSeed started\n"); 1541 LogPrint("nostr", "ThreadNostrSeed started\n");
1164 1542
1165 if (!EnsureNostrKey()) 1543 if (!EnsureNostrKey())
1166 { 1544 {
1167 printf("Nostr: failed to initialize secp256k1 key\n"); 1545 LogPrint("nostr", "Nostr: failed to initialize secp256k1 key\n");
1168 return; 1546 return;
1169 } 1547 }
1170 CNostrKey& key = g_nostrKey; 1548 CNostrKey& key = g_nostrKey;
1171 printf("Nostr: node pubkey = %s\n", key.PubKeyHex().c_str()); 1549 LogPrint("nostr", "Nostr: node pubkey = %s\n", key.PubKeyHex().c_str());
1172 printf("Nostr: node .btf address = %s\n", key.BtfAddress().c_str()); 1550 LogPrint("nostr", "Nostr: node .btf address = %s\n", key.BtfAddress().c_str());
1173 1551
1174 // One-time self-test of the rendezvous: publish our descriptor to a relay, 1552 // One-time self-test of the rendezvous: publish our descriptor to a relay,
1175 // then resolve our OWN .btf address back and verify it self-certifies. Proves 1553 // then resolve our OWN .btf address back and verify it self-certifies. Proves
@@ -1178,17 +1556,20 @@ void ThreadNostrSeed(void* parg)
1178 { 1556 {
1179 try 1557 try
1180 { 1558 {
1181 CWebSocket ws; 1559 CRelayLease lease(pszNostrRelays[i], 10);
1182 if (!ws.Connect(pszNostrRelays[i], 10)) continue; 1560 if (!lease.Connected()) continue;
1561 CWebSocket& ws = lease.Ws();
1183 PublishDescriptor(ws, key); 1562 PublishDescriptor(ws, key);
1184 Sleep(700); // let the relay store the replaceable event 1563 Sleep(700); // let the relay store the replaceable event
1185 btf::Descriptor d; 1564 btf::Descriptor d;
1186 if (ResolveDescriptor(ws, key.ctx, key.BtfAddress(), d)) 1565 if (ResolveDescriptor(ws, key.ctx, key.BtfAddress(), d))
1187 { 1566 {
1188 printf("Nostr: .btf self-resolve OK via %s (meeting_node=%s, enc=%s...)\n", 1567 LogPrint("nostr", "Nostr: .btf self-resolve OK via %s (meeting_node=%s, enc=%s...)\n",
1189 pszNostrRelays[i], d.meeting_node.c_str(), d.enc.substr(0, 16).c_str()); 1568 pszNostrRelays[i], d.meeting_node.c_str(), d.enc.substr(0, 16).c_str());
1569 lease.fOk = true;
1190 break; 1570 break;
1191 } 1571 }
1572 lease.fOk = true;
1192 } 1573 }
1193 CATCH_PRINT_EXCEPTION("btf self-test") 1574 CATCH_PRINT_EXCEPTION("btf self-test")
1194 } 1575 }
@@ -1223,8 +1604,9 @@ void ThreadNostrSeed(void* parg)
1223 ann.dashboardUrl = strPoolDashboardUrl; 1604 ann.dashboardUrl = strPoolDashboardUrl;
1224 ann.feePercent = dPoolFeePercent; 1605 ann.feePercent = dPoolFeePercent;
1225 uint64 roundShares = 0; 1606 uint64 roundShares = 0;
1226 GetPoolOperatorStats(ann.connectedMiners, ann.blocksFound, roundShares); 1607 double totalHashRate = 0.0;
1227 ann.hashRate = 0.0; 1608 GetPoolOperatorStats(ann.connectedMiners, ann.blocksFound, roundShares, totalHashRate);
1609 ann.hashRate = totalHashRate;
1228 ann.createdAt = GetTime(); 1610 ann.createdAt = GetTime();
1229 if (!ann.btfAddress.empty() && !ann.poolName.empty()) 1611 if (!ann.btfAddress.empty() && !ann.poolName.empty())
1230 BtfPublishPoolAnnouncement(ann); 1612 BtfPublishPoolAnnouncement(ann);
diff --git a/src/nostr.h b/src/nostr.h
index 63fc095..37b3b05 100644
--- a/src/nostr.h
+++ b/src/nostr.h
@@ -12,11 +12,17 @@
12 12
13#include <string> 13#include <string>
14#include <vector> 14#include <vector>
15#include <map>
15 16
16// Thread entry point (signature compatible with _beginthread) 17// Thread entry point (signature compatible with _beginthread)
17void ThreadNostrSeed(void* parg); 18void ThreadNostrSeed(void* parg);
18void ThreadBtfPoolAnnouncer(void* parg); 19void ThreadBtfPoolAnnouncer(void* parg);
19 20
21// Set to true to make ThreadBtfPoolAnnouncer publish immediately instead of
22// waiting for its ~60s sleep loop (e.g. right after the operator changes pool
23// name/fee/dashboard URL in Options). The announcer clears it after publishing.
24extern volatile bool gAnnounceNow;
25
20// Public relays used for discovery. Tunable. 26// Public relays used for discovery. Tunable.
21extern const char* pszNostrRelays[]; 27extern const char* pszNostrRelays[];
22extern const int nNostrRelays; 28extern const int nNostrRelays;
@@ -56,6 +62,9 @@ struct BtfPoolAnnouncement
56 } 62 }
57}; 63};
58 64
65// Number of .btf peers discovered from Nostr relays (includes not-yet-connected).
66int GetDiscoveredPeerCount();
67
59// Current live pool announcements discovered from Nostr relays. 68// Current live pool announcements discovered from Nostr relays.
60void BtfGetPoolAnnouncements(std::vector<BtfPoolAnnouncement>& out); 69void BtfGetPoolAnnouncements(std::vector<BtfPoolAnnouncement>& out);
61 70
@@ -78,4 +87,21 @@ std::string BtfLocalAddress();
78bool BtfResolve(const std::string& btfAddr, std::string& meetingHostPort, 87bool BtfResolve(const std::string& btfAddr, std::string& meetingHostPort,
79 unsigned char enc_pub[32]); 88 unsigned char enc_pub[32]);
80 89
90// Result of resolving one .btf address via BtfResolveMany.
91struct BtfResolvedPeer
92{
93 std::string meetingHostPort;
94 unsigned char enc_pub[32];
95};
96
97// Resolve many .btf addresses at once. Batches all still-unresolved addresses
98// into a single Nostr REQ per relay (multiple "authors"), instead of opening
99// one relay connection per address like BtfResolve does. Use this whenever
100// resolving more than a handful of addresses in the same pass -- e.g. before
101// dialing several discovered peers in parallel -- to avoid hammering the
102// same few public relays with a burst of simultaneous connections. Returns
103// true if at least one address resolved; check `out` for which ones.
104bool BtfResolveMany(const std::vector<std::string>& btfAddrs,
105 std::map<std::string, BtfResolvedPeer>& out);
106
81#endif 107#endif
diff --git a/src/rc/addressbook16.bmp b/src/rc/addressbook16.bmp
deleted file mode 100644
index c557691..0000000
--- a/src/rc/addressbook16.bmp
+++ /dev/null
Binary files differ
diff --git a/src/rc/addressbook16mask.bmp b/src/rc/addressbook16mask.bmp
deleted file mode 100644
index d3a478d..0000000
--- a/src/rc/addressbook16mask.bmp
+++ /dev/null
Binary files differ
diff --git a/src/rc/addressbook20.bmp b/src/rc/addressbook20.bmp
deleted file mode 100644
index 2b33b22..0000000
--- a/src/rc/addressbook20.bmp
+++ /dev/null
Binary files differ
diff --git a/src/rc/addressbook20mask.bmp b/src/rc/addressbook20mask.bmp
deleted file mode 100644
index 56ce612..0000000
--- a/src/rc/addressbook20mask.bmp
+++ /dev/null
Binary files differ
diff --git a/src/rc/bitcoin_bc_original.ico b/src/rc/bitcoin_bc_original.ico
deleted file mode 100644
index 88cc240..0000000
--- a/src/rc/bitcoin_bc_original.ico
+++ /dev/null
Binary files differ
diff --git a/src/rc/check.ico b/src/rc/check.ico
deleted file mode 100644
index 0c4e6e8..0000000
--- a/src/rc/check.ico
+++ /dev/null
Binary files differ
diff --git a/src/rc/send16.bmp b/src/rc/send16.bmp
deleted file mode 100644
index 676b5c4..0000000
--- a/src/rc/send16.bmp
+++ /dev/null
Binary files differ
diff --git a/src/rc/send16mask.bmp b/src/rc/send16mask.bmp
deleted file mode 100644
index 06c747f..0000000
--- a/src/rc/send16mask.bmp
+++ /dev/null
Binary files differ
diff --git a/src/rc/send16masknoshadow.bmp b/src/rc/send16masknoshadow.bmp
deleted file mode 100644
index faf24e0..0000000
--- a/src/rc/send16masknoshadow.bmp
+++ /dev/null
Binary files differ
diff --git a/src/rc/send20.bmp b/src/rc/send20.bmp
deleted file mode 100644
index 2b90422..0000000
--- a/src/rc/send20.bmp
+++ /dev/null
Binary files differ
diff --git a/src/rc/send20mask.bmp b/src/rc/send20mask.bmp
deleted file mode 100644
index f124d0d..0000000
--- a/src/rc/send20mask.bmp
+++ /dev/null
Binary files differ
diff --git a/src/rpc.cpp b/src/rpc.cpp
index 99d182e..1b529e8 100644
--- a/src/rpc.cpp
+++ b/src/rpc.cpp
@@ -1,14 +1,19 @@
1// Copyright (c) 2009 Satoshi Nakamoto / Copyright (c) 2026 Bitflash developers 1// Copyright (c) 2009 Satoshi Nakamoto / Copyright (c) 2026 Bitflash developers
2// Distributed under the MIT/X11 software license. 2// Distributed under the MIT/X11 software license.
3// 3//
4// Bitflash pool server — .btf-only pool listener. 4// Bitflash pool server -- .btf Stratum pool, operator side.
5// Miners connect through rendezvous tunnels; no raw IP:port endpoints remain.
6// Pending payouts are held until maturity and shown in the GUI.
7// 5//
8// Compiles on both Windows (mingw) and Linux unchanged. 6// Architecture:
9// Launched from ui.cpp (GUI) and headless.cpp (node) via ThreadRPCServer(). 7// PoolEventLoop -- single thread, owns all miner fds, all job/share/payout
8// state. No locks needed on any of that data.
9// AcceptOneFn -- one thread per relay. Blocks on RvServiceRegister +
10// BtfServiceWrap, pushes finished socket to gReadyQueue.
11// AcceptLoopFn -- spawns AcceptOneFn threads, re-polls relay list every
12// 60s so dynamically discovered relays get picked up.
13//
14// GUI-visible state is snapshotted under gStatsMutex every 2s.
15// Accept queue handoff uses gReadyMutex (held for microseconds).
10 16
11// nlohmann must be included before headers.h because util.h redefines snprintf
12#pragma push_macro("snprintf") 17#pragma push_macro("snprintf")
13#undef snprintf 18#undef snprintf
14#include <nlohmann/json.hpp> 19#include <nlohmann/json.hpp>
@@ -20,8 +25,6 @@
20#endif 25#endif
21#include "btftunnel.h" 26#include "btftunnel.h"
22 27
23// POSIX socket headers — already provided by compat.h on Windows,
24// and by the OS directly on Linux.
25#ifndef _WIN32 28#ifndef _WIN32
26#include <sys/socket.h> 29#include <sys/socket.h>
27#include <sys/select.h> 30#include <sys/select.h>
@@ -33,14 +36,15 @@
33#include <atomic> 36#include <atomic>
34#include <mutex> 37#include <mutex>
35#include <map> 38#include <map>
39#include <set>
36#include <deque> 40#include <deque>
41#include <vector>
42#include <algorithm>
37#include <sstream> 43#include <sstream>
38#include <iomanip> 44#include <iomanip>
39#include <ctime>
40 45
41using json = nlohmann::json; 46using json = nlohmann::json;
42 47
43// Cross-platform socket close / send flags
44#ifdef _WIN32 48#ifdef _WIN32
45#define sock_close(s) closesocket(s) 49#define sock_close(s) closesocket(s)
46#define SEND_FLAGS 0 50#define SEND_FLAGS 0
@@ -49,660 +53,1260 @@ using json = nlohmann::json;
49#define SEND_FLAGS MSG_NOSIGNAL 53#define SEND_FLAGS MSG_NOSIGNAL
50#endif 54#endif
51 55
52// Cross-platform thread launch: wraps _beginthread (compat.h maps it to
53// pthread_create+detach on Linux, native _beginthread on Windows).
54// fn must be void(*)(void*).
55static void LaunchThread(void (*fn)(void*), void* arg)
56{
57 _beginthread(fn, 0, arg);
58}
59
60// ---------------------------------------------------------------------------
61// Config — set by headless.cpp / ui.cpp before threads launch
62// ---------------------------------------------------------------------------
63std::string gRpcUser;
64std::string gRpcPassword;
65
66// Pool server running flag — set false to stop server cleanly (all loops check it)
67volatile bool gPoolRunning = false; 56volatile bool gPoolRunning = false;
68 57
69// --------------------------------------------------------------------------- 58// ---------------------------------------------------------------------------
70// Stubs for symbols absent from Bitflash 0.1.0
71// ---------------------------------------------------------------------------
72double dHashesPerSec = 0.0;
73int64 nHPSTimerStart = 0;
74
75static bool IsInitialBlockDownload()
76{
77 return (pindexBest == NULL || nBestHeight < 1);
78}
79
80// ---------------------------------------------------------------------------
81// Hex helpers 59// Hex helpers
82// --------------------------------------------------------------------------- 60// ---------------------------------------------------------------------------
83static std::string ToHex(const void* p, size_t n) 61static std::string ToHex(const void* p, size_t n)
84{ 62{
85 const unsigned char* b = (const unsigned char*)p; 63 const unsigned char* b = (const unsigned char*)p;
86 std::string s; s.reserve(n*2); 64 std::string s; s.reserve(n * 2);
87 static const char* H = "0123456789abcdef"; 65 static const char* H = "0123456789abcdef";
88 for (size_t i = 0; i < n; i++) { s += H[b[i]>>4]; s += H[b[i]&0xf]; } 66 for (size_t i = 0; i < n; i++) { s += H[b[i] >> 4]; s += H[b[i] & 0xf]; }
89 return s; 67 return s;
90} 68}
69
91static std::vector<unsigned char> FromHex(const std::string& s) 70static std::vector<unsigned char> FromHex(const std::string& s)
92{ 71{
93 std::vector<unsigned char> v; 72 std::vector<unsigned char> v;
94 for (size_t i = 0; i+1 < s.size(); i += 2) { 73 for (size_t i = 0; i + 1 < s.size(); i += 2) {
95 auto h=[](char c)->int{ 74 auto h = [](char c) -> int {
96 if(c>='0'&&c<='9') return c-'0'; 75 if (c >= '0' && c <= '9') return c - '0';
97 if(c>='a'&&c<='f') return c-'a'+10; 76 if (c >= 'a' && c <= 'f') return c - 'a' + 10;
98 if(c>='A'&&c<='F') return c-'A'+10; 77 if (c >= 'A' && c <= 'F') return c - 'A' + 10;
99 return 0; 78 return 0;
100 }; 79 };
101 v.push_back((unsigned char)((h(s[i])<<4)|h(s[i+1]))); 80 v.push_back((unsigned char)((h(s[i]) << 4) | h(s[i + 1])));
102 } 81 }
103 return v; 82 return v;
104} 83}
105 84
106// --------------------------------------------------------------------------- 85// ---------------------------------------------------------------------------
107// PPLNS share tracking 86// Job -- written and read exclusively by the event loop thread
108// ---------------------------------------------------------------------------
109struct Share {
110 std::string minerAddress;
111 int64 timestamp;
112 uint64 difficulty;
113};
114
115struct MinerStats {
116 std::string address;
117 std::string worker;
118 uint64 totalShares = 0;
119 uint64 roundShares = 0;
120 int64 lastSeen = 0;
121};
122static std::mutex gMinerStatsMutex;
123static std::map<std::string, MinerStats> gMinerStats;
124
125struct FoundBlock {
126 int height;
127 int64 timestamp;
128 std::string minerAddress;
129 uint256 hash;
130};
131static std::mutex gBlocksMutex;
132static std::deque<FoundBlock> gFoundBlocks;
133
134struct Miner;
135static std::mutex gMinersMutex;
136static std::vector<Miner*> gMiners;
137
138static std::string MinerKey(const std::string& address, const std::string& worker)
139{
140 return address + "\n" + worker;
141}
142
143void GetPoolWorkerStats(std::vector<PoolWorkerStatView>& out)
144{
145 out.clear();
146 int64 now = GetTime();
147 std::lock_guard<std::mutex> lk(gMinerStatsMutex);
148 for (std::map<std::string, MinerStats>::const_iterator it = gMinerStats.begin(); it != gMinerStats.end(); ++it)
149 {
150 const MinerStats& ms = it->second;
151 if (ms.lastSeen <= 0)
152 continue;
153 if (now - ms.lastSeen > 15 * 60)
154 continue;
155 PoolWorkerStatView view;
156 view.address = ms.address;
157 view.worker = ms.worker;
158 view.totalShares = ms.totalShares;
159 view.roundShares = ms.roundShares;
160 view.lastSeen = ms.lastSeen;
161 out.push_back(view);
162 }
163 std::sort(out.begin(), out.end(), [](const PoolWorkerStatView& a, const PoolWorkerStatView& b) {
164 if (a.roundShares != b.roundShares) return a.roundShares > b.roundShares;
165 if (a.totalShares != b.totalShares) return a.totalShares > b.totalShares;
166 return a.lastSeen > b.lastSeen;
167 });
168}
169
170// ---------------------------------------------------------------------------
171// Current mining job
172// --------------------------------------------------------------------------- 87// ---------------------------------------------------------------------------
173struct StratumJob { 88struct StratumJob {
174 std::string jobId; 89 std::string jobId;
175 CBlock block; 90 CBlock block;
176 uint256 target; 91 uint256 target; // full block target; share targets are per-miner via vardiff
177 uint256 shareTarget;
178 int height; 92 int height;
179}; 93};
94static StratumJob gCurrentJob;
95static bool gHaveJob = false;
96
97// Compute a share target from a Stratum difficulty value.
98// Stratum difficulty 1 must correspond to THIS chain's easiest allowed target
99// (bnProofOfWorkLimit = ~uint256(0) >> 12, compact 0x1f0fffff), not Bitcoin's
100// SHA256 diff-1 target (0x1d00ffff). Those differ by about 2^20 (~1e6x):
101// Bitcoin's diff-1 needs ~2^32 hashes/share on average, while this chain's PoW
102// floor needs only ~2^12. Using the Bitcoin constant made every miner's
103// "difficulty 1" about a million times harder than the chain's own floor, so a
104// worker could hash for minutes without ever finding a share -- and vardiff
105// never gets the samples it needs to correct course, because no share ever
106// comes in for it to measure. Base off the actual chain limit instead so
107// difficulty 1 is genuinely easy and vardiff has real data to retarget from.
108// Higher difficulty = smaller (harder) target.
109static uint256 ShareTargetFromDifficulty(double difficulty)
110{
111 if (difficulty <= 0.0) difficulty = 1.0;
112 static const uint256 diff1 = CBigNum(bnProofOfWorkLimit).getuint256();
113 // shareTarget = diff1 / difficulty
114 CBigNum bn; bn.setuint256(diff1);
115 // Multiply by 2^16 to keep precision, divide, shift back
116 bn <<= 16;
117 bn /= (uint64)(difficulty * 65536.0);
118 uint256 t = bn.getuint256();
119 // Cap at all-ones (maximum, easiest possible)
120 if (t < diff1 && difficulty < 1.0) t = ~uint256(0);
121 return t;
122}
180 123
181static std::mutex gJobMutex; 124// Expected number of hashes to find one share at a given Stratum difficulty,
182static StratumJob gCurrentJob; 125// on this chain's scale (difficulty 1 == bnProofOfWorkLimit, which needs on
183static bool gHaveJob = false; 126// average 2^12 = 4096 hashes). Used to turn "shares per second" into H/s.
184static std::atomic<uint32_t> gJobSeq{0}; 127static const double SHARE_HASHES_AT_DIFF_1 = 4096.0;
185 128static double ExpectedHashesForDifficulty(double difficulty)
186static uint256 MakeShareTarget(const uint256& blockTarget)
187{ 129{
188 uint256 shareTarget = blockTarget; 130 if (difficulty <= 0.0) difficulty = 1.0;
189 shareTarget <<= 8; 131 return difficulty * SHARE_HASHES_AT_DIFF_1;
190 if (shareTarget < blockTarget)
191 shareTarget = ~uint256(0);
192 return shareTarget;
193} 132}
194 133
134// Rebuild the current job from the best chain tip.
135// Must be called from the event loop thread (or startup, before the loop).
136// Returns true on success. Logs the specific failure reason on false.
195static bool RebuildJob() 137static bool RebuildJob()
196{ 138{
197 if (!pindexBest) return false; 139 CRITICAL_BLOCK(cs_main)
140 {
141 if (!pindexBest) {
142 LogPrint("pool", "RebuildJob: no chain tip (pindexBest is null)\n");
143 return false;
144 }
198 145
199 CBlockIndex* pindexPrev = pindexBest; 146 CBlockIndex* pindexPrev = pindexBest;
200 unsigned int nBits = GetNextWorkRequired(pindexPrev); 147 unsigned int nBits = GetNextWorkRequired(pindexPrev);
201 148
202 CKey key; 149 CKey key; key.MakeNewKey();
203 key.MakeNewKey(); 150 static std::atomic<uint32_t> sExtra{0};
204 static std::atomic<uint32_t> sExtra{0}; 151 uint32_t extraNonce = ++sExtra;
205 uint32_t extraNonce = ++sExtra;
206 152
207 CTransaction txNew; 153 CTransaction txNew;
208 txNew.vin.resize(1); 154 txNew.vin.resize(1);
209 txNew.vin[0].prevout.SetNull(); 155 txNew.vin[0].prevout.SetNull();
210 txNew.vin[0].scriptSig << nBits << (CBigNum)extraNonce; 156 txNew.vin[0].scriptSig << nBits << (CBigNum)extraNonce;
211 txNew.vout.resize(1); 157 txNew.vout.resize(1);
212 // Always pay coinbase to a fresh wallet key. DoPayouts() distributes 158 txNew.vout[0].scriptPubKey << key.GetPubKey() << OP_CHECKSIG;
213 // shares to miners via SendMoney() after the block is accepted.
214 txNew.vout[0].scriptPubKey << key.GetPubKey() << OP_CHECKSIG;
215 159
216 CBlock block; 160 CBlock block;
217 block.vtx.push_back(txNew); 161 block.vtx.push_back(txNew);
218 162
219 {
220 CTxDB txdb("r");
221 CRITICAL_BLOCK(cs_mapTransactions)
222 { 163 {
223 map<uint256,CTxIndex> pool; 164 CTxDB txdb("r");
224 unsigned int sz = 0; 165 CRITICAL_BLOCK(cs_mapTransactions)
225 for (auto& kv : mapTransactions) { 166 {
226 CTransaction& tx = kv.second; 167 map<uint256, CTxIndex> pool;
227 if (tx.IsCoinBase() || !tx.IsFinal()) continue; 168 unsigned int sz = 0;
228 int64 nFees = 0; 169 for (auto& kv : mapTransactions) {
229 int64 nMinFee = tx.GetMinFee(block.vtx.size() < 100); 170 CTransaction& tx = kv.second;
230 map<uint256,CTxIndex> tmp(pool); 171 if (tx.IsCoinBase() || !tx.IsFinal()) continue;
231 if (!tx.ConnectInputs(txdb, tmp, CDiskTxPos(1,1,1), 0, nFees, false, true, nMinFee)) continue; 172 int64 nFees = 0;
232 pool = tmp; 173 map<uint256, CTxIndex> tmp(pool);
233 block.vtx.push_back(tx); 174 if (!tx.ConnectInputs(txdb, tmp, CDiskTxPos(1,1,1), 0, nFees,
234 sz += ::GetSerializeSize(tx, SER_NETWORK); 175 false, true, tx.GetMinFee(block.vtx.size() < 100)))
235 if (sz > MAX_SIZE/2) break; 176 continue;
177 pool = tmp;
178 block.vtx.push_back(tx);
179 sz += ::GetSerializeSize(tx, SER_NETWORK);
180 if (sz > MAX_SIZE / 2) break;
181 }
236 } 182 }
237 } 183 }
184
185 block.vtx[0].vout[0].nValue = block.GetBlockValue(0);
186 block.hashPrevBlock = pindexPrev->GetBlockHash();
187 block.hashMerkleRoot = block.BuildMerkleTree();
188 block.nTime = max((unsigned int)(pindexPrev->GetMedianTimePast() + 1),
189 (unsigned int)GetAdjustedTime());
190 block.nBits = nBits;
191 block.nNonce = 1;
192 AddKey(key);
193
194 StratumJob job;
195 job.jobId = ToHex(&extraNonce, 4);
196 job.block = block;
197 job.target = CBigNum().SetCompact(nBits).getuint256();
198 job.height = nBestHeight + 1;
199
200 gCurrentJob = job;
201 gHaveJob = true;
202 return true;
238 } 203 }
239 block.vtx[0].vout[0].nValue = block.GetBlockValue(0); 204 return false;
240 block.hashPrevBlock = pindexPrev->GetBlockHash();
241 block.hashMerkleRoot = block.BuildMerkleTree();
242 block.nTime = max((unsigned int)(pindexPrev->GetMedianTimePast()+1),
243 (unsigned int)GetAdjustedTime());
244 block.nBits = nBits;
245 block.nNonce = 1;
246
247 AddKey(key);
248
249 StratumJob job;
250 job.jobId = ToHex(&extraNonce, 4);
251 job.block = block;
252 job.target = CBigNum().SetCompact(nBits).getuint256();
253 job.shareTarget = MakeShareTarget(job.target);
254 job.height = nBestHeight + 1;
255
256 std::lock_guard<std::mutex> lk(gJobMutex);
257 gCurrentJob = job;
258 gHaveJob = true;
259 ++gJobSeq;
260 return true;
261} 205}
262 206
263// --------------------------------------------------------------------------- 207// ---------------------------------------------------------------------------
264// PPLNS payout 208// Payouts -- event loop thread only
265// ---------------------------------------------------------------------------
266// ---------------------------------------------------------------------------
267// Deferred payouts — coinbase outputs require COINBASE_MATURITY (100) blocks
268// before they can be spent. We store the share snapshot when a block is found
269// and execute the actual SendMoney() calls once the coinbase matures.
270// --------------------------------------------------------------------------- 209// ---------------------------------------------------------------------------
271struct PendingPayout { 210struct PendingPayout {
272 int matureAtHeight; // pay out when nBestHeight >= this 211 int matureAtHeight;
273 std::map<std::string, int64> amounts; // addr -> BTF amount 212 std::map<std::string, int64> amounts; // address -> satoshis
274}; 213};
214static std::vector<PendingPayout> gPendingPayouts;
275 215
276static std::mutex gPayoutMutex; 216static std::string PayoutFilePath()
277static std::vector<PendingPayout> gPendingPayouts; 217{
218 return GetAppDir() + "/pending_payouts.json";
219}
278 220
279void GetPendingPayouts(std::vector<PendingPayoutView>& out) 221static void SavePendingPayouts()
280{ 222{
281 out.clear(); 223 nlohmann::json arr = nlohmann::json::array();
282 std::lock_guard<std::mutex> lk(gPayoutMutex); 224 for (const auto& pp : gPendingPayouts) {
283 for (const PendingPayout& p : gPendingPayouts) 225 nlohmann::json obj;
284 { 226 obj["matureAtHeight"] = pp.matureAtHeight;
285 PendingPayoutView view; 227 nlohmann::json amounts = nlohmann::json::object();
286 view.matureAtHeight = p.matureAtHeight; 228 for (const auto& kv : pp.amounts)
287 view.recipients = (int)p.amounts.size(); 229 amounts[kv.first] = kv.second;
288 view.totalAmount = 0; 230 obj["amounts"] = amounts;
289 for (const std::map<std::string, int64>::value_type& kv : p.amounts) 231 arr.push_back(obj);
290 view.totalAmount += kv.second; 232 }
291 out.push_back(view); 233 std::string path = PayoutFilePath();
234 FILE* f = fopen(path.c_str(), "w");
235 if (f) {
236 std::string s = arr.dump(2);
237 fwrite(s.c_str(), 1, s.size(), f);
238 fclose(f);
239 } else {
240 LogPrint("payout", "[payout] WARNING: could not write %s\n", path.c_str());
292 } 241 }
293} 242}
294 243
295// Called when a block is found: snapshot shares, schedule payout for maturity. 244static void LoadPendingPayouts()
296static void QueuePayouts(int blockHeight)
297{ 245{
298 if (nMineMode != MINE_OPERATOR) return; 246 std::string path = PayoutFilePath();
299 247 FILE* f = fopen(path.c_str(), "r");
300 std::map<std::string, uint64> shareCount; 248 if (!f) return; // no file yet -- first run, nothing to load
301 uint64 total = 0; 249 fseek(f, 0, SEEK_END);
302 { 250 long sz = ftell(f);
303 std::lock_guard<std::mutex> lk(gMinerStatsMutex); 251 fseek(f, 0, SEEK_SET);
304 for (std::map<std::string, MinerStats>::iterator it = gMinerStats.begin(); it != gMinerStats.end(); ++it) 252 std::string s(sz, '\0');
305 { 253 fread(&s[0], 1, sz, f);
306 MinerStats& ms = it->second; 254 fclose(f);
307 if (ms.roundShares == 0) 255 try {
308 continue; 256 nlohmann::json arr = nlohmann::json::parse(s);
309 if (ms.address.empty()) 257 for (const auto& obj : arr) {
310 continue; 258 PendingPayout pp;
311 shareCount[ms.address] += ms.roundShares; 259 pp.matureAtHeight = obj["matureAtHeight"].get<int>();
312 total += ms.roundShares; 260 for (auto it = obj["amounts"].begin(); it != obj["amounts"].end(); ++it)
313 ms.roundShares = 0; 261 pp.amounts[it.key()] = it.value().get<int64>();
262 gPendingPayouts.push_back(pp);
314 } 263 }
264 LogPrint("payout", "[payout] loaded %zu pending payout(s) from disk\n",
265 gPendingPayouts.size());
266 } catch (const std::exception& e) {
267 LogPrint("payout", "[payout] WARNING: failed to parse %s: %s\n",
268 path.c_str(), e.what());
269 }
270}
271
272// Payouts ready to execute are moved here under gPayoutExecMutex.
273// A dedicated thread drains this list so SendMoney (which takes cs_main)
274// never runs on the event loop thread and can't stall miner I/O.
275static std::vector<PendingPayout> gPayoutExecQueue;
276static std::mutex gPayoutExecMutex;
277static std::atomic<bool> gPayoutThreadRunning{false};
278
279static void QueuePayouts(int blockHeight,
280 const std::map<std::string, uint64>& shareCount,
281 uint64 total)
282{
283 if (total == 0) {
284 LogPrint("payout", "[payout] block %d: zero shares recorded -- nothing to pay out\n",
285 blockHeight);
286 return;
315 } 287 }
316 if (total == 0) return;
317 288
318 int64 blockReward = CBlock().GetBlockValue(0); 289 double feeFrac = dPoolFeePercent / 100.0;
290 if (feeFrac < 0.0) feeFrac = 0.0;
291 if (feeFrac > 1.0) feeFrac = 1.0;
292
293 // Compute the block subsidy at the height that was just found.
294 // We do not include tx fees in miner payout -- those stay in the operator
295 // wallet as part of the coinbase, which is the operator's cut on top of feeFrac.
296 int64 nSubsidy = 50 * COIN;
297 nSubsidy >>= (blockHeight / 210000); // halving schedule
298 int64 minerReward = (int64)((double)nSubsidy * (1.0 - feeFrac));
299
319 PendingPayout pp; 300 PendingPayout pp;
320 pp.matureAtHeight = blockHeight + COINBASE_MATURITY; 301 pp.matureAtHeight = blockHeight + COINBASE_MATURITY;
302
303 int skipped = 0;
304 int64 burned = 0; // amount owed to miners with bad/empty addresses
321 for (auto& kv : shareCount) { 305 for (auto& kv : shareCount) {
322 int64 amount = (int64)(((double)kv.second / (double)total) * (double)blockReward); 306 int64 amount = (int64)(((double)kv.second / (double)total) * (double)minerReward);
323 if (amount >= CENT) 307 if (amount < CENT) {
324 pp.amounts[kv.first] = amount; 308 skipped++;
309 continue;
310 }
311 uint160 addrCheck;
312 if (kv.first.empty() || !AddressToHash160(kv.first, addrCheck)) {
313 // Address was invalid at authorize time (warned then). Their share
314 // of the reward cannot be paid -- log the amount so it's visible.
315 burned += amount;
316 LogPrint("payout", "[payout] WARNING: %s owed to miner with invalid"
317 " address '%s' -- cannot pay out, amount forfeited\n",
318 FormatMoney(amount).c_str(), kv.first.c_str());
319 continue;
320 }
321 pp.amounts[kv.first] = amount;
325 } 322 }
326 323
327 { std::lock_guard<std::mutex> lk(gPayoutMutex); gPendingPayouts.push_back(pp); } 324 gPendingPayouts.push_back(pp);
328 325 SavePendingPayouts();
329 printf("Pool: block %d payout queued for height %d (%zu miners)\n", 326
330 blockHeight, pp.matureAtHeight, pp.amounts.size()); 327 int64 operatorCut = nSubsidy - minerReward;
328 LogPrint("payout",
329 "[payout] block %d: subsidy %s BTF, miners get %s"
330 " (fee %.2f%% = %s to operator),"
331 " %zu recipients, matures height %d,"
332 " %d below dust%s\n",
333 blockHeight,
334 FormatMoney(nSubsidy).c_str(),
335 FormatMoney(minerReward).c_str(),
336 dPoolFeePercent,
337 FormatMoney(operatorCut).c_str(),
338 pp.amounts.size(), pp.matureAtHeight, skipped,
339 burned > 0 ? (", " + FormatMoney(burned) + " forfeited (bad address)").c_str()
340 : "");
331} 341}
332 342
333// Called from JobWatcher every new block: execute any matured payouts. 343// Called from event loop: move matured entries to the exec queue (fast).
344// Save BEFORE moving to exec queue: if we crash between the save and SendMoney,
345// LoadPendingPayouts re-queues them from the exec-queue section of the file.
334static void FlushMaturePayouts() 346static void FlushMaturePayouts()
335{ 347{
336 if (nMineMode != MINE_OPERATOR) return; 348 std::vector<PendingPayout> ready;
337
338 std::lock_guard<std::mutex> lk(gPayoutMutex);
339 for (auto it = gPendingPayouts.begin(); it != gPendingPayouts.end(); ) { 349 for (auto it = gPendingPayouts.begin(); it != gPendingPayouts.end(); ) {
340 if (nBestHeight < it->matureAtHeight) { ++it; continue; } 350 if (nBestHeight < it->matureAtHeight) { ++it; continue; }
341 351 LogPrint("payout", "[payout] block height %d matured -- queuing %zu payments\n",
342 printf("Pool: executing payout for block matured at height %d\n", it->matureAtHeight); 352 it->matureAtHeight, it->amounts.size());
343 for (auto& kv : it->amounts) { 353 ready.push_back(*it); // copy first; erase after save
344 uint160 hash160; 354 ++it;
345 if (!AddressToHash160(kv.first, hash160)) continue; 355 }
346 CScript scriptPubKey; 356 if (!ready.empty()) {
347 scriptPubKey << OP_DUP << OP_HASH160 << hash160 << OP_EQUALVERIFY << OP_CHECKSIG; 357 // Erase from pending then save before handing off to exec thread,
348 CWalletTx wtx; 358 // so the file never contains an entry that is already being sent.
349 wtx.mapValue["comment"] = strprintf("Pool payout height %d", it->matureAtHeight); 359 for (auto it = gPendingPayouts.begin(); it != gPendingPayouts.end(); ) {
350 if (SendMoney(scriptPubKey, kv.second, wtx)) 360 if (nBestHeight >= it->matureAtHeight)
351 printf("Pool: paid %s to %s\n", FormatMoney(kv.second).c_str(), kv.first.c_str()); 361 it = gPendingPayouts.erase(it);
352 else 362 else
353 printf("Pool: payout FAILED for %s (will not retry)\n", kv.first.c_str()); 363 ++it;
364 }
365 SavePendingPayouts();
366 std::lock_guard<std::mutex> lk(gPayoutExecMutex);
367 for (auto& pp : ready)
368 gPayoutExecQueue.push_back(std::move(pp));
369 }
370}
371
372// Payout execution thread: drains gPayoutExecQueue, calls SendMoney.
373// Runs independently of the event loop so slow wallet operations
374// (SendMoney takes cs_main) never stall miner I/O.
375static void PayoutThreadFn(void*)
376{
377 gPayoutThreadRunning = true;
378 LogPrint("payout", "[payout] payout thread started\n");
379
380 while (!fShutdown && gPoolRunning) {
381 std::vector<PendingPayout> batch;
382 {
383 std::lock_guard<std::mutex> lk(gPayoutExecMutex);
384 batch.swap(gPayoutExecQueue);
385 }
386
387 for (auto& pp : batch) {
388 LogPrint("payout", "[payout] executing payments for block matured at %d"
389 " (%zu miners)\n", pp.matureAtHeight, pp.amounts.size());
390 for (auto& kv : pp.amounts) {
391 uint160 h160;
392 if (!AddressToHash160(kv.first, h160)) {
393 // Should not happen -- bad addresses are filtered in QueuePayouts
394 LogPrint("payout", "[payout] SKIPPED bad address '%s'\n",
395 kv.first.c_str());
396 continue;
397 }
398 CScript sc;
399 sc << OP_DUP << OP_HASH160 << h160 << OP_EQUALVERIFY << OP_CHECKSIG;
400 CWalletTx wtx;
401 wtx.mapValue["comment"] = strprintf("Pool payout height %d",
402 pp.matureAtHeight);
403 if (SendMoney(sc, kv.second, wtx))
404 LogPrint("payout", "[payout] paid %s to %s\n",
405 FormatMoney(kv.second).c_str(), kv.first.c_str());
406 else
407 LogPrint("payout", "[payout] FAILED to pay %s to %s"
408 " (insufficient funds or wallet locked?)\n",
409 FormatMoney(kv.second).c_str(), kv.first.c_str());
410 }
354 } 411 }
355 it = gPendingPayouts.erase(it); 412
413 Sleep(500); // check for new work every 500ms
356 } 414 }
415
416 gPayoutThreadRunning = false;
417 LogPrint("payout", "[payout] payout thread stopped\n");
357} 418}
358 419
359// --------------------------------------------------------------------------- 420// ---------------------------------------------------------------------------
360// Stratum protocol 421// GUI stats snapshot -- event loop writes, GUI threads read
361// --------------------------------------------------------------------------- 422// ---------------------------------------------------------------------------
362static json MakeNotifyParams(const StratumJob& job, bool clean) 423struct StatsSnapshot {
424 int authorizedMiners = 0;
425 int blocksFound = 0;
426 uint64 roundShares = 0;
427 double totalHashRate = 0.0;
428};
429static StatsSnapshot gStats;
430static std::vector<PoolWorkerStatView> gWorkerStats;
431static std::vector<PendingPayoutView> gPayoutViews;
432static std::mutex gStatsMutex;
433
434void GetPoolOperatorStats(int& authorizedMiners, int& blocksFound, uint64& roundShares, double& totalHashRate)
363{ 435{
364 CBlock& b = const_cast<CBlock&>(job.block); 436 std::lock_guard<std::mutex> lk(gStatsMutex);
365 unsigned char hdr[80]; 437 authorizedMiners = gStats.authorizedMiners;
366 memcpy(hdr, &b.nVersion, 4); 438 blocksFound = gStats.blocksFound;
367 memcpy(hdr+4, &b.hashPrevBlock, 32); 439 roundShares = gStats.roundShares;
368 memcpy(hdr+36, &b.hashMerkleRoot, 32); 440 totalHashRate = gStats.totalHashRate;
369 memcpy(hdr+68, &b.nTime, 4); 441}
370 memcpy(hdr+72, &b.nBits, 4); 442
371 memcpy(hdr+76, &b.nNonce, 4); 443void GetPoolWorkerStats(std::vector<PoolWorkerStatView>& out)
372 unsigned char shareTgt[32]; memcpy(shareTgt, &job.shareTarget, 32); 444{
373 return json::array({job.jobId, ToHex(hdr,80), b.hashPrevBlock.GetHex(), ToHex(shareTgt,32), clean}); 445 std::lock_guard<std::mutex> lk(gStatsMutex);
446 out = gWorkerStats;
447}
448
449void GetPendingPayouts(std::vector<PendingPayoutView>& out)
450{
451 std::lock_guard<std::mutex> lk(gStatsMutex);
452 out = gPayoutViews;
374} 453}
375 454
455// ---------------------------------------------------------------------------
456// Miner state -- event loop thread only
457// ---------------------------------------------------------------------------
458static std::atomic<uint32_t> gNextExtranonce2{1};
459
460// Vardiff target: aim for one share every VARDIFF_TARGET_SECS seconds per miner.
461// After VARDIFF_SHARES_PER_CHECK shares, recalculate and adjust if rate is off
462// by more than 50%. Shares are the stable unit; difficulty floats to match.
463static const int64 VARDIFF_TARGET_SECS = 15; // one share every 15s
464static const uint64 VARDIFF_SHARES_PER_CHECK = 5; // re-evaluate every 5 shares
465static const double VARDIFF_RETARGET_RATIO = 1.5; // adjust if >50% off target
466static const double VARDIFF_MIN = 0.001;
467static const double VARDIFF_MAX = 1e12;
468// If a miner has gone this long since its vardiff window opened with ZERO
469// shares, the normal vardiff retarget (which only fires after
470// VARDIFF_SHARES_PER_CHECK shares) can never trigger -- it has no samples to
471// act on. This is the residual gap the ShareTargetFromDifficulty fix above
472// doesn't cover: even with a correctly-easy diff-1 target, a miner stuck in
473// RandomX light mode (or otherwise much slower than expected) can go
474// indefinitely without a single share, and difficulty would never drop to
475// meet it. Force a difficulty cut on a timeout instead of waiting for shares
476// that will never come.
477static const int64 VARDIFF_STALL_SECS = 45; // 3x share target -- reacts faster without false-triggering on normal variance
478static const double VARDIFF_STALL_CUT = 4.0; // divide difficulty by this much
479
376struct Miner { 480struct Miner {
377 SOCKET fd; 481 btf_socket_t fd;
378 bool authorised; 482 bool authorised = false;
379 std::string address; 483 std::string address;
380 std::string worker; 484 std::string worker;
381 std::string readBuf; 485 std::string readBuf;
382 int64 connectTime; 486 int64 connectTime;
383 uint64 sessionShares; 487 uint64 sessionShares = 0;
384 Miner(SOCKET f) : fd(f), authorised(false), connectTime(GetTime()), sessionShares(0) {} 488 uint64 roundShares = 0;
489 uint64 totalShares = 0;
490 int64 lastSeen = 0;
491 uint32_t extranonce2;
492
493 // Vardiff state
494 double difficulty = 1.0; // current share difficulty sent to this miner
495 uint256 shareTarget; // derived from difficulty; what we check against
496 int64 vardiffWindowStart = 0; // when the current vardiff window opened
497 uint64 vardiffShares = 0; // shares found in current window
498
499 // Hashrate estimate -- EWMA of (expected hashes per share at current
500 // difficulty) / (seconds since the previous share). We had all the data
501 // to compute this (difficulty + share timing) but never actually did,
502 // so pool/GUI hashrate always showed as zero/missing.
503 int64 lastShareTime = 0; // GetTime() of the previous accepted share
504 double hashRate = 0.0; // smoothed H/s estimate
505
506 explicit Miner(btf_socket_t f)
507 : fd(f), connectTime(GetTime()),
508 extranonce2(gNextExtranonce2.fetch_add(1)) {}
385}; 509};
386 510
387void GetPoolOperatorStats(int& authorizedMiners, int& blocksFound, uint64& roundShares) 511static std::vector<Miner*> gMiners;
512
513struct FoundBlock { int height; int64 ts; std::string addr; };
514static std::deque<FoundBlock> gFoundBlocks;
515
516// ---------------------------------------------------------------------------
517// Accept queue -- accept threads push; event loop pops at top of each tick
518// ---------------------------------------------------------------------------
519static std::vector<btf_socket_t> gReadyQueue;
520static std::mutex gReadyMutex;
521
522static void PushReady(btf_socket_t s)
388{ 523{
389 authorizedMiners = 0; 524 std::lock_guard<std::mutex> lk(gReadyMutex);
390 blocksFound = 0; 525 gReadyQueue.push_back(s);
391 roundShares = 0; 526}
392 { 527
393 std::lock_guard<std::mutex> lk(gMinersMutex); 528// ---------------------------------------------------------------------------
394 for (Miner* m : gMiners) 529// I/O helpers -- event loop thread only
395 if (m->authorised) 530// ---------------------------------------------------------------------------
396 authorizedMiners++; 531
532// Blocking send of a complete JSON line. Called only from the event loop so
533// no other thread is writing to the same fd concurrently.
534static bool SendLine(btf_socket_t fd, const json& j)
535{
536 std::string s = j.dump() + "\n";
537 int off = 0, total = (int)s.size();
538 while (off < total) {
539 int r = send(fd, s.c_str() + off, total - off, SEND_FLAGS);
540 if (r <= 0) return false;
541 off += r;
397 } 542 }
398 { 543 return true;
399 std::lock_guard<std::mutex> lk(gBlocksMutex); 544}
400 blocksFound = (int)gFoundBlocks.size(); 545
546// Non-blocking recv: pull whatever bytes are available now into buf, then
547// return one complete line if one is ready. Three outcomes:
548// true -- line is filled; buf may still contain more lines
549// false, errno EAGAIN/EWOULDBLOCK (or FIONREAD==0) -- no data right now
550// false, r==0 -- clean disconnect; caller must treat fd as dead
551// Caller distinguishes disconnect from "not yet" by checking whether
552// line.empty() after a false return (line is "" on both paths, so we
553// use a separate out-param for the disconnect signal).
554static bool RecvLine(btf_socket_t fd, std::string& buf,
555 std::string& line, bool& disconnected)
556{
557 disconnected = false;
558 char tmp[4096];
559
560#ifdef _WIN32
561 u_long avail = 0;
562 ioctlsocket(fd, FIONREAD, &avail);
563 if (avail > 0) {
564 int r = recv(fd, tmp, (int)std::min((u_long)(sizeof(tmp)-1), avail), 0);
565 if (r > 0) { tmp[r] = 0; buf += tmp; }
566 else if (r == 0){ disconnected = true; return false; }
567 // r < 0: WSAEWOULDBLOCK -- fall through with what we have
401 } 568 }
569#else
402 { 570 {
403 std::lock_guard<std::mutex> lk(gMinerStatsMutex); 571 int r = recv(fd, tmp, sizeof(tmp) - 1, MSG_DONTWAIT);
404 for (std::map<std::string, MinerStats>::const_iterator it = gMinerStats.begin(); it != gMinerStats.end(); ++it) 572 if (r > 0) { tmp[r] = 0; buf += tmp; }
405 roundShares += it->second.roundShares; 573 else if (r == 0) { disconnected = true; return false; }
574 // r < 0: EAGAIN/EWOULDBLOCK -- fall through with what we have
406 } 575 }
576#endif
577
578 size_t pos = buf.find('\n');
579 if (pos == std::string::npos) return false; // no complete line yet
580
581 line = buf.substr(0, pos);
582 if (!line.empty() && line.back() == '\r') line.pop_back();
583 buf = buf.substr(pos + 1);
584 return true;
407} 585}
408 586
409static bool SendLine(Miner* m, const json& j) 587// ---------------------------------------------------------------------------
588// Job helpers
589// ---------------------------------------------------------------------------
590static CBlock BuildMinerBlock(const StratumJob& job, uint32_t extranonce2)
410{ 591{
411 std::string s = j.dump() + "\n"; 592 CBlock blk = job.block;
412 int off = 0; 593 blk.vtx[0].vin[0].scriptSig << (CBigNum)extranonce2;
413 while (off < (int)s.size()) { 594 blk.hashMerkleRoot = blk.BuildMerkleTree();
414 int n = send(m->fd, s.c_str() + off, (int)s.size() - off, SEND_FLAGS); 595 return blk;
415 if (n <= 0) 596}
416 return false; 597
417 off += n; 598// shareTarget is per-miner (set by vardiff) and passed explicitly so the
418 } 599// value in p[3] of mining.notify always matches what HandleLine checks on submit.
419 return true; 600// This is the single source of truth for share difficulty.
601static json MakeNotifyParams(const StratumJob& job, const CBlock& b,
602 const uint256& shareTarget, bool clean)
603{
604 unsigned char hdr[80];
605 memcpy(hdr, &b.nVersion, 4);
606 memcpy(hdr+4, &b.hashPrevBlock, 32);
607 memcpy(hdr+36, &b.hashMerkleRoot, 32);
608 memcpy(hdr+68, &b.nTime, 4);
609 memcpy(hdr+72, &b.nBits, 4);
610 memcpy(hdr+76, &b.nNonce, 4);
611 unsigned char tgt[32]; memcpy(tgt, &shareTarget, 32);
612 return json::array({job.jobId, ToHex(hdr, 80),
613 b.hashPrevBlock.GetHex(), ToHex(tgt, 32), clean});
614}
615
616static void SendJob(Miner* m, bool clean)
617{
618 if (!gHaveJob) return;
619 CBlock mb = BuildMinerBlock(gCurrentJob, m->extranonce2);
620 // Use this miner's own shareTarget (set by vardiff) in the notify params.
621 // The participant miner reads p[3] as its share target, and HandleLine
622 // checks m->shareTarget on submit -- both sides now use the same value.
623 json n = {{"id",nullptr},{"method","mining.notify"},
624 {"params", MakeNotifyParams(gCurrentJob, mb, m->shareTarget, clean)}};
625 if (!SendLine(m->fd, n))
626 LogPrint("worker", "[pool->worker] job send FAILED for %s -- miner will be dropped\n",
627 m->address.empty() ? "(not yet authorized)" : m->address.c_str());
420} 628}
421 629
422static void BroadcastJob(bool clean) 630static void BroadcastJob(bool clean)
423{ 631{
424 StratumJob job; 632 if (!gHaveJob) return;
425 { std::lock_guard<std::mutex> lk(gJobMutex); if(!gHaveJob) return; job=gCurrentJob; } 633 int sent = 0;
426 json n = {{"id",nullptr},{"method","mining.notify"},{"params",MakeNotifyParams(job,clean)}}; 634 for (Miner* m : gMiners) {
427 std::lock_guard<std::mutex> lk(gMinersMutex); 635 if (!m->authorised) continue;
428 for (Miner* m : gMiners) 636 SendJob(m, clean);
429 if (m->authorised && !SendLine(m, n)) 637 sent++;
430 printf("Stratum: failed to broadcast job to %s\n", m->address.c_str()); 638 }
639 LogPrint("pool", "[pool] job %s broadcast to %d miner(s)\n",
640 gCurrentJob.jobId.c_str(), sent);
431} 641}
432 642
433static void HandleLine(Miner* m, const std::string& line) 643// ---------------------------------------------------------------------------
644// Stratum message handler -- called for each complete line from a miner
645// Returns false if the miner should be disconnected immediately.
646// ---------------------------------------------------------------------------
647static bool HandleLine(Miner* m, const std::string& rawLine,
648 std::map<std::string, uint64>& roundShareCount,
649 uint64& roundShareTotal,
650 int& blocksFoundThisSession)
434{ 651{
435 json req; 652 json req;
436 try { req = json::parse(line); } catch(...){ return; } 653 try { req = json::parse(rawLine); }
654 catch (...) {
655 LogPrint("worker", "[worker] JSON parse error from %s: %.80s\n",
656 m->address.empty() ? "(unauth)" : m->address.c_str(),
657 rawLine.c_str());
658 return true; // don't disconnect on bad JSON, just ignore the line
659 }
437 660
438 json id = req.value("id", json(nullptr)); 661 json id = req.value("id", json(nullptr));
439 std::string method = req.value("method",""); 662 std::string method = req.value("method", "");
440 663
441 auto reply = [&](json result, json error=nullptr){ 664 // Reply helper: always sends result+error pair as Stratum requires
442 if (!SendLine(m, json{{"id",id},{"result",result},{"error",error}})) 665 auto reply = [&](json result, std::string error = "") {
443 printf("Stratum: failed to reply to miner %s\n", m->address.c_str()); 666 json err = error.empty() ? json(nullptr) : json(error);
667 if (!SendLine(m->fd, json{{"id",id},{"result",result},{"error",err}}))
668 LogPrint("worker", "[pool->worker] reply send FAILED for %s (method=%s)\n",
669 m->address.empty() ? "(unauth)" : m->address.c_str(),
670 method.c_str());
444 }; 671 };
445 672
673 // ------------------------------------------------------------------
446 if (method == "mining.subscribe") { 674 if (method == "mining.subscribe") {
447 std::string sid = ToHex(&m->fd, 4); 675 std::string sid = ToHex(&m->fd, 4);
448 printf("Stratum: miner subscribed %s\n", sid.c_str()); 676 LogPrint("worker", "[worker->pool] subscribe from fd=%d sid=%s\n",
677 (int)m->fd, sid.c_str());
449 reply(json::array({json::array({json::array({"mining.notify",sid})}),sid,4})); 678 reply(json::array({json::array({json::array({"mining.notify",sid})}),sid,4}));
450 return; 679 return true;
451 } 680 }
452 681
682 // ------------------------------------------------------------------
453 if (method == "mining.authorize") { 683 if (method == "mining.authorize") {
454 auto& p = req["params"]; 684 auto& p = req["params"];
455 m->address = (p.size()>0 && p[0].is_string()) ? p[0].get<std::string>() : ""; 685 m->address = (p.size() > 0 && p[0].is_string()) ? p[0].get<std::string>() : "";
456 m->worker = (p.size()>1 && p[1].is_string()) ? p[1].get<std::string>() : "worker"; 686 m->worker = (p.size() > 1 && p[1].is_string()) ? p[1].get<std::string>() : "worker";
457 m->authorised = true; 687 m->lastSeen = GetTime();
458 printf("Stratum: miner authorized address=%s worker=%s\n", m->address.c_str(), m->worker.c_str());
459 reply(true);
460 688
461 uint160 h; bool valid = AddressToHash160(m->address, h); 689 // Validate address before authorising
462 if (!valid) printf("Stratum: miner %s invalid address '%s' — shares won't pay out\n", 690 uint160 h160; bool validAddr = AddressToHash160(m->address, h160);
463 m->worker.c_str(), m->address.c_str());
464 691
465 { std::lock_guard<std::mutex> lk(gMinerStatsMutex); 692 m->authorised = true; // authorise regardless -- shares just won't pay out
466 auto& ms = gMinerStats[m->address]; 693 LogPrint("worker", "[worker->pool] authorize address=%s worker=%s addr_valid=%s\n",
467 ms.lastSeen = GetTime(); ms.worker = m->worker; } 694 m->address.c_str(), m->worker.c_str(), validAddr ? "yes" : "NO");
468 695
469 if (!SendLine(m, json{{"id",nullptr},{"method","mining.set_difficulty"},{"params",json::array({1})}})) 696 if (!validAddr)
470 printf("Stratum: failed to send difficulty to %s\n", m->address.c_str()); 697 LogPrint("worker", "[pool] WARNING: address '%s' is invalid -- "
698 "miner will hash but shares cannot be paid out\n",
699 m->address.c_str());
471 700
472 StratumJob job; bool have; 701 reply(true);
473 { std::lock_guard<std::mutex> lk(gJobMutex); have=gHaveJob; if(have) job=gCurrentJob; } 702
474 if (have) { 703 // Initialize vardiff state and send initial difficulty
475 printf("Stratum: sending job %s to %s\n", job.jobId.c_str(), m->address.c_str()); 704 m->difficulty = 1.0;
476 if (!SendLine(m, json{{"id",nullptr},{"method","mining.notify"},{"params",MakeNotifyParams(job,true)}})) 705 m->shareTarget = ShareTargetFromDifficulty(m->difficulty);
477 printf("Stratum: failed to send job %s to %s\n", job.jobId.c_str(), m->address.c_str()); 706 m->vardiffWindowStart = GetTime();
707 m->vardiffShares = 0;
708 LogPrint("worker", "[pool->worker] initial difficulty=%.4f for %s\n",
709 m->difficulty, m->address.c_str());
710 if (!SendLine(m->fd, json{{"id",nullptr},{"method","mining.set_difficulty"},
711 {"params",json::array({m->difficulty})}}))
712 LogPrint("worker", "[pool->worker] set_difficulty send FAILED for %s\n",
713 m->address.c_str());
714
715 if (gHaveJob) {
716 LogPrint("worker", "[pool->worker] sending job %s to %s\n",
717 gCurrentJob.jobId.c_str(), m->address.c_str());
718 SendJob(m, true);
478 } else { 719 } else {
479 printf("Stratum: no job available for %s\n", m->address.c_str()); 720 LogPrint("worker", "[pool->worker] no job available yet for %s"
721 " -- will be sent one as soon as the pool builds it\n",
722 m->address.c_str());
480 } 723 }
481 return; 724 return true;
482 } 725 }
483 726
484 if (method == "mining.extranonce.subscribe") { reply(true); return; } 727 // ------------------------------------------------------------------
728 if (method == "mining.extranonce.subscribe") { reply(true); return true; }
729 if (method == "mining.get_transactions") { reply(json::array()); return true; }
485 730
731 // ------------------------------------------------------------------
486 if (method == "mining.submit") { 732 if (method == "mining.submit") {
487 if (!m->authorised) { reply(false,"not authorised"); return; } 733 if (!m->authorised) {
734 LogPrint("worker", "[worker->pool] submit from unauthorized miner (fd=%d)\n",
735 (int)m->fd);
736 reply(false, "not authorised");
737 return true;
738 }
488 739
489 auto& p = req["params"]; 740 auto& p = req["params"];
490 if (p.size() < 4) { reply(false,"bad params"); return; } 741 if (p.size() < 3) {
742 LogPrint("worker", "[worker->pool] submit bad params from %s (size=%zu)\n",
743 m->address.c_str(), p.size());
744 reply(false, "bad params");
745 return true;
746 }
491 747
492 std::string jobId = p[1].get<std::string>(); 748 std::string submitJobId = p[1].get<std::string>();
493 std::string nonceHex = p[2].get<std::string>(); 749 std::string nonceHex = p[2].get<std::string>();
494 750
495 StratumJob job; 751 if (!gHaveJob) {
496 { std::lock_guard<std::mutex> lk(gJobMutex); 752 LogPrint("worker", "[worker->pool] submit from %s but pool has no current job\n",
497 if (!gHaveJob || gCurrentJob.jobId != jobId) { reply(false,"stale job"); return; } 753 m->address.c_str());
498 job = gCurrentJob; } 754 reply(false, "stale job");
755 return true;
756 }
757 if (gCurrentJob.jobId != submitJobId) {
758 LogPrint("worker", "[worker->pool] submit stale job from %s"
759 " (submitted=%s current=%s)\n",
760 m->address.c_str(), submitJobId.c_str(), gCurrentJob.jobId.c_str());
761 reply(false, "stale job");
762 return true;
763 }
499 764
500 auto nb = FromHex(nonceHex); 765 auto nb = FromHex(nonceHex);
501 if (nb.size()<4) { reply(false,"bad nonce"); return; } 766 if (nb.size() < 4) {
767 LogPrint("worker", "[worker->pool] submit bad nonce from %s: '%s'\n",
768 m->address.c_str(), nonceHex.c_str());
769 reply(false, "bad nonce");
770 return true;
771 }
502 unsigned int nNonce; memcpy(&nNonce, nb.data(), 4); 772 unsigned int nNonce; memcpy(&nNonce, nb.data(), 4);
503 773
504 CBlock& b = job.block; 774 // Rebuild this miner's exact block (unique merkle via extranonce2)
775 CBlock b = BuildMinerBlock(gCurrentJob, m->extranonce2);
505 b.nNonce = nNonce; 776 b.nNonce = nNonce;
506 unsigned char hdr[80]; 777 unsigned char hdr[80];
507 memcpy(hdr, &b.nVersion, 4); 778 memcpy(hdr, &b.nVersion, 4);
508 memcpy(hdr+4, &b.hashPrevBlock, 32); 779 memcpy(hdr+4, &b.hashPrevBlock, 32);
509 memcpy(hdr+36, &b.hashMerkleRoot,32); 780 memcpy(hdr+36, &b.hashMerkleRoot, 32);
510 memcpy(hdr+68, &b.nTime, 4); 781 memcpy(hdr+68, &b.nTime, 4);
511 memcpy(hdr+72, &b.nBits, 4); 782 memcpy(hdr+72, &b.nBits, 4);
512 memcpy(hdr+76, &b.nNonce, 4); 783 memcpy(hdr+76, &b.nNonce, 4);
513 784
514 uint256 powHash = RandomXPoWHash(hdr, 80); 785 uint256 powHash = RandomXPoWHash(hdr, 80);
515 786
516 // Record share in the current round. 787 // Check against this miner's personal share target (set by vardiff)
517 std::string key = MinerKey(m->address, m->worker); 788 if (powHash > m->shareTarget) {
518 { std::lock_guard<std::mutex> lk(gMinerStatsMutex); 789 LogPrint("worker", "[worker->pool] high-hash from %s"
519 MinerStats& ms = gMinerStats[key]; 790 " nonce=%u (difficulty=%.4f)\n",
520 ms.address = m->address; 791 m->address.c_str(), nNonce, m->difficulty);
521 ms.worker = m->worker; 792 reply(false, "high-hash");
522 ms.roundShares++; 793 return true;
523 ms.totalShares++; 794 }
524 ms.lastSeen = GetTime(); } 795
796 // Valid share -- record it
525 m->sessionShares++; 797 m->sessionShares++;
798 m->roundShares++;
799 m->totalShares++;
800 m->vardiffShares++;
801 int64 shareTime = GetTime();
802 m->lastSeen = shareTime;
803 roundShareCount[m->address]++;
804 roundShareTotal++;
805
806 // Update hashrate estimate: expected hashes for this share divided by
807 // the time since the last one, smoothed with an EWMA so a single fast
808 // or slow share doesn't make the number jump around.
809 if (m->lastShareTime > 0) {
810 int64 dt = shareTime - m->lastShareTime;
811 if (dt <= 0) dt = 1;
812 double inst = ExpectedHashesForDifficulty(m->difficulty) / (double)dt;
813 const double alpha = 0.25;
814 m->hashRate = (m->hashRate <= 0.0) ? inst
815 : alpha * inst + (1.0 - alpha) * m->hashRate;
816 }
817 m->lastShareTime = shareTime;
526 818
527 if (powHash > job.shareTarget) { reply(true); return; } // valid share, not a full block 819 LogPrint("worker", "[worker->pool] valid share from %s"
820 " nonce=%u job=%s difficulty=%.4f (session: %llu)\n",
821 m->address.c_str(), nNonce,
822 gCurrentJob.jobId.c_str(), m->difficulty,
823 (unsigned long long)m->sessionShares);
824 reply(true);
825
826 // Vardiff: after every VARDIFF_SHARES_PER_CHECK shares, check rate
827 if (m->vardiffShares >= VARDIFF_SHARES_PER_CHECK) {
828 int64 elapsed = GetTime() - m->vardiffWindowStart;
829 if (elapsed <= 0) elapsed = 1;
830 double actualSecsPerShare = (double)elapsed / (double)m->vardiffShares;
831 double ratio = actualSecsPerShare / (double)VARDIFF_TARGET_SECS;
832 // ratio < 1 means shares arriving faster than target (too easy)
833 // ratio > 1 means shares arriving slower than target (too hard)
834 if (ratio < (1.0 / VARDIFF_RETARGET_RATIO) ||
835 ratio > VARDIFF_RETARGET_RATIO) {
836 // New difficulty scales inversely with actual share rate
837 double newDiff = m->difficulty / ratio;
838 if (newDiff < VARDIFF_MIN) newDiff = VARDIFF_MIN;
839 if (newDiff > VARDIFF_MAX) newDiff = VARDIFF_MAX;
840 // Only apply if the change is meaningful (>10%)
841 if (newDiff / m->difficulty > 1.1 || m->difficulty / newDiff > 1.1) {
842 m->difficulty = newDiff;
843 m->shareTarget = ShareTargetFromDifficulty(m->difficulty);
844 LogPrint("worker", "[pool] vardiff: %s new difficulty=%.4f"
845 " (%.1fs/share actual vs %ds target)\n",
846 m->address.c_str(), m->difficulty,
847 actualSecsPerShare, (int)VARDIFF_TARGET_SECS);
848 SendLine(m->fd, json{{"id",nullptr},
849 {"method","mining.set_difficulty"},
850 {"params",json::array({m->difficulty})}});
851 // set_difficulty alone doesn't change what the worker
852 // actually hashes against -- it only reads its share
853 // target from mining.notify params[3]. Without this, the
854 // new difficulty wouldn't take effect until the next
855 // natural job broadcast (new block, or the 60s trickle
856 // refresh), so push a fresh notify for this miner now.
857 SendJob(m, false);
858 }
859 }
860 // Reset window
861 m->vardiffWindowStart = GetTime();
862 m->vardiffShares = 0;
863 }
864
865 if (powHash > gCurrentJob.target) return true; // valid share, not a block
866
867 // Full difficulty met -- submit block to the chain
868 LogPrint("pool", "[pool] BLOCK CANDIDATE from %s height=%d nNonce=%u -- submitting\n",
869 m->address.c_str(), gCurrentJob.height, nNonce);
528 870
529 // Full block
530 CBlock* pblock = new CBlock(b); 871 CBlock* pblock = new CBlock(b);
531 bool accepted = false; 872 bool accepted = false;
532 CRITICAL_BLOCK(cs_main) 873 CRITICAL_BLOCK(cs_main)
533 { 874 {
875 int heightBefore = nBestHeight;
534 if (ProcessBlock(NULL, pblock)) { 876 if (ProcessBlock(NULL, pblock)) {
535 accepted = true; 877 // ProcessBlock returns true for orphans too -- verify the chain
536 printf("Pool: BLOCK FOUND by %s height=%d nNonce=%u\n", 878 // actually advanced. If nBestHeight didn't increase, the block
537 m->address.c_str(), job.height, nNonce); 879 // was shelved as an orphan (pool was behind the chain tip) and
538 FoundBlock fb{job.height, GetTime(), m->address, pblock->GetHash()}; 880 // no coinbase was added to the wallet. Do not pay out.
539 { std::lock_guard<std::mutex> lk(gBlocksMutex); 881 if (nBestHeight > heightBefore) {
540 gFoundBlocks.push_front(fb); 882 accepted = true;
541 if (gFoundBlocks.size()>50) gFoundBlocks.pop_back(); } 883 LogPrint("pool", "[pool] BLOCK ACCEPTED height=%d by %s\n",
542 { std::lock_guard<std::mutex> lk(gJobMutex); gHaveJob=false; } 884 gCurrentJob.height, m->address.c_str());
885 gFoundBlocks.push_front({gCurrentJob.height, GetTime(), m->address});
886 if (gFoundBlocks.size() > 50) gFoundBlocks.pop_back();
887 blocksFoundThisSession++;
888 gHaveJob = false; // invalidate job immediately
889 } else {
890 LogPrint("pool", "[pool] BLOCK ORPHANED height=%d by %s"
891 " -- pool was behind chain tip, no payout\n",
892 gCurrentJob.height, m->address.c_str());
893 gHaveJob = false; // job is stale regardless
894 }
543 } else { 895 } else {
896 LogPrint("pool", "[pool] BLOCK REJECTED height=%d (ProcessBlock returned false)\n",
897 gCurrentJob.height);
544 delete pblock; 898 delete pblock;
545 } 899 }
546 } 900 }
547 reply(accepted); 901
548 if (accepted) { QueuePayouts(job.height); RebuildJob(); BroadcastJob(true); } 902 if (accepted) {
549 return; 903 // Snapshot height before RebuildJob() (which increments it)
904 int foundHeight = gCurrentJob.height;
905 QueuePayouts(foundHeight, roundShareCount, roundShareTotal);
906 // Reset round shares
907 roundShareCount.clear();
908 roundShareTotal = 0;
909 for (Miner* mi : gMiners) mi->roundShares = 0;
910 // Build and broadcast new job immediately
911 if (RebuildJob()) {
912 LogPrint("pool", "[pool] new job %s built after block %d\n",
913 gCurrentJob.jobId.c_str(), foundHeight);
914 BroadcastJob(true);
915 } else {
916 LogPrint("pool", "[pool] WARNING: RebuildJob() failed after block %d"
917 " -- miners will wait\n", foundHeight);
918 }
919 }
920 return true;
550 } 921 }
551 922
552 if (method == "mining.get_transactions") { reply(json::array()); return; } 923 // Unknown method -- log it (can reveal miner software quirks)
924 LogPrint("worker", "[worker->pool] unknown method '%s' from %s\n",
925 method.c_str(),
926 m->address.empty() ? "(unauth)" : m->address.c_str());
553 reply(nullptr, "unknown method"); 927 reply(nullptr, "unknown method");
928 return true;
554} 929}
555 930
556static void MinerThreadFn(void* arg) 931// ---------------------------------------------------------------------------
932// Stats refresh -- called every 2s from event loop
933// ---------------------------------------------------------------------------
934static void RefreshStats(int blocksFoundThisSession, uint64 roundShareTotal)
557{ 935{
558 Miner* m = (Miner*)arg; 936 std::lock_guard<std::mutex> lk(gStatsMutex);
559 while (!fShutdown && gPoolRunning) { 937
560 fd_set fds; FD_ZERO(&fds); FD_SET(m->fd, &fds); 938 gStats.authorizedMiners = 0;
561 struct timeval tv={1,0}; 939 gStats.blocksFound = blocksFoundThisSession;
562 if (select((int)m->fd+1, &fds, NULL, NULL, &tv) <= 0) continue; 940 gStats.roundShares = roundShareTotal;
563 char buf[4096]; 941 gStats.totalHashRate = 0.0;
564 int n = recv(m->fd, buf, sizeof(buf)-1, 0); 942 for (Miner* m : gMiners)
565 if (n <= 0) break; 943 if (m->authorised) gStats.authorizedMiners++;
566 buf[n]=0; m->readBuf += buf; 944
567 size_t pos; 945 gWorkerStats.clear();
568 while ((pos = m->readBuf.find('\n')) != std::string::npos) { 946 for (Miner* m : gMiners) {
569 std::string line = m->readBuf.substr(0, pos); 947 if (!m->authorised || m->lastSeen <= 0) continue;
570 m->readBuf = m->readBuf.substr(pos+1); 948 PoolWorkerStatView v;
571 if (!line.empty() && line.back()=='\r') line.pop_back(); 949 v.address = m->address;
572 if (!line.empty()) HandleLine(m, line); 950 v.worker = m->worker;
573 } 951 v.roundShares = m->roundShares;
952 v.totalShares = m->totalShares;
953 v.lastSeen = m->lastSeen;
954 v.hashRate = m->hashRate;
955 gWorkerStats.push_back(v);
956 gStats.totalHashRate += m->hashRate;
957 }
958 std::sort(gWorkerStats.begin(), gWorkerStats.end(),
959 [](const PoolWorkerStatView& a, const PoolWorkerStatView& b) {
960 return a.roundShares != b.roundShares ? a.roundShares > b.roundShares
961 : a.lastSeen > b.lastSeen;
962 });
963
964 // gPendingPayouts is event-loop-only data (no lock needed here since
965 // RefreshStats is always called from the event loop thread).
966 gPayoutViews.clear();
967 for (const PendingPayout& pp : gPendingPayouts) {
968 PendingPayoutView pv;
969 pv.matureAtHeight = pp.matureAtHeight;
970 pv.recipients = (int)pp.amounts.size();
971 pv.totalAmount = 0;
972 for (auto& kv : pp.amounts) pv.totalAmount += kv.second;
973 gPayoutViews.push_back(pv);
574 } 974 }
575 sock_close(m->fd);
576 printf("Stratum: miner %s disconnected (%llu shares)\n",
577 m->worker.empty()?"unknown":m->worker.c_str(),
578 (unsigned long long)m->sessionShares);
579 { std::lock_guard<std::mutex> lk(gMinersMutex);
580 auto it = std::find(gMiners.begin(), gMiners.end(), m);
581 if (it != gMiners.end()) gMiners.erase(it); }
582 delete m;
583} 975}
584 976
585static void JobWatcherFn(void*) 977// ---------------------------------------------------------------------------
978// Event loop
979// ---------------------------------------------------------------------------
980static void PoolEventLoop()
586{ 981{
587 int lastHeight = -1; 982 int lastHeight = -1;
983 int64 lastRefresh = GetTime();
984 int64 lastStatsRefresh = 0;
985 int blocksFoundThisSession = 0;
986 int64 noJobSince = 0; // 0 = have a job
987 bool warnedNoJob = false;
988 int64 lastNoJobRetry = 0; // throttle RebuildJob calls when no tip
989
990 std::map<std::string, uint64> roundShareCount;
991 uint64 roundShareTotal = 0;
992
993 static const int64 JOB_REFRESH_SECS = 60; // re-stamp nTime periodically
994 static const int64 NO_JOB_WARN_SECS = 15; // warn after this long with no job
995 static const int64 NO_JOB_RETRY_SECS = 5; // how often to retry RebuildJob
996
588 while (!fShutdown && gPoolRunning) { 997 while (!fShutdown && gPoolRunning) {
589 Sleep(500); 998
590 bool newBlock = false; 999 // 1. Drain accept queue
591 CRITICAL_BLOCK(cs_main) 1000 {
592 { if (nBestHeight != lastHeight && pindexBest) { lastHeight = nBestHeight; newBlock = true; } } 1001 std::lock_guard<std::mutex> lk(gReadyMutex);
593 if (newBlock) { 1002 for (btf_socket_t fd : gReadyQueue) {
594 FlushMaturePayouts(); 1003 gMiners.push_back(new Miner(fd));
595 if (RebuildJob()) { printf("Stratum: new job height=%d\n", lastHeight+1); BroadcastJob(true); } 1004 LogPrint("worker", "[pool] miner fd=%d entered event loop"
596 } else if (!gHaveJob) { 1005 " -- awaiting subscribe/authorize\n", (int)fd);
1006 }
1007 gReadyQueue.clear();
1008 }
1009
1010 // 2. Detect new block.
1011 // When our own miner found the block, HandleLine already called
1012 // RebuildJob() + BroadcastJob(true) and set gHaveJob=true.
1013 // We still flush mature payouts and update bookkeeping, but skip
1014 // rebuilding if a fresh job already exists for this height.
1015 {
1016 bool newBlock = false;
1017 CRITICAL_BLOCK(cs_main)
1018 {
1019 if (pindexBest && nBestHeight != lastHeight) {
1020 lastHeight = nBestHeight;
1021 newBlock = true;
1022 }
1023 }
1024 if (newBlock) {
1025 FlushMaturePayouts();
1026 if (!gHaveJob) {
1027 // External block (not found by our miners), or HandleLine's
1028 // RebuildJob failed. Either way this round is over with no
1029 // payout from us, so clear round shares before starting the
1030 // next one -- otherwise they'd keep accumulating across
1031 // rounds that our own miners didn't win.
1032 roundShareCount.clear();
1033 roundShareTotal = 0;
1034 for (Miner* mi : gMiners) mi->roundShares = 0;
1035
1036 // Build and broadcast now.
1037 if (RebuildJob()) {
1038 LogPrint("pool", "[pool] new block height=%d -- job %s ready,"
1039 " %zu miner(s) connected\n",
1040 lastHeight, gCurrentJob.jobId.c_str(), gMiners.size());
1041 BroadcastJob(true);
1042 } else {
1043 LogPrint("pool", "[pool] new block height=%d but RebuildJob() failed"
1044 " -- miners will wait\n", lastHeight);
1045 }
1046 } else {
1047 // HandleLine already built and broadcast for this height.
1048 LogPrint("pool", "[pool] new block height=%d -- job already"
1049 " broadcast by submit handler\n", lastHeight);
1050 }
1051 lastRefresh = GetTime();
1052 noJobSince = 0;
1053 warnedNoJob = false;
1054 }
1055 }
1056
1057 // 3. No-job watchdog (throttled: only retry every NO_JOB_RETRY_SECS)
1058 if (!gHaveJob) {
1059 int64 now = GetTime();
1060 if (noJobSince == 0) noJobSince = now;
1061
1062 if (now - lastNoJobRetry >= NO_JOB_RETRY_SECS) {
1063 lastNoJobRetry = now;
1064 if (RebuildJob()) {
1065 LogPrint("pool", "[pool] job built after %llds without one\n",
1066 (long long)(now - noJobSince));
1067 BroadcastJob(false);
1068 noJobSince = 0;
1069 warnedNoJob = false;
1070 lastRefresh = now;
1071 } else if (!warnedNoJob && now - noJobSince >= NO_JOB_WARN_SECS) {
1072 LogPrint("pool", "[pool] STUCK: no job for %llds -- %s."
1073 " Miners are waiting. Will keep retrying every %llds.\n",
1074 (long long)(now - noJobSince),
1075 pindexBest ? "RebuildJob() keeps failing (check above for why)"
1076 : "no chain tip yet (node still syncing)",
1077 (long long)NO_JOB_RETRY_SECS);
1078 warnedNoJob = true;
1079 }
1080 }
1081 } else if (GetTime() - lastRefresh >= JOB_REFRESH_SECS) {
1082 // Periodic nTime refresh -- stale timestamps cause valid hashes to be rejected
597 if (RebuildJob()) BroadcastJob(false); 1083 if (RebuildJob()) BroadcastJob(false);
1084 lastRefresh = GetTime();
1085 }
1086
1087 // 3.5. Vardiff stall watchdog -- runs independently of share count.
1088 // The normal vardiff check in HandleLine only fires once
1089 // VARDIFF_SHARES_PER_CHECK shares have arrived; a miner that never
1090 // finds a single share never reaches that check, so it can be stuck
1091 // at its initial (or last) difficulty forever. Catch that here.
1092 for (Miner* m : gMiners) {
1093 if (!m->authorised || m->vardiffShares != 0 || m->vardiffWindowStart <= 0)
1094 continue;
1095 int64 stalled = GetTime() - m->vardiffWindowStart;
1096 if (stalled < VARDIFF_STALL_SECS) continue;
1097
1098 double newDiff = m->difficulty / VARDIFF_STALL_CUT;
1099 if (newDiff < VARDIFF_MIN) newDiff = VARDIFF_MIN;
1100
1101 if (newDiff < m->difficulty) {
1102 m->difficulty = newDiff;
1103 m->shareTarget = ShareTargetFromDifficulty(m->difficulty);
1104 m->vardiffWindowStart = GetTime();
1105 LogPrint("worker", "[pool] vardiff STALL: %s sent zero shares in"
1106 " %llds -- forcing difficulty down to %.6f (no share data"
1107 " to retarget from normally)\n",
1108 m->address.c_str(), (long long)stalled, m->difficulty);
1109 SendLine(m->fd, json{{"id",nullptr},
1110 {"method","mining.set_difficulty"},
1111 {"params",json::array({m->difficulty})}});
1112 // Same reasoning as the normal vardiff retarget above: the
1113 // worker only reads its share target from mining.notify, so
1114 // push a fresh job now instead of waiting on the next
1115 // natural broadcast.
1116 SendJob(m, false);
1117 } else {
1118 // Already at the difficulty floor -- this miner's problem isn't
1119 // difficulty, it's something else (slow hashing, bad connection,
1120 // stuck RandomX light mode, etc). Log once per stall window so
1121 // it's visible without spamming.
1122 LogPrint("worker", "[pool] vardiff STALL: %s still at zero shares"
1123 " after %llds at floor difficulty %.6f -- likely a"
1124 " hashrate/connectivity problem, not a difficulty problem\n",
1125 m->address.c_str(), (long long)stalled, m->difficulty);
1126 m->vardiffWindowStart = GetTime(); // avoid re-logging every tick
1127 }
1128 }
1129
1130 // 4. Select over miner sockets
1131 if (!gMiners.empty()) {
1132 fd_set fds; FD_ZERO(&fds);
1133 int maxfd = 0;
1134 for (Miner* m : gMiners) {
1135 FD_SET(m->fd, &fds);
1136 if ((int)m->fd > maxfd) maxfd = (int)m->fd;
1137 }
1138 struct timeval tv = {0, 50000}; // 50ms
1139 if (select(maxfd + 1, &fds, NULL, NULL, &tv) > 0) {
1140 std::vector<Miner*> dead;
1141 for (Miner* m : gMiners) {
1142 if (!FD_ISSET(m->fd, &fds)) continue;
1143 std::string line;
1144 bool disc = false;
1145 // Drain all complete lines buffered for this miner.
1146 // HandleLine always returns true; disc signals clean disconnect.
1147 while (RecvLine(m->fd, m->readBuf, line, disc))
1148 HandleLine(m, line, roundShareCount,
1149 roundShareTotal, blocksFoundThisSession);
1150 if (disc) dead.push_back(m);
1151 }
1152 for (Miner* m : dead) {
1153 LogPrint("worker", "[pool] miner %s disconnected"
1154 " (session shares: %llu, round shares: %llu)\n",
1155 m->worker.empty() ? "(never authorized)" : m->worker.c_str(),
1156 (unsigned long long)m->sessionShares,
1157 (unsigned long long)m->roundShares);
1158 sock_close(m->fd);
1159 gMiners.erase(std::find(gMiners.begin(), gMiners.end(), m));
1160 delete m;
1161 }
1162 }
1163 } else {
1164 Sleep(50);
1165 }
1166
1167 // 5. Refresh GUI stats every 2s
1168 if (GetTime() - lastStatsRefresh >= 2) {
1169 RefreshStats(blocksFoundThisSession, roundShareTotal);
1170 lastStatsRefresh = GetTime();
598 } 1171 }
599 } 1172 }
1173
1174 for (Miner* m : gMiners) { sock_close(m->fd); delete m; }
1175 gMiners.clear();
600} 1176}
601 1177
602// --------------------------------------------------------------------------- 1178// ---------------------------------------------------------------------------
603// Main Stratum accept loop — entry point called from ui.cpp and headless.cpp 1179// Accept threads
604// ---------------------------------------------------------------------------
605// .btf Stratum listener — miners connect via rendezvous relay using the
606// node's .btf address instead of a raw IP:port. Same Stratum protocol,
607// same MinerThreadFn handler, works through CGNAT with no port forwarding.
608//
609// Keeps one listener registered per relay at all times. When a miner
610// connects, a replacement listener is spawned immediately so the next
611// miner doesn't have to wait.
612// --------------------------------------------------------------------------- 1180// ---------------------------------------------------------------------------
1181struct AcceptCtx { unsigned char pk[32]; unsigned char sk[32]; std::string relay; };
613 1182
614struct BtfAcceptCtx { unsigned char pk[32]; unsigned char sk[32]; string relay; }; 1183// One persistent thread per relay. Loops: register -> wrap -> push -> repeat.
615 1184static void AcceptOneFn(void* arg)
616// Track active listener count per relay to avoid pile-up when relay is slow
617static std::map<string,int> gBtfListenerCount;
618static std::mutex gBtfListenerMutex;
619
620static void BtfStratumAcceptOneFn(void* arg)
621{ 1185{
622 BtfAcceptCtx* ctx = (BtfAcceptCtx*)arg; 1186 AcceptCtx* ctx = (AcceptCtx*)arg;
623 unsigned char pk[32], sk[32]; 1187 unsigned char pk[32], sk[32];
624 memcpy(pk, ctx->pk, 32); memcpy(sk, ctx->sk, 32); 1188 memcpy(pk, ctx->pk, 32); memcpy(sk, ctx->sk, 32);
625 string relay = ctx->relay; 1189 std::string relay = ctx->relay;
626 delete ctx; 1190 delete ctx;
627 1191
628 auto decrement = [&]() {
629 std::lock_guard<std::mutex> lk(gBtfListenerMutex);
630 gBtfListenerCount[relay]--;
631 };
632
633 size_t colon = relay.rfind(':'); 1192 size_t colon = relay.rfind(':');
634 if (colon == string::npos) { decrement(); return; } 1193 if (colon == std::string::npos) {
635 string strHost = relay.substr(0, colon); 1194 LogPrint("pool", "[pool] AcceptOneFn: bad relay address '%s'\n", relay.c_str());
636 int nPort = atoi(relay.substr(colon+1).c_str()); 1195 return;
637
638 btf::RvSocket rv = btf::RvServiceRegister(strHost.c_str(), (unsigned short)nPort, pk);
639 if (fShutdown || !gPoolRunning) { if (rv != btf::RV_INVALID) btf::RvClose(rv); decrement(); return; }
640 if (rv == btf::RV_INVALID) { decrement(); return; }
641
642 // Paired: spawn replacement (count transfers to new thread)
643 if (!fShutdown && gPoolRunning) {
644 BtfAcceptCtx* next = new BtfAcceptCtx();
645 memcpy(next->pk, pk, 32); memcpy(next->sk, sk, 32);
646 next->relay = relay;
647 LaunchThread(BtfStratumAcceptOneFn, next);
648 } else {
649 decrement();
650 } 1196 }
1197 std::string host = relay.substr(0, colon);
1198 int port = atoi(relay.substr(colon + 1).c_str());
1199
1200 LogPrint("pool", "[pool] accept thread started for relay %s\n", relay.c_str());
1201
1202 while (!fShutdown && gPoolRunning) {
1203 // Blocks until a miner connects to us at this relay
1204 btf::RvSocket rv = btf::RvServiceRegister(host.c_str(), (unsigned short)port, pk);
651 1205
652 btf_socket_t hSocket = btf::BtfServiceWrap(rv, sk); 1206 if (fShutdown || !gPoolRunning) {
653 if (hSocket == INVALID_SOCKET) return; 1207 if (rv != btf::RV_INVALID) btf::RvClose(rv);
1208 break;
1209 }
1210 if (rv == btf::RV_INVALID) {
1211 LogPrint("pool", "[pool] relay %s: RvServiceRegister failed"
1212 " -- backing off 30s before retry\n", relay.c_str());
1213 for (int i = 0; i < 30 && !fShutdown && gPoolRunning; i++) Sleep(1000);
1214 continue;
1215 }
654 1216
655 printf("Stratum/.btf: miner connected via %s\n", relay.c_str()); 1217 // Echan handshake -- blocking but fast (local + relay round-trip)
656 Miner* m = new Miner(hSocket); 1218 btf_socket_t fd = btf::BtfServiceWrap(rv, sk);
657 { std::lock_guard<std::mutex> lk(gMinersMutex); gMiners.push_back(m); } 1219 if (fd == INVALID_SOCKET) {
658 LaunchThread(MinerThreadFn, m); 1220 LogPrint("pool", "[pool] relay %s: BtfServiceWrap failed (echan handshake)"
1221 " -- miner dropped, will accept next\n", relay.c_str());
1222 continue;
1223 }
1224
1225 LogPrint("worker", "[pool] miner arrived via relay %s -- pushing to event loop\n",
1226 relay.c_str());
1227 PushReady(fd);
1228 // Loop immediately: register again so the next miner can connect
1229 }
1230
1231 LogPrint("pool", "[pool] accept thread stopped for relay %s\n", relay.c_str());
659} 1232}
660 1233
661static void BtfStratumAcceptFn(void*) 1234// Spawns one AcceptOneFn per relay. Re-polls relay list every 60s to pick up
1235// newly discovered relays. Uses a set to avoid spawning duplicate threads.
1236static void AcceptLoopFn(void*)
662{ 1237{
663 printf("Stratum/.btf: starting \xe2\x80\x94 miners can connect via %s\n", 1238 LogPrint("pool", "[pool] AcceptLoopFn started -- miners can connect via %s\n",
664 BtfLocalAddress().c_str()); 1239 BtfLocalAddress().c_str());
665 1240
1241 // Wait for our identity to be ready
666 unsigned char pk[32], sk[32]; 1242 unsigned char pk[32], sk[32];
1243 int waitSecs = 0;
667 while (!BtfGetIdentity(pk, sk)) { 1244 while (!BtfGetIdentity(pk, sk)) {
668 if (fShutdown || !gPoolRunning) return; 1245 if (fShutdown || !gPoolRunning) return;
1246 if (waitSecs == 0)
1247 LogPrint("pool", "[pool] waiting for .btf identity...\n");
1248 waitSecs++;
669 Sleep(2000); 1249 Sleep(2000);
670 } 1250 }
1251 LogPrint("pool", "[pool] .btf identity ready after %ds\n", waitSecs * 2);
1252
1253 std::set<std::string> spawned; // relays we've already started a thread for
671 1254
672 while (!fShutdown && gPoolRunning) { 1255 while (!fShutdown && gPoolRunning) {
673 vector<string> relays = BtfAllRelays(); 1256 vector<string> relays = BtfAllRelays();
674 if (relays.empty()) { Sleep(5000); continue; } 1257 if (relays.empty()) {
675 1258 LogPrint("pool", "[pool] no relays available -- miners cannot connect yet\n");
676 // Spawn one listener per relay, only if none already active 1259 } else {
677 for (const string& relay : relays) { 1260 for (const string& relay : relays) {
678 std::lock_guard<std::mutex> lk(gBtfListenerMutex); 1261 if (spawned.count(relay)) continue; // already running
679 if (gBtfListenerCount[relay] == 0) { 1262 AcceptCtx* ctx = new AcceptCtx();
680 gBtfListenerCount[relay]++;
681 BtfAcceptCtx* ctx = new BtfAcceptCtx();
682 memcpy(ctx->pk, pk, 32); memcpy(ctx->sk, sk, 32); 1263 memcpy(ctx->pk, pk, 32); memcpy(ctx->sk, sk, 32);
683 ctx->relay = relay; 1264 ctx->relay = relay;
684 LaunchThread(BtfStratumAcceptOneFn, ctx); 1265 uintptr_t tid = _beginthread(AcceptOneFn, 0, ctx);
1266 if (tid == (uintptr_t)-1) {
1267 delete ctx;
1268 LogPrint("pool", "[pool] failed to spawn accept thread for %s\n",
1269 relay.c_str());
1270 } else {
1271 spawned.insert(relay);
1272 LogPrint("pool", "[pool] accept thread spawned for relay %s"
1273 " (%zu total)\n", relay.c_str(), spawned.size());
1274 }
685 } 1275 }
686 } 1276 }
687 for (int i = 0; i < 30 && !fShutdown && gPoolRunning; i++) Sleep(1000); 1277 // Re-poll every 60s -- newly discovered relays get picked up
1278 for (int i = 0; i < 60 && !fShutdown && gPoolRunning; i++) Sleep(1000);
688 } 1279 }
689} 1280}
1281
1282// ---------------------------------------------------------------------------
1283// Entry point
1284// ---------------------------------------------------------------------------
690void ThreadRPCServer(void*) 1285void ThreadRPCServer(void*)
691{ 1286{
692 gPoolRunning = true; 1287 gPoolRunning = true;
693 printf("Bitflash pool server starting\n");
694 printf(" Stratum .btf: %s (no port forwarding needed)\n",
695 BtfLocalAddress().c_str());
696 printf(" Mode: operator\n");
697 1288
698 if (RebuildJob()) 1289 LogPrint("pool", "[pool] ============================================\n");
699 printf("Stratum: initial job seeded height=%d\n", nBestHeight + 1); 1290 LogPrint("pool", "[pool] Pool server starting\n");
1291 LogPrint("pool", "[pool] .btf address: %s\n", BtfLocalAddress().c_str());
1292 LogPrint("pool", "[pool] fee: %.2f%%\n", dPoolFeePercent);
1293
1294 if (RebuildJob()) {
1295 LogPrint("pool", "[pool] initial job %s seeded at height %d\n",
1296 gCurrentJob.jobId.c_str(), nBestHeight + 1);
1297 } else {
1298 LogPrint("pool", "[pool] no chain tip yet -- job will build on first block\n");
1299 }
1300
1301 LoadPendingPayouts();
1302
1303 _beginthread(AcceptLoopFn, 0, NULL);
1304 _beginthread(ThreadBtfPoolAnnouncer, 0, NULL);
1305 _beginthread(PayoutThreadFn, 0, NULL);
700 1306
701 LaunchThread(JobWatcherFn, NULL); 1307 PoolEventLoop(); // blocks until gPoolRunning = false or fShutdown
702 LaunchThread(BtfStratumAcceptFn, NULL);
703 LaunchThread(ThreadBtfPoolAnnouncer, NULL);
704 1308
705 while (!fShutdown && gPoolRunning) 1309 LogPrint("pool", "[pool] pool server stopped\n");
706 Sleep(1000); 1310 LogPrint("pool", "[pool] ============================================\n");
707 printf("Pool server stopped\n"); 1311 gPoolRunning = false;
708} 1312}
diff --git a/src/ui.rc b/src/ui.rc
deleted file mode 100644
index ec8b142..0000000
--- a/src/ui.rc
+++ /dev/null
@@ -1,14 +0,0 @@
1bitcoin ICON "rc/bitcoin.ico"
2
3#include "wx/msw/wx.rc"
4
5check ICON "rc/check.ico"
6send16 BITMAP "rc/send16.bmp"
7send16mask BITMAP "rc/send16mask.bmp"
8send16masknoshadow BITMAP "rc/send16masknoshadow.bmp"
9send20 BITMAP "rc/send20.bmp"
10send20mask BITMAP "rc/send20mask.bmp"
11addressbook16 BITMAP "rc/addressbook16.bmp"
12addressbook16mask BITMAP "rc/addressbook16mask.bmp"
13addressbook20 BITMAP "rc/addressbook20.bmp"
14addressbook20mask BITMAP "rc/addressbook20mask.bmp"
diff --git a/src/uiproject.fbp b/src/uiproject.fbp
deleted file mode 100644
index 57a2950..0000000
--- a/src/uiproject.fbp
+++ /dev/null
@@ -1,11825 +0,0 @@
1<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
2<wxFormBuilder_Project>
3 <FileVersion major="1" minor="9" />
4 <object class="Project" expanded="1">
5 <property name="class_decoration"></property>
6 <property name="code_generation">C++</property>
7 <property name="disconnect_events">1</property>
8 <property name="encoding">UTF-8</property>
9 <property name="event_generation">connect</property>
10 <property name="file">uibase</property>
11 <property name="first_id">1000</property>
12 <property name="help_provider">none</property>
13 <property name="internationalize">0</property>
14 <property name="name"></property>
15 <property name="namespace"></property>
16 <property name="path">.</property>
17 <property name="precompiled_header"></property>
18 <property name="relative_path">1</property>
19 <property name="use_enum">0</property>
20 <property name="use_microsoft_bom">0</property>
21 <object class="Frame" expanded="0">
22 <property name="bg">wxSYS_COLOUR_BTNFACE</property>
23 <property name="center"></property>
24 <property name="context_help"></property>
25 <property name="enabled">1</property>
26 <property name="extra_style"></property>
27 <property name="fg"></property>
28 <property name="font"></property>
29 <property name="hidden">0</property>
30 <property name="id">wxID_MAINFRAME</property>
31 <property name="maximum_size"></property>
32 <property name="minimum_size"></property>
33 <property name="name">CMainFrameBase</property>
34 <property name="pos"></property>
35 <property name="size">705,484</property>
36 <property name="style">wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER</property>
37 <property name="subclass"></property>
38 <property name="title">Bitcoin</property>
39 <property name="tooltip"></property>
40 <property name="window_extra_style"></property>
41 <property name="window_name"></property>
42 <property name="window_style">wxTAB_TRAVERSAL</property>
43 <property name="xrc_skip_sizer">1</property>
44 <event name="OnActivate"></event>
45 <event name="OnActivateApp"></event>
46 <event name="OnChar"></event>
47 <event name="OnClose">OnClose</event>
48 <event name="OnEnterWindow"></event>
49 <event name="OnEraseBackground"></event>
50 <event name="OnHibernate"></event>
51 <event name="OnIconize"></event>
52 <event name="OnIdle">OnIdle</event>
53 <event name="OnKeyDown"></event>
54 <event name="OnKeyUp"></event>
55 <event name="OnKillFocus"></event>
56 <event name="OnLeaveWindow"></event>
57 <event name="OnLeftDClick"></event>
58 <event name="OnLeftDown"></event>
59 <event name="OnLeftUp"></event>
60 <event name="OnMiddleDClick"></event>
61 <event name="OnMiddleDown"></event>
62 <event name="OnMiddleUp"></event>
63 <event name="OnMotion"></event>
64 <event name="OnMouseEvents">OnMouseEvents</event>
65 <event name="OnMouseWheel"></event>
66 <event name="OnPaint">OnPaint</event>
67 <event name="OnRightDClick"></event>
68 <event name="OnRightDown"></event>
69 <event name="OnRightUp"></event>
70 <event name="OnSetFocus"></event>
71 <event name="OnSize"></event>
72 <event name="OnUpdateUI"></event>
73 <object class="wxMenuBar" expanded="1">
74 <property name="bg">240,240,240</property>
75 <property name="context_help"></property>
76 <property name="enabled">1</property>
77 <property name="fg"></property>
78 <property name="font"></property>
79 <property name="hidden">0</property>
80 <property name="id">wxID_ANY</property>
81 <property name="label">MyMenuBar</property>
82 <property name="maximum_size"></property>
83 <property name="minimum_size"></property>
84 <property name="name">m_menubar</property>
85 <property name="permission">protected</property>
86 <property name="pos"></property>
87 <property name="size"></property>
88 <property name="style"></property>
89 <property name="subclass"></property>
90 <property name="tooltip"></property>
91 <property name="window_extra_style"></property>
92 <property name="window_name"></property>
93 <property name="window_style"></property>
94 <event name="OnChar"></event>
95 <event name="OnEnterWindow"></event>
96 <event name="OnEraseBackground"></event>
97 <event name="OnKeyDown"></event>
98 <event name="OnKeyUp"></event>
99 <event name="OnKillFocus"></event>
100 <event name="OnLeaveWindow"></event>
101 <event name="OnLeftDClick"></event>
102 <event name="OnLeftDown"></event>
103 <event name="OnLeftUp"></event>
104 <event name="OnMiddleDClick"></event>
105 <event name="OnMiddleDown"></event>
106 <event name="OnMiddleUp"></event>
107 <event name="OnMotion"></event>
108 <event name="OnMouseEvents"></event>
109 <event name="OnMouseWheel"></event>
110 <event name="OnPaint"></event>
111 <event name="OnRightDClick"></event>
112 <event name="OnRightDown"></event>
113 <event name="OnRightUp"></event>
114 <event name="OnSetFocus"></event>
115 <event name="OnSize"></event>
116 <event name="OnUpdateUI"></event>
117 <object class="wxMenu" expanded="1">
118 <property name="label">&amp;File</property>
119 <property name="name">m_menuFile</property>
120 <property name="permission">protected</property>
121 <object class="wxMenuItem" expanded="1">
122 <property name="bitmap"></property>
123 <property name="checked">0</property>
124 <property name="enabled">1</property>
125 <property name="help"></property>
126 <property name="id">wxID_ANY</property>
127 <property name="kind">wxITEM_NORMAL</property>
128 <property name="label">E&amp;xit</property>
129 <property name="name">m_menuFileExit</property>
130 <property name="permission">none</property>
131 <property name="shortcut"></property>
132 <property name="unchecked_bitmap"></property>
133 <event name="OnMenuSelection">OnMenuFileExit</event>
134 <event name="OnUpdateUI"></event>
135 </object>
136 </object>
137 <object class="wxMenu" expanded="1">
138 <property name="label">&amp;Options</property>
139 <property name="name">m_menuOptions</property>
140 <property name="permission">public</property>
141 <object class="wxMenuItem" expanded="1">
142 <property name="bitmap"></property>
143 <property name="checked">0</property>
144 <property name="enabled">1</property>
145 <property name="help"></property>
146 <property name="id">wxID_OPTIONSGENERATEBITCOINS</property>
147 <property name="kind">wxITEM_CHECK</property>
148 <property name="label">&amp;Generate Coins</property>
149 <property name="name">m_menuOptionsGenerateBitcoins</property>
150 <property name="permission">none</property>
151 <property name="shortcut"></property>
152 <property name="unchecked_bitmap"></property>
153 <event name="OnMenuSelection">OnMenuOptionsGenerate</event>
154 <event name="OnUpdateUI"></event>
155 </object>
156 <object class="wxMenuItem" expanded="1">
157 <property name="bitmap"></property>
158 <property name="checked">0</property>
159 <property name="enabled">1</property>
160 <property name="help"></property>
161 <property name="id">wxID_ANY</property>
162 <property name="kind">wxITEM_NORMAL</property>
163 <property name="label">&amp;Options...</property>
164 <property name="name">m_menuOptionsOptions</property>
165 <property name="permission">none</property>
166 <property name="shortcut"></property>
167 <property name="unchecked_bitmap"></property>
168 <event name="OnMenuSelection">OnMenuOptionsOptions</event>
169 <event name="OnUpdateUI"></event>
170 </object>
171 </object>
172 <object class="wxMenu" expanded="1">
173 <property name="label">&amp;Help</property>
174 <property name="name">m_menuHelp</property>
175 <property name="permission">protected</property>
176 <object class="wxMenuItem" expanded="1">
177 <property name="bitmap"></property>
178 <property name="checked">0</property>
179 <property name="enabled">1</property>
180 <property name="help"></property>
181 <property name="id">wxID_ANY</property>
182 <property name="kind">wxITEM_NORMAL</property>
183 <property name="label">&amp;About...</property>
184 <property name="name">m_menuHelpAbout</property>
185 <property name="permission">none</property>
186 <property name="shortcut"></property>
187 <property name="unchecked_bitmap"></property>
188 <event name="OnMenuSelection">OnMenuHelpAbout</event>
189 <event name="OnUpdateUI"></event>
190 </object>
191 </object>
192 </object>
193 <object class="wxToolBar" expanded="0">
194 <property name="bg"></property>
195 <property name="bitmapsize">20,20</property>
196 <property name="context_help"></property>
197 <property name="enabled">1</property>
198 <property name="fg"></property>
199 <property name="font">,90,90,-1,70,0</property>
200 <property name="hidden">0</property>
201 <property name="id">wxID_ANY</property>
202 <property name="margins"></property>
203 <property name="maximum_size"></property>
204 <property name="minimum_size"></property>
205 <property name="name">m_toolBar</property>
206 <property name="packing">1</property>
207 <property name="permission">protected</property>
208 <property name="pos"></property>
209 <property name="separation">1</property>
210 <property name="size">-1,-1</property>
211 <property name="style">wxTB_FLAT|wxTB_HORZ_TEXT</property>
212 <property name="subclass"></property>
213 <property name="tooltip"></property>
214 <property name="window_extra_style"></property>
215 <property name="window_name"></property>
216 <property name="window_style"></property>
217 <event name="OnChar"></event>
218 <event name="OnEnterWindow"></event>
219 <event name="OnEraseBackground"></event>
220 <event name="OnKeyDown"></event>
221 <event name="OnKeyUp"></event>
222 <event name="OnKillFocus"></event>
223 <event name="OnLeaveWindow"></event>
224 <event name="OnLeftDClick"></event>
225 <event name="OnLeftDown"></event>
226 <event name="OnLeftUp"></event>
227 <event name="OnMiddleDClick"></event>
228 <event name="OnMiddleDown"></event>
229 <event name="OnMiddleUp"></event>
230 <event name="OnMotion"></event>
231 <event name="OnMouseEvents"></event>
232 <event name="OnMouseWheel"></event>
233 <event name="OnPaint"></event>
234 <event name="OnRightDClick"></event>
235 <event name="OnRightDown"></event>
236 <event name="OnRightUp"></event>
237 <event name="OnSetFocus"></event>
238 <event name="OnSize"></event>
239 <event name="OnUpdateUI"></event>
240 <object class="tool" expanded="1">
241 <property name="bitmap">send20; Load From Resource</property>
242 <property name="id">wxID_BUTTONSEND</property>
243 <property name="kind">wxITEM_NORMAL</property>
244 <property name="label">&amp;Send Coins</property>
245 <property name="name">m_tool1</property>
246 <property name="statusbar"></property>
247 <property name="tooltip"></property>
248 <event name="OnMenuSelection"></event>
249 <event name="OnToolClicked">OnButtonSend</event>
250 <event name="OnToolEnter"></event>
251 <event name="OnToolRClicked"></event>
252 <event name="OnUpdateUI"></event>
253 </object>
254 <object class="tool" expanded="1">
255 <property name="bitmap">addressbook20; Load From Resource</property>
256 <property name="id">wxID_BUTTONRECEIVE</property>
257 <property name="kind">wxITEM_NORMAL</property>
258 <property name="label">&amp;Address Book</property>
259 <property name="name">m_tool2</property>
260 <property name="statusbar"></property>
261 <property name="tooltip"></property>
262 <event name="OnMenuSelection"></event>
263 <event name="OnToolClicked">OnButtonAddressBook</event>
264 <event name="OnToolEnter"></event>
265 <event name="OnToolRClicked"></event>
266 <event name="OnUpdateUI"></event>
267 </object>
268 </object>
269 <object class="wxStatusBar" expanded="1">
270 <property name="bg">240,240,240</property>
271 <property name="context_help"></property>
272 <property name="enabled">1</property>
273 <property name="fg"></property>
274 <property name="fields">1</property>
275 <property name="font"></property>
276 <property name="hidden">0</property>
277 <property name="id">wxID_ANY</property>
278 <property name="maximum_size"></property>
279 <property name="minimum_size"></property>
280 <property name="name">m_statusBar</property>
281 <property name="permission">protected</property>
282 <property name="pos"></property>
283 <property name="size"></property>
284 <property name="style">wxST_SIZEGRIP</property>
285 <property name="subclass"></property>
286 <property name="tooltip"></property>
287 <property name="window_extra_style"></property>
288 <property name="window_name"></property>
289 <property name="window_style"></property>
290 <event name="OnChar"></event>
291 <event name="OnEnterWindow"></event>
292 <event name="OnEraseBackground"></event>
293 <event name="OnKeyDown"></event>
294 <event name="OnKeyUp"></event>
295 <event name="OnKillFocus"></event>
296 <event name="OnLeaveWindow"></event>
297 <event name="OnLeftDClick"></event>
298 <event name="OnLeftDown"></event>
299 <event name="OnLeftUp"></event>
300 <event name="OnMiddleDClick"></event>
301 <event name="OnMiddleDown"></event>
302 <event name="OnMiddleUp"></event>
303 <event name="OnMotion"></event>
304 <event name="OnMouseEvents"></event>
305 <event name="OnMouseWheel"></event>
306 <event name="OnPaint"></event>
307 <event name="OnRightDClick"></event>
308 <event name="OnRightDown"></event>
309 <event name="OnRightUp"></event>
310 <event name="OnSetFocus"></event>
311 <event name="OnSize"></event>
312 <event name="OnUpdateUI"></event>
313 </object>
314 <object class="wxBoxSizer" expanded="0">
315 <property name="minimum_size"></property>
316 <property name="name">bSizer2</property>
317 <property name="orient">wxVERTICAL</property>
318 <property name="permission">none</property>
319 <object class="sizeritem" expanded="1">
320 <property name="border">5</property>
321 <property name="flag">wxEXPAND</property>
322 <property name="proportion">0</property>
323 <object class="spacer" expanded="1">
324 <property name="height">2</property>
325 <property name="permission">protected</property>
326 <property name="width">0</property>
327 </object>
328 </object>
329 <object class="sizeritem" expanded="1">
330 <property name="border">5</property>
331 <property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property>
332 <property name="proportion">0</property>
333 <object class="wxBoxSizer" expanded="1">
334 <property name="minimum_size"></property>
335 <property name="name">bSizer85</property>
336 <property name="orient">wxHORIZONTAL</property>
337 <property name="permission">none</property>
338 <object class="sizeritem" expanded="1">
339 <property name="border">5</property>
340 <property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT</property>
341 <property name="proportion">0</property>
342 <object class="wxStaticText" expanded="1">
343 <property name="bg"></property>
344 <property name="context_help"></property>
345 <property name="enabled">1</property>
346 <property name="fg"></property>
347 <property name="font"></property>
348 <property name="hidden">0</property>
349 <property name="id">wxID_ANY</property>
350 <property name="label">Your Bitcoin Address:</property>
351 <property name="maximum_size"></property>
352 <property name="minimum_size"></property>
353 <property name="name">m_staticText32</property>
354 <property name="permission">protected</property>
355 <property name="pos"></property>
356 <property name="size"></property>
357 <property name="style"></property>
358 <property name="subclass"></property>
359 <property name="tooltip"></property>
360 <property name="window_extra_style"></property>
361 <property name="window_name"></property>
362 <property name="window_style"></property>
363 <property name="wrap">-1</property>
364 <event name="OnChar"></event>
365 <event name="OnEnterWindow"></event>
366 <event name="OnEraseBackground"></event>
367 <event name="OnKeyDown"></event>
368 <event name="OnKeyUp"></event>
369 <event name="OnKillFocus"></event>
370 <event name="OnLeaveWindow"></event>
371 <event name="OnLeftDClick"></event>
372 <event name="OnLeftDown"></event>
373 <event name="OnLeftUp"></event>
374 <event name="OnMiddleDClick"></event>
375 <event name="OnMiddleDown"></event>
376 <event name="OnMiddleUp"></event>
377 <event name="OnMotion"></event>
378 <event name="OnMouseEvents"></event>
379 <event name="OnMouseWheel"></event>
380 <event name="OnPaint"></event>
381 <event name="OnRightDClick"></event>
382 <event name="OnRightDown"></event>
383 <event name="OnRightUp"></event>
384 <event name="OnSetFocus"></event>
385 <event name="OnSize"></event>
386 <event name="OnUpdateUI"></event>
387 </object>
388 </object>
389 <object class="sizeritem" expanded="1">
390 <property name="border">5</property>
391 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
392 <property name="proportion">0</property>
393 <object class="wxTextCtrl" expanded="1">
394 <property name="bg">wxSYS_COLOUR_MENU</property>
395 <property name="context_help"></property>
396 <property name="enabled">1</property>
397 <property name="fg"></property>
398 <property name="font"></property>
399 <property name="hidden">0</property>
400 <property name="id">wxID_TEXTCTRLADDRESS</property>
401 <property name="maximum_size">-1,-1</property>
402 <property name="maxlength">0</property>
403 <property name="minimum_size">-1,-1</property>
404 <property name="name">m_textCtrlAddress</property>
405 <property name="permission">protected</property>
406 <property name="pos"></property>
407 <property name="size">250,-1</property>
408 <property name="style">wxTE_READONLY</property>
409 <property name="subclass"></property>
410 <property name="tooltip"></property>
411 <property name="value"></property>
412 <property name="window_extra_style"></property>
413 <property name="window_name"></property>
414 <property name="window_style"></property>
415 <event name="OnChar"></event>
416 <event name="OnEnterWindow"></event>
417 <event name="OnEraseBackground"></event>
418 <event name="OnKeyDown">OnKeyDown</event>
419 <event name="OnKeyUp"></event>
420 <event name="OnKillFocus"></event>
421 <event name="OnLeaveWindow"></event>
422 <event name="OnLeftDClick"></event>
423 <event name="OnLeftDown"></event>
424 <event name="OnLeftUp"></event>
425 <event name="OnMiddleDClick"></event>
426 <event name="OnMiddleDown"></event>
427 <event name="OnMiddleUp"></event>
428 <event name="OnMotion"></event>
429 <event name="OnMouseEvents">OnMouseEventsAddress</event>
430 <event name="OnMouseWheel"></event>
431 <event name="OnPaint"></event>
432 <event name="OnRightDClick"></event>
433 <event name="OnRightDown"></event>
434 <event name="OnRightUp"></event>
435 <event name="OnSetFocus">OnSetFocusAddress</event>
436 <event name="OnSize"></event>
437 <event name="OnText"></event>
438 <event name="OnTextEnter"></event>
439 <event name="OnTextMaxLen"></event>
440 <event name="OnTextURL"></event>
441 <event name="OnUpdateUI"></event>
442 </object>
443 </object>
444 <object class="sizeritem" expanded="1">
445 <property name="border">5</property>
446 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT</property>
447 <property name="proportion">0</property>
448 <object class="wxButton" expanded="1">
449 <property name="bg"></property>
450 <property name="context_help"></property>
451 <property name="default">0</property>
452 <property name="enabled">1</property>
453 <property name="fg"></property>
454 <property name="font"></property>
455 <property name="hidden">0</property>
456 <property name="id">wxID_BUTTONCOPY</property>
457 <property name="label">&amp;Copy to Clipboard</property>
458 <property name="maximum_size"></property>
459 <property name="minimum_size"></property>
460 <property name="name">m_buttonCopy</property>
461 <property name="permission">protected</property>
462 <property name="pos"></property>
463 <property name="size"></property>
464 <property name="style">wxBU_EXACTFIT</property>
465 <property name="subclass"></property>
466 <property name="tooltip"></property>
467 <property name="window_extra_style"></property>
468 <property name="window_name"></property>
469 <property name="window_style"></property>
470 <event name="OnButtonClick">OnButtonCopy</event>
471 <event name="OnChar"></event>
472 <event name="OnEnterWindow"></event>
473 <event name="OnEraseBackground"></event>
474 <event name="OnKeyDown"></event>
475 <event name="OnKeyUp"></event>
476 <event name="OnKillFocus"></event>
477 <event name="OnLeaveWindow"></event>
478 <event name="OnLeftDClick"></event>
479 <event name="OnLeftDown"></event>
480 <event name="OnLeftUp"></event>
481 <event name="OnMiddleDClick"></event>
482 <event name="OnMiddleDown"></event>
483 <event name="OnMiddleUp"></event>
484 <event name="OnMotion"></event>
485 <event name="OnMouseEvents"></event>
486 <event name="OnMouseWheel"></event>
487 <event name="OnPaint"></event>
488 <event name="OnRightDClick"></event>
489 <event name="OnRightDown"></event>
490 <event name="OnRightUp"></event>
491 <event name="OnSetFocus"></event>
492 <event name="OnSize"></event>
493 <event name="OnUpdateUI"></event>
494 </object>
495 </object>
496 <object class="sizeritem" expanded="1">
497 <property name="border">5</property>
498 <property name="flag">wxRIGHT</property>
499 <property name="proportion">0</property>
500 <object class="wxButton" expanded="1">
501 <property name="bg"></property>
502 <property name="context_help"></property>
503 <property name="default">0</property>
504 <property name="enabled">1</property>
505 <property name="fg"></property>
506 <property name="font"></property>
507 <property name="hidden">0</property>
508 <property name="id">wxID_BUTTONCHANGE</property>
509 <property name="label">C&amp;hange...</property>
510 <property name="maximum_size"></property>
511 <property name="minimum_size"></property>
512 <property name="name">m_button91</property>
513 <property name="permission">protected</property>
514 <property name="pos"></property>
515 <property name="size"></property>
516 <property name="style"></property>
517 <property name="subclass"></property>
518 <property name="tooltip"></property>
519 <property name="window_extra_style"></property>
520 <property name="window_name"></property>
521 <property name="window_style"></property>
522 <event name="OnButtonClick">OnButtonChange</event>
523 <event name="OnChar"></event>
524 <event name="OnEnterWindow"></event>
525 <event name="OnEraseBackground"></event>
526 <event name="OnKeyDown"></event>
527 <event name="OnKeyUp"></event>
528 <event name="OnKillFocus"></event>
529 <event name="OnLeaveWindow"></event>
530 <event name="OnLeftDClick"></event>
531 <event name="OnLeftDown"></event>
532 <event name="OnLeftUp"></event>
533 <event name="OnMiddleDClick"></event>
534 <event name="OnMiddleDown"></event>
535 <event name="OnMiddleUp"></event>
536 <event name="OnMotion"></event>
537 <event name="OnMouseEvents"></event>
538 <event name="OnMouseWheel"></event>
539 <event name="OnPaint"></event>
540 <event name="OnRightDClick"></event>
541 <event name="OnRightDown"></event>
542 <event name="OnRightUp"></event>
543 <event name="OnSetFocus"></event>
544 <event name="OnSize"></event>
545 <event name="OnUpdateUI"></event>
546 </object>
547 </object>
548 <object class="sizeritem" expanded="1">
549 <property name="border">5</property>
550 <property name="flag">wxEXPAND</property>
551 <property name="proportion">0</property>
552 <object class="spacer" expanded="1">
553 <property name="height">0</property>
554 <property name="permission">protected</property>
555 <property name="width">0</property>
556 </object>
557 </object>
558 </object>
559 </object>
560 <object class="sizeritem" expanded="1">
561 <property name="border">5</property>
562 <property name="flag">wxEXPAND</property>
563 <property name="proportion">0</property>
564 <object class="wxBoxSizer" expanded="1">
565 <property name="minimum_size"></property>
566 <property name="name">bSizer3</property>
567 <property name="orient">wxHORIZONTAL</property>
568 <property name="permission">none</property>
569 <object class="sizeritem" expanded="1">
570 <property name="border">5</property>
571 <property name="flag">wxEXPAND|wxALIGN_BOTTOM|wxALL</property>
572 <property name="proportion">1</property>
573 <object class="wxPanel" expanded="1">
574 <property name="bg"></property>
575 <property name="context_help"></property>
576 <property name="enabled">1</property>
577 <property name="fg"></property>
578 <property name="font"></property>
579 <property name="hidden">0</property>
580 <property name="id">wxID_ANY</property>
581 <property name="maximum_size"></property>
582 <property name="minimum_size"></property>
583 <property name="name">m_panel14</property>
584 <property name="permission">protected</property>
585 <property name="pos"></property>
586 <property name="size"></property>
587 <property name="subclass"></property>
588 <property name="tooltip"></property>
589 <property name="window_extra_style"></property>
590 <property name="window_name"></property>
591 <property name="window_style">wxTAB_TRAVERSAL</property>
592 <event name="OnChar"></event>
593 <event name="OnEnterWindow"></event>
594 <event name="OnEraseBackground"></event>
595 <event name="OnKeyDown"></event>
596 <event name="OnKeyUp"></event>
597 <event name="OnKillFocus"></event>
598 <event name="OnLeaveWindow"></event>
599 <event name="OnLeftDClick"></event>
600 <event name="OnLeftDown"></event>
601 <event name="OnLeftUp"></event>
602 <event name="OnMiddleDClick"></event>
603 <event name="OnMiddleDown"></event>
604 <event name="OnMiddleUp"></event>
605 <event name="OnMotion"></event>
606 <event name="OnMouseEvents"></event>
607 <event name="OnMouseWheel"></event>
608 <event name="OnPaint"></event>
609 <event name="OnRightDClick"></event>
610 <event name="OnRightDown"></event>
611 <event name="OnRightUp"></event>
612 <event name="OnSetFocus"></event>
613 <event name="OnSize"></event>
614 <event name="OnUpdateUI"></event>
615 <object class="wxBoxSizer" expanded="1">
616 <property name="minimum_size"></property>
617 <property name="name">bSizer66</property>
618 <property name="orient">wxHORIZONTAL</property>
619 <property name="permission">none</property>
620 <object class="sizeritem" expanded="1">
621 <property name="border">5</property>
622 <property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT</property>
623 <property name="proportion">0</property>
624 <object class="wxStaticText" expanded="1">
625 <property name="bg"></property>
626 <property name="context_help"></property>
627 <property name="enabled">1</property>
628 <property name="fg"></property>
629 <property name="font"></property>
630 <property name="hidden">0</property>
631 <property name="id">wxID_ANY</property>
632 <property name="label">Balance:</property>
633 <property name="maximum_size"></property>
634 <property name="minimum_size"></property>
635 <property name="name">m_staticText41</property>
636 <property name="permission">protected</property>
637 <property name="pos"></property>
638 <property name="size">-1,15</property>
639 <property name="style"></property>
640 <property name="subclass"></property>
641 <property name="tooltip"></property>
642 <property name="window_extra_style"></property>
643 <property name="window_name"></property>
644 <property name="window_style"></property>
645 <property name="wrap">-1</property>
646 <event name="OnChar"></event>
647 <event name="OnEnterWindow"></event>
648 <event name="OnEraseBackground"></event>
649 <event name="OnKeyDown"></event>
650 <event name="OnKeyUp"></event>
651 <event name="OnKillFocus"></event>
652 <event name="OnLeaveWindow"></event>
653 <event name="OnLeftDClick"></event>
654 <event name="OnLeftDown"></event>
655 <event name="OnLeftUp"></event>
656 <event name="OnMiddleDClick"></event>
657 <event name="OnMiddleDown"></event>
658 <event name="OnMiddleUp"></event>
659 <event name="OnMotion"></event>
660 <event name="OnMouseEvents"></event>
661 <event name="OnMouseWheel"></event>
662 <event name="OnPaint"></event>
663 <event name="OnRightDClick"></event>
664 <event name="OnRightDown"></event>
665 <event name="OnRightUp"></event>
666 <event name="OnSetFocus"></event>
667 <event name="OnSize"></event>
668 <event name="OnUpdateUI"></event>
669 </object>
670 </object>
671 <object class="sizeritem" expanded="1">
672 <property name="border">5</property>
673 <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
674 <property name="proportion">0</property>
675 <object class="wxStaticText" expanded="1">
676 <property name="bg">240,240,240</property>
677 <property name="context_help"></property>
678 <property name="enabled">1</property>
679 <property name="fg"></property>
680 <property name="font">,90,90,8,70,0</property>
681 <property name="hidden">0</property>
682 <property name="id">wxID_ANY</property>
683 <property name="label"></property>
684 <property name="maximum_size"></property>
685 <property name="minimum_size"></property>
686 <property name="name">m_staticTextBalance</property>
687 <property name="permission">protected</property>
688 <property name="pos"></property>
689 <property name="size">120,15</property>
690 <property name="style">wxALIGN_RIGHT|wxST_NO_AUTORESIZE</property>
691 <property name="subclass"></property>
692 <property name="tooltip"></property>
693 <property name="window_extra_style"></property>
694 <property name="window_name"></property>
695 <property name="window_style"></property>
696 <property name="wrap">-1</property>
697 <event name="OnChar"></event>
698 <event name="OnEnterWindow"></event>
699 <event name="OnEraseBackground"></event>
700 <event name="OnKeyDown"></event>
701 <event name="OnKeyUp"></event>
702 <event name="OnKillFocus"></event>
703 <event name="OnLeaveWindow"></event>
704 <event name="OnLeftDClick"></event>
705 <event name="OnLeftDown"></event>
706 <event name="OnLeftUp"></event>
707 <event name="OnMiddleDClick"></event>
708 <event name="OnMiddleDown"></event>
709 <event name="OnMiddleUp"></event>
710 <event name="OnMotion"></event>
711 <event name="OnMouseEvents"></event>
712 <event name="OnMouseWheel"></event>
713 <event name="OnPaint"></event>
714 <event name="OnRightDClick"></event>
715 <event name="OnRightDown"></event>
716 <event name="OnRightUp"></event>
717 <event name="OnSetFocus"></event>
718 <event name="OnSize"></event>
719 <event name="OnUpdateUI"></event>
720 </object>
721 </object>
722 </object>
723 </object>
724 </object>
725 <object class="sizeritem" expanded="1">
726 <property name="border">5</property>
727 <property name="flag">wxEXPAND</property>
728 <property name="proportion">0</property>
729 <object class="spacer" expanded="1">
730 <property name="height">0</property>
731 <property name="permission">protected</property>
732 <property name="width">0</property>
733 </object>
734 </object>
735 <object class="sizeritem" expanded="1">
736 <property name="border">5</property>
737 <property name="flag">wxALIGN_BOTTOM|wxTOP|wxRIGHT|wxLEFT</property>
738 <property name="proportion">0</property>
739 <object class="wxChoice" expanded="1">
740 <property name="bg"></property>
741 <property name="choices">&quot; All&quot; &quot; Sent&quot; &quot; Received&quot; &quot; In Progress&quot;</property>
742 <property name="context_help"></property>
743 <property name="enabled">1</property>
744 <property name="fg"></property>
745 <property name="font"></property>
746 <property name="hidden">1</property>
747 <property name="id">wxID_ANY</property>
748 <property name="maximum_size"></property>
749 <property name="minimum_size"></property>
750 <property name="name">m_choiceFilter</property>
751 <property name="permission">protected</property>
752 <property name="pos"></property>
753 <property name="selection">0</property>
754 <property name="size">110,-1</property>
755 <property name="subclass"></property>
756 <property name="tooltip"></property>
757 <property name="window_extra_style"></property>
758 <property name="window_name"></property>
759 <property name="window_style"></property>
760 <event name="OnChar"></event>
761 <event name="OnChoice"></event>
762 <event name="OnEnterWindow"></event>
763 <event name="OnEraseBackground"></event>
764 <event name="OnKeyDown"></event>
765 <event name="OnKeyUp"></event>
766 <event name="OnKillFocus"></event>
767 <event name="OnLeaveWindow"></event>
768 <event name="OnLeftDClick"></event>
769 <event name="OnLeftDown"></event>
770 <event name="OnLeftUp"></event>
771 <event name="OnMiddleDClick"></event>
772 <event name="OnMiddleDown"></event>
773 <event name="OnMiddleUp"></event>
774 <event name="OnMotion"></event>
775 <event name="OnMouseEvents"></event>
776 <event name="OnMouseWheel"></event>
777 <event name="OnPaint"></event>
778 <event name="OnRightDClick"></event>
779 <event name="OnRightDown"></event>
780 <event name="OnRightUp"></event>
781 <event name="OnSetFocus"></event>
782 <event name="OnSize"></event>
783 <event name="OnUpdateUI"></event>
784 </object>
785 </object>
786 </object>
787 </object>
788 <object class="sizeritem" expanded="1">
789 <property name="border">5</property>
790 <property name="flag">wxEXPAND</property>
791 <property name="proportion">1</property>
792 <object class="wxNotebook" expanded="1">
793 <property name="bg"></property>
794 <property name="bitmapsize"></property>
795 <property name="context_help"></property>
796 <property name="enabled">1</property>
797 <property name="fg"></property>
798 <property name="font"></property>
799 <property name="hidden">0</property>
800 <property name="id">wxID_ANY</property>
801 <property name="maximum_size"></property>
802 <property name="minimum_size"></property>
803 <property name="name">m_notebook</property>
804 <property name="permission">protected</property>
805 <property name="pos"></property>
806 <property name="size"></property>
807 <property name="style"></property>
808 <property name="subclass"></property>
809 <property name="tooltip"></property>
810 <property name="window_extra_style"></property>
811 <property name="window_name"></property>
812 <property name="window_style"></property>
813 <event name="OnChar"></event>
814 <event name="OnEnterWindow"></event>
815 <event name="OnEraseBackground"></event>
816 <event name="OnKeyDown"></event>
817 <event name="OnKeyUp"></event>
818 <event name="OnKillFocus"></event>
819 <event name="OnLeaveWindow"></event>
820 <event name="OnLeftDClick"></event>
821 <event name="OnLeftDown"></event>
822 <event name="OnLeftUp"></event>
823 <event name="OnMiddleDClick"></event>
824 <event name="OnMiddleDown"></event>
825 <event name="OnMiddleUp"></event>
826 <event name="OnMotion"></event>
827 <event name="OnMouseEvents"></event>
828 <event name="OnMouseWheel"></event>
829 <event name="OnNotebookPageChanged"></event>
830 <event name="OnNotebookPageChanging"></event>
831 <event name="OnPaint"></event>
832 <event name="OnRightDClick"></event>
833 <event name="OnRightDown"></event>
834 <event name="OnRightUp"></event>
835 <event name="OnSetFocus"></event>
836 <event name="OnSize"></event>
837 <event name="OnUpdateUI"></event>
838 <object class="notebookpage" expanded="1">
839 <property name="bitmap"></property>
840 <property name="label">All Transactions</property>
841 <property name="select">0</property>
842 <object class="wxPanel" expanded="1">
843 <property name="bg"></property>
844 <property name="context_help"></property>
845 <property name="enabled">1</property>
846 <property name="fg"></property>
847 <property name="font"></property>
848 <property name="hidden">0</property>
849 <property name="id">wxID_ANY</property>
850 <property name="maximum_size"></property>
851 <property name="minimum_size"></property>
852 <property name="name">m_panel7</property>
853 <property name="permission">protected</property>
854 <property name="pos"></property>
855 <property name="size"></property>
856 <property name="subclass"></property>
857 <property name="tooltip"></property>
858 <property name="window_extra_style"></property>
859 <property name="window_name"></property>
860 <property name="window_style">wxTAB_TRAVERSAL</property>
861 <event name="OnChar"></event>
862 <event name="OnEnterWindow"></event>
863 <event name="OnEraseBackground"></event>
864 <event name="OnKeyDown"></event>
865 <event name="OnKeyUp"></event>
866 <event name="OnKillFocus"></event>
867 <event name="OnLeaveWindow"></event>
868 <event name="OnLeftDClick"></event>
869 <event name="OnLeftDown"></event>
870 <event name="OnLeftUp"></event>
871 <event name="OnMiddleDClick"></event>
872 <event name="OnMiddleDown"></event>
873 <event name="OnMiddleUp"></event>
874 <event name="OnMotion"></event>
875 <event name="OnMouseEvents"></event>
876 <event name="OnMouseWheel"></event>
877 <event name="OnPaint"></event>
878 <event name="OnRightDClick"></event>
879 <event name="OnRightDown"></event>
880 <event name="OnRightUp"></event>
881 <event name="OnSetFocus"></event>
882 <event name="OnSize"></event>
883 <event name="OnUpdateUI"></event>
884 <object class="wxBoxSizer" expanded="1">
885 <property name="minimum_size"></property>
886 <property name="name">bSizer157</property>
887 <property name="orient">wxVERTICAL</property>
888 <property name="permission">none</property>
889 <object class="sizeritem" expanded="1">
890 <property name="border">5</property>
891 <property name="flag">wxEXPAND|wxALL</property>
892 <property name="proportion">1</property>
893 <object class="wxListCtrl" expanded="1">
894 <property name="bg"></property>
895 <property name="context_help"></property>
896 <property name="enabled">1</property>
897 <property name="fg"></property>
898 <property name="font"></property>
899 <property name="hidden">0</property>
900 <property name="id">wxID_ANY</property>
901 <property name="maximum_size"></property>
902 <property name="minimum_size"></property>
903 <property name="name">m_listCtrl</property>
904 <property name="permission">public</property>
905 <property name="pos"></property>
906 <property name="size"></property>
907 <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_DESCENDING</property>
908 <property name="subclass"></property>
909 <property name="tooltip"></property>
910 <property name="window_extra_style"></property>
911 <property name="window_name"></property>
912 <property name="window_style">wxALWAYS_SHOW_SB</property>
913 <event name="OnChar"></event>
914 <event name="OnEnterWindow"></event>
915 <event name="OnEraseBackground"></event>
916 <event name="OnKeyDown"></event>
917 <event name="OnKeyUp"></event>
918 <event name="OnKillFocus"></event>
919 <event name="OnLeaveWindow"></event>
920 <event name="OnLeftDClick"></event>
921 <event name="OnLeftDown"></event>
922 <event name="OnLeftUp"></event>
923 <event name="OnListBeginDrag"></event>
924 <event name="OnListBeginLabelEdit"></event>
925 <event name="OnListBeginRDrag"></event>
926 <event name="OnListCacheHint"></event>
927 <event name="OnListColBeginDrag">OnListColBeginDrag</event>
928 <event name="OnListColClick"></event>
929 <event name="OnListColDragging"></event>
930 <event name="OnListColEndDrag"></event>
931 <event name="OnListColRightClick"></event>
932 <event name="OnListDeleteAllItems"></event>
933 <event name="OnListDeleteItem"></event>
934 <event name="OnListEndLabelEdit"></event>
935 <event name="OnListInsertItem"></event>
936 <event name="OnListItemActivated">OnListItemActivatedAllTransactions</event>
937 <event name="OnListItemDeselected"></event>
938 <event name="OnListItemFocused"></event>
939 <event name="OnListItemMiddleClick"></event>
940 <event name="OnListItemRightClick"></event>
941 <event name="OnListItemSelected"></event>
942 <event name="OnListKeyDown"></event>
943 <event name="OnMiddleDClick"></event>
944 <event name="OnMiddleDown"></event>
945 <event name="OnMiddleUp"></event>
946 <event name="OnMotion"></event>
947 <event name="OnMouseEvents"></event>
948 <event name="OnMouseWheel"></event>
949 <event name="OnPaint">OnPaintListCtrl</event>
950 <event name="OnRightDClick"></event>
951 <event name="OnRightDown"></event>
952 <event name="OnRightUp"></event>
953 <event name="OnSetFocus"></event>
954 <event name="OnSize"></event>
955 <event name="OnUpdateUI"></event>
956 </object>
957 </object>
958 </object>
959 </object>
960 </object>
961 </object>
962 </object>
963 <object class="sizeritem" expanded="1">
964 <property name="border">5</property>
965 <property name="flag">wxEXPAND</property>
966 <property name="proportion">1</property>
967 <object class="wxBoxSizer" expanded="1">
968 <property name="minimum_size"></property>
969 <property name="name">bSizer_TabsForFutureUse</property>
970 <property name="orient">wxVERTICAL</property>
971 <property name="permission">none</property>
972 <object class="sizeritem" expanded="1">
973 <property name="border">5</property>
974 <property name="flag">wxEXPAND | wxALL</property>
975 <property name="proportion">1</property>
976 <object class="wxPanel" expanded="1">
977 <property name="bg"></property>
978 <property name="context_help"></property>
979 <property name="enabled">1</property>
980 <property name="fg"></property>
981 <property name="font"></property>
982 <property name="hidden">1</property>
983 <property name="id">wxID_ANY</property>
984 <property name="maximum_size"></property>
985 <property name="minimum_size"></property>
986 <property name="name">m_panel9</property>
987 <property name="permission">protected</property>
988 <property name="pos"></property>
989 <property name="size"></property>
990 <property name="subclass"></property>
991 <property name="tooltip"></property>
992 <property name="window_extra_style"></property>
993 <property name="window_name"></property>
994 <property name="window_style">wxTAB_TRAVERSAL</property>
995 <event name="OnChar"></event>
996 <event name="OnEnterWindow"></event>
997 <event name="OnEraseBackground"></event>
998 <event name="OnKeyDown"></event>
999 <event name="OnKeyUp"></event>
1000 <event name="OnKillFocus"></event>
1001 <event name="OnLeaveWindow"></event>
1002 <event name="OnLeftDClick"></event>
1003 <event name="OnLeftDown"></event>
1004 <event name="OnLeftUp"></event>
1005 <event name="OnMiddleDClick"></event>
1006 <event name="OnMiddleDown"></event>
1007 <event name="OnMiddleUp"></event>
1008 <event name="OnMotion"></event>
1009 <event name="OnMouseEvents"></event>
1010 <event name="OnMouseWheel"></event>
1011 <event name="OnPaint"></event>
1012 <event name="OnRightDClick"></event>
1013 <event name="OnRightDown"></event>
1014 <event name="OnRightUp"></event>
1015 <event name="OnSetFocus"></event>
1016 <event name="OnSize"></event>
1017 <event name="OnUpdateUI"></event>
1018 <object class="wxBoxSizer" expanded="1">
1019 <property name="minimum_size"></property>
1020 <property name="name">bSizer159</property>
1021 <property name="orient">wxVERTICAL</property>
1022 <property name="permission">none</property>
1023 <object class="sizeritem" expanded="1">
1024 <property name="border">5</property>
1025 <property name="flag">wxALL|wxEXPAND</property>
1026 <property name="proportion">1</property>
1027 <object class="wxListCtrl" expanded="1">
1028 <property name="bg"></property>
1029 <property name="context_help"></property>
1030 <property name="enabled">1</property>
1031 <property name="fg"></property>
1032 <property name="font"></property>
1033 <property name="hidden">0</property>
1034 <property name="id">wxID_ANY</property>
1035 <property name="maximum_size"></property>
1036 <property name="minimum_size"></property>
1037 <property name="name">m_listCtrlEscrows</property>
1038 <property name="permission">public</property>
1039 <property name="pos"></property>
1040 <property name="size"></property>
1041 <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT</property>
1042 <property name="subclass"></property>
1043 <property name="tooltip"></property>
1044 <property name="window_extra_style"></property>
1045 <property name="window_name"></property>
1046 <property name="window_style"></property>
1047 <event name="OnChar"></event>
1048 <event name="OnEnterWindow"></event>
1049 <event name="OnEraseBackground"></event>
1050 <event name="OnKeyDown"></event>
1051 <event name="OnKeyUp"></event>
1052 <event name="OnKillFocus"></event>
1053 <event name="OnLeaveWindow"></event>
1054 <event name="OnLeftDClick"></event>
1055 <event name="OnLeftDown"></event>
1056 <event name="OnLeftUp"></event>
1057 <event name="OnListBeginDrag"></event>
1058 <event name="OnListBeginLabelEdit"></event>
1059 <event name="OnListBeginRDrag"></event>
1060 <event name="OnListCacheHint"></event>
1061 <event name="OnListColBeginDrag"></event>
1062 <event name="OnListColClick"></event>
1063 <event name="OnListColDragging"></event>
1064 <event name="OnListColEndDrag"></event>
1065 <event name="OnListColRightClick"></event>
1066 <event name="OnListDeleteAllItems"></event>
1067 <event name="OnListDeleteItem"></event>
1068 <event name="OnListEndLabelEdit"></event>
1069 <event name="OnListInsertItem"></event>
1070 <event name="OnListItemActivated"></event>
1071 <event name="OnListItemDeselected"></event>
1072 <event name="OnListItemFocused"></event>
1073 <event name="OnListItemMiddleClick"></event>
1074 <event name="OnListItemRightClick"></event>
1075 <event name="OnListItemSelected"></event>
1076 <event name="OnListKeyDown"></event>
1077 <event name="OnMiddleDClick"></event>
1078 <event name="OnMiddleDown"></event>
1079 <event name="OnMiddleUp"></event>
1080 <event name="OnMotion"></event>
1081 <event name="OnMouseEvents"></event>
1082 <event name="OnMouseWheel"></event>
1083 <event name="OnPaint"></event>
1084 <event name="OnRightDClick"></event>
1085 <event name="OnRightDown"></event>
1086 <event name="OnRightUp"></event>
1087 <event name="OnSetFocus"></event>
1088 <event name="OnSize"></event>
1089 <event name="OnUpdateUI"></event>
1090 </object>
1091 </object>
1092 </object>
1093 </object>
1094 </object>
1095 <object class="sizeritem" expanded="1">
1096 <property name="border">5</property>
1097 <property name="flag">wxEXPAND | wxALL</property>
1098 <property name="proportion">1</property>
1099 <object class="wxPanel" expanded="1">
1100 <property name="bg"></property>
1101 <property name="context_help"></property>
1102 <property name="enabled">1</property>
1103 <property name="fg"></property>
1104 <property name="font"></property>
1105 <property name="hidden">1</property>
1106 <property name="id">wxID_ANY</property>
1107 <property name="maximum_size"></property>
1108 <property name="minimum_size"></property>
1109 <property name="name">m_panel8</property>
1110 <property name="permission">protected</property>
1111 <property name="pos"></property>
1112 <property name="size"></property>
1113 <property name="subclass"></property>
1114 <property name="tooltip"></property>
1115 <property name="window_extra_style"></property>
1116 <property name="window_name"></property>
1117 <property name="window_style">wxTAB_TRAVERSAL</property>
1118 <event name="OnChar"></event>
1119 <event name="OnEnterWindow"></event>
1120 <event name="OnEraseBackground"></event>
1121 <event name="OnKeyDown"></event>
1122 <event name="OnKeyUp"></event>
1123 <event name="OnKillFocus"></event>
1124 <event name="OnLeaveWindow"></event>
1125 <event name="OnLeftDClick"></event>
1126 <event name="OnLeftDown"></event>
1127 <event name="OnLeftUp"></event>
1128 <event name="OnMiddleDClick"></event>
1129 <event name="OnMiddleDown"></event>
1130 <event name="OnMiddleUp"></event>
1131 <event name="OnMotion"></event>
1132 <event name="OnMouseEvents"></event>
1133 <event name="OnMouseWheel"></event>
1134 <event name="OnPaint"></event>
1135 <event name="OnRightDClick"></event>
1136 <event name="OnRightDown"></event>
1137 <event name="OnRightUp"></event>
1138 <event name="OnSetFocus"></event>
1139 <event name="OnSize"></event>
1140 <event name="OnUpdateUI"></event>
1141 <object class="wxBoxSizer" expanded="1">
1142 <property name="minimum_size"></property>
1143 <property name="name">bSizer158</property>
1144 <property name="orient">wxVERTICAL</property>
1145 <property name="permission">none</property>
1146 <object class="sizeritem" expanded="1">
1147 <property name="border">5</property>
1148 <property name="flag">wxALL|wxEXPAND</property>
1149 <property name="proportion">1</property>
1150 <object class="wxListCtrl" expanded="1">
1151 <property name="bg"></property>
1152 <property name="context_help"></property>
1153 <property name="enabled">1</property>
1154 <property name="fg"></property>
1155 <property name="font"></property>
1156 <property name="hidden">0</property>
1157 <property name="id">wxID_ANY</property>
1158 <property name="maximum_size"></property>
1159 <property name="minimum_size"></property>
1160 <property name="name">m_listCtrlOrdersSent</property>
1161 <property name="permission">public</property>
1162 <property name="pos"></property>
1163 <property name="size"></property>
1164 <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT</property>
1165 <property name="subclass"></property>
1166 <property name="tooltip"></property>
1167 <property name="window_extra_style"></property>
1168 <property name="window_name"></property>
1169 <property name="window_style"></property>
1170 <event name="OnChar"></event>
1171 <event name="OnEnterWindow"></event>
1172 <event name="OnEraseBackground"></event>
1173 <event name="OnKeyDown"></event>
1174 <event name="OnKeyUp"></event>
1175 <event name="OnKillFocus"></event>
1176 <event name="OnLeaveWindow"></event>
1177 <event name="OnLeftDClick"></event>
1178 <event name="OnLeftDown"></event>
1179 <event name="OnLeftUp"></event>
1180 <event name="OnListBeginDrag"></event>
1181 <event name="OnListBeginLabelEdit"></event>
1182 <event name="OnListBeginRDrag"></event>
1183 <event name="OnListCacheHint"></event>
1184 <event name="OnListColBeginDrag"></event>
1185 <event name="OnListColClick"></event>
1186 <event name="OnListColDragging"></event>
1187 <event name="OnListColEndDrag"></event>
1188 <event name="OnListColRightClick"></event>
1189 <event name="OnListDeleteAllItems"></event>
1190 <event name="OnListDeleteItem"></event>
1191 <event name="OnListEndLabelEdit"></event>
1192 <event name="OnListInsertItem"></event>
1193 <event name="OnListItemActivated">OnListItemActivatedOrdersSent</event>
1194 <event name="OnListItemDeselected"></event>
1195 <event name="OnListItemFocused"></event>
1196 <event name="OnListItemMiddleClick"></event>
1197 <event name="OnListItemRightClick"></event>
1198 <event name="OnListItemSelected"></event>
1199 <event name="OnListKeyDown"></event>
1200 <event name="OnMiddleDClick"></event>
1201 <event name="OnMiddleDown"></event>
1202 <event name="OnMiddleUp"></event>
1203 <event name="OnMotion"></event>
1204 <event name="OnMouseEvents"></event>
1205 <event name="OnMouseWheel"></event>
1206 <event name="OnPaint"></event>
1207 <event name="OnRightDClick"></event>
1208 <event name="OnRightDown"></event>
1209 <event name="OnRightUp"></event>
1210 <event name="OnSetFocus"></event>
1211 <event name="OnSize"></event>
1212 <event name="OnUpdateUI"></event>
1213 </object>
1214 </object>
1215 </object>
1216 </object>
1217 </object>
1218 <object class="sizeritem" expanded="1">
1219 <property name="border">5</property>
1220 <property name="flag">wxEXPAND | wxALL</property>
1221 <property name="proportion">1</property>
1222 <object class="wxPanel" expanded="1">
1223 <property name="bg"></property>
1224 <property name="context_help"></property>
1225 <property name="enabled">1</property>
1226 <property name="fg"></property>
1227 <property name="font"></property>
1228 <property name="hidden">1</property>
1229 <property name="id">wxID_ANY</property>
1230 <property name="maximum_size"></property>
1231 <property name="minimum_size"></property>
1232 <property name="name">m_panel10</property>
1233 <property name="permission">protected</property>
1234 <property name="pos"></property>
1235 <property name="size"></property>
1236 <property name="subclass"></property>
1237 <property name="tooltip"></property>
1238 <property name="window_extra_style"></property>
1239 <property name="window_name"></property>
1240 <property name="window_style">wxTAB_TRAVERSAL</property>
1241 <event name="OnChar"></event>
1242 <event name="OnEnterWindow"></event>
1243 <event name="OnEraseBackground"></event>
1244 <event name="OnKeyDown"></event>
1245 <event name="OnKeyUp"></event>
1246 <event name="OnKillFocus"></event>
1247 <event name="OnLeaveWindow"></event>
1248 <event name="OnLeftDClick"></event>
1249 <event name="OnLeftDown"></event>
1250 <event name="OnLeftUp"></event>
1251 <event name="OnMiddleDClick"></event>
1252 <event name="OnMiddleDown"></event>
1253 <event name="OnMiddleUp"></event>
1254 <event name="OnMotion"></event>
1255 <event name="OnMouseEvents"></event>
1256 <event name="OnMouseWheel"></event>
1257 <event name="OnPaint"></event>
1258 <event name="OnRightDClick"></event>
1259 <event name="OnRightDown"></event>
1260 <event name="OnRightUp"></event>
1261 <event name="OnSetFocus"></event>
1262 <event name="OnSize"></event>
1263 <event name="OnUpdateUI"></event>
1264 <object class="wxBoxSizer" expanded="1">
1265 <property name="minimum_size"></property>
1266 <property name="name">bSizer160</property>
1267 <property name="orient">wxVERTICAL</property>
1268 <property name="permission">none</property>
1269 <object class="sizeritem" expanded="1">
1270 <property name="border">5</property>
1271 <property name="flag">wxALL|wxEXPAND</property>
1272 <property name="proportion">1</property>
1273 <object class="wxListCtrl" expanded="1">
1274 <property name="bg"></property>
1275 <property name="context_help"></property>
1276 <property name="enabled">1</property>
1277 <property name="fg"></property>
1278 <property name="font"></property>
1279 <property name="hidden">0</property>
1280 <property name="id">wxID_ANY</property>
1281 <property name="maximum_size"></property>
1282 <property name="minimum_size"></property>
1283 <property name="name">m_listCtrlProductsSent</property>
1284 <property name="permission">public</property>
1285 <property name="pos"></property>
1286 <property name="size"></property>
1287 <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT</property>
1288 <property name="subclass"></property>
1289 <property name="tooltip"></property>
1290 <property name="window_extra_style"></property>
1291 <property name="window_name"></property>
1292 <property name="window_style"></property>
1293 <event name="OnChar"></event>
1294 <event name="OnEnterWindow"></event>
1295 <event name="OnEraseBackground"></event>
1296 <event name="OnKeyDown"></event>
1297 <event name="OnKeyUp"></event>
1298 <event name="OnKillFocus"></event>
1299 <event name="OnLeaveWindow"></event>
1300 <event name="OnLeftDClick"></event>
1301 <event name="OnLeftDown"></event>
1302 <event name="OnLeftUp"></event>
1303 <event name="OnListBeginDrag"></event>
1304 <event name="OnListBeginLabelEdit"></event>
1305 <event name="OnListBeginRDrag"></event>
1306 <event name="OnListCacheHint"></event>
1307 <event name="OnListColBeginDrag"></event>
1308 <event name="OnListColClick"></event>
1309 <event name="OnListColDragging"></event>
1310 <event name="OnListColEndDrag"></event>
1311 <event name="OnListColRightClick"></event>
1312 <event name="OnListDeleteAllItems"></event>
1313 <event name="OnListDeleteItem"></event>
1314 <event name="OnListEndLabelEdit"></event>
1315 <event name="OnListInsertItem"></event>
1316 <event name="OnListItemActivated">OnListItemActivatedProductsSent</event>
1317 <event name="OnListItemDeselected"></event>
1318 <event name="OnListItemFocused"></event>
1319 <event name="OnListItemMiddleClick"></event>
1320 <event name="OnListItemRightClick"></event>
1321 <event name="OnListItemSelected"></event>
1322 <event name="OnListKeyDown"></event>
1323 <event name="OnMiddleDClick"></event>
1324 <event name="OnMiddleDown"></event>
1325 <event name="OnMiddleUp"></event>
1326 <event name="OnMotion"></event>
1327 <event name="OnMouseEvents"></event>
1328 <event name="OnMouseWheel"></event>
1329 <event name="OnPaint"></event>
1330 <event name="OnRightDClick"></event>
1331 <event name="OnRightDown"></event>
1332 <event name="OnRightUp"></event>
1333 <event name="OnSetFocus"></event>
1334 <event name="OnSize"></event>
1335 <event name="OnUpdateUI"></event>
1336 </object>
1337 </object>
1338 </object>
1339 </object>
1340 </object>
1341 <object class="sizeritem" expanded="1">
1342 <property name="border">5</property>
1343 <property name="flag">wxEXPAND | wxALL</property>
1344 <property name="proportion">1</property>
1345 <object class="wxPanel" expanded="1">
1346 <property name="bg"></property>
1347 <property name="context_help"></property>
1348 <property name="enabled">1</property>
1349 <property name="fg"></property>
1350 <property name="font"></property>
1351 <property name="hidden">1</property>
1352 <property name="id">wxID_ANY</property>
1353 <property name="maximum_size"></property>
1354 <property name="minimum_size"></property>
1355 <property name="name">m_panel11</property>
1356 <property name="permission">protected</property>
1357 <property name="pos"></property>
1358 <property name="size"></property>
1359 <property name="subclass"></property>
1360 <property name="tooltip"></property>
1361 <property name="window_extra_style"></property>
1362 <property name="window_name"></property>
1363 <property name="window_style">wxTAB_TRAVERSAL</property>
1364 <event name="OnChar"></event>
1365 <event name="OnEnterWindow"></event>
1366 <event name="OnEraseBackground"></event>
1367 <event name="OnKeyDown"></event>
1368 <event name="OnKeyUp"></event>
1369 <event name="OnKillFocus"></event>
1370 <event name="OnLeaveWindow"></event>
1371 <event name="OnLeftDClick"></event>
1372 <event name="OnLeftDown"></event>
1373 <event name="OnLeftUp"></event>
1374 <event name="OnMiddleDClick"></event>
1375 <event name="OnMiddleDown"></event>
1376 <event name="OnMiddleUp"></event>
1377 <event name="OnMotion"></event>
1378 <event name="OnMouseEvents"></event>
1379 <event name="OnMouseWheel"></event>
1380 <event name="OnPaint"></event>
1381 <event name="OnRightDClick"></event>
1382 <event name="OnRightDown"></event>
1383 <event name="OnRightUp"></event>
1384 <event name="OnSetFocus"></event>
1385 <event name="OnSize"></event>
1386 <event name="OnUpdateUI"></event>
1387 <object class="wxBoxSizer" expanded="1">
1388 <property name="minimum_size"></property>
1389 <property name="name">bSizer161</property>
1390 <property name="orient">wxVERTICAL</property>
1391 <property name="permission">none</property>
1392 <object class="sizeritem" expanded="1">
1393 <property name="border">5</property>
1394 <property name="flag">wxALL|wxEXPAND</property>
1395 <property name="proportion">1</property>
1396 <object class="wxListCtrl" expanded="1">
1397 <property name="bg"></property>
1398 <property name="context_help"></property>
1399 <property name="enabled">1</property>
1400 <property name="fg"></property>
1401 <property name="font"></property>
1402 <property name="hidden">0</property>
1403 <property name="id">wxID_ANY</property>
1404 <property name="maximum_size"></property>
1405 <property name="minimum_size"></property>
1406 <property name="name">m_listCtrlOrdersReceived</property>
1407 <property name="permission">public</property>
1408 <property name="pos"></property>
1409 <property name="size"></property>
1410 <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT</property>
1411 <property name="subclass"></property>
1412 <property name="tooltip"></property>
1413 <property name="window_extra_style"></property>
1414 <property name="window_name"></property>
1415 <property name="window_style"></property>
1416 <event name="OnChar"></event>
1417 <event name="OnEnterWindow"></event>
1418 <event name="OnEraseBackground"></event>
1419 <event name="OnKeyDown"></event>
1420 <event name="OnKeyUp"></event>
1421 <event name="OnKillFocus"></event>
1422 <event name="OnLeaveWindow"></event>
1423 <event name="OnLeftDClick"></event>
1424 <event name="OnLeftDown"></event>
1425 <event name="OnLeftUp"></event>
1426 <event name="OnListBeginDrag"></event>
1427 <event name="OnListBeginLabelEdit"></event>
1428 <event name="OnListBeginRDrag"></event>
1429 <event name="OnListCacheHint"></event>
1430 <event name="OnListColBeginDrag"></event>
1431 <event name="OnListColClick"></event>
1432 <event name="OnListColDragging"></event>
1433 <event name="OnListColEndDrag"></event>
1434 <event name="OnListColRightClick"></event>
1435 <event name="OnListDeleteAllItems"></event>
1436 <event name="OnListDeleteItem"></event>
1437 <event name="OnListEndLabelEdit"></event>
1438 <event name="OnListInsertItem"></event>
1439 <event name="OnListItemActivated">OnListItemActivatedOrdersReceived</event>
1440 <event name="OnListItemDeselected"></event>
1441 <event name="OnListItemFocused"></event>
1442 <event name="OnListItemMiddleClick"></event>
1443 <event name="OnListItemRightClick"></event>
1444 <event name="OnListItemSelected"></event>
1445 <event name="OnListKeyDown"></event>
1446 <event name="OnMiddleDClick"></event>
1447 <event name="OnMiddleDown"></event>
1448 <event name="OnMiddleUp"></event>
1449 <event name="OnMotion"></event>
1450 <event name="OnMouseEvents"></event>
1451 <event name="OnMouseWheel"></event>
1452 <event name="OnPaint"></event>
1453 <event name="OnRightDClick"></event>
1454 <event name="OnRightDown"></event>
1455 <event name="OnRightUp"></event>
1456 <event name="OnSetFocus"></event>
1457 <event name="OnSize"></event>
1458 <event name="OnUpdateUI"></event>
1459 </object>
1460 </object>
1461 </object>
1462 </object>
1463 </object>
1464 </object>
1465 </object>
1466 </object>
1467 </object>
1468 <object class="Dialog" expanded="0">
1469 <property name="bg"></property>
1470 <property name="center"></property>
1471 <property name="context_help"></property>
1472 <property name="enabled">1</property>
1473 <property name="extra_style"></property>
1474 <property name="fg"></property>
1475 <property name="font"></property>
1476 <property name="hidden">0</property>
1477 <property name="id">wxID_ANY</property>
1478 <property name="maximum_size"></property>
1479 <property name="minimum_size"></property>
1480 <property name="name">CTxDetailsDialogBase</property>
1481 <property name="pos"></property>
1482 <property name="size">620,450</property>
1483 <property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
1484 <property name="subclass"></property>
1485 <property name="title">Transaction Details</property>
1486 <property name="tooltip"></property>
1487 <property name="window_extra_style"></property>
1488 <property name="window_name"></property>
1489 <property name="window_style"></property>
1490 <event name="OnActivate"></event>
1491 <event name="OnActivateApp"></event>
1492 <event name="OnChar"></event>
1493 <event name="OnClose"></event>
1494 <event name="OnEnterWindow"></event>
1495 <event name="OnEraseBackground"></event>
1496 <event name="OnHibernate"></event>
1497 <event name="OnIconize"></event>
1498 <event name="OnIdle"></event>
1499 <event name="OnInitDialog"></event>
1500 <event name="OnKeyDown"></event>
1501 <event name="OnKeyUp"></event>
1502 <event name="OnKillFocus"></event>
1503 <event name="OnLeaveWindow"></event>
1504 <event name="OnLeftDClick"></event>
1505 <event name="OnLeftDown"></event>
1506 <event name="OnLeftUp"></event>
1507 <event name="OnMiddleDClick"></event>
1508 <event name="OnMiddleDown"></event>
1509 <event name="OnMiddleUp"></event>
1510 <event name="OnMotion"></event>
1511 <event name="OnMouseEvents"></event>
1512 <event name="OnMouseWheel"></event>
1513 <event name="OnPaint"></event>
1514 <event name="OnRightDClick"></event>
1515 <event name="OnRightDown"></event>
1516 <event name="OnRightUp"></event>
1517 <event name="OnSetFocus"></event>
1518 <event name="OnSize"></event>
1519 <event name="OnUpdateUI"></event>
1520 <object class="wxBoxSizer" expanded="1">
1521 <property name="minimum_size"></property>
1522 <property name="name">bSizer64</property>
1523 <property name="orient">wxVERTICAL</property>
1524 <property name="permission">none</property>
1525 <object class="sizeritem" expanded="1">
1526 <property name="border">5</property>
1527 <property name="flag">wxEXPAND</property>
1528 <property name="proportion">1</property>
1529 <object class="wxBoxSizer" expanded="1">
1530 <property name="minimum_size"></property>
1531 <property name="name">bSizer66</property>
1532 <property name="orient">wxVERTICAL</property>
1533 <property name="permission">none</property>
1534 <object class="sizeritem" expanded="1">
1535 <property name="border">5</property>
1536 <property name="flag">wxALL|wxEXPAND</property>
1537 <property name="proportion">1</property>
1538 <object class="wxHtmlWindow" expanded="1">
1539 <property name="bg"></property>
1540 <property name="context_help"></property>
1541 <property name="enabled">1</property>
1542 <property name="fg"></property>
1543 <property name="font"></property>
1544 <property name="hidden">0</property>
1545 <property name="id">wxID_ANY</property>
1546 <property name="maximum_size"></property>
1547 <property name="minimum_size"></property>
1548 <property name="name">m_htmlWin</property>
1549 <property name="permission">protected</property>
1550 <property name="pos"></property>
1551 <property name="size"></property>
1552 <property name="style">wxHW_SCROLLBAR_AUTO</property>
1553 <property name="subclass"></property>
1554 <property name="tooltip"></property>
1555 <property name="window_extra_style"></property>
1556 <property name="window_name"></property>
1557 <property name="window_style"></property>
1558 <event name="OnChar"></event>
1559 <event name="OnEnterWindow"></event>
1560 <event name="OnEraseBackground"></event>
1561 <event name="OnHtmlCellClicked"></event>
1562 <event name="OnHtmlCellHover"></event>
1563 <event name="OnHtmlLinkClicked"></event>
1564 <event name="OnKeyDown"></event>
1565 <event name="OnKeyUp"></event>
1566 <event name="OnKillFocus"></event>
1567 <event name="OnLeaveWindow"></event>
1568 <event name="OnLeftDClick"></event>
1569 <event name="OnLeftDown"></event>
1570 <event name="OnLeftUp"></event>
1571 <event name="OnMiddleDClick"></event>
1572 <event name="OnMiddleDown"></event>
1573 <event name="OnMiddleUp"></event>
1574 <event name="OnMotion"></event>
1575 <event name="OnMouseEvents"></event>
1576 <event name="OnMouseWheel"></event>
1577 <event name="OnPaint"></event>
1578 <event name="OnRightDClick"></event>
1579 <event name="OnRightDown"></event>
1580 <event name="OnRightUp"></event>
1581 <event name="OnSetFocus"></event>
1582 <event name="OnSize"></event>
1583 <event name="OnUpdateUI"></event>
1584 </object>
1585 </object>
1586 </object>
1587 </object>
1588 <object class="sizeritem" expanded="1">
1589 <property name="border">5</property>
1590 <property name="flag">wxALIGN_RIGHT</property>
1591 <property name="proportion">0</property>
1592 <object class="wxBoxSizer" expanded="1">
1593 <property name="minimum_size"></property>
1594 <property name="name">bSizer65</property>
1595 <property name="orient">wxVERTICAL</property>
1596 <property name="permission">none</property>
1597 <object class="sizeritem" expanded="1">
1598 <property name="border">5</property>
1599 <property name="flag">wxALL</property>
1600 <property name="proportion">0</property>
1601 <object class="wxButton" expanded="1">
1602 <property name="bg"></property>
1603 <property name="context_help"></property>
1604 <property name="default">0</property>
1605 <property name="enabled">1</property>
1606 <property name="fg"></property>
1607 <property name="font"></property>
1608 <property name="hidden">0</property>
1609 <property name="id">wxID_OK</property>
1610 <property name="label">OK</property>
1611 <property name="maximum_size"></property>
1612 <property name="minimum_size"></property>
1613 <property name="name">m_buttonOK</property>
1614 <property name="permission">protected</property>
1615 <property name="pos"></property>
1616 <property name="size">85,25</property>
1617 <property name="style"></property>
1618 <property name="subclass"></property>
1619 <property name="tooltip"></property>
1620 <property name="window_extra_style"></property>
1621 <property name="window_name"></property>
1622 <property name="window_style"></property>
1623 <event name="OnButtonClick">OnButtonOK</event>
1624 <event name="OnChar"></event>
1625 <event name="OnEnterWindow"></event>
1626 <event name="OnEraseBackground"></event>
1627 <event name="OnKeyDown"></event>
1628 <event name="OnKeyUp"></event>
1629 <event name="OnKillFocus"></event>
1630 <event name="OnLeaveWindow"></event>
1631 <event name="OnLeftDClick"></event>
1632 <event name="OnLeftDown"></event>
1633 <event name="OnLeftUp"></event>
1634 <event name="OnMiddleDClick"></event>
1635 <event name="OnMiddleDown"></event>
1636 <event name="OnMiddleUp"></event>
1637 <event name="OnMotion"></event>
1638 <event name="OnMouseEvents"></event>
1639 <event name="OnMouseWheel"></event>
1640 <event name="OnPaint"></event>
1641 <event name="OnRightDClick"></event>
1642 <event name="OnRightDown"></event>
1643 <event name="OnRightUp"></event>
1644 <event name="OnSetFocus"></event>
1645 <event name="OnSize"></event>
1646 <event name="OnUpdateUI"></event>
1647 </object>
1648 </object>
1649 </object>
1650 </object>
1651 </object>
1652 </object>
1653 <object class="Dialog" expanded="0">
1654 <property name="bg"></property>
1655 <property name="center"></property>
1656 <property name="context_help"></property>
1657 <property name="enabled">1</property>
1658 <property name="extra_style"></property>
1659 <property name="fg"></property>
1660 <property name="font"></property>
1661 <property name="hidden">0</property>
1662 <property name="id">wxID_ANY</property>
1663 <property name="maximum_size"></property>
1664 <property name="minimum_size"></property>
1665 <property name="name">COptionsDialogBase</property>
1666 <property name="pos"></property>
1667 <property name="size">500,261</property>
1668 <property name="style">wxDEFAULT_DIALOG_STYLE</property>
1669 <property name="subclass"></property>
1670 <property name="title">Options</property>
1671 <property name="tooltip"></property>
1672 <property name="window_extra_style"></property>
1673 <property name="window_name"></property>
1674 <property name="window_style"></property>
1675 <event name="OnActivate"></event>
1676 <event name="OnActivateApp"></event>
1677 <event name="OnChar"></event>
1678 <event name="OnClose"></event>
1679 <event name="OnEnterWindow"></event>
1680 <event name="OnEraseBackground"></event>
1681 <event name="OnHibernate"></event>
1682 <event name="OnIconize"></event>
1683 <event name="OnIdle"></event>
1684 <event name="OnInitDialog"></event>
1685 <event name="OnKeyDown"></event>
1686 <event name="OnKeyUp"></event>
1687 <event name="OnKillFocus"></event>
1688 <event name="OnLeaveWindow"></event>
1689 <event name="OnLeftDClick"></event>
1690 <event name="OnLeftDown"></event>
1691 <event name="OnLeftUp"></event>
1692 <event name="OnMiddleDClick"></event>
1693 <event name="OnMiddleDown"></event>
1694 <event name="OnMiddleUp"></event>
1695 <event name="OnMotion"></event>
1696 <event name="OnMouseEvents"></event>
1697 <event name="OnMouseWheel"></event>
1698 <event name="OnPaint"></event>
1699 <event name="OnRightDClick"></event>
1700 <event name="OnRightDown"></event>
1701 <event name="OnRightUp"></event>
1702 <event name="OnSetFocus"></event>
1703 <event name="OnSize"></event>
1704 <event name="OnUpdateUI"></event>
1705 <object class="wxBoxSizer" expanded="1">
1706 <property name="minimum_size"></property>
1707 <property name="name">bSizer55</property>
1708 <property name="orient">wxVERTICAL</property>
1709 <property name="permission">none</property>
1710 <object class="sizeritem" expanded="1">
1711 <property name="border">5</property>
1712 <property name="flag">wxEXPAND|wxLEFT</property>
1713 <property name="proportion">1</property>
1714 <object class="wxBoxSizer" expanded="1">
1715 <property name="minimum_size"></property>
1716 <property name="name">bSizer57</property>
1717 <property name="orient">wxVERTICAL</property>
1718 <property name="permission">none</property>
1719 <object class="sizeritem" expanded="1">
1720 <property name="border">5</property>
1721 <property name="flag">wxEXPAND</property>
1722 <property name="proportion">0</property>
1723 <object class="spacer" expanded="1">
1724 <property name="height">20</property>
1725 <property name="permission">protected</property>
1726 <property name="width">0</property>
1727 </object>
1728 </object>
1729 <object class="sizeritem" expanded="1">
1730 <property name="border">5</property>
1731 <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
1732 <property name="proportion">0</property>
1733 <object class="wxStaticText" expanded="1">
1734 <property name="bg"></property>
1735 <property name="context_help"></property>
1736 <property name="enabled">1</property>
1737 <property name="fg"></property>
1738 <property name="font"></property>
1739 <property name="hidden">0</property>
1740 <property name="id">wxID_ANY</property>
1741 <property name="label">Optional transaction fee you give to the nodes that process your transactions.</property>
1742 <property name="maximum_size"></property>
1743 <property name="minimum_size"></property>
1744 <property name="name">m_staticText32</property>
1745 <property name="permission">protected</property>
1746 <property name="pos"></property>
1747 <property name="size"></property>
1748 <property name="style"></property>
1749 <property name="subclass"></property>
1750 <property name="tooltip"></property>
1751 <property name="window_extra_style"></property>
1752 <property name="window_name"></property>
1753 <property name="window_style"></property>
1754 <property name="wrap">-1</property>
1755 <event name="OnChar"></event>
1756 <event name="OnEnterWindow"></event>
1757 <event name="OnEraseBackground"></event>
1758 <event name="OnKeyDown"></event>
1759 <event name="OnKeyUp"></event>
1760 <event name="OnKillFocus"></event>
1761 <event name="OnLeaveWindow"></event>
1762 <event name="OnLeftDClick"></event>
1763 <event name="OnLeftDown"></event>
1764 <event name="OnLeftUp"></event>
1765 <event name="OnMiddleDClick"></event>
1766 <event name="OnMiddleDown"></event>
1767 <event name="OnMiddleUp"></event>
1768 <event name="OnMotion"></event>
1769 <event name="OnMouseEvents"></event>
1770 <event name="OnMouseWheel"></event>
1771 <event name="OnPaint"></event>
1772 <event name="OnRightDClick"></event>
1773 <event name="OnRightDown"></event>
1774 <event name="OnRightUp"></event>
1775 <event name="OnSetFocus"></event>
1776 <event name="OnSize"></event>
1777 <event name="OnUpdateUI"></event>
1778 </object>
1779 </object>
1780 <object class="sizeritem" expanded="1">
1781 <property name="border">5</property>
1782 <property name="flag">wxEXPAND</property>
1783 <property name="proportion">0</property>
1784 <object class="wxBoxSizer" expanded="1">
1785 <property name="minimum_size"></property>
1786 <property name="name">bSizer56</property>
1787 <property name="orient">wxHORIZONTAL</property>
1788 <property name="permission">none</property>
1789 <object class="sizeritem" expanded="1">
1790 <property name="border">5</property>
1791 <property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT</property>
1792 <property name="proportion">0</property>
1793 <object class="wxStaticText" expanded="1">
1794 <property name="bg"></property>
1795 <property name="context_help"></property>
1796 <property name="enabled">1</property>
1797 <property name="fg"></property>
1798 <property name="font"></property>
1799 <property name="hidden">0</property>
1800 <property name="id">wxID_ANY</property>
1801 <property name="label">Transaction fee:</property>
1802 <property name="maximum_size"></property>
1803 <property name="minimum_size"></property>
1804 <property name="name">m_staticText31</property>
1805 <property name="permission">protected</property>
1806 <property name="pos"></property>
1807 <property name="size"></property>
1808 <property name="style"></property>
1809 <property name="subclass"></property>
1810 <property name="tooltip"></property>
1811 <property name="window_extra_style"></property>
1812 <property name="window_name"></property>
1813 <property name="window_style"></property>
1814 <property name="wrap">-1</property>
1815 <event name="OnChar"></event>
1816 <event name="OnEnterWindow"></event>
1817 <event name="OnEraseBackground"></event>
1818 <event name="OnKeyDown"></event>
1819 <event name="OnKeyUp"></event>
1820 <event name="OnKillFocus"></event>
1821 <event name="OnLeaveWindow"></event>
1822 <event name="OnLeftDClick"></event>
1823 <event name="OnLeftDown"></event>
1824 <event name="OnLeftUp"></event>
1825 <event name="OnMiddleDClick"></event>
1826 <event name="OnMiddleDown"></event>
1827 <event name="OnMiddleUp"></event>
1828 <event name="OnMotion"></event>
1829 <event name="OnMouseEvents"></event>
1830 <event name="OnMouseWheel"></event>
1831 <event name="OnPaint"></event>
1832 <event name="OnRightDClick"></event>
1833 <event name="OnRightDown"></event>
1834 <event name="OnRightUp"></event>
1835 <event name="OnSetFocus"></event>
1836 <event name="OnSize"></event>
1837 <event name="OnUpdateUI"></event>
1838 </object>
1839 </object>
1840 <object class="sizeritem" expanded="1">
1841 <property name="border">5</property>
1842 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
1843 <property name="proportion">0</property>
1844 <object class="wxTextCtrl" expanded="1">
1845 <property name="bg"></property>
1846 <property name="context_help"></property>
1847 <property name="enabled">1</property>
1848 <property name="fg"></property>
1849 <property name="font"></property>
1850 <property name="hidden">0</property>
1851 <property name="id">wxID_TRANSACTIONFEE</property>
1852 <property name="maximum_size"></property>
1853 <property name="maxlength">0</property>
1854 <property name="minimum_size"></property>
1855 <property name="name">m_textCtrlTransactionFee</property>
1856 <property name="permission">protected</property>
1857 <property name="pos"></property>
1858 <property name="size">70,-1</property>
1859 <property name="style"></property>
1860 <property name="subclass"></property>
1861 <property name="tooltip"></property>
1862 <property name="value"></property>
1863 <property name="window_extra_style"></property>
1864 <property name="window_name"></property>
1865 <property name="window_style"></property>
1866 <event name="OnChar"></event>
1867 <event name="OnEnterWindow"></event>
1868 <event name="OnEraseBackground"></event>
1869 <event name="OnKeyDown"></event>
1870 <event name="OnKeyUp"></event>
1871 <event name="OnKillFocus">OnKillFocusTransactionFee</event>
1872 <event name="OnLeaveWindow"></event>
1873 <event name="OnLeftDClick"></event>
1874 <event name="OnLeftDown"></event>
1875 <event name="OnLeftUp"></event>
1876 <event name="OnMiddleDClick"></event>
1877 <event name="OnMiddleDown"></event>
1878 <event name="OnMiddleUp"></event>
1879 <event name="OnMotion"></event>
1880 <event name="OnMouseEvents"></event>
1881 <event name="OnMouseWheel"></event>
1882 <event name="OnPaint"></event>
1883 <event name="OnRightDClick"></event>
1884 <event name="OnRightDown"></event>
1885 <event name="OnRightUp"></event>
1886 <event name="OnSetFocus"></event>
1887 <event name="OnSize"></event>
1888 <event name="OnText"></event>
1889 <event name="OnTextEnter"></event>
1890 <event name="OnTextMaxLen"></event>
1891 <event name="OnTextURL"></event>
1892 <event name="OnUpdateUI"></event>
1893 </object>
1894 </object>
1895 </object>
1896 </object>
1897 </object>
1898 </object>
1899 <object class="sizeritem" expanded="1">
1900 <property name="border">5</property>
1901 <property name="flag">wxALIGN_RIGHT</property>
1902 <property name="proportion">0</property>
1903 <object class="wxBoxSizer" expanded="1">
1904 <property name="minimum_size"></property>
1905 <property name="name">bSizer58</property>
1906 <property name="orient">wxHORIZONTAL</property>
1907 <property name="permission">none</property>
1908 <object class="sizeritem" expanded="1">
1909 <property name="border">5</property>
1910 <property name="flag">wxALL</property>
1911 <property name="proportion">0</property>
1912 <object class="wxButton" expanded="1">
1913 <property name="bg"></property>
1914 <property name="context_help"></property>
1915 <property name="default">0</property>
1916 <property name="enabled">1</property>
1917 <property name="fg"></property>
1918 <property name="font"></property>
1919 <property name="hidden">0</property>
1920 <property name="id">wxID_OK</property>
1921 <property name="label">OK</property>
1922 <property name="maximum_size"></property>
1923 <property name="minimum_size"></property>
1924 <property name="name">m_buttonOK</property>
1925 <property name="permission">protected</property>
1926 <property name="pos"></property>
1927 <property name="size">85,25</property>
1928 <property name="style"></property>
1929 <property name="subclass"></property>
1930 <property name="tooltip"></property>
1931 <property name="window_extra_style"></property>
1932 <property name="window_name"></property>
1933 <property name="window_style"></property>
1934 <event name="OnButtonClick">OnButtonOK</event>
1935 <event name="OnChar"></event>
1936 <event name="OnEnterWindow"></event>
1937 <event name="OnEraseBackground"></event>
1938 <event name="OnKeyDown"></event>
1939 <event name="OnKeyUp"></event>
1940 <event name="OnKillFocus"></event>
1941 <event name="OnLeaveWindow"></event>
1942 <event name="OnLeftDClick"></event>
1943 <event name="OnLeftDown"></event>
1944 <event name="OnLeftUp"></event>
1945 <event name="OnMiddleDClick"></event>
1946 <event name="OnMiddleDown"></event>
1947 <event name="OnMiddleUp"></event>
1948 <event name="OnMotion"></event>
1949 <event name="OnMouseEvents"></event>
1950 <event name="OnMouseWheel"></event>
1951 <event name="OnPaint"></event>
1952 <event name="OnRightDClick"></event>
1953 <event name="OnRightDown"></event>
1954 <event name="OnRightUp"></event>
1955 <event name="OnSetFocus"></event>
1956 <event name="OnSize"></event>
1957 <event name="OnUpdateUI"></event>
1958 </object>
1959 </object>
1960 <object class="sizeritem" expanded="1">
1961 <property name="border">5</property>
1962 <property name="flag">wxALL</property>
1963 <property name="proportion">0</property>
1964 <object class="wxButton" expanded="1">
1965 <property name="bg"></property>
1966 <property name="context_help"></property>
1967 <property name="default">0</property>
1968 <property name="enabled">1</property>
1969 <property name="fg"></property>
1970 <property name="font"></property>
1971 <property name="hidden">0</property>
1972 <property name="id">wxID_CANCEL</property>
1973 <property name="label">Cancel</property>
1974 <property name="maximum_size"></property>
1975 <property name="minimum_size">85,25</property>
1976 <property name="name">m_buttonCancel</property>
1977 <property name="permission">protected</property>
1978 <property name="pos"></property>
1979 <property name="size">-1,-1</property>
1980 <property name="style"></property>
1981 <property name="subclass"></property>
1982 <property name="tooltip"></property>
1983 <property name="window_extra_style"></property>
1984 <property name="window_name"></property>
1985 <property name="window_style"></property>
1986 <event name="OnButtonClick">OnButtonCancel</event>
1987 <event name="OnChar"></event>
1988 <event name="OnEnterWindow"></event>
1989 <event name="OnEraseBackground"></event>
1990 <event name="OnKeyDown"></event>
1991 <event name="OnKeyUp"></event>
1992 <event name="OnKillFocus"></event>
1993 <event name="OnLeaveWindow"></event>
1994 <event name="OnLeftDClick"></event>
1995 <event name="OnLeftDown"></event>
1996 <event name="OnLeftUp"></event>
1997 <event name="OnMiddleDClick"></event>
1998 <event name="OnMiddleDown"></event>
1999 <event name="OnMiddleUp"></event>
2000 <event name="OnMotion"></event>
2001 <event name="OnMouseEvents"></event>
2002 <event name="OnMouseWheel"></event>
2003 <event name="OnPaint"></event>
2004 <event name="OnRightDClick"></event>
2005 <event name="OnRightDown"></event>
2006 <event name="OnRightUp"></event>
2007 <event name="OnSetFocus"></event>
2008 <event name="OnSize"></event>
2009 <event name="OnUpdateUI"></event>
2010 </object>
2011 </object>
2012 </object>
2013 </object>
2014 </object>
2015 </object>
2016 <object class="Dialog" expanded="0">
2017 <property name="bg"></property>
2018 <property name="center"></property>
2019 <property name="context_help"></property>
2020 <property name="enabled">1</property>
2021 <property name="extra_style"></property>
2022 <property name="fg"></property>
2023 <property name="font"></property>
2024 <property name="hidden">0</property>
2025 <property name="id">wxID_ANY</property>
2026 <property name="maximum_size"></property>
2027 <property name="minimum_size"></property>
2028 <property name="name">CAboutDialogBase</property>
2029 <property name="pos"></property>
2030 <property name="size">507,298</property>
2031 <property name="style">wxDEFAULT_DIALOG_STYLE</property>
2032 <property name="subclass"></property>
2033 <property name="title">About Bitcoin</property>
2034 <property name="tooltip"></property>
2035 <property name="window_extra_style"></property>
2036 <property name="window_name"></property>
2037 <property name="window_style"></property>
2038 <event name="OnActivate"></event>
2039 <event name="OnActivateApp"></event>
2040 <event name="OnChar"></event>
2041 <event name="OnClose"></event>
2042 <event name="OnEnterWindow"></event>
2043 <event name="OnEraseBackground"></event>
2044 <event name="OnHibernate"></event>
2045 <event name="OnIconize"></event>
2046 <event name="OnIdle"></event>
2047 <event name="OnInitDialog"></event>
2048 <event name="OnKeyDown"></event>
2049 <event name="OnKeyUp"></event>
2050 <event name="OnKillFocus"></event>
2051 <event name="OnLeaveWindow"></event>
2052 <event name="OnLeftDClick"></event>
2053 <event name="OnLeftDown"></event>
2054 <event name="OnLeftUp"></event>
2055 <event name="OnMiddleDClick"></event>
2056 <event name="OnMiddleDown"></event>
2057 <event name="OnMiddleUp"></event>
2058 <event name="OnMotion"></event>
2059 <event name="OnMouseEvents"></event>
2060 <event name="OnMouseWheel"></event>
2061 <event name="OnPaint"></event>
2062 <event name="OnRightDClick"></event>
2063 <event name="OnRightDown"></event>
2064 <event name="OnRightUp"></event>
2065 <event name="OnSetFocus"></event>
2066 <event name="OnSize"></event>
2067 <event name="OnUpdateUI"></event>
2068 <object class="wxBoxSizer" expanded="0">
2069 <property name="minimum_size"></property>
2070 <property name="name">bSizer60</property>
2071 <property name="orient">wxVERTICAL</property>
2072 <property name="permission">none</property>
2073 <object class="sizeritem" expanded="1">
2074 <property name="border">5</property>
2075 <property name="flag">wxEXPAND</property>
2076 <property name="proportion">1</property>
2077 <object class="wxBoxSizer" expanded="1">
2078 <property name="minimum_size"></property>
2079 <property name="name">bSizer62</property>
2080 <property name="orient">wxHORIZONTAL</property>
2081 <property name="permission">none</property>
2082 <object class="sizeritem" expanded="1">
2083 <property name="border">5</property>
2084 <property name="flag">wxEXPAND</property>
2085 <property name="proportion">0</property>
2086 <object class="spacer" expanded="1">
2087 <property name="height">0</property>
2088 <property name="permission">protected</property>
2089 <property name="width">60</property>
2090 </object>
2091 </object>
2092 <object class="sizeritem" expanded="1">
2093 <property name="border">5</property>
2094 <property name="flag">wxEXPAND</property>
2095 <property name="proportion">1</property>
2096 <object class="wxBoxSizer" expanded="1">
2097 <property name="minimum_size"></property>
2098 <property name="name">bSizer63</property>
2099 <property name="orient">wxVERTICAL</property>
2100 <property name="permission">none</property>
2101 <object class="sizeritem" expanded="1">
2102 <property name="border">5</property>
2103 <property name="flag">wxEXPAND</property>
2104 <property name="proportion">0</property>
2105 <object class="spacer" expanded="1">
2106 <property name="height">50</property>
2107 <property name="permission">protected</property>
2108 <property name="width">0</property>
2109 </object>
2110 </object>
2111 <object class="sizeritem" expanded="1">
2112 <property name="border">5</property>
2113 <property name="flag">wxEXPAND</property>
2114 <property name="proportion">0</property>
2115 <object class="wxBoxSizer" expanded="1">
2116 <property name="minimum_size"></property>
2117 <property name="name">bSizer64</property>
2118 <property name="orient">wxHORIZONTAL</property>
2119 <property name="permission">none</property>
2120 <object class="sizeritem" expanded="1">
2121 <property name="border">5</property>
2122 <property name="flag">wxALIGN_BOTTOM|wxTOP|wxBOTTOM|wxLEFT</property>
2123 <property name="proportion">0</property>
2124 <object class="wxStaticText" expanded="1">
2125 <property name="bg"></property>
2126 <property name="context_help"></property>
2127 <property name="enabled">1</property>
2128 <property name="fg"></property>
2129 <property name="font">Tahoma,90,92,10,74,0</property>
2130 <property name="hidden">0</property>
2131 <property name="id">wxID_ANY</property>
2132 <property name="label">Bitcoin </property>
2133 <property name="maximum_size"></property>
2134 <property name="minimum_size"></property>
2135 <property name="name">m_staticText40</property>
2136 <property name="permission">protected</property>
2137 <property name="pos"></property>
2138 <property name="size"></property>
2139 <property name="style"></property>
2140 <property name="subclass"></property>
2141 <property name="tooltip"></property>
2142 <property name="window_extra_style"></property>
2143 <property name="window_name"></property>
2144 <property name="window_style"></property>
2145 <property name="wrap">-1</property>
2146 <event name="OnChar"></event>
2147 <event name="OnEnterWindow"></event>
2148 <event name="OnEraseBackground"></event>
2149 <event name="OnKeyDown"></event>
2150 <event name="OnKeyUp"></event>
2151 <event name="OnKillFocus"></event>
2152 <event name="OnLeaveWindow"></event>
2153 <event name="OnLeftDClick"></event>
2154 <event name="OnLeftDown"></event>
2155 <event name="OnLeftUp"></event>
2156 <event name="OnMiddleDClick"></event>
2157 <event name="OnMiddleDown"></event>
2158 <event name="OnMiddleUp"></event>
2159 <event name="OnMotion"></event>
2160 <event name="OnMouseEvents"></event>
2161 <event name="OnMouseWheel"></event>
2162 <event name="OnPaint"></event>
2163 <event name="OnRightDClick"></event>
2164 <event name="OnRightDown"></event>
2165 <event name="OnRightUp"></event>
2166 <event name="OnSetFocus"></event>
2167 <event name="OnSize"></event>
2168 <event name="OnUpdateUI"></event>
2169 </object>
2170 </object>
2171 <object class="sizeritem" expanded="1">
2172 <property name="border">5</property>
2173 <property name="flag">wxALIGN_BOTTOM|wxTOP|wxBOTTOM|wxRIGHT</property>
2174 <property name="proportion">0</property>
2175 <object class="wxStaticText" expanded="1">
2176 <property name="bg"></property>
2177 <property name="context_help"></property>
2178 <property name="enabled">1</property>
2179 <property name="fg"></property>
2180 <property name="font">Tahoma,90,90,10,74,0</property>
2181 <property name="hidden">0</property>
2182 <property name="id">wxID_ANY</property>
2183 <property name="label">version</property>
2184 <property name="maximum_size"></property>
2185 <property name="minimum_size"></property>
2186 <property name="name">m_staticTextVersion</property>
2187 <property name="permission">public</property>
2188 <property name="pos"></property>
2189 <property name="size"></property>
2190 <property name="style"></property>
2191 <property name="subclass"></property>
2192 <property name="tooltip"></property>
2193 <property name="window_extra_style"></property>
2194 <property name="window_name"></property>
2195 <property name="window_style"></property>
2196 <property name="wrap">-1</property>
2197 <event name="OnChar"></event>
2198 <event name="OnEnterWindow"></event>
2199 <event name="OnEraseBackground"></event>
2200 <event name="OnKeyDown"></event>
2201 <event name="OnKeyUp"></event>
2202 <event name="OnKillFocus"></event>
2203 <event name="OnLeaveWindow"></event>
2204 <event name="OnLeftDClick"></event>
2205 <event name="OnLeftDown"></event>
2206 <event name="OnLeftUp"></event>
2207 <event name="OnMiddleDClick"></event>
2208 <event name="OnMiddleDown"></event>
2209 <event name="OnMiddleUp"></event>
2210 <event name="OnMotion"></event>
2211 <event name="OnMouseEvents"></event>
2212 <event name="OnMouseWheel"></event>
2213 <event name="OnPaint"></event>
2214 <event name="OnRightDClick"></event>
2215 <event name="OnRightDown"></event>
2216 <event name="OnRightUp"></event>
2217 <event name="OnSetFocus"></event>
2218 <event name="OnSize"></event>
2219 <event name="OnUpdateUI"></event>
2220 </object>
2221 </object>
2222 </object>
2223 </object>
2224 <object class="sizeritem" expanded="1">
2225 <property name="border">5</property>
2226 <property name="flag">wxEXPAND</property>
2227 <property name="proportion">0</property>
2228 <object class="spacer" expanded="1">
2229 <property name="height">4</property>
2230 <property name="permission">protected</property>
2231 <property name="width">0</property>
2232 </object>
2233 </object>
2234 <object class="sizeritem" expanded="1">
2235 <property name="border">5</property>
2236 <property name="flag">wxALL</property>
2237 <property name="proportion">0</property>
2238 <object class="wxStaticText" expanded="1">
2239 <property name="bg"></property>
2240 <property name="context_help"></property>
2241 <property name="enabled">1</property>
2242 <property name="fg"></property>
2243 <property name="font"></property>
2244 <property name="hidden">0</property>
2245 <property name="id">wxID_ANY</property>
2246 <property name="label">Copyright © 2009 Satoshi Nakamoto.&#x0A;&#x0A;This is experimental software. Do not rely on it for actual financial transactions.&#x0A;&#x0A;Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php.&#x0A;&#x0A;This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com).</property>
2247 <property name="maximum_size"></property>
2248 <property name="minimum_size"></property>
2249 <property name="name">m_staticTextMain</property>
2250 <property name="permission">protected</property>
2251 <property name="pos"></property>
2252 <property name="size"></property>
2253 <property name="style"></property>
2254 <property name="subclass"></property>
2255 <property name="tooltip"></property>
2256 <property name="window_extra_style"></property>
2257 <property name="window_name"></property>
2258 <property name="window_style"></property>
2259 <property name="wrap">400</property>
2260 <event name="OnChar"></event>
2261 <event name="OnEnterWindow"></event>
2262 <event name="OnEraseBackground"></event>
2263 <event name="OnKeyDown"></event>
2264 <event name="OnKeyUp"></event>
2265 <event name="OnKillFocus"></event>
2266 <event name="OnLeaveWindow"></event>
2267 <event name="OnLeftDClick"></event>
2268 <event name="OnLeftDown"></event>
2269 <event name="OnLeftUp"></event>
2270 <event name="OnMiddleDClick"></event>
2271 <event name="OnMiddleDown"></event>
2272 <event name="OnMiddleUp"></event>
2273 <event name="OnMotion"></event>
2274 <event name="OnMouseEvents"></event>
2275 <event name="OnMouseWheel"></event>
2276 <event name="OnPaint"></event>
2277 <event name="OnRightDClick"></event>
2278 <event name="OnRightDown"></event>
2279 <event name="OnRightUp"></event>
2280 <event name="OnSetFocus"></event>
2281 <event name="OnSize"></event>
2282 <event name="OnUpdateUI"></event>
2283 </object>
2284 </object>
2285 <object class="sizeritem" expanded="1">
2286 <property name="border">5</property>
2287 <property name="flag">wxEXPAND</property>
2288 <property name="proportion">1</property>
2289 <object class="spacer" expanded="1">
2290 <property name="height">0</property>
2291 <property name="permission">protected</property>
2292 <property name="width">0</property>
2293 </object>
2294 </object>
2295 </object>
2296 </object>
2297 </object>
2298 </object>
2299 <object class="sizeritem" expanded="1">
2300 <property name="border">5</property>
2301 <property name="flag">wxALIGN_RIGHT|wxEXPAND</property>
2302 <property name="proportion">0</property>
2303 <object class="wxBoxSizer" expanded="1">
2304 <property name="minimum_size"></property>
2305 <property name="name">bSizer61</property>
2306 <property name="orient">wxHORIZONTAL</property>
2307 <property name="permission">none</property>
2308 <object class="sizeritem" expanded="1">
2309 <property name="border">5</property>
2310 <property name="flag">wxEXPAND</property>
2311 <property name="proportion">1</property>
2312 <object class="spacer" expanded="1">
2313 <property name="height">0</property>
2314 <property name="permission">protected</property>
2315 <property name="width">0</property>
2316 </object>
2317 </object>
2318 <object class="sizeritem" expanded="1">
2319 <property name="border">5</property>
2320 <property name="flag">wxALL</property>
2321 <property name="proportion">0</property>
2322 <object class="wxButton" expanded="1">
2323 <property name="bg"></property>
2324 <property name="context_help"></property>
2325 <property name="default">0</property>
2326 <property name="enabled">1</property>
2327 <property name="fg"></property>
2328 <property name="font"></property>
2329 <property name="hidden">0</property>
2330 <property name="id">wxID_OK</property>
2331 <property name="label">OK</property>
2332 <property name="maximum_size"></property>
2333 <property name="minimum_size"></property>
2334 <property name="name">m_buttonOK</property>
2335 <property name="permission">protected</property>
2336 <property name="pos"></property>
2337 <property name="size">85,25</property>
2338 <property name="style"></property>
2339 <property name="subclass"></property>
2340 <property name="tooltip"></property>
2341 <property name="window_extra_style"></property>
2342 <property name="window_name"></property>
2343 <property name="window_style"></property>
2344 <event name="OnButtonClick">OnButtonOK</event>
2345 <event name="OnChar"></event>
2346 <event name="OnEnterWindow"></event>
2347 <event name="OnEraseBackground"></event>
2348 <event name="OnKeyDown"></event>
2349 <event name="OnKeyUp"></event>
2350 <event name="OnKillFocus"></event>
2351 <event name="OnLeaveWindow"></event>
2352 <event name="OnLeftDClick"></event>
2353 <event name="OnLeftDown"></event>
2354 <event name="OnLeftUp"></event>
2355 <event name="OnMiddleDClick"></event>
2356 <event name="OnMiddleDown"></event>
2357 <event name="OnMiddleUp"></event>
2358 <event name="OnMotion"></event>
2359 <event name="OnMouseEvents"></event>
2360 <event name="OnMouseWheel"></event>
2361 <event name="OnPaint"></event>
2362 <event name="OnRightDClick"></event>
2363 <event name="OnRightDown"></event>
2364 <event name="OnRightUp"></event>
2365 <event name="OnSetFocus"></event>
2366 <event name="OnSize"></event>
2367 <event name="OnUpdateUI"></event>
2368 </object>
2369 </object>
2370 </object>
2371 </object>
2372 </object>
2373 </object>
2374 <object class="Dialog" expanded="0">
2375 <property name="bg"></property>
2376 <property name="center"></property>
2377 <property name="context_help"></property>
2378 <property name="enabled">1</property>
2379 <property name="extra_style"></property>
2380 <property name="fg"></property>
2381 <property name="font"></property>
2382 <property name="hidden">0</property>
2383 <property name="id">wxID_ANY</property>
2384 <property name="maximum_size"></property>
2385 <property name="minimum_size"></property>
2386 <property name="name">CSendDialogBase</property>
2387 <property name="pos"></property>
2388 <property name="size">675,338</property>
2389 <property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
2390 <property name="subclass"></property>
2391 <property name="title">Send Coins</property>
2392 <property name="tooltip"></property>
2393 <property name="window_extra_style"></property>
2394 <property name="window_name"></property>
2395 <property name="window_style"></property>
2396 <event name="OnActivate"></event>
2397 <event name="OnActivateApp"></event>
2398 <event name="OnChar"></event>
2399 <event name="OnClose"></event>
2400 <event name="OnEnterWindow"></event>
2401 <event name="OnEraseBackground"></event>
2402 <event name="OnHibernate"></event>
2403 <event name="OnIconize"></event>
2404 <event name="OnIdle"></event>
2405 <event name="OnInitDialog"></event>
2406 <event name="OnKeyDown"></event>
2407 <event name="OnKeyUp"></event>
2408 <event name="OnKillFocus"></event>
2409 <event name="OnLeaveWindow"></event>
2410 <event name="OnLeftDClick"></event>
2411 <event name="OnLeftDown"></event>
2412 <event name="OnLeftUp"></event>
2413 <event name="OnMiddleDClick"></event>
2414 <event name="OnMiddleDown"></event>
2415 <event name="OnMiddleUp"></event>
2416 <event name="OnMotion"></event>
2417 <event name="OnMouseEvents"></event>
2418 <event name="OnMouseWheel"></event>
2419 <event name="OnPaint"></event>
2420 <event name="OnRightDClick"></event>
2421 <event name="OnRightDown"></event>
2422 <event name="OnRightUp"></event>
2423 <event name="OnSetFocus"></event>
2424 <event name="OnSize"></event>
2425 <event name="OnUpdateUI"></event>
2426 <object class="wxBoxSizer" expanded="1">
2427 <property name="minimum_size"></property>
2428 <property name="name">bSizer21</property>
2429 <property name="orient">wxVERTICAL</property>
2430 <property name="permission">none</property>
2431 <object class="sizeritem" expanded="1">
2432 <property name="border">5</property>
2433 <property name="flag">wxEXPAND</property>
2434 <property name="proportion">0</property>
2435 <object class="spacer" expanded="1">
2436 <property name="height">5</property>
2437 <property name="permission">protected</property>
2438 <property name="width">0</property>
2439 </object>
2440 </object>
2441 <object class="sizeritem" expanded="1">
2442 <property name="border">5</property>
2443 <property name="flag">wxEXPAND|wxLEFT</property>
2444 <property name="proportion">0</property>
2445 <object class="wxFlexGridSizer" expanded="0">
2446 <property name="cols">2</property>
2447 <property name="flexible_direction">wxBOTH</property>
2448 <property name="growablecols">1</property>
2449 <property name="growablerows"></property>
2450 <property name="hgap">0</property>
2451 <property name="minimum_size"></property>
2452 <property name="name">fgSizer1</property>
2453 <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
2454 <property name="permission">none</property>
2455 <property name="rows">3</property>
2456 <property name="vgap">0</property>
2457 <object class="sizeritem" expanded="1">
2458 <property name="border">5</property>
2459 <property name="flag">wxEXPAND</property>
2460 <property name="proportion">0</property>
2461 <object class="spacer" expanded="1">
2462 <property name="height">0</property>
2463 <property name="permission">protected</property>
2464 <property name="width">0</property>
2465 </object>
2466 </object>
2467 <object class="sizeritem" expanded="1">
2468 <property name="border">5</property>
2469 <property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
2470 <property name="proportion">0</property>
2471 <object class="wxStaticText" expanded="1">
2472 <property name="bg"></property>
2473 <property name="context_help"></property>
2474 <property name="enabled">1</property>
2475 <property name="fg"></property>
2476 <property name="font"></property>
2477 <property name="hidden">0</property>
2478 <property name="id">wxID_ANY</property>
2479 <property name="label">Enter the recipient&apos;s IP address (e.g. 123.45.6.7) for online transfer with comments and confirmation, &#x0A;or bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJED9L) if recipient is not online.</property>
2480 <property name="maximum_size"></property>
2481 <property name="minimum_size"></property>
2482 <property name="name">m_staticText14</property>
2483 <property name="permission">protected</property>
2484 <property name="pos"></property>
2485 <property name="size"></property>
2486 <property name="style"></property>
2487 <property name="subclass"></property>
2488 <property name="tooltip"></property>
2489 <property name="window_extra_style"></property>
2490 <property name="window_name"></property>
2491 <property name="window_style"></property>
2492 <property name="wrap">-1</property>
2493 <event name="OnChar"></event>
2494 <event name="OnEnterWindow"></event>
2495 <event name="OnEraseBackground"></event>
2496 <event name="OnKeyDown"></event>
2497 <event name="OnKeyUp"></event>
2498 <event name="OnKillFocus"></event>
2499 <event name="OnLeaveWindow"></event>
2500 <event name="OnLeftDClick"></event>
2501 <event name="OnLeftDown"></event>
2502 <event name="OnLeftUp"></event>
2503 <event name="OnMiddleDClick"></event>
2504 <event name="OnMiddleDown"></event>
2505 <event name="OnMiddleUp"></event>
2506 <event name="OnMotion"></event>
2507 <event name="OnMouseEvents"></event>
2508 <event name="OnMouseWheel"></event>
2509 <event name="OnPaint"></event>
2510 <event name="OnRightDClick"></event>
2511 <event name="OnRightDown"></event>
2512 <event name="OnRightUp"></event>
2513 <event name="OnSetFocus"></event>
2514 <event name="OnSize"></event>
2515 <event name="OnUpdateUI"></event>
2516 </object>
2517 </object>
2518 <object class="sizeritem" expanded="1">
2519 <property name="border">5</property>
2520 <property name="flag">wxEXPAND|wxLEFT</property>
2521 <property name="proportion">1</property>
2522 <object class="wxBoxSizer" expanded="1">
2523 <property name="minimum_size">70,-1</property>
2524 <property name="name">bSizer47</property>
2525 <property name="orient">wxHORIZONTAL</property>
2526 <property name="permission">none</property>
2527 <object class="sizeritem" expanded="1">
2528 <property name="border">5</property>
2529 <property name="flag">wxEXPAND</property>
2530 <property name="proportion">1</property>
2531 <object class="spacer" expanded="1">
2532 <property name="height">0</property>
2533 <property name="permission">protected</property>
2534 <property name="width">0</property>
2535 </object>
2536 </object>
2537 <object class="sizeritem" expanded="1">
2538 <property name="border">5</property>
2539 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
2540 <property name="proportion">0</property>
2541 <object class="wxStaticBitmap" expanded="1">
2542 <property name="bg"></property>
2543 <property name="bitmap">check; Load From Icon Resource [-1; -1]</property>
2544 <property name="context_help"></property>
2545 <property name="enabled">1</property>
2546 <property name="fg"></property>
2547 <property name="font"></property>
2548 <property name="hidden">0</property>
2549 <property name="id">wxID_ANY</property>
2550 <property name="maximum_size"></property>
2551 <property name="minimum_size"></property>
2552 <property name="name">m_bitmapCheckMark</property>
2553 <property name="permission">protected</property>
2554 <property name="pos"></property>
2555 <property name="size">16,16</property>
2556 <property name="subclass"></property>
2557 <property name="tooltip"></property>
2558 <property name="window_extra_style"></property>
2559 <property name="window_name"></property>
2560 <property name="window_style"></property>
2561 <event name="OnChar"></event>
2562 <event name="OnEnterWindow"></event>
2563 <event name="OnEraseBackground"></event>
2564 <event name="OnKeyDown"></event>
2565 <event name="OnKeyUp"></event>
2566 <event name="OnKillFocus"></event>
2567 <event name="OnLeaveWindow"></event>
2568 <event name="OnLeftDClick"></event>
2569 <event name="OnLeftDown"></event>
2570 <event name="OnLeftUp"></event>
2571 <event name="OnMiddleDClick"></event>
2572 <event name="OnMiddleDown"></event>
2573 <event name="OnMiddleUp"></event>
2574 <event name="OnMotion"></event>
2575 <event name="OnMouseEvents"></event>
2576 <event name="OnMouseWheel"></event>
2577 <event name="OnPaint"></event>
2578 <event name="OnRightDClick"></event>
2579 <event name="OnRightDown"></event>
2580 <event name="OnRightUp"></event>
2581 <event name="OnSetFocus"></event>
2582 <event name="OnSize"></event>
2583 <event name="OnUpdateUI"></event>
2584 </object>
2585 </object>
2586 <object class="sizeritem" expanded="1">
2587 <property name="border">5</property>
2588 <property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT</property>
2589 <property name="proportion">0</property>
2590 <object class="wxStaticText" expanded="1">
2591 <property name="bg"></property>
2592 <property name="context_help"></property>
2593 <property name="enabled">1</property>
2594 <property name="fg"></property>
2595 <property name="font"></property>
2596 <property name="hidden">0</property>
2597 <property name="id">wxID_ANY</property>
2598 <property name="label">Pay &amp;To:</property>
2599 <property name="maximum_size"></property>
2600 <property name="minimum_size"></property>
2601 <property name="name">m_staticText36</property>
2602 <property name="permission">protected</property>
2603 <property name="pos"></property>
2604 <property name="size">-1,-1</property>
2605 <property name="style">wxALIGN_RIGHT</property>
2606 <property name="subclass"></property>
2607 <property name="tooltip"></property>
2608 <property name="window_extra_style"></property>
2609 <property name="window_name"></property>
2610 <property name="window_style"></property>
2611 <property name="wrap">-1</property>
2612 <event name="OnChar"></event>
2613 <event name="OnEnterWindow"></event>
2614 <event name="OnEraseBackground"></event>
2615 <event name="OnKeyDown"></event>
2616 <event name="OnKeyUp"></event>
2617 <event name="OnKillFocus"></event>
2618 <event name="OnLeaveWindow"></event>
2619 <event name="OnLeftDClick"></event>
2620 <event name="OnLeftDown"></event>
2621 <event name="OnLeftUp"></event>
2622 <event name="OnMiddleDClick"></event>
2623 <event name="OnMiddleDown"></event>
2624 <event name="OnMiddleUp"></event>
2625 <event name="OnMotion"></event>
2626 <event name="OnMouseEvents"></event>
2627 <event name="OnMouseWheel"></event>
2628 <event name="OnPaint"></event>
2629 <event name="OnRightDClick"></event>
2630 <event name="OnRightDown"></event>
2631 <event name="OnRightUp"></event>
2632 <event name="OnSetFocus"></event>
2633 <event name="OnSize"></event>
2634 <event name="OnUpdateUI"></event>
2635 </object>
2636 </object>
2637 </object>
2638 </object>
2639 <object class="sizeritem" expanded="1">
2640 <property name="border">5</property>
2641 <property name="flag">wxEXPAND|wxRIGHT</property>
2642 <property name="proportion">1</property>
2643 <object class="wxBoxSizer" expanded="1">
2644 <property name="minimum_size"></property>
2645 <property name="name">bSizer19</property>
2646 <property name="orient">wxHORIZONTAL</property>
2647 <property name="permission">none</property>
2648 <object class="sizeritem" expanded="1">
2649 <property name="border">5</property>
2650 <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
2651 <property name="proportion">1</property>
2652 <object class="wxTextCtrl" expanded="1">
2653 <property name="bg"></property>
2654 <property name="context_help"></property>
2655 <property name="enabled">1</property>
2656 <property name="fg"></property>
2657 <property name="font"></property>
2658 <property name="hidden">0</property>
2659 <property name="id">wxID_TEXTCTRLPAYTO</property>
2660 <property name="maximum_size"></property>
2661 <property name="maxlength">0</property>
2662 <property name="minimum_size"></property>
2663 <property name="name">m_textCtrlAddress</property>
2664 <property name="permission">protected</property>
2665 <property name="pos"></property>
2666 <property name="size"></property>
2667 <property name="style"></property>
2668 <property name="subclass"></property>
2669 <property name="tooltip"></property>
2670 <property name="value"></property>
2671 <property name="window_extra_style"></property>
2672 <property name="window_name"></property>
2673 <property name="window_style"></property>
2674 <event name="OnChar"></event>
2675 <event name="OnEnterWindow"></event>
2676 <event name="OnEraseBackground"></event>
2677 <event name="OnKeyDown">OnKeyDown</event>
2678 <event name="OnKeyUp"></event>
2679 <event name="OnKillFocus"></event>
2680 <event name="OnLeaveWindow"></event>
2681 <event name="OnLeftDClick"></event>
2682 <event name="OnLeftDown"></event>
2683 <event name="OnLeftUp"></event>
2684 <event name="OnMiddleDClick"></event>
2685 <event name="OnMiddleDown"></event>
2686 <event name="OnMiddleUp"></event>
2687 <event name="OnMotion"></event>
2688 <event name="OnMouseEvents"></event>
2689 <event name="OnMouseWheel"></event>
2690 <event name="OnPaint"></event>
2691 <event name="OnRightDClick"></event>
2692 <event name="OnRightDown"></event>
2693 <event name="OnRightUp"></event>
2694 <event name="OnSetFocus"></event>
2695 <event name="OnSize"></event>
2696 <event name="OnText">OnTextAddress</event>
2697 <event name="OnTextEnter"></event>
2698 <event name="OnTextMaxLen"></event>
2699 <event name="OnTextURL"></event>
2700 <event name="OnUpdateUI"></event>
2701 </object>
2702 </object>
2703 <object class="sizeritem" expanded="1">
2704 <property name="border">5</property>
2705 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT</property>
2706 <property name="proportion">0</property>
2707 <object class="wxButton" expanded="1">
2708 <property name="bg"></property>
2709 <property name="context_help"></property>
2710 <property name="default">0</property>
2711 <property name="enabled">1</property>
2712 <property name="fg"></property>
2713 <property name="font"></property>
2714 <property name="hidden">0</property>
2715 <property name="id">wxID_BUTTONPASTE</property>
2716 <property name="label">&amp;Paste</property>
2717 <property name="maximum_size"></property>
2718 <property name="minimum_size"></property>
2719 <property name="name">m_buttonPaste</property>
2720 <property name="permission">protected</property>
2721 <property name="pos"></property>
2722 <property name="size">-1,-1</property>
2723 <property name="style">wxBU_EXACTFIT</property>
2724 <property name="subclass"></property>
2725 <property name="tooltip"></property>
2726 <property name="window_extra_style"></property>
2727 <property name="window_name"></property>
2728 <property name="window_style"></property>
2729 <event name="OnButtonClick">OnButtonPaste</event>
2730 <event name="OnChar"></event>
2731 <event name="OnEnterWindow"></event>
2732 <event name="OnEraseBackground"></event>
2733 <event name="OnKeyDown"></event>
2734 <event name="OnKeyUp"></event>
2735 <event name="OnKillFocus"></event>
2736 <event name="OnLeaveWindow"></event>
2737 <event name="OnLeftDClick"></event>
2738 <event name="OnLeftDown"></event>
2739 <event name="OnLeftUp"></event>
2740 <event name="OnMiddleDClick"></event>
2741 <event name="OnMiddleDown"></event>
2742 <event name="OnMiddleUp"></event>
2743 <event name="OnMotion"></event>
2744 <event name="OnMouseEvents"></event>
2745 <event name="OnMouseWheel"></event>
2746 <event name="OnPaint"></event>
2747 <event name="OnRightDClick"></event>
2748 <event name="OnRightDown"></event>
2749 <event name="OnRightUp"></event>
2750 <event name="OnSetFocus"></event>
2751 <event name="OnSize"></event>
2752 <event name="OnUpdateUI"></event>
2753 </object>
2754 </object>
2755 <object class="sizeritem" expanded="1">
2756 <property name="border">5</property>
2757 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT</property>
2758 <property name="proportion">0</property>
2759 <object class="wxButton" expanded="1">
2760 <property name="bg"></property>
2761 <property name="context_help"></property>
2762 <property name="default">0</property>
2763 <property name="enabled">1</property>
2764 <property name="fg"></property>
2765 <property name="font"></property>
2766 <property name="hidden">0</property>
2767 <property name="id">wxID_BUTTONADDRESSBOOK</property>
2768 <property name="label"> Address &amp;Book...</property>
2769 <property name="maximum_size"></property>
2770 <property name="minimum_size"></property>
2771 <property name="name">m_buttonAddress</property>
2772 <property name="permission">protected</property>
2773 <property name="pos"></property>
2774 <property name="size"></property>
2775 <property name="style"></property>
2776 <property name="subclass"></property>
2777 <property name="tooltip"></property>
2778 <property name="window_extra_style"></property>
2779 <property name="window_name"></property>
2780 <property name="window_style"></property>
2781 <event name="OnButtonClick">OnButtonAddressBook</event>
2782 <event name="OnChar"></event>
2783 <event name="OnEnterWindow"></event>
2784 <event name="OnEraseBackground"></event>
2785 <event name="OnKeyDown"></event>
2786 <event name="OnKeyUp"></event>
2787 <event name="OnKillFocus"></event>
2788 <event name="OnLeaveWindow"></event>
2789 <event name="OnLeftDClick"></event>
2790 <event name="OnLeftDown"></event>
2791 <event name="OnLeftUp"></event>
2792 <event name="OnMiddleDClick"></event>
2793 <event name="OnMiddleDown"></event>
2794 <event name="OnMiddleUp"></event>
2795 <event name="OnMotion"></event>
2796 <event name="OnMouseEvents"></event>
2797 <event name="OnMouseWheel"></event>
2798 <event name="OnPaint"></event>
2799 <event name="OnRightDClick"></event>
2800 <event name="OnRightDown"></event>
2801 <event name="OnRightUp"></event>
2802 <event name="OnSetFocus"></event>
2803 <event name="OnSize"></event>
2804 <event name="OnUpdateUI"></event>
2805 </object>
2806 </object>
2807 </object>
2808 </object>
2809 <object class="sizeritem" expanded="1">
2810 <property name="border">5</property>
2811 <property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT|wxALIGN_RIGHT</property>
2812 <property name="proportion">0</property>
2813 <object class="wxStaticText" expanded="1">
2814 <property name="bg"></property>
2815 <property name="context_help"></property>
2816 <property name="enabled">1</property>
2817 <property name="fg"></property>
2818 <property name="font"></property>
2819 <property name="hidden">0</property>
2820 <property name="id">wxID_ANY</property>
2821 <property name="label">&amp;Amount:</property>
2822 <property name="maximum_size"></property>
2823 <property name="minimum_size"></property>
2824 <property name="name">m_staticText19</property>
2825 <property name="permission">protected</property>
2826 <property name="pos"></property>
2827 <property name="size">-1,-1</property>
2828 <property name="style">wxALIGN_RIGHT</property>
2829 <property name="subclass"></property>
2830 <property name="tooltip"></property>
2831 <property name="window_extra_style"></property>
2832 <property name="window_name"></property>
2833 <property name="window_style"></property>
2834 <property name="wrap">-1</property>
2835 <event name="OnChar"></event>
2836 <event name="OnEnterWindow"></event>
2837 <event name="OnEraseBackground"></event>
2838 <event name="OnKeyDown"></event>
2839 <event name="OnKeyUp"></event>
2840 <event name="OnKillFocus"></event>
2841 <event name="OnLeaveWindow"></event>
2842 <event name="OnLeftDClick"></event>
2843 <event name="OnLeftDown"></event>
2844 <event name="OnLeftUp"></event>
2845 <event name="OnMiddleDClick"></event>
2846 <event name="OnMiddleDown"></event>
2847 <event name="OnMiddleUp"></event>
2848 <event name="OnMotion"></event>
2849 <event name="OnMouseEvents"></event>
2850 <event name="OnMouseWheel"></event>
2851 <event name="OnPaint"></event>
2852 <event name="OnRightDClick"></event>
2853 <event name="OnRightDown"></event>
2854 <event name="OnRightUp"></event>
2855 <event name="OnSetFocus"></event>
2856 <event name="OnSize"></event>
2857 <event name="OnUpdateUI"></event>
2858 </object>
2859 </object>
2860 <object class="sizeritem" expanded="1">
2861 <property name="border">5</property>
2862 <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
2863 <property name="proportion">0</property>
2864 <object class="wxTextCtrl" expanded="1">
2865 <property name="bg"></property>
2866 <property name="context_help"></property>
2867 <property name="enabled">1</property>
2868 <property name="fg"></property>
2869 <property name="font">,90,90,-1,70,0</property>
2870 <property name="hidden">0</property>
2871 <property name="id">wxID_TEXTCTRLAMOUNT</property>
2872 <property name="maximum_size"></property>
2873 <property name="maxlength">20</property>
2874 <property name="minimum_size"></property>
2875 <property name="name">m_textCtrlAmount</property>
2876 <property name="permission">protected</property>
2877 <property name="pos"></property>
2878 <property name="size">145,-1</property>
2879 <property name="style"></property>
2880 <property name="subclass"></property>
2881 <property name="tooltip"></property>
2882 <property name="value"></property>
2883 <property name="window_extra_style"></property>
2884 <property name="window_name"></property>
2885 <property name="window_style"></property>
2886 <event name="OnChar"></event>
2887 <event name="OnEnterWindow"></event>
2888 <event name="OnEraseBackground"></event>
2889 <event name="OnKeyDown">OnKeyDown</event>
2890 <event name="OnKeyUp"></event>
2891 <event name="OnKillFocus">OnKillFocusAmount</event>
2892 <event name="OnLeaveWindow"></event>
2893 <event name="OnLeftDClick"></event>
2894 <event name="OnLeftDown"></event>
2895 <event name="OnLeftUp"></event>
2896 <event name="OnMiddleDClick"></event>
2897 <event name="OnMiddleDown"></event>
2898 <event name="OnMiddleUp"></event>
2899 <event name="OnMotion"></event>
2900 <event name="OnMouseEvents"></event>
2901 <event name="OnMouseWheel"></event>
2902 <event name="OnPaint"></event>
2903 <event name="OnRightDClick"></event>
2904 <event name="OnRightDown"></event>
2905 <event name="OnRightUp"></event>
2906 <event name="OnSetFocus"></event>
2907 <event name="OnSize"></event>
2908 <event name="OnText"></event>
2909 <event name="OnTextEnter"></event>
2910 <event name="OnTextMaxLen"></event>
2911 <event name="OnTextURL"></event>
2912 <event name="OnUpdateUI"></event>
2913 </object>
2914 </object>
2915 <object class="sizeritem" expanded="1">
2916 <property name="border">5</property>
2917 <property name="flag">wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT</property>
2918 <property name="proportion">0</property>
2919 <object class="wxStaticText" expanded="1">
2920 <property name="bg"></property>
2921 <property name="context_help"></property>
2922 <property name="enabled">1</property>
2923 <property name="fg"></property>
2924 <property name="font"></property>
2925 <property name="hidden">0</property>
2926 <property name="id">wxID_ANY</property>
2927 <property name="label">T&amp;ransfer:</property>
2928 <property name="maximum_size"></property>
2929 <property name="minimum_size"></property>
2930 <property name="name">m_staticText20</property>
2931 <property name="permission">protected</property>
2932 <property name="pos"></property>
2933 <property name="size">-1,-1</property>
2934 <property name="style">wxALIGN_RIGHT</property>
2935 <property name="subclass"></property>
2936 <property name="tooltip"></property>
2937 <property name="window_extra_style"></property>
2938 <property name="window_name"></property>
2939 <property name="window_style"></property>
2940 <property name="wrap">-1</property>
2941 <event name="OnChar"></event>
2942 <event name="OnEnterWindow"></event>
2943 <event name="OnEraseBackground"></event>
2944 <event name="OnKeyDown"></event>
2945 <event name="OnKeyUp"></event>
2946 <event name="OnKillFocus"></event>
2947 <event name="OnLeaveWindow"></event>
2948 <event name="OnLeftDClick"></event>
2949 <event name="OnLeftDown"></event>
2950 <event name="OnLeftUp"></event>
2951 <event name="OnMiddleDClick"></event>
2952 <event name="OnMiddleDown"></event>
2953 <event name="OnMiddleUp"></event>
2954 <event name="OnMotion"></event>
2955 <event name="OnMouseEvents"></event>
2956 <event name="OnMouseWheel"></event>
2957 <event name="OnPaint"></event>
2958 <event name="OnRightDClick"></event>
2959 <event name="OnRightDown"></event>
2960 <event name="OnRightUp"></event>
2961 <event name="OnSetFocus"></event>
2962 <event name="OnSize"></event>
2963 <event name="OnUpdateUI"></event>
2964 </object>
2965 </object>
2966 <object class="sizeritem" expanded="1">
2967 <property name="border">5</property>
2968 <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
2969 <property name="proportion">0</property>
2970 <object class="wxChoice" expanded="1">
2971 <property name="bg"></property>
2972 <property name="choices">&quot; Standard&quot;</property>
2973 <property name="context_help"></property>
2974 <property name="enabled">1</property>
2975 <property name="fg"></property>
2976 <property name="font"></property>
2977 <property name="hidden">0</property>
2978 <property name="id">wxID_CHOICETRANSFERTYPE</property>
2979 <property name="maximum_size"></property>
2980 <property name="minimum_size"></property>
2981 <property name="name">m_choiceTransferType</property>
2982 <property name="permission">protected</property>
2983 <property name="pos"></property>
2984 <property name="selection">0</property>
2985 <property name="size"></property>
2986 <property name="subclass"></property>
2987 <property name="tooltip"></property>
2988 <property name="window_extra_style"></property>
2989 <property name="window_name"></property>
2990 <property name="window_style"></property>
2991 <event name="OnChar"></event>
2992 <event name="OnChoice"></event>
2993 <event name="OnEnterWindow"></event>
2994 <event name="OnEraseBackground"></event>
2995 <event name="OnKeyDown"></event>
2996 <event name="OnKeyUp"></event>
2997 <event name="OnKillFocus"></event>
2998 <event name="OnLeaveWindow"></event>
2999 <event name="OnLeftDClick"></event>
3000 <event name="OnLeftDown"></event>
3001 <event name="OnLeftUp"></event>
3002 <event name="OnMiddleDClick"></event>
3003 <event name="OnMiddleDown"></event>
3004 <event name="OnMiddleUp"></event>
3005 <event name="OnMotion"></event>
3006 <event name="OnMouseEvents"></event>
3007 <event name="OnMouseWheel"></event>
3008 <event name="OnPaint"></event>
3009 <event name="OnRightDClick"></event>
3010 <event name="OnRightDown"></event>
3011 <event name="OnRightUp"></event>
3012 <event name="OnSetFocus"></event>
3013 <event name="OnSize"></event>
3014 <event name="OnUpdateUI"></event>
3015 </object>
3016 </object>
3017 </object>
3018 </object>
3019 <object class="sizeritem" expanded="1">
3020 <property name="border">5</property>
3021 <property name="flag">wxEXPAND</property>
3022 <property name="proportion">0</property>
3023 <object class="wxBoxSizer" expanded="1">
3024 <property name="minimum_size"></property>
3025 <property name="name">bSizer672</property>
3026 <property name="orient">wxHORIZONTAL</property>
3027 <property name="permission">none</property>
3028 <object class="sizeritem" expanded="1">
3029 <property name="border">5</property>
3030 <property name="flag">wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT</property>
3031 <property name="proportion">1</property>
3032 <object class="wxBoxSizer" expanded="1">
3033 <property name="minimum_size"></property>
3034 <property name="name">bSizer681</property>
3035 <property name="orient">wxVERTICAL</property>
3036 <property name="permission">none</property>
3037 <object class="sizeritem" expanded="1">
3038 <property name="border">5</property>
3039 <property name="flag">wxBOTTOM|wxLEFT</property>
3040 <property name="proportion">0</property>
3041 <object class="wxStaticText" expanded="1">
3042 <property name="bg"></property>
3043 <property name="context_help"></property>
3044 <property name="enabled">1</property>
3045 <property name="fg"></property>
3046 <property name="font"></property>
3047 <property name="hidden">0</property>
3048 <property name="id">wxID_ANY</property>
3049 <property name="label">&amp;From:</property>
3050 <property name="maximum_size"></property>
3051 <property name="minimum_size"></property>
3052 <property name="name">m_staticTextFrom</property>
3053 <property name="permission">protected</property>
3054 <property name="pos"></property>
3055 <property name="size"></property>
3056 <property name="style"></property>
3057 <property name="subclass"></property>
3058 <property name="tooltip"></property>
3059 <property name="window_extra_style"></property>
3060 <property name="window_name"></property>
3061 <property name="window_style"></property>
3062 <property name="wrap">-1</property>
3063 <event name="OnChar"></event>
3064 <event name="OnEnterWindow"></event>
3065 <event name="OnEraseBackground"></event>
3066 <event name="OnKeyDown"></event>
3067 <event name="OnKeyUp"></event>
3068 <event name="OnKillFocus"></event>
3069 <event name="OnLeaveWindow"></event>
3070 <event name="OnLeftDClick"></event>
3071 <event name="OnLeftDown"></event>
3072 <event name="OnLeftUp"></event>
3073 <event name="OnMiddleDClick"></event>
3074 <event name="OnMiddleDown"></event>
3075 <event name="OnMiddleUp"></event>
3076 <event name="OnMotion"></event>
3077 <event name="OnMouseEvents"></event>
3078 <event name="OnMouseWheel"></event>
3079 <event name="OnPaint"></event>
3080 <event name="OnRightDClick"></event>
3081 <event name="OnRightDown"></event>
3082 <event name="OnRightUp"></event>
3083 <event name="OnSetFocus"></event>
3084 <event name="OnSize"></event>
3085 <event name="OnUpdateUI"></event>
3086 </object>
3087 </object>
3088 <object class="sizeritem" expanded="1">
3089 <property name="border">5</property>
3090 <property name="flag">wxLEFT|wxEXPAND</property>
3091 <property name="proportion">0</property>
3092 <object class="wxTextCtrl" expanded="1">
3093 <property name="bg"></property>
3094 <property name="context_help"></property>
3095 <property name="enabled">1</property>
3096 <property name="fg"></property>
3097 <property name="font"></property>
3098 <property name="hidden">0</property>
3099 <property name="id">wxID_ANY</property>
3100 <property name="maximum_size"></property>
3101 <property name="maxlength">0</property>
3102 <property name="minimum_size"></property>
3103 <property name="name">m_textCtrlFrom</property>
3104 <property name="permission">protected</property>
3105 <property name="pos"></property>
3106 <property name="size">-1,-1</property>
3107 <property name="style"></property>
3108 <property name="subclass"></property>
3109 <property name="tooltip"></property>
3110 <property name="value"></property>
3111 <property name="window_extra_style"></property>
3112 <property name="window_name"></property>
3113 <property name="window_style"></property>
3114 <event name="OnChar"></event>
3115 <event name="OnEnterWindow"></event>
3116 <event name="OnEraseBackground"></event>
3117 <event name="OnKeyDown">OnKeyDown</event>
3118 <event name="OnKeyUp"></event>
3119 <event name="OnKillFocus"></event>
3120 <event name="OnLeaveWindow"></event>
3121 <event name="OnLeftDClick"></event>
3122 <event name="OnLeftDown"></event>
3123 <event name="OnLeftUp"></event>
3124 <event name="OnMiddleDClick"></event>
3125 <event name="OnMiddleDown"></event>
3126 <event name="OnMiddleUp"></event>
3127 <event name="OnMotion"></event>
3128 <event name="OnMouseEvents"></event>
3129 <event name="OnMouseWheel"></event>
3130 <event name="OnPaint"></event>
3131 <event name="OnRightDClick"></event>
3132 <event name="OnRightDown"></event>
3133 <event name="OnRightUp"></event>
3134 <event name="OnSetFocus"></event>
3135 <event name="OnSize"></event>
3136 <event name="OnText"></event>
3137 <event name="OnTextEnter"></event>
3138 <event name="OnTextMaxLen"></event>
3139 <event name="OnTextURL"></event>
3140 <event name="OnUpdateUI"></event>
3141 </object>
3142 </object>
3143 </object>
3144 </object>
3145 </object>
3146 </object>
3147 <object class="sizeritem" expanded="1">
3148 <property name="border">5</property>
3149 <property name="flag">wxEXPAND</property>
3150 <property name="proportion">1</property>
3151 <object class="wxBoxSizer" expanded="1">
3152 <property name="minimum_size"></property>
3153 <property name="name">bSizer67</property>
3154 <property name="orient">wxHORIZONTAL</property>
3155 <property name="permission">none</property>
3156 <object class="sizeritem" expanded="1">
3157 <property name="border">5</property>
3158 <property name="flag">wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT</property>
3159 <property name="proportion">1</property>
3160 <object class="wxBoxSizer" expanded="1">
3161 <property name="minimum_size"></property>
3162 <property name="name">bSizer68</property>
3163 <property name="orient">wxVERTICAL</property>
3164 <property name="permission">none</property>
3165 <object class="sizeritem" expanded="1">
3166 <property name="border">5</property>
3167 <property name="flag">wxTOP|wxBOTTOM|wxLEFT</property>
3168 <property name="proportion">0</property>
3169 <object class="wxStaticText" expanded="1">
3170 <property name="bg"></property>
3171 <property name="context_help"></property>
3172 <property name="enabled">1</property>
3173 <property name="fg"></property>
3174 <property name="font"></property>
3175 <property name="hidden">0</property>
3176 <property name="id">wxID_ANY</property>
3177 <property name="label">&amp;Message:</property>
3178 <property name="maximum_size"></property>
3179 <property name="minimum_size"></property>
3180 <property name="name">m_staticTextMessage</property>
3181 <property name="permission">protected</property>
3182 <property name="pos"></property>
3183 <property name="size"></property>
3184 <property name="style"></property>
3185 <property name="subclass"></property>
3186 <property name="tooltip"></property>
3187 <property name="window_extra_style"></property>
3188 <property name="window_name"></property>
3189 <property name="window_style"></property>
3190 <property name="wrap">-1</property>
3191 <event name="OnChar"></event>
3192 <event name="OnEnterWindow"></event>
3193 <event name="OnEraseBackground"></event>
3194 <event name="OnKeyDown"></event>
3195 <event name="OnKeyUp"></event>
3196 <event name="OnKillFocus"></event>
3197 <event name="OnLeaveWindow"></event>
3198 <event name="OnLeftDClick"></event>
3199 <event name="OnLeftDown"></event>
3200 <event name="OnLeftUp"></event>
3201 <event name="OnMiddleDClick"></event>
3202 <event name="OnMiddleDown"></event>
3203 <event name="OnMiddleUp"></event>
3204 <event name="OnMotion"></event>
3205 <event name="OnMouseEvents"></event>
3206 <event name="OnMouseWheel"></event>
3207 <event name="OnPaint"></event>
3208 <event name="OnRightDClick"></event>
3209 <event name="OnRightDown"></event>
3210 <event name="OnRightUp"></event>
3211 <event name="OnSetFocus"></event>
3212 <event name="OnSize"></event>
3213 <event name="OnUpdateUI"></event>
3214 </object>
3215 </object>
3216 <object class="sizeritem" expanded="1">
3217 <property name="border">5</property>
3218 <property name="flag">wxEXPAND|wxLEFT</property>
3219 <property name="proportion">1</property>
3220 <object class="wxTextCtrl" expanded="1">
3221 <property name="bg"></property>
3222 <property name="context_help"></property>
3223 <property name="enabled">1</property>
3224 <property name="fg"></property>
3225 <property name="font"></property>
3226 <property name="hidden">0</property>
3227 <property name="id">wxID_ANY</property>
3228 <property name="maximum_size"></property>
3229 <property name="maxlength">0</property>
3230 <property name="minimum_size"></property>
3231 <property name="name">m_textCtrlMessage</property>
3232 <property name="permission">protected</property>
3233 <property name="pos"></property>
3234 <property name="size"></property>
3235 <property name="style">wxTE_MULTILINE</property>
3236 <property name="subclass"></property>
3237 <property name="tooltip"></property>
3238 <property name="value"></property>
3239 <property name="window_extra_style"></property>
3240 <property name="window_name"></property>
3241 <property name="window_style"></property>
3242 <event name="OnChar"></event>
3243 <event name="OnEnterWindow"></event>
3244 <event name="OnEraseBackground"></event>
3245 <event name="OnKeyDown">OnKeyDown</event>
3246 <event name="OnKeyUp"></event>
3247 <event name="OnKillFocus"></event>
3248 <event name="OnLeaveWindow"></event>
3249 <event name="OnLeftDClick"></event>
3250 <event name="OnLeftDown"></event>
3251 <event name="OnLeftUp"></event>
3252 <event name="OnMiddleDClick"></event>
3253 <event name="OnMiddleDown"></event>
3254 <event name="OnMiddleUp"></event>
3255 <event name="OnMotion"></event>
3256 <event name="OnMouseEvents"></event>
3257 <event name="OnMouseWheel"></event>
3258 <event name="OnPaint"></event>
3259 <event name="OnRightDClick"></event>
3260 <event name="OnRightDown"></event>
3261 <event name="OnRightUp"></event>
3262 <event name="OnSetFocus"></event>
3263 <event name="OnSize"></event>
3264 <event name="OnText"></event>
3265 <event name="OnTextEnter"></event>
3266 <event name="OnTextMaxLen"></event>
3267 <event name="OnTextURL"></event>
3268 <event name="OnUpdateUI"></event>
3269 </object>
3270 </object>
3271 </object>
3272 </object>
3273 </object>
3274 </object>
3275 <object class="sizeritem" expanded="1">
3276 <property name="border">5</property>
3277 <property name="flag">wxEXPAND</property>
3278 <property name="proportion">0</property>
3279 <object class="wxBoxSizer" expanded="1">
3280 <property name="minimum_size"></property>
3281 <property name="name">bSizer23</property>
3282 <property name="orient">wxHORIZONTAL</property>
3283 <property name="permission">none</property>
3284 <object class="sizeritem" expanded="1">
3285 <property name="border">5</property>
3286 <property name="flag">wxEXPAND</property>
3287 <property name="proportion">1</property>
3288 <object class="spacer" expanded="1">
3289 <property name="height">0</property>
3290 <property name="permission">protected</property>
3291 <property name="width">0</property>
3292 </object>
3293 </object>
3294 <object class="sizeritem" expanded="1">
3295 <property name="border">5</property>
3296 <property name="flag">wxALL</property>
3297 <property name="proportion">0</property>
3298 <object class="wxButton" expanded="1">
3299 <property name="bg"></property>
3300 <property name="context_help"></property>
3301 <property name="default">0</property>
3302 <property name="enabled">1</property>
3303 <property name="fg"></property>
3304 <property name="font">,90,90,-1,70,0</property>
3305 <property name="hidden">0</property>
3306 <property name="id">wxID_BUTTONSEND</property>
3307 <property name="label">&amp;Send</property>
3308 <property name="maximum_size"></property>
3309 <property name="minimum_size">85,25</property>
3310 <property name="name">m_buttonSend</property>
3311 <property name="permission">protected</property>
3312 <property name="pos"></property>
3313 <property name="size">-1,-1</property>
3314 <property name="style"></property>
3315 <property name="subclass"></property>
3316 <property name="tooltip"></property>
3317 <property name="window_extra_style"></property>
3318 <property name="window_name"></property>
3319 <property name="window_style"></property>
3320 <event name="OnButtonClick">OnButtonSend</event>
3321 <event name="OnChar"></event>
3322 <event name="OnEnterWindow"></event>
3323 <event name="OnEraseBackground"></event>
3324 <event name="OnKeyDown"></event>
3325 <event name="OnKeyUp"></event>
3326 <event name="OnKillFocus"></event>
3327 <event name="OnLeaveWindow"></event>
3328 <event name="OnLeftDClick"></event>
3329 <event name="OnLeftDown"></event>
3330 <event name="OnLeftUp"></event>
3331 <event name="OnMiddleDClick"></event>
3332 <event name="OnMiddleDown"></event>
3333 <event name="OnMiddleUp"></event>
3334 <event name="OnMotion"></event>
3335 <event name="OnMouseEvents"></event>
3336 <event name="OnMouseWheel"></event>
3337 <event name="OnPaint"></event>
3338 <event name="OnRightDClick"></event>
3339 <event name="OnRightDown"></event>
3340 <event name="OnRightUp"></event>
3341 <event name="OnSetFocus"></event>
3342 <event name="OnSize"></event>
3343 <event name="OnUpdateUI"></event>
3344 </object>
3345 </object>
3346 <object class="sizeritem" expanded="1">
3347 <property name="border">5</property>
3348 <property name="flag">wxALL</property>
3349 <property name="proportion">0</property>
3350 <object class="wxButton" expanded="1">
3351 <property name="bg"></property>
3352 <property name="context_help"></property>
3353 <property name="default">0</property>
3354 <property name="enabled">1</property>
3355 <property name="fg"></property>
3356 <property name="font"></property>
3357 <property name="hidden">0</property>
3358 <property name="id">wxID_CANCEL</property>
3359 <property name="label">Cancel</property>
3360 <property name="maximum_size"></property>
3361 <property name="minimum_size">85,25</property>
3362 <property name="name">m_buttonCancel</property>
3363 <property name="permission">protected</property>
3364 <property name="pos"></property>
3365 <property name="size">-1,-1</property>
3366 <property name="style"></property>
3367 <property name="subclass"></property>
3368 <property name="tooltip"></property>
3369 <property name="window_extra_style"></property>
3370 <property name="window_name"></property>
3371 <property name="window_style"></property>
3372 <event name="OnButtonClick">OnButtonCancel</event>
3373 <event name="OnChar"></event>
3374 <event name="OnEnterWindow"></event>
3375 <event name="OnEraseBackground"></event>
3376 <event name="OnKeyDown"></event>
3377 <event name="OnKeyUp"></event>
3378 <event name="OnKillFocus"></event>
3379 <event name="OnLeaveWindow"></event>
3380 <event name="OnLeftDClick"></event>
3381 <event name="OnLeftDown"></event>
3382 <event name="OnLeftUp"></event>
3383 <event name="OnMiddleDClick"></event>
3384 <event name="OnMiddleDown"></event>
3385 <event name="OnMiddleUp"></event>
3386 <event name="OnMotion"></event>
3387 <event name="OnMouseEvents"></event>
3388 <event name="OnMouseWheel"></event>
3389 <event name="OnPaint"></event>
3390 <event name="OnRightDClick"></event>
3391 <event name="OnRightDown"></event>
3392 <event name="OnRightUp"></event>
3393 <event name="OnSetFocus"></event>
3394 <event name="OnSize"></event>
3395 <event name="OnUpdateUI"></event>
3396 </object>
3397 </object>
3398 </object>
3399 </object>
3400 </object>
3401 </object>
3402 <object class="Dialog" expanded="1">
3403 <property name="bg"></property>
3404 <property name="center"></property>
3405 <property name="context_help"></property>
3406 <property name="enabled">1</property>
3407 <property name="extra_style"></property>
3408 <property name="fg"></property>
3409 <property name="font"></property>
3410 <property name="hidden">0</property>
3411 <property name="id">wxID_ANY</property>
3412 <property name="maximum_size"></property>
3413 <property name="minimum_size"></property>
3414 <property name="name">CSendingDialogBase</property>
3415 <property name="pos"></property>
3416 <property name="size">442,151</property>
3417 <property name="style">wxDEFAULT_DIALOG_STYLE</property>
3418 <property name="subclass"></property>
3419 <property name="title">Sending...</property>
3420 <property name="tooltip"></property>
3421 <property name="window_extra_style"></property>
3422 <property name="window_name"></property>
3423 <property name="window_style"></property>
3424 <event name="OnActivate"></event>
3425 <event name="OnActivateApp"></event>
3426 <event name="OnChar"></event>
3427 <event name="OnClose">OnClose</event>
3428 <event name="OnEnterWindow"></event>
3429 <event name="OnEraseBackground"></event>
3430 <event name="OnHibernate"></event>
3431 <event name="OnIconize"></event>
3432 <event name="OnIdle"></event>
3433 <event name="OnInitDialog"></event>
3434 <event name="OnKeyDown"></event>
3435 <event name="OnKeyUp"></event>
3436 <event name="OnKillFocus"></event>
3437 <event name="OnLeaveWindow"></event>
3438 <event name="OnLeftDClick"></event>
3439 <event name="OnLeftDown"></event>
3440 <event name="OnLeftUp"></event>
3441 <event name="OnMiddleDClick"></event>
3442 <event name="OnMiddleDown"></event>
3443 <event name="OnMiddleUp"></event>
3444 <event name="OnMotion"></event>
3445 <event name="OnMouseEvents"></event>
3446 <event name="OnMouseWheel"></event>
3447 <event name="OnPaint">OnPaint</event>
3448 <event name="OnRightDClick"></event>
3449 <event name="OnRightDown"></event>
3450 <event name="OnRightUp"></event>
3451 <event name="OnSetFocus"></event>
3452 <event name="OnSize"></event>
3453 <event name="OnUpdateUI"></event>
3454 <object class="wxBoxSizer" expanded="1">
3455 <property name="minimum_size"></property>
3456 <property name="name">bSizer68</property>
3457 <property name="orient">wxVERTICAL</property>
3458 <property name="permission">none</property>
3459 <object class="sizeritem" expanded="1">
3460 <property name="border">8</property>
3461 <property name="flag">wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT</property>
3462 <property name="proportion">0</property>
3463 <object class="wxStaticText" expanded="1">
3464 <property name="bg"></property>
3465 <property name="context_help"></property>
3466 <property name="enabled">1</property>
3467 <property name="fg"></property>
3468 <property name="font"></property>
3469 <property name="hidden">0</property>
3470 <property name="id">wxID_ANY</property>
3471 <property name="label"></property>
3472 <property name="maximum_size"></property>
3473 <property name="minimum_size"></property>
3474 <property name="name">m_staticTextSending</property>
3475 <property name="permission">protected</property>
3476 <property name="pos"></property>
3477 <property name="size">-1,14</property>
3478 <property name="style"></property>
3479 <property name="subclass"></property>
3480 <property name="tooltip"></property>
3481 <property name="window_extra_style"></property>
3482 <property name="window_name"></property>
3483 <property name="window_style"></property>
3484 <property name="wrap">-1</property>
3485 <event name="OnChar"></event>
3486 <event name="OnEnterWindow"></event>
3487 <event name="OnEraseBackground"></event>
3488 <event name="OnKeyDown"></event>
3489 <event name="OnKeyUp"></event>
3490 <event name="OnKillFocus"></event>
3491 <event name="OnLeaveWindow"></event>
3492 <event name="OnLeftDClick"></event>
3493 <event name="OnLeftDown"></event>
3494 <event name="OnLeftUp"></event>
3495 <event name="OnMiddleDClick"></event>
3496 <event name="OnMiddleDown"></event>
3497 <event name="OnMiddleUp"></event>
3498 <event name="OnMotion"></event>
3499 <event name="OnMouseEvents"></event>
3500 <event name="OnMouseWheel"></event>
3501 <event name="OnPaint"></event>
3502 <event name="OnRightDClick"></event>
3503 <event name="OnRightDown"></event>
3504 <event name="OnRightUp"></event>
3505 <event name="OnSetFocus"></event>
3506 <event name="OnSize"></event>
3507 <event name="OnUpdateUI"></event>
3508 </object>
3509 </object>
3510 <object class="sizeritem" expanded="1">
3511 <property name="border">10</property>
3512 <property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property>
3513 <property name="proportion">1</property>
3514 <object class="wxTextCtrl" expanded="1">
3515 <property name="bg">wxSYS_COLOUR_BTNFACE</property>
3516 <property name="context_help"></property>
3517 <property name="enabled">1</property>
3518 <property name="fg"></property>
3519 <property name="font"></property>
3520 <property name="hidden">0</property>
3521 <property name="id">wxID_ANY</property>
3522 <property name="maximum_size"></property>
3523 <property name="maxlength">0</property>
3524 <property name="minimum_size"></property>
3525 <property name="name">m_textCtrlStatus</property>
3526 <property name="permission">protected</property>
3527 <property name="pos"></property>
3528 <property name="size"></property>
3529 <property name="style">wxTE_CENTRE|wxTE_MULTILINE|wxTE_NO_VSCROLL|wxTE_READONLY</property>
3530 <property name="subclass"></property>
3531 <property name="tooltip"></property>
3532 <property name="value">&#x0A;&#x0A;Connecting...</property>
3533 <property name="window_extra_style"></property>
3534 <property name="window_name"></property>
3535 <property name="window_style">wxNO_BORDER</property>
3536 <event name="OnChar"></event>
3537 <event name="OnEnterWindow"></event>
3538 <event name="OnEraseBackground"></event>
3539 <event name="OnKeyDown"></event>
3540 <event name="OnKeyUp"></event>
3541 <event name="OnKillFocus"></event>
3542 <event name="OnLeaveWindow"></event>
3543 <event name="OnLeftDClick"></event>
3544 <event name="OnLeftDown"></event>
3545 <event name="OnLeftUp"></event>
3546 <event name="OnMiddleDClick"></event>
3547 <event name="OnMiddleDown"></event>
3548 <event name="OnMiddleUp"></event>
3549 <event name="OnMotion"></event>
3550 <event name="OnMouseEvents"></event>
3551 <event name="OnMouseWheel"></event>
3552 <event name="OnPaint"></event>
3553 <event name="OnRightDClick"></event>
3554 <event name="OnRightDown"></event>
3555 <event name="OnRightUp"></event>
3556 <event name="OnSetFocus"></event>
3557 <event name="OnSize"></event>
3558 <event name="OnText"></event>
3559 <event name="OnTextEnter"></event>
3560 <event name="OnTextMaxLen"></event>
3561 <event name="OnTextURL"></event>
3562 <event name="OnUpdateUI"></event>
3563 </object>
3564 </object>
3565 <object class="sizeritem" expanded="1">
3566 <property name="border">5</property>
3567 <property name="flag">wxEXPAND</property>
3568 <property name="proportion">0</property>
3569 <object class="wxBoxSizer" expanded="1">
3570 <property name="minimum_size"></property>
3571 <property name="name">bSizer69</property>
3572 <property name="orient">wxHORIZONTAL</property>
3573 <property name="permission">none</property>
3574 <object class="sizeritem" expanded="1">
3575 <property name="border">5</property>
3576 <property name="flag">wxEXPAND</property>
3577 <property name="proportion">1</property>
3578 <object class="spacer" expanded="1">
3579 <property name="height">0</property>
3580 <property name="permission">protected</property>
3581 <property name="width">0</property>
3582 </object>
3583 </object>
3584 <object class="sizeritem" expanded="1">
3585 <property name="border">5</property>
3586 <property name="flag">wxALL</property>
3587 <property name="proportion">0</property>
3588 <object class="wxButton" expanded="1">
3589 <property name="bg"></property>
3590 <property name="context_help"></property>
3591 <property name="default">0</property>
3592 <property name="enabled">0</property>
3593 <property name="fg"></property>
3594 <property name="font"></property>
3595 <property name="hidden">0</property>
3596 <property name="id">wxID_ANY</property>
3597 <property name="label">OK</property>
3598 <property name="maximum_size"></property>
3599 <property name="minimum_size">85,25</property>
3600 <property name="name">m_buttonOK</property>
3601 <property name="permission">protected</property>
3602 <property name="pos"></property>
3603 <property name="size"></property>
3604 <property name="style"></property>
3605 <property name="subclass"></property>
3606 <property name="tooltip"></property>
3607 <property name="window_extra_style"></property>
3608 <property name="window_name"></property>
3609 <property name="window_style"></property>
3610 <event name="OnButtonClick">OnButtonOK</event>
3611 <event name="OnChar"></event>
3612 <event name="OnEnterWindow"></event>
3613 <event name="OnEraseBackground"></event>
3614 <event name="OnKeyDown"></event>
3615 <event name="OnKeyUp"></event>
3616 <event name="OnKillFocus"></event>
3617 <event name="OnLeaveWindow"></event>
3618 <event name="OnLeftDClick"></event>
3619 <event name="OnLeftDown"></event>
3620 <event name="OnLeftUp"></event>
3621 <event name="OnMiddleDClick"></event>
3622 <event name="OnMiddleDown"></event>
3623 <event name="OnMiddleUp"></event>
3624 <event name="OnMotion"></event>
3625 <event name="OnMouseEvents"></event>
3626 <event name="OnMouseWheel"></event>
3627 <event name="OnPaint"></event>
3628 <event name="OnRightDClick"></event>
3629 <event name="OnRightDown"></event>
3630 <event name="OnRightUp"></event>
3631 <event name="OnSetFocus"></event>
3632 <event name="OnSize"></event>
3633 <event name="OnUpdateUI"></event>
3634 </object>
3635 </object>
3636 <object class="sizeritem" expanded="1">
3637 <property name="border">5</property>
3638 <property name="flag">wxALL</property>
3639 <property name="proportion">0</property>
3640 <object class="wxButton" expanded="1">
3641 <property name="bg"></property>
3642 <property name="context_help"></property>
3643 <property name="default">0</property>
3644 <property name="enabled">1</property>
3645 <property name="fg"></property>
3646 <property name="font"></property>
3647 <property name="hidden">0</property>
3648 <property name="id">wxID_CANCEL</property>
3649 <property name="label">Cancel</property>
3650 <property name="maximum_size"></property>
3651 <property name="minimum_size">85,25</property>
3652 <property name="name">m_buttonCancel</property>
3653 <property name="permission">protected</property>
3654 <property name="pos"></property>
3655 <property name="size">-1,-1</property>
3656 <property name="style"></property>
3657 <property name="subclass"></property>
3658 <property name="tooltip"></property>
3659 <property name="window_extra_style"></property>
3660 <property name="window_name"></property>
3661 <property name="window_style"></property>
3662 <event name="OnButtonClick">OnButtonCancel</event>
3663 <event name="OnChar"></event>
3664 <event name="OnEnterWindow"></event>
3665 <event name="OnEraseBackground"></event>
3666 <event name="OnKeyDown"></event>
3667 <event name="OnKeyUp"></event>
3668 <event name="OnKillFocus"></event>
3669 <event name="OnLeaveWindow"></event>
3670 <event name="OnLeftDClick"></event>
3671 <event name="OnLeftDown"></event>
3672 <event name="OnLeftUp"></event>
3673 <event name="OnMiddleDClick"></event>
3674 <event name="OnMiddleDown"></event>
3675 <event name="OnMiddleUp"></event>
3676 <event name="OnMotion"></event>
3677 <event name="OnMouseEvents"></event>
3678 <event name="OnMouseWheel"></event>
3679 <event name="OnPaint"></event>
3680 <event name="OnRightDClick"></event>
3681 <event name="OnRightDown"></event>
3682 <event name="OnRightUp"></event>
3683 <event name="OnSetFocus"></event>
3684 <event name="OnSize"></event>
3685 <event name="OnUpdateUI"></event>
3686 </object>
3687 </object>
3688 </object>
3689 </object>
3690 </object>
3691 </object>
3692 <object class="Dialog" expanded="0">
3693 <property name="bg"></property>
3694 <property name="center"></property>
3695 <property name="context_help"></property>
3696 <property name="enabled">1</property>
3697 <property name="extra_style"></property>
3698 <property name="fg"></property>
3699 <property name="font"></property>
3700 <property name="hidden">0</property>
3701 <property name="id">wxID_ANY</property>
3702 <property name="maximum_size"></property>
3703 <property name="minimum_size"></property>
3704 <property name="name">CYourAddressDialogBase</property>
3705 <property name="pos"></property>
3706 <property name="size">610,390</property>
3707 <property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
3708 <property name="subclass"></property>
3709 <property name="title">Your Bitcoin Address</property>
3710 <property name="tooltip"></property>
3711 <property name="window_extra_style"></property>
3712 <property name="window_name"></property>
3713 <property name="window_style"></property>
3714 <event name="OnActivate"></event>
3715 <event name="OnActivateApp"></event>
3716 <event name="OnChar"></event>
3717 <event name="OnClose">OnClose</event>
3718 <event name="OnEnterWindow"></event>
3719 <event name="OnEraseBackground"></event>
3720 <event name="OnHibernate"></event>
3721 <event name="OnIconize"></event>
3722 <event name="OnIdle"></event>
3723 <event name="OnInitDialog"></event>
3724 <event name="OnKeyDown"></event>
3725 <event name="OnKeyUp"></event>
3726 <event name="OnKillFocus"></event>
3727 <event name="OnLeaveWindow"></event>
3728 <event name="OnLeftDClick"></event>
3729 <event name="OnLeftDown"></event>
3730 <event name="OnLeftUp"></event>
3731 <event name="OnMiddleDClick"></event>
3732 <event name="OnMiddleDown"></event>
3733 <event name="OnMiddleUp"></event>
3734 <event name="OnMotion"></event>
3735 <event name="OnMouseEvents"></event>
3736 <event name="OnMouseWheel"></event>
3737 <event name="OnPaint"></event>
3738 <event name="OnRightDClick"></event>
3739 <event name="OnRightDown"></event>
3740 <event name="OnRightUp"></event>
3741 <event name="OnSetFocus"></event>
3742 <event name="OnSize"></event>
3743 <event name="OnUpdateUI"></event>
3744 <object class="wxBoxSizer" expanded="1">
3745 <property name="minimum_size"></property>
3746 <property name="name">bSizer68</property>
3747 <property name="orient">wxVERTICAL</property>
3748 <property name="permission">none</property>
3749 <object class="sizeritem" expanded="1">
3750 <property name="border">5</property>
3751 <property name="flag">wxEXPAND</property>
3752 <property name="proportion">0</property>
3753 <object class="spacer" expanded="1">
3754 <property name="height">5</property>
3755 <property name="permission">protected</property>
3756 <property name="width">0</property>
3757 </object>
3758 </object>
3759 <object class="sizeritem" expanded="1">
3760 <property name="border">5</property>
3761 <property name="flag">wxALL</property>
3762 <property name="proportion">0</property>
3763 <object class="wxStaticText" expanded="1">
3764 <property name="bg"></property>
3765 <property name="context_help"></property>
3766 <property name="enabled">1</property>
3767 <property name="fg"></property>
3768 <property name="font"></property>
3769 <property name="hidden">0</property>
3770 <property name="id">wxID_ANY</property>
3771 <property name="label">These are your Bitcoin addresses for receiving payments.&#x0A;You may want to give a different one to each sender so you can keep track of who is paying you.</property>
3772 <property name="maximum_size"></property>
3773 <property name="minimum_size"></property>
3774 <property name="name">m_staticText45</property>
3775 <property name="permission">protected</property>
3776 <property name="pos"></property>
3777 <property name="size"></property>
3778 <property name="style"></property>
3779 <property name="subclass"></property>
3780 <property name="tooltip"></property>
3781 <property name="window_extra_style"></property>
3782 <property name="window_name"></property>
3783 <property name="window_style"></property>
3784 <property name="wrap">600</property>
3785 <event name="OnChar"></event>
3786 <event name="OnEnterWindow"></event>
3787 <event name="OnEraseBackground"></event>
3788 <event name="OnKeyDown"></event>
3789 <event name="OnKeyUp"></event>
3790 <event name="OnKillFocus"></event>
3791 <event name="OnLeaveWindow"></event>
3792 <event name="OnLeftDClick"></event>
3793 <event name="OnLeftDown"></event>
3794 <event name="OnLeftUp"></event>
3795 <event name="OnMiddleDClick"></event>
3796 <event name="OnMiddleDown"></event>
3797 <event name="OnMiddleUp"></event>
3798 <event name="OnMotion"></event>
3799 <event name="OnMouseEvents"></event>
3800 <event name="OnMouseWheel"></event>
3801 <event name="OnPaint"></event>
3802 <event name="OnRightDClick"></event>
3803 <event name="OnRightDown"></event>
3804 <event name="OnRightUp"></event>
3805 <event name="OnSetFocus"></event>
3806 <event name="OnSize"></event>
3807 <event name="OnUpdateUI"></event>
3808 </object>
3809 </object>
3810 <object class="sizeritem" expanded="1">
3811 <property name="border">5</property>
3812 <property name="flag">wxALL|wxEXPAND</property>
3813 <property name="proportion">1</property>
3814 <object class="wxListCtrl" expanded="1">
3815 <property name="bg"></property>
3816 <property name="context_help"></property>
3817 <property name="enabled">1</property>
3818 <property name="fg"></property>
3819 <property name="font"></property>
3820 <property name="hidden">0</property>
3821 <property name="id">wxID_LISTCTRL</property>
3822 <property name="maximum_size"></property>
3823 <property name="minimum_size"></property>
3824 <property name="name">m_listCtrl</property>
3825 <property name="permission">protected</property>
3826 <property name="pos"></property>
3827 <property name="size"></property>
3828 <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_ASCENDING</property>
3829 <property name="subclass"></property>
3830 <property name="tooltip"></property>
3831 <property name="window_extra_style"></property>
3832 <property name="window_name"></property>
3833 <property name="window_style"></property>
3834 <event name="OnChar"></event>
3835 <event name="OnEnterWindow"></event>
3836 <event name="OnEraseBackground"></event>
3837 <event name="OnKeyDown"></event>
3838 <event name="OnKeyUp"></event>
3839 <event name="OnKillFocus"></event>
3840 <event name="OnLeaveWindow"></event>
3841 <event name="OnLeftDClick"></event>
3842 <event name="OnLeftDown"></event>
3843 <event name="OnLeftUp"></event>
3844 <event name="OnListBeginDrag"></event>
3845 <event name="OnListBeginLabelEdit"></event>
3846 <event name="OnListBeginRDrag"></event>
3847 <event name="OnListCacheHint"></event>
3848 <event name="OnListColBeginDrag"></event>
3849 <event name="OnListColClick"></event>
3850 <event name="OnListColDragging"></event>
3851 <event name="OnListColEndDrag"></event>
3852 <event name="OnListColRightClick"></event>
3853 <event name="OnListDeleteAllItems"></event>
3854 <event name="OnListDeleteItem"></event>
3855 <event name="OnListEndLabelEdit">OnListEndLabelEdit</event>
3856 <event name="OnListInsertItem"></event>
3857 <event name="OnListItemActivated">OnListItemActivated</event>
3858 <event name="OnListItemDeselected"></event>
3859 <event name="OnListItemFocused"></event>
3860 <event name="OnListItemMiddleClick"></event>
3861 <event name="OnListItemRightClick"></event>
3862 <event name="OnListItemSelected">OnListItemSelected</event>
3863 <event name="OnListKeyDown"></event>
3864 <event name="OnMiddleDClick"></event>
3865 <event name="OnMiddleDown"></event>
3866 <event name="OnMiddleUp"></event>
3867 <event name="OnMotion"></event>
3868 <event name="OnMouseEvents"></event>
3869 <event name="OnMouseWheel"></event>
3870 <event name="OnPaint"></event>
3871 <event name="OnRightDClick"></event>
3872 <event name="OnRightDown"></event>
3873 <event name="OnRightUp"></event>
3874 <event name="OnSetFocus"></event>
3875 <event name="OnSize"></event>
3876 <event name="OnUpdateUI"></event>
3877 </object>
3878 </object>
3879 <object class="sizeritem" expanded="1">
3880 <property name="border">5</property>
3881 <property name="flag">wxEXPAND</property>
3882 <property name="proportion">0</property>
3883 <object class="wxBoxSizer" expanded="1">
3884 <property name="minimum_size"></property>
3885 <property name="name">bSizer69</property>
3886 <property name="orient">wxHORIZONTAL</property>
3887 <property name="permission">none</property>
3888 <object class="sizeritem" expanded="1">
3889 <property name="border">5</property>
3890 <property name="flag">wxEXPAND</property>
3891 <property name="proportion">1</property>
3892 <object class="spacer" expanded="1">
3893 <property name="height">0</property>
3894 <property name="permission">protected</property>
3895 <property name="width">0</property>
3896 </object>
3897 </object>
3898 <object class="sizeritem" expanded="1">
3899 <property name="border">5</property>
3900 <property name="flag">wxALL</property>
3901 <property name="proportion">0</property>
3902 <object class="wxButton" expanded="1">
3903 <property name="bg"></property>
3904 <property name="context_help"></property>
3905 <property name="default">0</property>
3906 <property name="enabled">1</property>
3907 <property name="fg"></property>
3908 <property name="font"></property>
3909 <property name="hidden">0</property>
3910 <property name="id">wxID_BUTTONRENAME</property>
3911 <property name="label">&amp;Rename...</property>
3912 <property name="maximum_size"></property>
3913 <property name="minimum_size">85,25</property>
3914 <property name="name">m_buttonRename</property>
3915 <property name="permission">protected</property>
3916 <property name="pos"></property>
3917 <property name="size"></property>
3918 <property name="style"></property>
3919 <property name="subclass"></property>
3920 <property name="tooltip"></property>
3921 <property name="window_extra_style"></property>
3922 <property name="window_name"></property>
3923 <property name="window_style"></property>
3924 <event name="OnButtonClick">OnButtonRename</event>
3925 <event name="OnChar"></event>
3926 <event name="OnEnterWindow"></event>
3927 <event name="OnEraseBackground"></event>
3928 <event name="OnKeyDown"></event>
3929 <event name="OnKeyUp"></event>
3930 <event name="OnKillFocus"></event>
3931 <event name="OnLeaveWindow"></event>
3932 <event name="OnLeftDClick"></event>
3933 <event name="OnLeftDown"></event>
3934 <event name="OnLeftUp"></event>
3935 <event name="OnMiddleDClick"></event>
3936 <event name="OnMiddleDown"></event>
3937 <event name="OnMiddleUp"></event>
3938 <event name="OnMotion"></event>
3939 <event name="OnMouseEvents"></event>
3940 <event name="OnMouseWheel"></event>
3941 <event name="OnPaint"></event>
3942 <event name="OnRightDClick"></event>
3943 <event name="OnRightDown"></event>
3944 <event name="OnRightUp"></event>
3945 <event name="OnSetFocus"></event>
3946 <event name="OnSize"></event>
3947 <event name="OnUpdateUI"></event>
3948 </object>
3949 </object>
3950 <object class="sizeritem" expanded="1">
3951 <property name="border">5</property>
3952 <property name="flag">wxALL</property>
3953 <property name="proportion">0</property>
3954 <object class="wxButton" expanded="1">
3955 <property name="bg"></property>
3956 <property name="context_help"></property>
3957 <property name="default">0</property>
3958 <property name="enabled">1</property>
3959 <property name="fg"></property>
3960 <property name="font"></property>
3961 <property name="hidden">0</property>
3962 <property name="id">wxID_BUTTONNEW</property>
3963 <property name="label">&amp;New Address...</property>
3964 <property name="maximum_size"></property>
3965 <property name="minimum_size">110,25</property>
3966 <property name="name">m_buttonNew</property>
3967 <property name="permission">protected</property>
3968 <property name="pos"></property>
3969 <property name="size">-1,-1</property>
3970 <property name="style"></property>
3971 <property name="subclass"></property>
3972 <property name="tooltip"></property>
3973 <property name="window_extra_style"></property>
3974 <property name="window_name"></property>
3975 <property name="window_style"></property>
3976 <event name="OnButtonClick">OnButtonNew</event>
3977 <event name="OnChar"></event>
3978 <event name="OnEnterWindow"></event>
3979 <event name="OnEraseBackground"></event>
3980 <event name="OnKeyDown"></event>
3981 <event name="OnKeyUp"></event>
3982 <event name="OnKillFocus"></event>
3983 <event name="OnLeaveWindow"></event>
3984 <event name="OnLeftDClick"></event>
3985 <event name="OnLeftDown"></event>
3986 <event name="OnLeftUp"></event>
3987 <event name="OnMiddleDClick"></event>
3988 <event name="OnMiddleDown"></event>
3989 <event name="OnMiddleUp"></event>
3990 <event name="OnMotion"></event>
3991 <event name="OnMouseEvents"></event>
3992 <event name="OnMouseWheel"></event>
3993 <event name="OnPaint"></event>
3994 <event name="OnRightDClick"></event>
3995 <event name="OnRightDown"></event>
3996 <event name="OnRightUp"></event>
3997 <event name="OnSetFocus"></event>
3998 <event name="OnSize"></event>
3999 <event name="OnUpdateUI"></event>
4000 </object>
4001 </object>
4002 <object class="sizeritem" expanded="1">
4003 <property name="border">5</property>
4004 <property name="flag">wxALL</property>
4005 <property name="proportion">0</property>
4006 <object class="wxButton" expanded="1">
4007 <property name="bg"></property>
4008 <property name="context_help"></property>
4009 <property name="default">0</property>
4010 <property name="enabled">1</property>
4011 <property name="fg"></property>
4012 <property name="font"></property>
4013 <property name="hidden">0</property>
4014 <property name="id">wxID_BUTTONCOPY</property>
4015 <property name="label">&amp;Copy to Clipboard</property>
4016 <property name="maximum_size"></property>
4017 <property name="minimum_size">120,25</property>
4018 <property name="name">m_buttonCopy</property>
4019 <property name="permission">protected</property>
4020 <property name="pos"></property>
4021 <property name="size">-1,-1</property>
4022 <property name="style"></property>
4023 <property name="subclass"></property>
4024 <property name="tooltip"></property>
4025 <property name="window_extra_style"></property>
4026 <property name="window_name"></property>
4027 <property name="window_style"></property>
4028 <event name="OnButtonClick">OnButtonCopy</event>
4029 <event name="OnChar"></event>
4030 <event name="OnEnterWindow"></event>
4031 <event name="OnEraseBackground"></event>
4032 <event name="OnKeyDown"></event>
4033 <event name="OnKeyUp"></event>
4034 <event name="OnKillFocus"></event>
4035 <event name="OnLeaveWindow"></event>
4036 <event name="OnLeftDClick"></event>
4037 <event name="OnLeftDown"></event>
4038 <event name="OnLeftUp"></event>
4039 <event name="OnMiddleDClick"></event>
4040 <event name="OnMiddleDown"></event>
4041 <event name="OnMiddleUp"></event>
4042 <event name="OnMotion"></event>
4043 <event name="OnMouseEvents"></event>
4044 <event name="OnMouseWheel"></event>
4045 <event name="OnPaint"></event>
4046 <event name="OnRightDClick"></event>
4047 <event name="OnRightDown"></event>
4048 <event name="OnRightUp"></event>
4049 <event name="OnSetFocus"></event>
4050 <event name="OnSize"></event>
4051 <event name="OnUpdateUI"></event>
4052 </object>
4053 </object>
4054 <object class="sizeritem" expanded="1">
4055 <property name="border">5</property>
4056 <property name="flag">wxALL</property>
4057 <property name="proportion">0</property>
4058 <object class="wxButton" expanded="1">
4059 <property name="bg"></property>
4060 <property name="context_help"></property>
4061 <property name="default">0</property>
4062 <property name="enabled">1</property>
4063 <property name="fg"></property>
4064 <property name="font"></property>
4065 <property name="hidden">0</property>
4066 <property name="id">wxID_OK</property>
4067 <property name="label">OK</property>
4068 <property name="maximum_size"></property>
4069 <property name="minimum_size">85,25</property>
4070 <property name="name">m_buttonOK</property>
4071 <property name="permission">protected</property>
4072 <property name="pos"></property>
4073 <property name="size"></property>
4074 <property name="style"></property>
4075 <property name="subclass"></property>
4076 <property name="tooltip"></property>
4077 <property name="window_extra_style"></property>
4078 <property name="window_name"></property>
4079 <property name="window_style"></property>
4080 <event name="OnButtonClick">OnButtonOK</event>
4081 <event name="OnChar"></event>
4082 <event name="OnEnterWindow"></event>
4083 <event name="OnEraseBackground"></event>
4084 <event name="OnKeyDown"></event>
4085 <event name="OnKeyUp"></event>
4086 <event name="OnKillFocus"></event>
4087 <event name="OnLeaveWindow"></event>
4088 <event name="OnLeftDClick"></event>
4089 <event name="OnLeftDown"></event>
4090 <event name="OnLeftUp"></event>
4091 <event name="OnMiddleDClick"></event>
4092 <event name="OnMiddleDown"></event>
4093 <event name="OnMiddleUp"></event>
4094 <event name="OnMotion"></event>
4095 <event name="OnMouseEvents"></event>
4096 <event name="OnMouseWheel"></event>
4097 <event name="OnPaint"></event>
4098 <event name="OnRightDClick"></event>
4099 <event name="OnRightDown"></event>
4100 <event name="OnRightUp"></event>
4101 <event name="OnSetFocus"></event>
4102 <event name="OnSize"></event>
4103 <event name="OnUpdateUI"></event>
4104 </object>
4105 </object>
4106 <object class="sizeritem" expanded="1">
4107 <property name="border">5</property>
4108 <property name="flag">wxALL</property>
4109 <property name="proportion">0</property>
4110 <object class="wxButton" expanded="1">
4111 <property name="bg"></property>
4112 <property name="context_help"></property>
4113 <property name="default">0</property>
4114 <property name="enabled">1</property>
4115 <property name="fg"></property>
4116 <property name="font"></property>
4117 <property name="hidden">0</property>
4118 <property name="id">wxID_CANCEL</property>
4119 <property name="label">Cancel</property>
4120 <property name="maximum_size"></property>
4121 <property name="minimum_size">85,25</property>
4122 <property name="name">m_buttonCancel</property>
4123 <property name="permission">protected</property>
4124 <property name="pos"></property>
4125 <property name="size">-1,-1</property>
4126 <property name="style"></property>
4127 <property name="subclass"></property>
4128 <property name="tooltip"></property>
4129 <property name="window_extra_style"></property>
4130 <property name="window_name"></property>
4131 <property name="window_style"></property>
4132 <event name="OnButtonClick">OnButtonCancel</event>
4133 <event name="OnChar"></event>
4134 <event name="OnEnterWindow"></event>
4135 <event name="OnEraseBackground"></event>
4136 <event name="OnKeyDown"></event>
4137 <event name="OnKeyUp"></event>
4138 <event name="OnKillFocus"></event>
4139 <event name="OnLeaveWindow"></event>
4140 <event name="OnLeftDClick"></event>
4141 <event name="OnLeftDown"></event>
4142 <event name="OnLeftUp"></event>
4143 <event name="OnMiddleDClick"></event>
4144 <event name="OnMiddleDown"></event>
4145 <event name="OnMiddleUp"></event>
4146 <event name="OnMotion"></event>
4147 <event name="OnMouseEvents"></event>
4148 <event name="OnMouseWheel"></event>
4149 <event name="OnPaint"></event>
4150 <event name="OnRightDClick"></event>
4151 <event name="OnRightDown"></event>
4152 <event name="OnRightUp"></event>
4153 <event name="OnSetFocus"></event>
4154 <event name="OnSize"></event>
4155 <event name="OnUpdateUI"></event>
4156 </object>
4157 </object>
4158 </object>
4159 </object>
4160 </object>
4161 </object>
4162 <object class="Dialog" expanded="0">
4163 <property name="bg"></property>
4164 <property name="center"></property>
4165 <property name="context_help"></property>
4166 <property name="enabled">1</property>
4167 <property name="extra_style"></property>
4168 <property name="fg"></property>
4169 <property name="font"></property>
4170 <property name="hidden">0</property>
4171 <property name="id">wxID_ANY</property>
4172 <property name="maximum_size"></property>
4173 <property name="minimum_size"></property>
4174 <property name="name">CAddressBookDialogBase</property>
4175 <property name="pos"></property>
4176 <property name="size">610,390</property>
4177 <property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
4178 <property name="subclass"></property>
4179 <property name="title">Address Book</property>
4180 <property name="tooltip"></property>
4181 <property name="window_extra_style"></property>
4182 <property name="window_name"></property>
4183 <property name="window_style"></property>
4184 <event name="OnActivate"></event>
4185 <event name="OnActivateApp"></event>
4186 <event name="OnChar"></event>
4187 <event name="OnClose">OnClose</event>
4188 <event name="OnEnterWindow"></event>
4189 <event name="OnEraseBackground"></event>
4190 <event name="OnHibernate"></event>
4191 <event name="OnIconize"></event>
4192 <event name="OnIdle"></event>
4193 <event name="OnInitDialog"></event>
4194 <event name="OnKeyDown"></event>
4195 <event name="OnKeyUp"></event>
4196 <event name="OnKillFocus"></event>
4197 <event name="OnLeaveWindow"></event>
4198 <event name="OnLeftDClick"></event>
4199 <event name="OnLeftDown"></event>
4200 <event name="OnLeftUp"></event>
4201 <event name="OnMiddleDClick"></event>
4202 <event name="OnMiddleDown"></event>
4203 <event name="OnMiddleUp"></event>
4204 <event name="OnMotion"></event>
4205 <event name="OnMouseEvents"></event>
4206 <event name="OnMouseWheel"></event>
4207 <event name="OnPaint"></event>
4208 <event name="OnRightDClick"></event>
4209 <event name="OnRightDown"></event>
4210 <event name="OnRightUp"></event>
4211 <event name="OnSetFocus"></event>
4212 <event name="OnSize"></event>
4213 <event name="OnUpdateUI"></event>
4214 <object class="wxBoxSizer" expanded="1">
4215 <property name="minimum_size"></property>
4216 <property name="name">bSizer68</property>
4217 <property name="orient">wxVERTICAL</property>
4218 <property name="permission">none</property>
4219 <object class="sizeritem" expanded="1">
4220 <property name="border">5</property>
4221 <property name="flag">wxEXPAND</property>
4222 <property name="proportion">0</property>
4223 <object class="spacer" expanded="1">
4224 <property name="height">5</property>
4225 <property name="permission">protected</property>
4226 <property name="width">0</property>
4227 </object>
4228 </object>
4229 <object class="sizeritem" expanded="1">
4230 <property name="border">5</property>
4231 <property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
4232 <property name="proportion">0</property>
4233 <object class="wxStaticText" expanded="1">
4234 <property name="bg"></property>
4235 <property name="context_help"></property>
4236 <property name="enabled">1</property>
4237 <property name="fg"></property>
4238 <property name="font"></property>
4239 <property name="hidden">1</property>
4240 <property name="id">wxID_ANY</property>
4241 <property name="label">Bitcoin Address</property>
4242 <property name="maximum_size"></property>
4243 <property name="minimum_size"></property>
4244 <property name="name">m_staticText55</property>
4245 <property name="permission">protected</property>
4246 <property name="pos"></property>
4247 <property name="size"></property>
4248 <property name="style"></property>
4249 <property name="subclass"></property>
4250 <property name="tooltip"></property>
4251 <property name="window_extra_style"></property>
4252 <property name="window_name"></property>
4253 <property name="window_style"></property>
4254 <property name="wrap">-1</property>
4255 <event name="OnChar"></event>
4256 <event name="OnEnterWindow"></event>
4257 <event name="OnEraseBackground"></event>
4258 <event name="OnKeyDown"></event>
4259 <event name="OnKeyUp"></event>
4260 <event name="OnKillFocus"></event>
4261 <event name="OnLeaveWindow"></event>
4262 <event name="OnLeftDClick"></event>
4263 <event name="OnLeftDown"></event>
4264 <event name="OnLeftUp"></event>
4265 <event name="OnMiddleDClick"></event>
4266 <event name="OnMiddleDown"></event>
4267 <event name="OnMiddleUp"></event>
4268 <event name="OnMotion"></event>
4269 <event name="OnMouseEvents"></event>
4270 <event name="OnMouseWheel"></event>
4271 <event name="OnPaint"></event>
4272 <event name="OnRightDClick"></event>
4273 <event name="OnRightDown"></event>
4274 <event name="OnRightUp"></event>
4275 <event name="OnSetFocus"></event>
4276 <event name="OnSize"></event>
4277 <event name="OnUpdateUI"></event>
4278 </object>
4279 </object>
4280 <object class="sizeritem" expanded="1">
4281 <property name="border">5</property>
4282 <property name="flag">wxALL|wxEXPAND</property>
4283 <property name="proportion">1</property>
4284 <object class="wxListCtrl" expanded="1">
4285 <property name="bg"></property>
4286 <property name="context_help"></property>
4287 <property name="enabled">1</property>
4288 <property name="fg"></property>
4289 <property name="font"></property>
4290 <property name="hidden">0</property>
4291 <property name="id">wxID_LISTCTRL</property>
4292 <property name="maximum_size"></property>
4293 <property name="minimum_size"></property>
4294 <property name="name">m_listCtrl</property>
4295 <property name="permission">protected</property>
4296 <property name="pos"></property>
4297 <property name="size"></property>
4298 <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_ASCENDING</property>
4299 <property name="subclass"></property>
4300 <property name="tooltip"></property>
4301 <property name="window_extra_style"></property>
4302 <property name="window_name"></property>
4303 <property name="window_style"></property>
4304 <event name="OnChar"></event>
4305 <event name="OnEnterWindow"></event>
4306 <event name="OnEraseBackground"></event>
4307 <event name="OnKeyDown"></event>
4308 <event name="OnKeyUp"></event>
4309 <event name="OnKillFocus"></event>
4310 <event name="OnLeaveWindow"></event>
4311 <event name="OnLeftDClick"></event>
4312 <event name="OnLeftDown"></event>
4313 <event name="OnLeftUp"></event>
4314 <event name="OnListBeginDrag"></event>
4315 <event name="OnListBeginLabelEdit"></event>
4316 <event name="OnListBeginRDrag"></event>
4317 <event name="OnListCacheHint"></event>
4318 <event name="OnListColBeginDrag"></event>
4319 <event name="OnListColClick"></event>
4320 <event name="OnListColDragging"></event>
4321 <event name="OnListColEndDrag"></event>
4322 <event name="OnListColRightClick"></event>
4323 <event name="OnListDeleteAllItems"></event>
4324 <event name="OnListDeleteItem"></event>
4325 <event name="OnListEndLabelEdit">OnListEndLabelEdit</event>
4326 <event name="OnListInsertItem"></event>
4327 <event name="OnListItemActivated">OnListItemActivated</event>
4328 <event name="OnListItemDeselected"></event>
4329 <event name="OnListItemFocused"></event>
4330 <event name="OnListItemMiddleClick"></event>
4331 <event name="OnListItemRightClick"></event>
4332 <event name="OnListItemSelected">OnListItemSelected</event>
4333 <event name="OnListKeyDown"></event>
4334 <event name="OnMiddleDClick"></event>
4335 <event name="OnMiddleDown"></event>
4336 <event name="OnMiddleUp"></event>
4337 <event name="OnMotion"></event>
4338 <event name="OnMouseEvents"></event>
4339 <event name="OnMouseWheel"></event>
4340 <event name="OnPaint"></event>
4341 <event name="OnRightDClick"></event>
4342 <event name="OnRightDown"></event>
4343 <event name="OnRightUp"></event>
4344 <event name="OnSetFocus"></event>
4345 <event name="OnSize"></event>
4346 <event name="OnUpdateUI"></event>
4347 </object>
4348 </object>
4349 <object class="sizeritem" expanded="1">
4350 <property name="border">5</property>
4351 <property name="flag">wxEXPAND</property>
4352 <property name="proportion">0</property>
4353 <object class="wxBoxSizer" expanded="1">
4354 <property name="minimum_size"></property>
4355 <property name="name">bSizer69</property>
4356 <property name="orient">wxHORIZONTAL</property>
4357 <property name="permission">none</property>
4358 <object class="sizeritem" expanded="1">
4359 <property name="border">5</property>
4360 <property name="flag">wxEXPAND</property>
4361 <property name="proportion">1</property>
4362 <object class="spacer" expanded="1">
4363 <property name="height">0</property>
4364 <property name="permission">protected</property>
4365 <property name="width">0</property>
4366 </object>
4367 </object>
4368 <object class="sizeritem" expanded="1">
4369 <property name="border">5</property>
4370 <property name="flag">wxALL</property>
4371 <property name="proportion">0</property>
4372 <object class="wxButton" expanded="1">
4373 <property name="bg"></property>
4374 <property name="context_help"></property>
4375 <property name="default">0</property>
4376 <property name="enabled">1</property>
4377 <property name="fg"></property>
4378 <property name="font"></property>
4379 <property name="hidden">0</property>
4380 <property name="id">wxID_BUTTONEDIT</property>
4381 <property name="label">&amp;Edit...</property>
4382 <property name="maximum_size"></property>
4383 <property name="minimum_size">85,25</property>
4384 <property name="name">m_buttonEdit</property>
4385 <property name="permission">protected</property>
4386 <property name="pos"></property>
4387 <property name="size"></property>
4388 <property name="style"></property>
4389 <property name="subclass"></property>
4390 <property name="tooltip"></property>
4391 <property name="window_extra_style"></property>
4392 <property name="window_name"></property>
4393 <property name="window_style"></property>
4394 <event name="OnButtonClick">OnButtonEdit</event>
4395 <event name="OnChar"></event>
4396 <event name="OnEnterWindow"></event>
4397 <event name="OnEraseBackground"></event>
4398 <event name="OnKeyDown"></event>
4399 <event name="OnKeyUp"></event>
4400 <event name="OnKillFocus"></event>
4401 <event name="OnLeaveWindow"></event>
4402 <event name="OnLeftDClick"></event>
4403 <event name="OnLeftDown"></event>
4404 <event name="OnLeftUp"></event>
4405 <event name="OnMiddleDClick"></event>
4406 <event name="OnMiddleDown"></event>
4407 <event name="OnMiddleUp"></event>
4408 <event name="OnMotion"></event>
4409 <event name="OnMouseEvents"></event>
4410 <event name="OnMouseWheel"></event>
4411 <event name="OnPaint"></event>
4412 <event name="OnRightDClick"></event>
4413 <event name="OnRightDown"></event>
4414 <event name="OnRightUp"></event>
4415 <event name="OnSetFocus"></event>
4416 <event name="OnSize"></event>
4417 <event name="OnUpdateUI"></event>
4418 </object>
4419 </object>
4420 <object class="sizeritem" expanded="1">
4421 <property name="border">5</property>
4422 <property name="flag">wxALL</property>
4423 <property name="proportion">0</property>
4424 <object class="wxButton" expanded="1">
4425 <property name="bg"></property>
4426 <property name="context_help"></property>
4427 <property name="default">0</property>
4428 <property name="enabled">1</property>
4429 <property name="fg"></property>
4430 <property name="font"></property>
4431 <property name="hidden">0</property>
4432 <property name="id">wxID_BUTTONNEW</property>
4433 <property name="label">&amp;New Address...</property>
4434 <property name="maximum_size"></property>
4435 <property name="minimum_size">110,25</property>
4436 <property name="name">m_buttonNew</property>
4437 <property name="permission">protected</property>
4438 <property name="pos"></property>
4439 <property name="size"></property>
4440 <property name="style"></property>
4441 <property name="subclass"></property>
4442 <property name="tooltip"></property>
4443 <property name="window_extra_style"></property>
4444 <property name="window_name"></property>
4445 <property name="window_style"></property>
4446 <event name="OnButtonClick">OnButtonNew</event>
4447 <event name="OnChar"></event>
4448 <event name="OnEnterWindow"></event>
4449 <event name="OnEraseBackground"></event>
4450 <event name="OnKeyDown"></event>
4451 <event name="OnKeyUp"></event>
4452 <event name="OnKillFocus"></event>
4453 <event name="OnLeaveWindow"></event>
4454 <event name="OnLeftDClick"></event>
4455 <event name="OnLeftDown"></event>
4456 <event name="OnLeftUp"></event>
4457 <event name="OnMiddleDClick"></event>
4458 <event name="OnMiddleDown"></event>
4459 <event name="OnMiddleUp"></event>
4460 <event name="OnMotion"></event>
4461 <event name="OnMouseEvents"></event>
4462 <event name="OnMouseWheel"></event>
4463 <event name="OnPaint"></event>
4464 <event name="OnRightDClick"></event>
4465 <event name="OnRightDown"></event>
4466 <event name="OnRightUp"></event>
4467 <event name="OnSetFocus"></event>
4468 <event name="OnSize"></event>
4469 <event name="OnUpdateUI"></event>
4470 </object>
4471 </object>
4472 <object class="sizeritem" expanded="1">
4473 <property name="border">5</property>
4474 <property name="flag">wxALL</property>
4475 <property name="proportion">0</property>
4476 <object class="wxButton" expanded="1">
4477 <property name="bg"></property>
4478 <property name="context_help"></property>
4479 <property name="default">0</property>
4480 <property name="enabled">1</property>
4481 <property name="fg"></property>
4482 <property name="font"></property>
4483 <property name="hidden">0</property>
4484 <property name="id">wxID_BUTTONDELETE</property>
4485 <property name="label">&amp;Delete</property>
4486 <property name="maximum_size"></property>
4487 <property name="minimum_size">85,25</property>
4488 <property name="name">m_buttonDelete</property>
4489 <property name="permission">protected</property>
4490 <property name="pos"></property>
4491 <property name="size"></property>
4492 <property name="style"></property>
4493 <property name="subclass"></property>
4494 <property name="tooltip"></property>
4495 <property name="window_extra_style"></property>
4496 <property name="window_name"></property>
4497 <property name="window_style"></property>
4498 <event name="OnButtonClick">OnButtonDelete</event>
4499 <event name="OnChar"></event>
4500 <event name="OnEnterWindow"></event>
4501 <event name="OnEraseBackground"></event>
4502 <event name="OnKeyDown"></event>
4503 <event name="OnKeyUp"></event>
4504 <event name="OnKillFocus"></event>
4505 <event name="OnLeaveWindow"></event>
4506 <event name="OnLeftDClick"></event>
4507 <event name="OnLeftDown"></event>
4508 <event name="OnLeftUp"></event>
4509 <event name="OnMiddleDClick"></event>
4510 <event name="OnMiddleDown"></event>
4511 <event name="OnMiddleUp"></event>
4512 <event name="OnMotion"></event>
4513 <event name="OnMouseEvents"></event>
4514 <event name="OnMouseWheel"></event>
4515 <event name="OnPaint"></event>
4516 <event name="OnRightDClick"></event>
4517 <event name="OnRightDown"></event>
4518 <event name="OnRightUp"></event>
4519 <event name="OnSetFocus"></event>
4520 <event name="OnSize"></event>
4521 <event name="OnUpdateUI"></event>
4522 </object>
4523 </object>
4524 <object class="sizeritem" expanded="1">
4525 <property name="border">5</property>
4526 <property name="flag">wxALL</property>
4527 <property name="proportion">0</property>
4528 <object class="wxButton" expanded="1">
4529 <property name="bg"></property>
4530 <property name="context_help"></property>
4531 <property name="default">0</property>
4532 <property name="enabled">1</property>
4533 <property name="fg"></property>
4534 <property name="font"></property>
4535 <property name="hidden">0</property>
4536 <property name="id">wxID_OK</property>
4537 <property name="label">OK</property>
4538 <property name="maximum_size"></property>
4539 <property name="minimum_size">85,25</property>
4540 <property name="name">m_buttonOK</property>
4541 <property name="permission">protected</property>
4542 <property name="pos"></property>
4543 <property name="size">-1,-1</property>
4544 <property name="style"></property>
4545 <property name="subclass"></property>
4546 <property name="tooltip"></property>
4547 <property name="window_extra_style"></property>
4548 <property name="window_name"></property>
4549 <property name="window_style"></property>
4550 <event name="OnButtonClick">OnButtonOK</event>
4551 <event name="OnChar"></event>
4552 <event name="OnEnterWindow"></event>
4553 <event name="OnEraseBackground"></event>
4554 <event name="OnKeyDown"></event>
4555 <event name="OnKeyUp"></event>
4556 <event name="OnKillFocus"></event>
4557 <event name="OnLeaveWindow"></event>
4558 <event name="OnLeftDClick"></event>
4559 <event name="OnLeftDown"></event>
4560 <event name="OnLeftUp"></event>
4561 <event name="OnMiddleDClick"></event>
4562 <event name="OnMiddleDown"></event>
4563 <event name="OnMiddleUp"></event>
4564 <event name="OnMotion"></event>
4565 <event name="OnMouseEvents"></event>
4566 <event name="OnMouseWheel"></event>
4567 <event name="OnPaint"></event>
4568 <event name="OnRightDClick"></event>
4569 <event name="OnRightDown"></event>
4570 <event name="OnRightUp"></event>
4571 <event name="OnSetFocus"></event>
4572 <event name="OnSize"></event>
4573 <event name="OnUpdateUI"></event>
4574 </object>
4575 </object>
4576 <object class="sizeritem" expanded="1">
4577 <property name="border">5</property>
4578 <property name="flag">wxALL</property>
4579 <property name="proportion">0</property>
4580 <object class="wxButton" expanded="1">
4581 <property name="bg"></property>
4582 <property name="context_help"></property>
4583 <property name="default">0</property>
4584 <property name="enabled">1</property>
4585 <property name="fg"></property>
4586 <property name="font"></property>
4587 <property name="hidden">0</property>
4588 <property name="id">wxID_CANCEL</property>
4589 <property name="label">Cancel</property>
4590 <property name="maximum_size"></property>
4591 <property name="minimum_size">85,25</property>
4592 <property name="name">m_buttonCancel</property>
4593 <property name="permission">public</property>
4594 <property name="pos"></property>
4595 <property name="size">-1,-1</property>
4596 <property name="style"></property>
4597 <property name="subclass"></property>
4598 <property name="tooltip"></property>
4599 <property name="window_extra_style"></property>
4600 <property name="window_name"></property>
4601 <property name="window_style"></property>
4602 <event name="OnButtonClick">OnButtonCancel</event>
4603 <event name="OnChar"></event>
4604 <event name="OnEnterWindow"></event>
4605 <event name="OnEraseBackground"></event>
4606 <event name="OnKeyDown"></event>
4607 <event name="OnKeyUp"></event>
4608 <event name="OnKillFocus"></event>
4609 <event name="OnLeaveWindow"></event>
4610 <event name="OnLeftDClick"></event>
4611 <event name="OnLeftDown"></event>
4612 <event name="OnLeftUp"></event>
4613 <event name="OnMiddleDClick"></event>
4614 <event name="OnMiddleDown"></event>
4615 <event name="OnMiddleUp"></event>
4616 <event name="OnMotion"></event>
4617 <event name="OnMouseEvents"></event>
4618 <event name="OnMouseWheel"></event>
4619 <event name="OnPaint"></event>
4620 <event name="OnRightDClick"></event>
4621 <event name="OnRightDown"></event>
4622 <event name="OnRightUp"></event>
4623 <event name="OnSetFocus"></event>
4624 <event name="OnSize"></event>
4625 <event name="OnUpdateUI"></event>
4626 </object>
4627 </object>
4628 </object>
4629 </object>
4630 </object>
4631 </object>
4632 <object class="Dialog" expanded="0">
4633 <property name="bg"></property>
4634 <property name="center"></property>
4635 <property name="context_help"></property>
4636 <property name="enabled">1</property>
4637 <property name="extra_style"></property>
4638 <property name="fg"></property>
4639 <property name="font"></property>
4640 <property name="hidden">0</property>
4641 <property name="id">wxID_ANY</property>
4642 <property name="maximum_size"></property>
4643 <property name="minimum_size"></property>
4644 <property name="name">CProductsDialogBase</property>
4645 <property name="pos"></property>
4646 <property name="size">708,535</property>
4647 <property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
4648 <property name="subclass"></property>
4649 <property name="title">Marketplace</property>
4650 <property name="tooltip"></property>
4651 <property name="window_extra_style"></property>
4652 <property name="window_name"></property>
4653 <property name="window_style"></property>
4654 <event name="OnActivate"></event>
4655 <event name="OnActivateApp"></event>
4656 <event name="OnChar"></event>
4657 <event name="OnClose"></event>
4658 <event name="OnEnterWindow"></event>
4659 <event name="OnEraseBackground"></event>
4660 <event name="OnHibernate"></event>
4661 <event name="OnIconize"></event>
4662 <event name="OnIdle"></event>
4663 <event name="OnInitDialog"></event>
4664 <event name="OnKeyDown"></event>
4665 <event name="OnKeyUp"></event>
4666 <event name="OnKillFocus"></event>
4667 <event name="OnLeaveWindow"></event>
4668 <event name="OnLeftDClick"></event>
4669 <event name="OnLeftDown"></event>
4670 <event name="OnLeftUp"></event>
4671 <event name="OnMiddleDClick"></event>
4672 <event name="OnMiddleDown"></event>
4673 <event name="OnMiddleUp"></event>
4674 <event name="OnMotion"></event>
4675 <event name="OnMouseEvents"></event>
4676 <event name="OnMouseWheel"></event>
4677 <event name="OnPaint"></event>
4678 <event name="OnRightDClick"></event>
4679 <event name="OnRightDown"></event>
4680 <event name="OnRightUp"></event>
4681 <event name="OnSetFocus"></event>
4682 <event name="OnSize"></event>
4683 <event name="OnUpdateUI"></event>
4684 <object class="wxBoxSizer" expanded="1">
4685 <property name="minimum_size"></property>
4686 <property name="name">bSizer22</property>
4687 <property name="orient">wxVERTICAL</property>
4688 <property name="permission">none</property>
4689 <object class="sizeritem" expanded="1">
4690 <property name="border">5</property>
4691 <property name="flag">wxEXPAND|wxTOP|wxBOTTOM|wxRIGHT</property>
4692 <property name="proportion">0</property>
4693 <object class="wxBoxSizer" expanded="1">
4694 <property name="minimum_size"></property>
4695 <property name="name">bSizer23</property>
4696 <property name="orient">wxHORIZONTAL</property>
4697 <property name="permission">none</property>
4698 <object class="sizeritem" expanded="1">
4699 <property name="border">5</property>
4700 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
4701 <property name="proportion">0</property>
4702 <object class="wxComboBox" expanded="1">
4703 <property name="bg"></property>
4704 <property name="choices">&quot;(Any Category)&quot;</property>
4705 <property name="context_help"></property>
4706 <property name="enabled">1</property>
4707 <property name="fg"></property>
4708 <property name="font"></property>
4709 <property name="hidden">0</property>
4710 <property name="id">wxID_ANY</property>
4711 <property name="maximum_size"></property>
4712 <property name="minimum_size"></property>
4713 <property name="name">m_comboBoxCategory</property>
4714 <property name="permission">protected</property>
4715 <property name="pos"></property>
4716 <property name="size">150,-1</property>
4717 <property name="style"></property>
4718 <property name="subclass"></property>
4719 <property name="tooltip"></property>
4720 <property name="value">(Any Category)</property>
4721 <property name="window_extra_style"></property>
4722 <property name="window_name"></property>
4723 <property name="window_style"></property>
4724 <event name="OnChar"></event>
4725 <event name="OnCombobox">OnCombobox</event>
4726 <event name="OnEnterWindow"></event>
4727 <event name="OnEraseBackground"></event>
4728 <event name="OnKeyDown"></event>
4729 <event name="OnKeyUp"></event>
4730 <event name="OnKillFocus"></event>
4731 <event name="OnLeaveWindow"></event>
4732 <event name="OnLeftDClick"></event>
4733 <event name="OnLeftDown"></event>
4734 <event name="OnLeftUp"></event>
4735 <event name="OnMiddleDClick"></event>
4736 <event name="OnMiddleDown"></event>
4737 <event name="OnMiddleUp"></event>
4738 <event name="OnMotion"></event>
4739 <event name="OnMouseEvents"></event>
4740 <event name="OnMouseWheel"></event>
4741 <event name="OnPaint"></event>
4742 <event name="OnRightDClick"></event>
4743 <event name="OnRightDown"></event>
4744 <event name="OnRightUp"></event>
4745 <event name="OnSetFocus"></event>
4746 <event name="OnSize"></event>
4747 <event name="OnText"></event>
4748 <event name="OnTextEnter"></event>
4749 <event name="OnUpdateUI"></event>
4750 </object>
4751 </object>
4752 <object class="sizeritem" expanded="1">
4753 <property name="border">5</property>
4754 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
4755 <property name="proportion">1</property>
4756 <object class="wxTextCtrl" expanded="1">
4757 <property name="bg"></property>
4758 <property name="context_help"></property>
4759 <property name="enabled">1</property>
4760 <property name="fg"></property>
4761 <property name="font"></property>
4762 <property name="hidden">0</property>
4763 <property name="id">wxID_ANY</property>
4764 <property name="maximum_size"></property>
4765 <property name="maxlength">0</property>
4766 <property name="minimum_size"></property>
4767 <property name="name">m_textCtrlSearch</property>
4768 <property name="permission">protected</property>
4769 <property name="pos"></property>
4770 <property name="size"></property>
4771 <property name="style"></property>
4772 <property name="subclass"></property>
4773 <property name="tooltip"></property>
4774 <property name="value"></property>
4775 <property name="window_extra_style"></property>
4776 <property name="window_name"></property>
4777 <property name="window_style"></property>
4778 <event name="OnChar"></event>
4779 <event name="OnEnterWindow"></event>
4780 <event name="OnEraseBackground"></event>
4781 <event name="OnKeyDown">OnKeyDown</event>
4782 <event name="OnKeyUp"></event>
4783 <event name="OnKillFocus"></event>
4784 <event name="OnLeaveWindow"></event>
4785 <event name="OnLeftDClick"></event>
4786 <event name="OnLeftDown"></event>
4787 <event name="OnLeftUp"></event>
4788 <event name="OnMiddleDClick"></event>
4789 <event name="OnMiddleDown"></event>
4790 <event name="OnMiddleUp"></event>
4791 <event name="OnMotion"></event>
4792 <event name="OnMouseEvents"></event>
4793 <event name="OnMouseWheel"></event>
4794 <event name="OnPaint"></event>
4795 <event name="OnRightDClick"></event>
4796 <event name="OnRightDown"></event>
4797 <event name="OnRightUp"></event>
4798 <event name="OnSetFocus"></event>
4799 <event name="OnSize"></event>
4800 <event name="OnText"></event>
4801 <event name="OnTextEnter"></event>
4802 <event name="OnTextMaxLen"></event>
4803 <event name="OnTextURL"></event>
4804 <event name="OnUpdateUI"></event>
4805 </object>
4806 </object>
4807 <object class="sizeritem" expanded="1">
4808 <property name="border">5</property>
4809 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
4810 <property name="proportion">0</property>
4811 <object class="wxButton" expanded="1">
4812 <property name="bg"></property>
4813 <property name="context_help"></property>
4814 <property name="default">0</property>
4815 <property name="enabled">1</property>
4816 <property name="fg"></property>
4817 <property name="font"></property>
4818 <property name="hidden">0</property>
4819 <property name="id">wxID_ANY</property>
4820 <property name="label">&amp;Search</property>
4821 <property name="maximum_size"></property>
4822 <property name="minimum_size"></property>
4823 <property name="name">m_buttonSearch</property>
4824 <property name="permission">protected</property>
4825 <property name="pos"></property>
4826 <property name="size"></property>
4827 <property name="style"></property>
4828 <property name="subclass"></property>
4829 <property name="tooltip"></property>
4830 <property name="window_extra_style"></property>
4831 <property name="window_name"></property>
4832 <property name="window_style"></property>
4833 <event name="OnButtonClick">OnButtonSearch</event>
4834 <event name="OnChar"></event>
4835 <event name="OnEnterWindow"></event>
4836 <event name="OnEraseBackground"></event>
4837 <event name="OnKeyDown"></event>
4838 <event name="OnKeyUp"></event>
4839 <event name="OnKillFocus"></event>
4840 <event name="OnLeaveWindow"></event>
4841 <event name="OnLeftDClick"></event>
4842 <event name="OnLeftDown"></event>
4843 <event name="OnLeftUp"></event>
4844 <event name="OnMiddleDClick"></event>
4845 <event name="OnMiddleDown"></event>
4846 <event name="OnMiddleUp"></event>
4847 <event name="OnMotion"></event>
4848 <event name="OnMouseEvents"></event>
4849 <event name="OnMouseWheel"></event>
4850 <event name="OnPaint"></event>
4851 <event name="OnRightDClick"></event>
4852 <event name="OnRightDown"></event>
4853 <event name="OnRightUp"></event>
4854 <event name="OnSetFocus"></event>
4855 <event name="OnSize"></event>
4856 <event name="OnUpdateUI"></event>
4857 </object>
4858 </object>
4859 </object>
4860 </object>
4861 <object class="sizeritem" expanded="1">
4862 <property name="border">5</property>
4863 <property name="flag">wxALL|wxEXPAND</property>
4864 <property name="proportion">1</property>
4865 <object class="wxListCtrl" expanded="1">
4866 <property name="bg"></property>
4867 <property name="context_help"></property>
4868 <property name="enabled">1</property>
4869 <property name="fg"></property>
4870 <property name="font"></property>
4871 <property name="hidden">0</property>
4872 <property name="id">wxID_ANY</property>
4873 <property name="maximum_size"></property>
4874 <property name="minimum_size"></property>
4875 <property name="name">m_listCtrl</property>
4876 <property name="permission">protected</property>
4877 <property name="pos"></property>
4878 <property name="size"></property>
4879 <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT</property>
4880 <property name="subclass"></property>
4881 <property name="tooltip"></property>
4882 <property name="window_extra_style"></property>
4883 <property name="window_name"></property>
4884 <property name="window_style"></property>
4885 <event name="OnChar"></event>
4886 <event name="OnEnterWindow"></event>
4887 <event name="OnEraseBackground"></event>
4888 <event name="OnKeyDown"></event>
4889 <event name="OnKeyUp"></event>
4890 <event name="OnKillFocus"></event>
4891 <event name="OnLeaveWindow"></event>
4892 <event name="OnLeftDClick"></event>
4893 <event name="OnLeftDown"></event>
4894 <event name="OnLeftUp"></event>
4895 <event name="OnListBeginDrag"></event>
4896 <event name="OnListBeginLabelEdit"></event>
4897 <event name="OnListBeginRDrag"></event>
4898 <event name="OnListCacheHint"></event>
4899 <event name="OnListColBeginDrag"></event>
4900 <event name="OnListColClick"></event>
4901 <event name="OnListColDragging"></event>
4902 <event name="OnListColEndDrag"></event>
4903 <event name="OnListColRightClick"></event>
4904 <event name="OnListDeleteAllItems"></event>
4905 <event name="OnListDeleteItem"></event>
4906 <event name="OnListEndLabelEdit"></event>
4907 <event name="OnListInsertItem"></event>
4908 <event name="OnListItemActivated">OnListItemActivated</event>
4909 <event name="OnListItemDeselected"></event>
4910 <event name="OnListItemFocused"></event>
4911 <event name="OnListItemMiddleClick"></event>
4912 <event name="OnListItemRightClick"></event>
4913 <event name="OnListItemSelected"></event>
4914 <event name="OnListKeyDown"></event>
4915 <event name="OnMiddleDClick"></event>
4916 <event name="OnMiddleDown"></event>
4917 <event name="OnMiddleUp"></event>
4918 <event name="OnMotion"></event>
4919 <event name="OnMouseEvents"></event>
4920 <event name="OnMouseWheel"></event>
4921 <event name="OnPaint"></event>
4922 <event name="OnRightDClick"></event>
4923 <event name="OnRightDown"></event>
4924 <event name="OnRightUp"></event>
4925 <event name="OnSetFocus"></event>
4926 <event name="OnSize"></event>
4927 <event name="OnUpdateUI"></event>
4928 </object>
4929 </object>
4930 </object>
4931 </object>
4932 <object class="Frame" expanded="0">
4933 <property name="bg">wxSYS_COLOUR_MENU</property>
4934 <property name="center"></property>
4935 <property name="context_help"></property>
4936 <property name="enabled">1</property>
4937 <property name="extra_style"></property>
4938 <property name="fg"></property>
4939 <property name="font"></property>
4940 <property name="hidden">0</property>
4941 <property name="id">wxID_ANY</property>
4942 <property name="maximum_size"></property>
4943 <property name="minimum_size"></property>
4944 <property name="name">CEditProductDialogBase</property>
4945 <property name="pos"></property>
4946 <property name="size">660,640</property>
4947 <property name="style">wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER</property>
4948 <property name="subclass"></property>
4949 <property name="title">Edit Product</property>
4950 <property name="tooltip"></property>
4951 <property name="window_extra_style"></property>
4952 <property name="window_name"></property>
4953 <property name="window_style">wxTAB_TRAVERSAL</property>
4954 <property name="xrc_skip_sizer">1</property>
4955 <event name="OnActivate"></event>
4956 <event name="OnActivateApp"></event>
4957 <event name="OnChar"></event>
4958 <event name="OnClose"></event>
4959 <event name="OnEnterWindow"></event>
4960 <event name="OnEraseBackground"></event>
4961 <event name="OnHibernate"></event>
4962 <event name="OnIconize"></event>
4963 <event name="OnIdle"></event>
4964 <event name="OnKeyDown"></event>
4965 <event name="OnKeyUp"></event>
4966 <event name="OnKillFocus"></event>
4967 <event name="OnLeaveWindow"></event>
4968 <event name="OnLeftDClick"></event>
4969 <event name="OnLeftDown"></event>
4970 <event name="OnLeftUp"></event>
4971 <event name="OnMiddleDClick"></event>
4972 <event name="OnMiddleDown"></event>
4973 <event name="OnMiddleUp"></event>
4974 <event name="OnMotion"></event>
4975 <event name="OnMouseEvents"></event>
4976 <event name="OnMouseWheel"></event>
4977 <event name="OnPaint"></event>
4978 <event name="OnRightDClick"></event>
4979 <event name="OnRightDown"></event>
4980 <event name="OnRightUp"></event>
4981 <event name="OnSetFocus"></event>
4982 <event name="OnSize"></event>
4983 <event name="OnUpdateUI"></event>
4984 <object class="wxBoxSizer" expanded="1">
4985 <property name="minimum_size"></property>
4986 <property name="name">bSizer20</property>
4987 <property name="orient">wxVERTICAL</property>
4988 <property name="permission">none</property>
4989 <object class="sizeritem" expanded="1">
4990 <property name="border">5</property>
4991 <property name="flag">wxEXPAND|wxALL</property>
4992 <property name="proportion">1</property>
4993 <object class="wxScrolledWindow" expanded="1">
4994 <property name="bg">wxSYS_COLOUR_WINDOW</property>
4995 <property name="context_help"></property>
4996 <property name="enabled">1</property>
4997 <property name="fg"></property>
4998 <property name="font"></property>
4999 <property name="hidden">0</property>
5000 <property name="id">wxID_ANY</property>
5001 <property name="maximum_size"></property>
5002 <property name="minimum_size"></property>
5003 <property name="name">m_scrolledWindow</property>
5004 <property name="permission">protected</property>
5005 <property name="pos"></property>
5006 <property name="scroll_rate_x">5</property>
5007 <property name="scroll_rate_y">5</property>
5008 <property name="size"></property>
5009 <property name="subclass"></property>
5010 <property name="tooltip"></property>
5011 <property name="window_extra_style"></property>
5012 <property name="window_name"></property>
5013 <property name="window_style">wxHSCROLL|wxTAB_TRAVERSAL|wxVSCROLL</property>
5014 <event name="OnChar"></event>
5015 <event name="OnEnterWindow"></event>
5016 <event name="OnEraseBackground"></event>
5017 <event name="OnKeyDown"></event>
5018 <event name="OnKeyUp"></event>
5019 <event name="OnKillFocus"></event>
5020 <event name="OnLeaveWindow"></event>
5021 <event name="OnLeftDClick"></event>
5022 <event name="OnLeftDown"></event>
5023 <event name="OnLeftUp"></event>
5024 <event name="OnMiddleDClick"></event>
5025 <event name="OnMiddleDown"></event>
5026 <event name="OnMiddleUp"></event>
5027 <event name="OnMotion"></event>
5028 <event name="OnMouseEvents"></event>
5029 <event name="OnMouseWheel"></event>
5030 <event name="OnPaint"></event>
5031 <event name="OnRightDClick"></event>
5032 <event name="OnRightDown"></event>
5033 <event name="OnRightUp"></event>
5034 <event name="OnSetFocus"></event>
5035 <event name="OnSize"></event>
5036 <event name="OnUpdateUI"></event>
5037 <object class="wxBoxSizer" expanded="1">
5038 <property name="minimum_size"></property>
5039 <property name="name">bSizer21</property>
5040 <property name="orient">wxVERTICAL</property>
5041 <property name="permission">none</property>
5042 <object class="sizeritem" expanded="1">
5043 <property name="border">5</property>
5044 <property name="flag">wxEXPAND|wxTOP|wxRIGHT|wxLEFT</property>
5045 <property name="proportion">0</property>
5046 <object class="wxFlexGridSizer" expanded="1">
5047 <property name="cols">2</property>
5048 <property name="flexible_direction">wxBOTH</property>
5049 <property name="growablecols">1</property>
5050 <property name="growablerows"></property>
5051 <property name="hgap">0</property>
5052 <property name="minimum_size"></property>
5053 <property name="name">fgSizer8</property>
5054 <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
5055 <property name="permission">none</property>
5056 <property name="rows">0</property>
5057 <property name="vgap">0</property>
5058 <object class="sizeritem" expanded="1">
5059 <property name="border">5</property>
5060 <property name="flag">wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT</property>
5061 <property name="proportion">0</property>
5062 <object class="wxStaticText" expanded="1">
5063 <property name="bg"></property>
5064 <property name="context_help"></property>
5065 <property name="enabled">1</property>
5066 <property name="fg"></property>
5067 <property name="font"></property>
5068 <property name="hidden">0</property>
5069 <property name="id">wxID_ANY</property>
5070 <property name="label">Category</property>
5071 <property name="maximum_size"></property>
5072 <property name="minimum_size"></property>
5073 <property name="name">m_staticText106</property>
5074 <property name="permission">protected</property>
5075 <property name="pos"></property>
5076 <property name="size"></property>
5077 <property name="style">wxALIGN_RIGHT</property>
5078 <property name="subclass"></property>
5079 <property name="tooltip"></property>
5080 <property name="window_extra_style"></property>
5081 <property name="window_name"></property>
5082 <property name="window_style"></property>
5083 <property name="wrap">-1</property>
5084 <event name="OnChar"></event>
5085 <event name="OnEnterWindow"></event>
5086 <event name="OnEraseBackground"></event>
5087 <event name="OnKeyDown"></event>
5088 <event name="OnKeyUp"></event>
5089 <event name="OnKillFocus"></event>
5090 <event name="OnLeaveWindow"></event>
5091 <event name="OnLeftDClick"></event>
5092 <event name="OnLeftDown"></event>
5093 <event name="OnLeftUp"></event>
5094 <event name="OnMiddleDClick"></event>
5095 <event name="OnMiddleDown"></event>
5096 <event name="OnMiddleUp"></event>
5097 <event name="OnMotion"></event>
5098 <event name="OnMouseEvents"></event>
5099 <event name="OnMouseWheel"></event>
5100 <event name="OnPaint"></event>
5101 <event name="OnRightDClick"></event>
5102 <event name="OnRightDown"></event>
5103 <event name="OnRightUp"></event>
5104 <event name="OnSetFocus"></event>
5105 <event name="OnSize"></event>
5106 <event name="OnUpdateUI"></event>
5107 </object>
5108 </object>
5109 <object class="sizeritem" expanded="1">
5110 <property name="border">5</property>
5111 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
5112 <property name="proportion">0</property>
5113 <object class="wxComboBox" expanded="1">
5114 <property name="bg"></property>
5115 <property name="choices"></property>
5116 <property name="context_help"></property>
5117 <property name="enabled">1</property>
5118 <property name="fg"></property>
5119 <property name="font"></property>
5120 <property name="hidden">0</property>
5121 <property name="id">wxID_ANY</property>
5122 <property name="maximum_size"></property>
5123 <property name="minimum_size">180,-1</property>
5124 <property name="name">m_comboBoxCategory</property>
5125 <property name="permission">protected</property>
5126 <property name="pos"></property>
5127 <property name="size"></property>
5128 <property name="style"></property>
5129 <property name="subclass"></property>
5130 <property name="tooltip"></property>
5131 <property name="value"></property>
5132 <property name="window_extra_style"></property>
5133 <property name="window_name"></property>
5134 <property name="window_style"></property>
5135 <event name="OnChar"></event>
5136 <event name="OnCombobox"></event>
5137 <event name="OnEnterWindow"></event>
5138 <event name="OnEraseBackground"></event>
5139 <event name="OnKeyDown"></event>
5140 <event name="OnKeyUp"></event>
5141 <event name="OnKillFocus"></event>
5142 <event name="OnLeaveWindow"></event>
5143 <event name="OnLeftDClick"></event>
5144 <event name="OnLeftDown"></event>
5145 <event name="OnLeftUp"></event>
5146 <event name="OnMiddleDClick"></event>
5147 <event name="OnMiddleDown"></event>
5148 <event name="OnMiddleUp"></event>
5149 <event name="OnMotion"></event>
5150 <event name="OnMouseEvents"></event>
5151 <event name="OnMouseWheel"></event>
5152 <event name="OnPaint"></event>
5153 <event name="OnRightDClick"></event>
5154 <event name="OnRightDown"></event>
5155 <event name="OnRightUp"></event>
5156 <event name="OnSetFocus"></event>
5157 <event name="OnSize"></event>
5158 <event name="OnText"></event>
5159 <event name="OnTextEnter"></event>
5160 <event name="OnUpdateUI"></event>
5161 </object>
5162 </object>
5163 <object class="sizeritem" expanded="1">
5164 <property name="border">5</property>
5165 <property name="flag">wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT</property>
5166 <property name="proportion">0</property>
5167 <object class="wxStaticText" expanded="1">
5168 <property name="bg"></property>
5169 <property name="context_help"></property>
5170 <property name="enabled">1</property>
5171 <property name="fg"></property>
5172 <property name="font"></property>
5173 <property name="hidden">0</property>
5174 <property name="id">wxID_ANY</property>
5175 <property name="label">Title</property>
5176 <property name="maximum_size"></property>
5177 <property name="minimum_size"></property>
5178 <property name="name">m_staticText108</property>
5179 <property name="permission">protected</property>
5180 <property name="pos"></property>
5181 <property name="size"></property>
5182 <property name="style">wxALIGN_RIGHT</property>
5183 <property name="subclass"></property>
5184 <property name="tooltip"></property>
5185 <property name="window_extra_style"></property>
5186 <property name="window_name"></property>
5187 <property name="window_style"></property>
5188 <property name="wrap">-1</property>
5189 <event name="OnChar"></event>
5190 <event name="OnEnterWindow"></event>
5191 <event name="OnEraseBackground"></event>
5192 <event name="OnKeyDown"></event>
5193 <event name="OnKeyUp"></event>
5194 <event name="OnKillFocus"></event>
5195 <event name="OnLeaveWindow"></event>
5196 <event name="OnLeftDClick"></event>
5197 <event name="OnLeftDown"></event>
5198 <event name="OnLeftUp"></event>
5199 <event name="OnMiddleDClick"></event>
5200 <event name="OnMiddleDown"></event>
5201 <event name="OnMiddleUp"></event>
5202 <event name="OnMotion"></event>
5203 <event name="OnMouseEvents"></event>
5204 <event name="OnMouseWheel"></event>
5205 <event name="OnPaint"></event>
5206 <event name="OnRightDClick"></event>
5207 <event name="OnRightDown"></event>
5208 <event name="OnRightUp"></event>
5209 <event name="OnSetFocus"></event>
5210 <event name="OnSize"></event>
5211 <event name="OnUpdateUI"></event>
5212 </object>
5213 </object>
5214 <object class="sizeritem" expanded="1">
5215 <property name="border">5</property>
5216 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND</property>
5217 <property name="proportion">1</property>
5218 <object class="wxTextCtrl" expanded="1">
5219 <property name="bg"></property>
5220 <property name="context_help"></property>
5221 <property name="enabled">1</property>
5222 <property name="fg"></property>
5223 <property name="font"></property>
5224 <property name="hidden">0</property>
5225 <property name="id">wxID_ANY</property>
5226 <property name="maximum_size"></property>
5227 <property name="maxlength">0</property>
5228 <property name="minimum_size"></property>
5229 <property name="name">m_textCtrlTitle</property>
5230 <property name="permission">protected</property>
5231 <property name="pos"></property>
5232 <property name="size"></property>
5233 <property name="style"></property>
5234 <property name="subclass"></property>
5235 <property name="tooltip"></property>
5236 <property name="value"></property>
5237 <property name="window_extra_style"></property>
5238 <property name="window_name"></property>
5239 <property name="window_style"></property>
5240 <event name="OnChar"></event>
5241 <event name="OnEnterWindow"></event>
5242 <event name="OnEraseBackground"></event>
5243 <event name="OnKeyDown">OnKeyDown</event>
5244 <event name="OnKeyUp"></event>
5245 <event name="OnKillFocus"></event>
5246 <event name="OnLeaveWindow"></event>
5247 <event name="OnLeftDClick"></event>
5248 <event name="OnLeftDown"></event>
5249 <event name="OnLeftUp"></event>
5250 <event name="OnMiddleDClick"></event>
5251 <event name="OnMiddleDown"></event>
5252 <event name="OnMiddleUp"></event>
5253 <event name="OnMotion"></event>
5254 <event name="OnMouseEvents"></event>
5255 <event name="OnMouseWheel"></event>
5256 <event name="OnPaint"></event>
5257 <event name="OnRightDClick"></event>
5258 <event name="OnRightDown"></event>
5259 <event name="OnRightUp"></event>
5260 <event name="OnSetFocus"></event>
5261 <event name="OnSize"></event>
5262 <event name="OnText"></event>
5263 <event name="OnTextEnter"></event>
5264 <event name="OnTextMaxLen"></event>
5265 <event name="OnTextURL"></event>
5266 <event name="OnUpdateUI"></event>
5267 </object>
5268 </object>
5269 <object class="sizeritem" expanded="1">
5270 <property name="border">5</property>
5271 <property name="flag">wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT</property>
5272 <property name="proportion">0</property>
5273 <object class="wxStaticText" expanded="1">
5274 <property name="bg"></property>
5275 <property name="context_help"></property>
5276 <property name="enabled">1</property>
5277 <property name="fg"></property>
5278 <property name="font"></property>
5279 <property name="hidden">0</property>
5280 <property name="id">wxID_ANY</property>
5281 <property name="label">Price</property>
5282 <property name="maximum_size"></property>
5283 <property name="minimum_size"></property>
5284 <property name="name">m_staticText107</property>
5285 <property name="permission">protected</property>
5286 <property name="pos"></property>
5287 <property name="size"></property>
5288 <property name="style">wxALIGN_RIGHT</property>
5289 <property name="subclass"></property>
5290 <property name="tooltip"></property>
5291 <property name="window_extra_style"></property>
5292 <property name="window_name"></property>
5293 <property name="window_style"></property>
5294 <property name="wrap">-1</property>
5295 <event name="OnChar"></event>
5296 <event name="OnEnterWindow"></event>
5297 <event name="OnEraseBackground"></event>
5298 <event name="OnKeyDown"></event>
5299 <event name="OnKeyUp"></event>
5300 <event name="OnKillFocus"></event>
5301 <event name="OnLeaveWindow"></event>
5302 <event name="OnLeftDClick"></event>
5303 <event name="OnLeftDown"></event>
5304 <event name="OnLeftUp"></event>
5305 <event name="OnMiddleDClick"></event>
5306 <event name="OnMiddleDown"></event>
5307 <event name="OnMiddleUp"></event>
5308 <event name="OnMotion"></event>
5309 <event name="OnMouseEvents"></event>
5310 <event name="OnMouseWheel"></event>
5311 <event name="OnPaint"></event>
5312 <event name="OnRightDClick"></event>
5313 <event name="OnRightDown"></event>
5314 <event name="OnRightUp"></event>
5315 <event name="OnSetFocus"></event>
5316 <event name="OnSize"></event>
5317 <event name="OnUpdateUI"></event>
5318 </object>
5319 </object>
5320 <object class="sizeritem" expanded="1">
5321 <property name="border">5</property>
5322 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
5323 <property name="proportion">0</property>
5324 <object class="wxTextCtrl" expanded="1">
5325 <property name="bg"></property>
5326 <property name="context_help"></property>
5327 <property name="enabled">1</property>
5328 <property name="fg"></property>
5329 <property name="font"></property>
5330 <property name="hidden">0</property>
5331 <property name="id">wxID_ANY</property>
5332 <property name="maximum_size"></property>
5333 <property name="maxlength">0</property>
5334 <property name="minimum_size">105,-1</property>
5335 <property name="name">m_textCtrlPrice</property>
5336 <property name="permission">protected</property>
5337 <property name="pos"></property>
5338 <property name="size"></property>
5339 <property name="style"></property>
5340 <property name="subclass"></property>
5341 <property name="tooltip"></property>
5342 <property name="value"></property>
5343 <property name="window_extra_style"></property>
5344 <property name="window_name"></property>
5345 <property name="window_style"></property>
5346 <event name="OnChar"></event>
5347 <event name="OnEnterWindow"></event>
5348 <event name="OnEraseBackground"></event>
5349 <event name="OnKeyDown">OnKeyDown</event>
5350 <event name="OnKeyUp"></event>
5351 <event name="OnKillFocus"></event>
5352 <event name="OnLeaveWindow"></event>
5353 <event name="OnLeftDClick"></event>
5354 <event name="OnLeftDown"></event>
5355 <event name="OnLeftUp"></event>
5356 <event name="OnMiddleDClick"></event>
5357 <event name="OnMiddleDown"></event>
5358 <event name="OnMiddleUp"></event>
5359 <event name="OnMotion"></event>
5360 <event name="OnMouseEvents"></event>
5361 <event name="OnMouseWheel"></event>
5362 <event name="OnPaint"></event>
5363 <event name="OnRightDClick"></event>
5364 <event name="OnRightDown"></event>
5365 <event name="OnRightUp"></event>
5366 <event name="OnSetFocus"></event>
5367 <event name="OnSize"></event>
5368 <event name="OnText"></event>
5369 <event name="OnTextEnter"></event>
5370 <event name="OnTextMaxLen"></event>
5371 <event name="OnTextURL"></event>
5372 <event name="OnUpdateUI"></event>
5373 </object>
5374 </object>
5375 </object>
5376 </object>
5377 <object class="sizeritem" expanded="1">
5378 <property name="border">5</property>
5379 <property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
5380 <property name="proportion">0</property>
5381 <object class="wxStaticText" expanded="1">
5382 <property name="bg"></property>
5383 <property name="context_help"></property>
5384 <property name="enabled">1</property>
5385 <property name="fg"></property>
5386 <property name="font"></property>
5387 <property name="hidden">0</property>
5388 <property name="id">wxID_ANY</property>
5389 <property name="label">Page 1: Description</property>
5390 <property name="maximum_size"></property>
5391 <property name="minimum_size"></property>
5392 <property name="name">m_staticText22</property>
5393 <property name="permission">protected</property>
5394 <property name="pos"></property>
5395 <property name="size"></property>
5396 <property name="style"></property>
5397 <property name="subclass"></property>
5398 <property name="tooltip"></property>
5399 <property name="window_extra_style"></property>
5400 <property name="window_name"></property>
5401 <property name="window_style"></property>
5402 <property name="wrap">-1</property>
5403 <event name="OnChar"></event>
5404 <event name="OnEnterWindow"></event>
5405 <event name="OnEraseBackground"></event>
5406 <event name="OnKeyDown"></event>
5407 <event name="OnKeyUp"></event>
5408 <event name="OnKillFocus"></event>
5409 <event name="OnLeaveWindow"></event>
5410 <event name="OnLeftDClick"></event>
5411 <event name="OnLeftDown"></event>
5412 <event name="OnLeftUp"></event>
5413 <event name="OnMiddleDClick"></event>
5414 <event name="OnMiddleDown"></event>
5415 <event name="OnMiddleUp"></event>
5416 <event name="OnMotion"></event>
5417 <event name="OnMouseEvents"></event>
5418 <event name="OnMouseWheel"></event>
5419 <event name="OnPaint"></event>
5420 <event name="OnRightDClick"></event>
5421 <event name="OnRightDown"></event>
5422 <event name="OnRightUp"></event>
5423 <event name="OnSetFocus"></event>
5424 <event name="OnSize"></event>
5425 <event name="OnUpdateUI"></event>
5426 </object>
5427 </object>
5428 <object class="sizeritem" expanded="1">
5429 <property name="border">5</property>
5430 <property name="flag">wxALL|wxEXPAND</property>
5431 <property name="proportion">0</property>
5432 <object class="wxTextCtrl" expanded="1">
5433 <property name="bg"></property>
5434 <property name="context_help"></property>
5435 <property name="enabled">1</property>
5436 <property name="fg"></property>
5437 <property name="font"></property>
5438 <property name="hidden">0</property>
5439 <property name="id">wxID_ANY</property>
5440 <property name="maximum_size"></property>
5441 <property name="maxlength">0</property>
5442 <property name="minimum_size">-1,170</property>
5443 <property name="name">m_textCtrlDescription</property>
5444 <property name="permission">protected</property>
5445 <property name="pos"></property>
5446 <property name="size"></property>
5447 <property name="style">wxTE_MULTILINE</property>
5448 <property name="subclass"></property>
5449 <property name="tooltip"></property>
5450 <property name="value"></property>
5451 <property name="window_extra_style"></property>
5452 <property name="window_name"></property>
5453 <property name="window_style"></property>
5454 <event name="OnChar"></event>
5455 <event name="OnEnterWindow"></event>
5456 <event name="OnEraseBackground"></event>
5457 <event name="OnKeyDown">OnKeyDown</event>
5458 <event name="OnKeyUp"></event>
5459 <event name="OnKillFocus"></event>
5460 <event name="OnLeaveWindow"></event>
5461 <event name="OnLeftDClick"></event>
5462 <event name="OnLeftDown"></event>
5463 <event name="OnLeftUp"></event>
5464 <event name="OnMiddleDClick"></event>
5465 <event name="OnMiddleDown"></event>
5466 <event name="OnMiddleUp"></event>
5467 <event name="OnMotion"></event>
5468 <event name="OnMouseEvents"></event>
5469 <event name="OnMouseWheel"></event>
5470 <event name="OnPaint"></event>
5471 <event name="OnRightDClick"></event>
5472 <event name="OnRightDown"></event>
5473 <event name="OnRightUp"></event>
5474 <event name="OnSetFocus"></event>
5475 <event name="OnSize"></event>
5476 <event name="OnText"></event>
5477 <event name="OnTextEnter"></event>
5478 <event name="OnTextMaxLen"></event>
5479 <event name="OnTextURL"></event>
5480 <event name="OnUpdateUI"></event>
5481 </object>
5482 </object>
5483 <object class="sizeritem" expanded="1">
5484 <property name="border">5</property>
5485 <property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
5486 <property name="proportion">0</property>
5487 <object class="wxStaticText" expanded="1">
5488 <property name="bg"></property>
5489 <property name="context_help"></property>
5490 <property name="enabled">1</property>
5491 <property name="fg"></property>
5492 <property name="font"></property>
5493 <property name="hidden">0</property>
5494 <property name="id">wxID_ANY</property>
5495 <property name="label">Page 2: Order Form</property>
5496 <property name="maximum_size"></property>
5497 <property name="minimum_size"></property>
5498 <property name="name">m_staticText23</property>
5499 <property name="permission">protected</property>
5500 <property name="pos"></property>
5501 <property name="size"></property>
5502 <property name="style"></property>
5503 <property name="subclass"></property>
5504 <property name="tooltip"></property>
5505 <property name="window_extra_style"></property>
5506 <property name="window_name"></property>
5507 <property name="window_style"></property>
5508 <property name="wrap">-1</property>
5509 <event name="OnChar"></event>
5510 <event name="OnEnterWindow"></event>
5511 <event name="OnEraseBackground"></event>
5512 <event name="OnKeyDown"></event>
5513 <event name="OnKeyUp"></event>
5514 <event name="OnKillFocus"></event>
5515 <event name="OnLeaveWindow"></event>
5516 <event name="OnLeftDClick"></event>
5517 <event name="OnLeftDown"></event>
5518 <event name="OnLeftUp"></event>
5519 <event name="OnMiddleDClick"></event>
5520 <event name="OnMiddleDown"></event>
5521 <event name="OnMiddleUp"></event>
5522 <event name="OnMotion"></event>
5523 <event name="OnMouseEvents"></event>
5524 <event name="OnMouseWheel"></event>
5525 <event name="OnPaint"></event>
5526 <event name="OnRightDClick"></event>
5527 <event name="OnRightDown"></event>
5528 <event name="OnRightUp"></event>
5529 <event name="OnSetFocus"></event>
5530 <event name="OnSize"></event>
5531 <event name="OnUpdateUI"></event>
5532 </object>
5533 </object>
5534 <object class="sizeritem" expanded="1">
5535 <property name="border">5</property>
5536 <property name="flag">wxEXPAND|wxALL</property>
5537 <property name="proportion">0</property>
5538 <object class="wxTextCtrl" expanded="1">
5539 <property name="bg"></property>
5540 <property name="context_help"></property>
5541 <property name="enabled">1</property>
5542 <property name="fg"></property>
5543 <property name="font"></property>
5544 <property name="hidden">0</property>
5545 <property name="id">wxID_ANY</property>
5546 <property name="maximum_size"></property>
5547 <property name="maxlength">0</property>
5548 <property name="minimum_size">-1,120</property>
5549 <property name="name">m_textCtrlInstructions</property>
5550 <property name="permission">protected</property>
5551 <property name="pos"></property>
5552 <property name="size"></property>
5553 <property name="style">wxTE_MULTILINE</property>
5554 <property name="subclass"></property>
5555 <property name="tooltip"></property>
5556 <property name="value"></property>
5557 <property name="window_extra_style"></property>
5558 <property name="window_name"></property>
5559 <property name="window_style"></property>
5560 <event name="OnChar"></event>
5561 <event name="OnEnterWindow"></event>
5562 <event name="OnEraseBackground"></event>
5563 <event name="OnKeyDown">OnKeyDown</event>
5564 <event name="OnKeyUp"></event>
5565 <event name="OnKillFocus"></event>
5566 <event name="OnLeaveWindow"></event>
5567 <event name="OnLeftDClick"></event>
5568 <event name="OnLeftDown"></event>
5569 <event name="OnLeftUp"></event>
5570 <event name="OnMiddleDClick"></event>
5571 <event name="OnMiddleDown"></event>
5572 <event name="OnMiddleUp"></event>
5573 <event name="OnMotion"></event>
5574 <event name="OnMouseEvents"></event>
5575 <event name="OnMouseWheel"></event>
5576 <event name="OnPaint"></event>
5577 <event name="OnRightDClick"></event>
5578 <event name="OnRightDown"></event>
5579 <event name="OnRightUp"></event>
5580 <event name="OnSetFocus"></event>
5581 <event name="OnSize"></event>
5582 <event name="OnText"></event>
5583 <event name="OnTextEnter"></event>
5584 <event name="OnTextMaxLen"></event>
5585 <event name="OnTextURL"></event>
5586 <event name="OnUpdateUI"></event>
5587 </object>
5588 </object>
5589 <object class="sizeritem" expanded="1">
5590 <property name="border">5</property>
5591 <property name="flag">wxEXPAND</property>
5592 <property name="proportion">0</property>
5593 <object class="wxFlexGridSizer" expanded="0">
5594 <property name="cols">3</property>
5595 <property name="flexible_direction">wxBOTH</property>
5596 <property name="growablecols">1</property>
5597 <property name="growablerows"></property>
5598 <property name="hgap">0</property>
5599 <property name="minimum_size"></property>
5600 <property name="name">fgSizer5</property>
5601 <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
5602 <property name="permission">public</property>
5603 <property name="rows">0</property>
5604 <property name="vgap">0</property>
5605 <object class="sizeritem" expanded="1">
5606 <property name="border">5</property>
5607 <property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT|wxLEFT</property>
5608 <property name="proportion">0</property>
5609 <object class="wxStaticText" expanded="1">
5610 <property name="bg"></property>
5611 <property name="context_help"></property>
5612 <property name="enabled">1</property>
5613 <property name="fg"></property>
5614 <property name="font"></property>
5615 <property name="hidden">0</property>
5616 <property name="id">wxID_ANY</property>
5617 <property name="label">Label</property>
5618 <property name="maximum_size"></property>
5619 <property name="minimum_size"></property>
5620 <property name="name">m_staticText24</property>
5621 <property name="permission">protected</property>
5622 <property name="pos"></property>
5623 <property name="size"></property>
5624 <property name="style"></property>
5625 <property name="subclass"></property>
5626 <property name="tooltip"></property>
5627 <property name="window_extra_style"></property>
5628 <property name="window_name"></property>
5629 <property name="window_style"></property>
5630 <property name="wrap">-1</property>
5631 <event name="OnChar"></event>
5632 <event name="OnEnterWindow"></event>
5633 <event name="OnEraseBackground"></event>
5634 <event name="OnKeyDown"></event>
5635 <event name="OnKeyUp"></event>
5636 <event name="OnKillFocus"></event>
5637 <event name="OnLeaveWindow"></event>
5638 <event name="OnLeftDClick"></event>
5639 <event name="OnLeftDown"></event>
5640 <event name="OnLeftUp"></event>
5641 <event name="OnMiddleDClick"></event>
5642 <event name="OnMiddleDown"></event>
5643 <event name="OnMiddleUp"></event>
5644 <event name="OnMotion"></event>
5645 <event name="OnMouseEvents"></event>
5646 <event name="OnMouseWheel"></event>
5647 <event name="OnPaint"></event>
5648 <event name="OnRightDClick"></event>
5649 <event name="OnRightDown"></event>
5650 <event name="OnRightUp"></event>
5651 <event name="OnSetFocus"></event>
5652 <event name="OnSize"></event>
5653 <event name="OnUpdateUI"></event>
5654 </object>
5655 </object>
5656 <object class="sizeritem" expanded="1">
5657 <property name="border">5</property>
5658 <property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT|wxLEFT</property>
5659 <property name="proportion">0</property>
5660 <object class="wxStaticText" expanded="1">
5661 <property name="bg"></property>
5662 <property name="context_help"></property>
5663 <property name="enabled">1</property>
5664 <property name="fg"></property>
5665 <property name="font"></property>
5666 <property name="hidden">0</property>
5667 <property name="id">wxID_ANY</property>
5668 <property name="label">Comma separated list of choices, or leave blank for text field</property>
5669 <property name="maximum_size"></property>
5670 <property name="minimum_size"></property>
5671 <property name="name">m_staticText25</property>
5672 <property name="permission">protected</property>
5673 <property name="pos"></property>
5674 <property name="size"></property>
5675 <property name="style"></property>
5676 <property name="subclass"></property>
5677 <property name="tooltip"></property>
5678 <property name="window_extra_style"></property>
5679 <property name="window_name"></property>
5680 <property name="window_style"></property>
5681 <property name="wrap">-1</property>
5682 <event name="OnChar"></event>
5683 <event name="OnEnterWindow"></event>
5684 <event name="OnEraseBackground"></event>
5685 <event name="OnKeyDown"></event>
5686 <event name="OnKeyUp"></event>
5687 <event name="OnKillFocus"></event>
5688 <event name="OnLeaveWindow"></event>
5689 <event name="OnLeftDClick"></event>
5690 <event name="OnLeftDown"></event>
5691 <event name="OnLeftUp"></event>
5692 <event name="OnMiddleDClick"></event>
5693 <event name="OnMiddleDown"></event>
5694 <event name="OnMiddleUp"></event>
5695 <event name="OnMotion"></event>
5696 <event name="OnMouseEvents"></event>
5697 <event name="OnMouseWheel"></event>
5698 <event name="OnPaint"></event>
5699 <event name="OnRightDClick"></event>
5700 <event name="OnRightDown"></event>
5701 <event name="OnRightUp"></event>
5702 <event name="OnSetFocus"></event>
5703 <event name="OnSize"></event>
5704 <event name="OnUpdateUI"></event>
5705 </object>
5706 </object>
5707 <object class="sizeritem" expanded="1">
5708 <property name="border">5</property>
5709 <property name="flag">wxEXPAND</property>
5710 <property name="proportion">1</property>
5711 <object class="spacer" expanded="1">
5712 <property name="height">0</property>
5713 <property name="permission">protected</property>
5714 <property name="width">0</property>
5715 </object>
5716 </object>
5717 <object class="sizeritem" expanded="1">
5718 <property name="border">5</property>
5719 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
5720 <property name="proportion">0</property>
5721 <object class="wxTextCtrl" expanded="1">
5722 <property name="bg"></property>
5723 <property name="context_help"></property>
5724 <property name="enabled">1</property>
5725 <property name="fg"></property>
5726 <property name="font"></property>
5727 <property name="hidden">0</property>
5728 <property name="id">wxID_ANY</property>
5729 <property name="maximum_size"></property>
5730 <property name="maxlength">0</property>
5731 <property name="minimum_size">150,-1</property>
5732 <property name="name">m_textCtrlLabel0</property>
5733 <property name="permission">protected</property>
5734 <property name="pos"></property>
5735 <property name="size"></property>
5736 <property name="style"></property>
5737 <property name="subclass"></property>
5738 <property name="tooltip"></property>
5739 <property name="value"></property>
5740 <property name="window_extra_style"></property>
5741 <property name="window_name"></property>
5742 <property name="window_style"></property>
5743 <event name="OnChar"></event>
5744 <event name="OnEnterWindow"></event>
5745 <event name="OnEraseBackground"></event>
5746 <event name="OnKeyDown">OnKeyDown</event>
5747 <event name="OnKeyUp"></event>
5748 <event name="OnKillFocus"></event>
5749 <event name="OnLeaveWindow"></event>
5750 <event name="OnLeftDClick"></event>
5751 <event name="OnLeftDown"></event>
5752 <event name="OnLeftUp"></event>
5753 <event name="OnMiddleDClick"></event>
5754 <event name="OnMiddleDown"></event>
5755 <event name="OnMiddleUp"></event>
5756 <event name="OnMotion"></event>
5757 <event name="OnMouseEvents"></event>
5758 <event name="OnMouseWheel"></event>
5759 <event name="OnPaint"></event>
5760 <event name="OnRightDClick"></event>
5761 <event name="OnRightDown"></event>
5762 <event name="OnRightUp"></event>
5763 <event name="OnSetFocus"></event>
5764 <event name="OnSize"></event>
5765 <event name="OnText"></event>
5766 <event name="OnTextEnter"></event>
5767 <event name="OnTextMaxLen"></event>
5768 <event name="OnTextURL"></event>
5769 <event name="OnUpdateUI"></event>
5770 </object>
5771 </object>
5772 <object class="sizeritem" expanded="1">
5773 <property name="border">5</property>
5774 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
5775 <property name="proportion">0</property>
5776 <object class="wxTextCtrl" expanded="1">
5777 <property name="bg"></property>
5778 <property name="context_help"></property>
5779 <property name="enabled">1</property>
5780 <property name="fg"></property>
5781 <property name="font"></property>
5782 <property name="hidden">0</property>
5783 <property name="id">wxID_ANY</property>
5784 <property name="maximum_size">-1,-1</property>
5785 <property name="maxlength">0</property>
5786 <property name="minimum_size">-1,-1</property>
5787 <property name="name">m_textCtrlField0</property>
5788 <property name="permission">protected</property>
5789 <property name="pos"></property>
5790 <property name="size">-1,-1</property>
5791 <property name="style"></property>
5792 <property name="subclass"></property>
5793 <property name="tooltip"></property>
5794 <property name="value"></property>
5795 <property name="window_extra_style"></property>
5796 <property name="window_name"></property>
5797 <property name="window_style"></property>
5798 <event name="OnChar"></event>
5799 <event name="OnEnterWindow"></event>
5800 <event name="OnEraseBackground"></event>
5801 <event name="OnKeyDown">OnKeyDown</event>
5802 <event name="OnKeyUp"></event>
5803 <event name="OnKillFocus"></event>
5804 <event name="OnLeaveWindow"></event>
5805 <event name="OnLeftDClick"></event>
5806 <event name="OnLeftDown"></event>
5807 <event name="OnLeftUp"></event>
5808 <event name="OnMiddleDClick"></event>
5809 <event name="OnMiddleDown"></event>
5810 <event name="OnMiddleUp"></event>
5811 <event name="OnMotion"></event>
5812 <event name="OnMouseEvents"></event>
5813 <event name="OnMouseWheel"></event>
5814 <event name="OnPaint"></event>
5815 <event name="OnRightDClick"></event>
5816 <event name="OnRightDown"></event>
5817 <event name="OnRightUp"></event>
5818 <event name="OnSetFocus"></event>
5819 <event name="OnSize"></event>
5820 <event name="OnText"></event>
5821 <event name="OnTextEnter"></event>
5822 <event name="OnTextMaxLen"></event>
5823 <event name="OnTextURL"></event>
5824 <event name="OnUpdateUI"></event>
5825 </object>
5826 </object>
5827 <object class="sizeritem" expanded="1">
5828 <property name="border">5</property>
5829 <property name="flag">wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL</property>
5830 <property name="proportion">0</property>
5831 <object class="wxButton" expanded="1">
5832 <property name="bg"></property>
5833 <property name="context_help"></property>
5834 <property name="default">0</property>
5835 <property name="enabled">1</property>
5836 <property name="fg"></property>
5837 <property name="font"></property>
5838 <property name="hidden">0</property>
5839 <property name="id">wxID_DEL0</property>
5840 <property name="label">Delete</property>
5841 <property name="maximum_size"></property>
5842 <property name="minimum_size">-1,-1</property>
5843 <property name="name">m_buttonDel0</property>
5844 <property name="permission">protected</property>
5845 <property name="pos"></property>
5846 <property name="size">60,20</property>
5847 <property name="style"></property>
5848 <property name="subclass"></property>
5849 <property name="tooltip"></property>
5850 <property name="window_extra_style"></property>
5851 <property name="window_name"></property>
5852 <property name="window_style"></property>
5853 <event name="OnButtonClick">OnButtonDel0</event>
5854 <event name="OnChar"></event>
5855 <event name="OnEnterWindow"></event>
5856 <event name="OnEraseBackground"></event>
5857 <event name="OnKeyDown"></event>
5858 <event name="OnKeyUp"></event>
5859 <event name="OnKillFocus"></event>
5860 <event name="OnLeaveWindow"></event>
5861 <event name="OnLeftDClick"></event>
5862 <event name="OnLeftDown"></event>
5863 <event name="OnLeftUp"></event>
5864 <event name="OnMiddleDClick"></event>
5865 <event name="OnMiddleDown"></event>
5866 <event name="OnMiddleUp"></event>
5867 <event name="OnMotion"></event>
5868 <event name="OnMouseEvents"></event>
5869 <event name="OnMouseWheel"></event>
5870 <event name="OnPaint"></event>
5871 <event name="OnRightDClick"></event>
5872 <event name="OnRightDown"></event>
5873 <event name="OnRightUp"></event>
5874 <event name="OnSetFocus"></event>
5875 <event name="OnSize"></event>
5876 <event name="OnUpdateUI"></event>
5877 </object>
5878 </object>
5879 <object class="sizeritem" expanded="1">
5880 <property name="border">5</property>
5881 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
5882 <property name="proportion">0</property>
5883 <object class="wxTextCtrl" expanded="1">
5884 <property name="bg"></property>
5885 <property name="context_help"></property>
5886 <property name="enabled">1</property>
5887 <property name="fg"></property>
5888 <property name="font"></property>
5889 <property name="hidden">0</property>
5890 <property name="id">wxID_ANY</property>
5891 <property name="maximum_size"></property>
5892 <property name="maxlength">0</property>
5893 <property name="minimum_size">150,-1</property>
5894 <property name="name">m_textCtrlLabel1</property>
5895 <property name="permission">protected</property>
5896 <property name="pos"></property>
5897 <property name="size"></property>
5898 <property name="style"></property>
5899 <property name="subclass"></property>
5900 <property name="tooltip"></property>
5901 <property name="value"></property>
5902 <property name="window_extra_style"></property>
5903 <property name="window_name"></property>
5904 <property name="window_style"></property>
5905 <event name="OnChar"></event>
5906 <event name="OnEnterWindow"></event>
5907 <event name="OnEraseBackground"></event>
5908 <event name="OnKeyDown">OnKeyDown</event>
5909 <event name="OnKeyUp"></event>
5910 <event name="OnKillFocus"></event>
5911 <event name="OnLeaveWindow"></event>
5912 <event name="OnLeftDClick"></event>
5913 <event name="OnLeftDown"></event>
5914 <event name="OnLeftUp"></event>
5915 <event name="OnMiddleDClick"></event>
5916 <event name="OnMiddleDown"></event>
5917 <event name="OnMiddleUp"></event>
5918 <event name="OnMotion"></event>
5919 <event name="OnMouseEvents"></event>
5920 <event name="OnMouseWheel"></event>
5921 <event name="OnPaint"></event>
5922 <event name="OnRightDClick"></event>
5923 <event name="OnRightDown"></event>
5924 <event name="OnRightUp"></event>
5925 <event name="OnSetFocus"></event>
5926 <event name="OnSize"></event>
5927 <event name="OnText"></event>
5928 <event name="OnTextEnter"></event>
5929 <event name="OnTextMaxLen"></event>
5930 <event name="OnTextURL"></event>
5931 <event name="OnUpdateUI"></event>
5932 </object>
5933 </object>
5934 <object class="sizeritem" expanded="1">
5935 <property name="border">5</property>
5936 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
5937 <property name="proportion">0</property>
5938 <object class="wxTextCtrl" expanded="1">
5939 <property name="bg"></property>
5940 <property name="context_help"></property>
5941 <property name="enabled">1</property>
5942 <property name="fg"></property>
5943 <property name="font"></property>
5944 <property name="hidden">0</property>
5945 <property name="id">wxID_ANY</property>
5946 <property name="maximum_size">-1,-1</property>
5947 <property name="maxlength">0</property>
5948 <property name="minimum_size">-1,-1</property>
5949 <property name="name">m_textCtrlField1</property>
5950 <property name="permission">protected</property>
5951 <property name="pos"></property>
5952 <property name="size">-1,-1</property>
5953 <property name="style"></property>
5954 <property name="subclass"></property>
5955 <property name="tooltip"></property>
5956 <property name="value"></property>
5957 <property name="window_extra_style"></property>
5958 <property name="window_name"></property>
5959 <property name="window_style"></property>
5960 <event name="OnChar"></event>
5961 <event name="OnEnterWindow"></event>
5962 <event name="OnEraseBackground"></event>
5963 <event name="OnKeyDown">OnKeyDown</event>
5964 <event name="OnKeyUp"></event>
5965 <event name="OnKillFocus"></event>
5966 <event name="OnLeaveWindow"></event>
5967 <event name="OnLeftDClick"></event>
5968 <event name="OnLeftDown"></event>
5969 <event name="OnLeftUp"></event>
5970 <event name="OnMiddleDClick"></event>
5971 <event name="OnMiddleDown"></event>
5972 <event name="OnMiddleUp"></event>
5973 <event name="OnMotion"></event>
5974 <event name="OnMouseEvents"></event>
5975 <event name="OnMouseWheel"></event>
5976 <event name="OnPaint"></event>
5977 <event name="OnRightDClick"></event>
5978 <event name="OnRightDown"></event>
5979 <event name="OnRightUp"></event>
5980 <event name="OnSetFocus"></event>
5981 <event name="OnSize"></event>
5982 <event name="OnText"></event>
5983 <event name="OnTextEnter"></event>
5984 <event name="OnTextMaxLen"></event>
5985 <event name="OnTextURL"></event>
5986 <event name="OnUpdateUI"></event>
5987 </object>
5988 </object>
5989 <object class="sizeritem" expanded="1">
5990 <property name="border">5</property>
5991 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
5992 <property name="proportion">0</property>
5993 <object class="wxButton" expanded="1">
5994 <property name="bg"></property>
5995 <property name="context_help"></property>
5996 <property name="default">0</property>
5997 <property name="enabled">1</property>
5998 <property name="fg"></property>
5999 <property name="font"></property>
6000 <property name="hidden">0</property>
6001 <property name="id">wxID_DEL1</property>
6002 <property name="label">Delete</property>
6003 <property name="maximum_size"></property>
6004 <property name="minimum_size">-1,-1</property>
6005 <property name="name">m_buttonDel1</property>
6006 <property name="permission">protected</property>
6007 <property name="pos"></property>
6008 <property name="size">60,20</property>
6009 <property name="style"></property>
6010 <property name="subclass"></property>
6011 <property name="tooltip"></property>
6012 <property name="window_extra_style"></property>
6013 <property name="window_name"></property>
6014 <property name="window_style"></property>
6015 <event name="OnButtonClick">OnButtonDel1</event>
6016 <event name="OnChar"></event>
6017 <event name="OnEnterWindow"></event>
6018 <event name="OnEraseBackground"></event>
6019 <event name="OnKeyDown"></event>
6020 <event name="OnKeyUp"></event>
6021 <event name="OnKillFocus"></event>
6022 <event name="OnLeaveWindow"></event>
6023 <event name="OnLeftDClick"></event>
6024 <event name="OnLeftDown"></event>
6025 <event name="OnLeftUp"></event>
6026 <event name="OnMiddleDClick"></event>
6027 <event name="OnMiddleDown"></event>
6028 <event name="OnMiddleUp"></event>
6029 <event name="OnMotion"></event>
6030 <event name="OnMouseEvents"></event>
6031 <event name="OnMouseWheel"></event>
6032 <event name="OnPaint"></event>
6033 <event name="OnRightDClick"></event>
6034 <event name="OnRightDown"></event>
6035 <event name="OnRightUp"></event>
6036 <event name="OnSetFocus"></event>
6037 <event name="OnSize"></event>
6038 <event name="OnUpdateUI"></event>
6039 </object>
6040 </object>
6041 <object class="sizeritem" expanded="1">
6042 <property name="border">5</property>
6043 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
6044 <property name="proportion">0</property>
6045 <object class="wxTextCtrl" expanded="1">
6046 <property name="bg"></property>
6047 <property name="context_help"></property>
6048 <property name="enabled">1</property>
6049 <property name="fg"></property>
6050 <property name="font"></property>
6051 <property name="hidden">0</property>
6052 <property name="id">wxID_ANY</property>
6053 <property name="maximum_size"></property>
6054 <property name="maxlength">0</property>
6055 <property name="minimum_size">150,-1</property>
6056 <property name="name">m_textCtrlLabel2</property>
6057 <property name="permission">protected</property>
6058 <property name="pos"></property>
6059 <property name="size"></property>
6060 <property name="style"></property>
6061 <property name="subclass"></property>
6062 <property name="tooltip"></property>
6063 <property name="value"></property>
6064 <property name="window_extra_style"></property>
6065 <property name="window_name"></property>
6066 <property name="window_style"></property>
6067 <event name="OnChar"></event>
6068 <event name="OnEnterWindow"></event>
6069 <event name="OnEraseBackground"></event>
6070 <event name="OnKeyDown">OnKeyDown</event>
6071 <event name="OnKeyUp"></event>
6072 <event name="OnKillFocus"></event>
6073 <event name="OnLeaveWindow"></event>
6074 <event name="OnLeftDClick"></event>
6075 <event name="OnLeftDown"></event>
6076 <event name="OnLeftUp"></event>
6077 <event name="OnMiddleDClick"></event>
6078 <event name="OnMiddleDown"></event>
6079 <event name="OnMiddleUp"></event>
6080 <event name="OnMotion"></event>
6081 <event name="OnMouseEvents"></event>
6082 <event name="OnMouseWheel"></event>
6083 <event name="OnPaint"></event>
6084 <event name="OnRightDClick"></event>
6085 <event name="OnRightDown"></event>
6086 <event name="OnRightUp"></event>
6087 <event name="OnSetFocus"></event>
6088 <event name="OnSize"></event>
6089 <event name="OnText"></event>
6090 <event name="OnTextEnter"></event>
6091 <event name="OnTextMaxLen"></event>
6092 <event name="OnTextURL"></event>
6093 <event name="OnUpdateUI"></event>
6094 </object>
6095 </object>
6096 <object class="sizeritem" expanded="1">
6097 <property name="border">5</property>
6098 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
6099 <property name="proportion">0</property>
6100 <object class="wxTextCtrl" expanded="1">
6101 <property name="bg"></property>
6102 <property name="context_help"></property>
6103 <property name="enabled">1</property>
6104 <property name="fg"></property>
6105 <property name="font"></property>
6106 <property name="hidden">0</property>
6107 <property name="id">wxID_ANY</property>
6108 <property name="maximum_size">-1,-1</property>
6109 <property name="maxlength">0</property>
6110 <property name="minimum_size">-1,-1</property>
6111 <property name="name">m_textCtrlField2</property>
6112 <property name="permission">protected</property>
6113 <property name="pos"></property>
6114 <property name="size">-1,-1</property>
6115 <property name="style"></property>
6116 <property name="subclass"></property>
6117 <property name="tooltip"></property>
6118 <property name="value"></property>
6119 <property name="window_extra_style"></property>
6120 <property name="window_name"></property>
6121 <property name="window_style"></property>
6122 <event name="OnChar"></event>
6123 <event name="OnEnterWindow"></event>
6124 <event name="OnEraseBackground"></event>
6125 <event name="OnKeyDown">OnKeyDown</event>
6126 <event name="OnKeyUp"></event>
6127 <event name="OnKillFocus"></event>
6128 <event name="OnLeaveWindow"></event>
6129 <event name="OnLeftDClick"></event>
6130 <event name="OnLeftDown"></event>
6131 <event name="OnLeftUp"></event>
6132 <event name="OnMiddleDClick"></event>
6133 <event name="OnMiddleDown"></event>
6134 <event name="OnMiddleUp"></event>
6135 <event name="OnMotion"></event>
6136 <event name="OnMouseEvents"></event>
6137 <event name="OnMouseWheel"></event>
6138 <event name="OnPaint"></event>
6139 <event name="OnRightDClick"></event>
6140 <event name="OnRightDown"></event>
6141 <event name="OnRightUp"></event>
6142 <event name="OnSetFocus"></event>
6143 <event name="OnSize"></event>
6144 <event name="OnText"></event>
6145 <event name="OnTextEnter"></event>
6146 <event name="OnTextMaxLen"></event>
6147 <event name="OnTextURL"></event>
6148 <event name="OnUpdateUI"></event>
6149 </object>
6150 </object>
6151 <object class="sizeritem" expanded="1">
6152 <property name="border">5</property>
6153 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
6154 <property name="proportion">0</property>
6155 <object class="wxButton" expanded="1">
6156 <property name="bg"></property>
6157 <property name="context_help"></property>
6158 <property name="default">0</property>
6159 <property name="enabled">1</property>
6160 <property name="fg"></property>
6161 <property name="font"></property>
6162 <property name="hidden">0</property>
6163 <property name="id">wxID_DEL2</property>
6164 <property name="label">Delete</property>
6165 <property name="maximum_size"></property>
6166 <property name="minimum_size">-1,-1</property>
6167 <property name="name">m_buttonDel2</property>
6168 <property name="permission">protected</property>
6169 <property name="pos"></property>
6170 <property name="size">60,20</property>
6171 <property name="style"></property>
6172 <property name="subclass"></property>
6173 <property name="tooltip"></property>
6174 <property name="window_extra_style"></property>
6175 <property name="window_name"></property>
6176 <property name="window_style"></property>
6177 <event name="OnButtonClick">OnButtonDel2</event>
6178 <event name="OnChar"></event>
6179 <event name="OnEnterWindow"></event>
6180 <event name="OnEraseBackground"></event>
6181 <event name="OnKeyDown"></event>
6182 <event name="OnKeyUp"></event>
6183 <event name="OnKillFocus"></event>
6184 <event name="OnLeaveWindow"></event>
6185 <event name="OnLeftDClick"></event>
6186 <event name="OnLeftDown"></event>
6187 <event name="OnLeftUp"></event>
6188 <event name="OnMiddleDClick"></event>
6189 <event name="OnMiddleDown"></event>
6190 <event name="OnMiddleUp"></event>
6191 <event name="OnMotion"></event>
6192 <event name="OnMouseEvents"></event>
6193 <event name="OnMouseWheel"></event>
6194 <event name="OnPaint"></event>
6195 <event name="OnRightDClick"></event>
6196 <event name="OnRightDown"></event>
6197 <event name="OnRightUp"></event>
6198 <event name="OnSetFocus"></event>
6199 <event name="OnSize"></event>
6200 <event name="OnUpdateUI"></event>
6201 </object>
6202 </object>
6203 <object class="sizeritem" expanded="1">
6204 <property name="border">5</property>
6205 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
6206 <property name="proportion">0</property>
6207 <object class="wxTextCtrl" expanded="1">
6208 <property name="bg"></property>
6209 <property name="context_help"></property>
6210 <property name="enabled">1</property>
6211 <property name="fg"></property>
6212 <property name="font"></property>
6213 <property name="hidden">0</property>
6214 <property name="id">wxID_ANY</property>
6215 <property name="maximum_size"></property>
6216 <property name="maxlength">0</property>
6217 <property name="minimum_size">150,-1</property>
6218 <property name="name">m_textCtrlLabel3</property>
6219 <property name="permission">protected</property>
6220 <property name="pos"></property>
6221 <property name="size"></property>
6222 <property name="style"></property>
6223 <property name="subclass"></property>
6224 <property name="tooltip"></property>
6225 <property name="value"></property>
6226 <property name="window_extra_style"></property>
6227 <property name="window_name"></property>
6228 <property name="window_style"></property>
6229 <event name="OnChar"></event>
6230 <event name="OnEnterWindow"></event>
6231 <event name="OnEraseBackground"></event>
6232 <event name="OnKeyDown">OnKeyDown</event>
6233 <event name="OnKeyUp"></event>
6234 <event name="OnKillFocus"></event>
6235 <event name="OnLeaveWindow"></event>
6236 <event name="OnLeftDClick"></event>
6237 <event name="OnLeftDown"></event>
6238 <event name="OnLeftUp"></event>
6239 <event name="OnMiddleDClick"></event>
6240 <event name="OnMiddleDown"></event>
6241 <event name="OnMiddleUp"></event>
6242 <event name="OnMotion"></event>
6243 <event name="OnMouseEvents"></event>
6244 <event name="OnMouseWheel"></event>
6245 <event name="OnPaint"></event>
6246 <event name="OnRightDClick"></event>
6247 <event name="OnRightDown"></event>
6248 <event name="OnRightUp"></event>
6249 <event name="OnSetFocus"></event>
6250 <event name="OnSize"></event>
6251 <event name="OnText"></event>
6252 <event name="OnTextEnter"></event>
6253 <event name="OnTextMaxLen"></event>
6254 <event name="OnTextURL"></event>
6255 <event name="OnUpdateUI"></event>
6256 </object>
6257 </object>
6258 <object class="sizeritem" expanded="1">
6259 <property name="border">5</property>
6260 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
6261 <property name="proportion">0</property>
6262 <object class="wxTextCtrl" expanded="1">
6263 <property name="bg"></property>
6264 <property name="context_help"></property>
6265 <property name="enabled">1</property>
6266 <property name="fg"></property>
6267 <property name="font"></property>
6268 <property name="hidden">0</property>
6269 <property name="id">wxID_ANY</property>
6270 <property name="maximum_size">-1,-1</property>
6271 <property name="maxlength">0</property>
6272 <property name="minimum_size">-1,-1</property>
6273 <property name="name">m_textCtrlField3</property>
6274 <property name="permission">protected</property>
6275 <property name="pos"></property>
6276 <property name="size">-1,-1</property>
6277 <property name="style"></property>
6278 <property name="subclass"></property>
6279 <property name="tooltip"></property>
6280 <property name="value"></property>
6281 <property name="window_extra_style"></property>
6282 <property name="window_name"></property>
6283 <property name="window_style"></property>
6284 <event name="OnChar"></event>
6285 <event name="OnEnterWindow"></event>
6286 <event name="OnEraseBackground"></event>
6287 <event name="OnKeyDown">OnKeyDown</event>
6288 <event name="OnKeyUp"></event>
6289 <event name="OnKillFocus"></event>
6290 <event name="OnLeaveWindow"></event>
6291 <event name="OnLeftDClick"></event>
6292 <event name="OnLeftDown"></event>
6293 <event name="OnLeftUp"></event>
6294 <event name="OnMiddleDClick"></event>
6295 <event name="OnMiddleDown"></event>
6296 <event name="OnMiddleUp"></event>
6297 <event name="OnMotion"></event>
6298 <event name="OnMouseEvents"></event>
6299 <event name="OnMouseWheel"></event>
6300 <event name="OnPaint"></event>
6301 <event name="OnRightDClick"></event>
6302 <event name="OnRightDown"></event>
6303 <event name="OnRightUp"></event>
6304 <event name="OnSetFocus"></event>
6305 <event name="OnSize"></event>
6306 <event name="OnText"></event>
6307 <event name="OnTextEnter"></event>
6308 <event name="OnTextMaxLen"></event>
6309 <event name="OnTextURL"></event>
6310 <event name="OnUpdateUI"></event>
6311 </object>
6312 </object>
6313 <object class="sizeritem" expanded="1">
6314 <property name="border">5</property>
6315 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
6316 <property name="proportion">0</property>
6317 <object class="wxButton" expanded="1">
6318 <property name="bg"></property>
6319 <property name="context_help"></property>
6320 <property name="default">0</property>
6321 <property name="enabled">1</property>
6322 <property name="fg"></property>
6323 <property name="font"></property>
6324 <property name="hidden">0</property>
6325 <property name="id">wxID_DEL3</property>
6326 <property name="label">Delete</property>
6327 <property name="maximum_size"></property>
6328 <property name="minimum_size">-1,-1</property>
6329 <property name="name">m_buttonDel3</property>
6330 <property name="permission">protected</property>
6331 <property name="pos"></property>
6332 <property name="size">60,20</property>
6333 <property name="style"></property>
6334 <property name="subclass"></property>
6335 <property name="tooltip"></property>
6336 <property name="window_extra_style"></property>
6337 <property name="window_name"></property>
6338 <property name="window_style"></property>
6339 <event name="OnButtonClick">OnButtonDel3</event>
6340 <event name="OnChar"></event>
6341 <event name="OnEnterWindow"></event>
6342 <event name="OnEraseBackground"></event>
6343 <event name="OnKeyDown"></event>
6344 <event name="OnKeyUp"></event>
6345 <event name="OnKillFocus"></event>
6346 <event name="OnLeaveWindow"></event>
6347 <event name="OnLeftDClick"></event>
6348 <event name="OnLeftDown"></event>
6349 <event name="OnLeftUp"></event>
6350 <event name="OnMiddleDClick"></event>
6351 <event name="OnMiddleDown"></event>
6352 <event name="OnMiddleUp"></event>
6353 <event name="OnMotion"></event>
6354 <event name="OnMouseEvents"></event>
6355 <event name="OnMouseWheel"></event>
6356 <event name="OnPaint"></event>
6357 <event name="OnRightDClick"></event>
6358 <event name="OnRightDown"></event>
6359 <event name="OnRightUp"></event>
6360 <event name="OnSetFocus"></event>
6361 <event name="OnSize"></event>
6362 <event name="OnUpdateUI"></event>
6363 </object>
6364 </object>
6365 <object class="sizeritem" expanded="1">
6366 <property name="border">5</property>
6367 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
6368 <property name="proportion">0</property>
6369 <object class="wxTextCtrl" expanded="1">
6370 <property name="bg"></property>
6371 <property name="context_help"></property>
6372 <property name="enabled">1</property>
6373 <property name="fg"></property>
6374 <property name="font"></property>
6375 <property name="hidden">0</property>
6376 <property name="id">wxID_ANY</property>
6377 <property name="maximum_size"></property>
6378 <property name="maxlength">0</property>
6379 <property name="minimum_size">150,-1</property>
6380 <property name="name">m_textCtrlLabel4</property>
6381 <property name="permission">protected</property>
6382 <property name="pos"></property>
6383 <property name="size"></property>
6384 <property name="style"></property>
6385 <property name="subclass"></property>
6386 <property name="tooltip"></property>
6387 <property name="value"></property>
6388 <property name="window_extra_style"></property>
6389 <property name="window_name"></property>
6390 <property name="window_style"></property>
6391 <event name="OnChar"></event>
6392 <event name="OnEnterWindow"></event>
6393 <event name="OnEraseBackground"></event>
6394 <event name="OnKeyDown">OnKeyDown</event>
6395 <event name="OnKeyUp"></event>
6396 <event name="OnKillFocus"></event>
6397 <event name="OnLeaveWindow"></event>
6398 <event name="OnLeftDClick"></event>
6399 <event name="OnLeftDown"></event>
6400 <event name="OnLeftUp"></event>
6401 <event name="OnMiddleDClick"></event>
6402 <event name="OnMiddleDown"></event>
6403 <event name="OnMiddleUp"></event>
6404 <event name="OnMotion"></event>
6405 <event name="OnMouseEvents"></event>
6406 <event name="OnMouseWheel"></event>
6407 <event name="OnPaint"></event>
6408 <event name="OnRightDClick"></event>
6409 <event name="OnRightDown"></event>
6410 <event name="OnRightUp"></event>
6411 <event name="OnSetFocus"></event>
6412 <event name="OnSize"></event>
6413 <event name="OnText"></event>
6414 <event name="OnTextEnter"></event>
6415 <event name="OnTextMaxLen"></event>
6416 <event name="OnTextURL"></event>
6417 <event name="OnUpdateUI"></event>
6418 </object>
6419 </object>
6420 <object class="sizeritem" expanded="1">
6421 <property name="border">5</property>
6422 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
6423 <property name="proportion">0</property>
6424 <object class="wxTextCtrl" expanded="1">
6425 <property name="bg"></property>
6426 <property name="context_help"></property>
6427 <property name="enabled">1</property>
6428 <property name="fg"></property>
6429 <property name="font"></property>
6430 <property name="hidden">0</property>
6431 <property name="id">wxID_ANY</property>
6432 <property name="maximum_size">-1,-1</property>
6433 <property name="maxlength">0</property>
6434 <property name="minimum_size">-1,-1</property>
6435 <property name="name">m_textCtrlField4</property>
6436 <property name="permission">protected</property>
6437 <property name="pos"></property>
6438 <property name="size">-1,-1</property>
6439 <property name="style"></property>
6440 <property name="subclass"></property>
6441 <property name="tooltip"></property>
6442 <property name="value"></property>
6443 <property name="window_extra_style"></property>
6444 <property name="window_name"></property>
6445 <property name="window_style"></property>
6446 <event name="OnChar"></event>
6447 <event name="OnEnterWindow"></event>
6448 <event name="OnEraseBackground"></event>
6449 <event name="OnKeyDown">OnKeyDown</event>
6450 <event name="OnKeyUp"></event>
6451 <event name="OnKillFocus"></event>
6452 <event name="OnLeaveWindow"></event>
6453 <event name="OnLeftDClick"></event>
6454 <event name="OnLeftDown"></event>
6455 <event name="OnLeftUp"></event>
6456 <event name="OnMiddleDClick"></event>
6457 <event name="OnMiddleDown"></event>
6458 <event name="OnMiddleUp"></event>
6459 <event name="OnMotion"></event>
6460 <event name="OnMouseEvents"></event>
6461 <event name="OnMouseWheel"></event>
6462 <event name="OnPaint"></event>
6463 <event name="OnRightDClick"></event>
6464 <event name="OnRightDown"></event>
6465 <event name="OnRightUp"></event>
6466 <event name="OnSetFocus"></event>
6467 <event name="OnSize"></event>
6468 <event name="OnText"></event>
6469 <event name="OnTextEnter"></event>
6470 <event name="OnTextMaxLen"></event>
6471 <event name="OnTextURL"></event>
6472 <event name="OnUpdateUI"></event>
6473 </object>
6474 </object>
6475 <object class="sizeritem" expanded="1">
6476 <property name="border">5</property>
6477 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
6478 <property name="proportion">0</property>
6479 <object class="wxButton" expanded="1">
6480 <property name="bg"></property>
6481 <property name="context_help"></property>
6482 <property name="default">0</property>
6483 <property name="enabled">1</property>
6484 <property name="fg"></property>
6485 <property name="font"></property>
6486 <property name="hidden">0</property>
6487 <property name="id">wxID_DEL4</property>
6488 <property name="label">Delete</property>
6489 <property name="maximum_size"></property>
6490 <property name="minimum_size">-1,-1</property>
6491 <property name="name">m_buttonDel4</property>
6492 <property name="permission">protected</property>
6493 <property name="pos"></property>
6494 <property name="size">60,20</property>
6495 <property name="style"></property>
6496 <property name="subclass"></property>
6497 <property name="tooltip"></property>
6498 <property name="window_extra_style"></property>
6499 <property name="window_name"></property>
6500 <property name="window_style"></property>
6501 <event name="OnButtonClick">OnButtonDel4</event>
6502 <event name="OnChar"></event>
6503 <event name="OnEnterWindow"></event>
6504 <event name="OnEraseBackground"></event>
6505 <event name="OnKeyDown"></event>
6506 <event name="OnKeyUp"></event>
6507 <event name="OnKillFocus"></event>
6508 <event name="OnLeaveWindow"></event>
6509 <event name="OnLeftDClick"></event>
6510 <event name="OnLeftDown"></event>
6511 <event name="OnLeftUp"></event>
6512 <event name="OnMiddleDClick"></event>
6513 <event name="OnMiddleDown"></event>
6514 <event name="OnMiddleUp"></event>
6515 <event name="OnMotion"></event>
6516 <event name="OnMouseEvents"></event>
6517 <event name="OnMouseWheel"></event>
6518 <event name="OnPaint"></event>
6519 <event name="OnRightDClick"></event>
6520 <event name="OnRightDown"></event>
6521 <event name="OnRightUp"></event>
6522 <event name="OnSetFocus"></event>
6523 <event name="OnSize"></event>
6524 <event name="OnUpdateUI"></event>
6525 </object>
6526 </object>
6527 <object class="sizeritem" expanded="1">
6528 <property name="border">5</property>
6529 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
6530 <property name="proportion">0</property>
6531 <object class="wxTextCtrl" expanded="1">
6532 <property name="bg"></property>
6533 <property name="context_help"></property>
6534 <property name="enabled">1</property>
6535 <property name="fg"></property>
6536 <property name="font"></property>
6537 <property name="hidden">0</property>
6538 <property name="id">wxID_ANY</property>
6539 <property name="maximum_size"></property>
6540 <property name="maxlength">0</property>
6541 <property name="minimum_size">150,-1</property>
6542 <property name="name">m_textCtrlLabel5</property>
6543 <property name="permission">protected</property>
6544 <property name="pos"></property>
6545 <property name="size"></property>
6546 <property name="style"></property>
6547 <property name="subclass"></property>
6548 <property name="tooltip"></property>
6549 <property name="value"></property>
6550 <property name="window_extra_style"></property>
6551 <property name="window_name"></property>
6552 <property name="window_style"></property>
6553 <event name="OnChar"></event>
6554 <event name="OnEnterWindow"></event>
6555 <event name="OnEraseBackground"></event>
6556 <event name="OnKeyDown">OnKeyDown</event>
6557 <event name="OnKeyUp"></event>
6558 <event name="OnKillFocus"></event>
6559 <event name="OnLeaveWindow"></event>
6560 <event name="OnLeftDClick"></event>
6561 <event name="OnLeftDown"></event>
6562 <event name="OnLeftUp"></event>
6563 <event name="OnMiddleDClick"></event>
6564 <event name="OnMiddleDown"></event>
6565 <event name="OnMiddleUp"></event>
6566 <event name="OnMotion"></event>
6567 <event name="OnMouseEvents"></event>
6568 <event name="OnMouseWheel"></event>
6569 <event name="OnPaint"></event>
6570 <event name="OnRightDClick"></event>
6571 <event name="OnRightDown"></event>
6572 <event name="OnRightUp"></event>
6573 <event name="OnSetFocus"></event>
6574 <event name="OnSize"></event>
6575 <event name="OnText"></event>
6576 <event name="OnTextEnter"></event>
6577 <event name="OnTextMaxLen"></event>
6578 <event name="OnTextURL"></event>
6579 <event name="OnUpdateUI"></event>
6580 </object>
6581 </object>
6582 <object class="sizeritem" expanded="1">
6583 <property name="border">5</property>
6584 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
6585 <property name="proportion">0</property>
6586 <object class="wxTextCtrl" expanded="1">
6587 <property name="bg"></property>
6588 <property name="context_help"></property>
6589 <property name="enabled">1</property>
6590 <property name="fg"></property>
6591 <property name="font"></property>
6592 <property name="hidden">0</property>
6593 <property name="id">wxID_ANY</property>
6594 <property name="maximum_size">-1,-1</property>
6595 <property name="maxlength">0</property>
6596 <property name="minimum_size">-1,-1</property>
6597 <property name="name">m_textCtrlField5</property>
6598 <property name="permission">protected</property>
6599 <property name="pos"></property>
6600 <property name="size">-1,-1</property>
6601 <property name="style"></property>
6602 <property name="subclass"></property>
6603 <property name="tooltip"></property>
6604 <property name="value"></property>
6605 <property name="window_extra_style"></property>
6606 <property name="window_name"></property>
6607 <property name="window_style"></property>
6608 <event name="OnChar"></event>
6609 <event name="OnEnterWindow"></event>
6610 <event name="OnEraseBackground"></event>
6611 <event name="OnKeyDown">OnKeyDown</event>
6612 <event name="OnKeyUp"></event>
6613 <event name="OnKillFocus"></event>
6614 <event name="OnLeaveWindow"></event>
6615 <event name="OnLeftDClick"></event>
6616 <event name="OnLeftDown"></event>
6617 <event name="OnLeftUp"></event>
6618 <event name="OnMiddleDClick"></event>
6619 <event name="OnMiddleDown"></event>
6620 <event name="OnMiddleUp"></event>
6621 <event name="OnMotion"></event>
6622 <event name="OnMouseEvents"></event>
6623 <event name="OnMouseWheel"></event>
6624 <event name="OnPaint"></event>
6625 <event name="OnRightDClick"></event>
6626 <event name="OnRightDown"></event>
6627 <event name="OnRightUp"></event>
6628 <event name="OnSetFocus"></event>
6629 <event name="OnSize"></event>
6630 <event name="OnText"></event>
6631 <event name="OnTextEnter"></event>
6632 <event name="OnTextMaxLen"></event>
6633 <event name="OnTextURL"></event>
6634 <event name="OnUpdateUI"></event>
6635 </object>
6636 </object>
6637 <object class="sizeritem" expanded="1">
6638 <property name="border">5</property>
6639 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
6640 <property name="proportion">0</property>
6641 <object class="wxButton" expanded="1">
6642 <property name="bg"></property>
6643 <property name="context_help"></property>
6644 <property name="default">0</property>
6645 <property name="enabled">1</property>
6646 <property name="fg"></property>
6647 <property name="font"></property>
6648 <property name="hidden">0</property>
6649 <property name="id">wxID_DEL5</property>
6650 <property name="label">Delete</property>
6651 <property name="maximum_size"></property>
6652 <property name="minimum_size">-1,-1</property>
6653 <property name="name">m_buttonDel5</property>
6654 <property name="permission">protected</property>
6655 <property name="pos"></property>
6656 <property name="size">60,20</property>
6657 <property name="style"></property>
6658 <property name="subclass"></property>
6659 <property name="tooltip"></property>
6660 <property name="window_extra_style"></property>
6661 <property name="window_name"></property>
6662 <property name="window_style"></property>
6663 <event name="OnButtonClick">OnButtonDel5</event>
6664 <event name="OnChar"></event>
6665 <event name="OnEnterWindow"></event>
6666 <event name="OnEraseBackground"></event>
6667 <event name="OnKeyDown"></event>
6668 <event name="OnKeyUp"></event>
6669 <event name="OnKillFocus"></event>
6670 <event name="OnLeaveWindow"></event>
6671 <event name="OnLeftDClick"></event>
6672 <event name="OnLeftDown"></event>
6673 <event name="OnLeftUp"></event>
6674 <event name="OnMiddleDClick"></event>
6675 <event name="OnMiddleDown"></event>
6676 <event name="OnMiddleUp"></event>
6677 <event name="OnMotion"></event>
6678 <event name="OnMouseEvents"></event>
6679 <event name="OnMouseWheel"></event>
6680 <event name="OnPaint"></event>
6681 <event name="OnRightDClick"></event>
6682 <event name="OnRightDown"></event>
6683 <event name="OnRightUp"></event>
6684 <event name="OnSetFocus"></event>
6685 <event name="OnSize"></event>
6686 <event name="OnUpdateUI"></event>
6687 </object>
6688 </object>
6689 <object class="sizeritem" expanded="1">
6690 <property name="border">5</property>
6691 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
6692 <property name="proportion">0</property>
6693 <object class="wxTextCtrl" expanded="1">
6694 <property name="bg"></property>
6695 <property name="context_help"></property>
6696 <property name="enabled">1</property>
6697 <property name="fg"></property>
6698 <property name="font"></property>
6699 <property name="hidden">0</property>
6700 <property name="id">wxID_ANY</property>
6701 <property name="maximum_size"></property>
6702 <property name="maxlength">0</property>
6703 <property name="minimum_size">150,-1</property>
6704 <property name="name">m_textCtrlLabel6</property>
6705 <property name="permission">protected</property>
6706 <property name="pos"></property>
6707 <property name="size"></property>
6708 <property name="style"></property>
6709 <property name="subclass"></property>
6710 <property name="tooltip"></property>
6711 <property name="value"></property>
6712 <property name="window_extra_style"></property>
6713 <property name="window_name"></property>
6714 <property name="window_style"></property>
6715 <event name="OnChar"></event>
6716 <event name="OnEnterWindow"></event>
6717 <event name="OnEraseBackground"></event>
6718 <event name="OnKeyDown">OnKeyDown</event>
6719 <event name="OnKeyUp"></event>
6720 <event name="OnKillFocus"></event>
6721 <event name="OnLeaveWindow"></event>
6722 <event name="OnLeftDClick"></event>
6723 <event name="OnLeftDown"></event>
6724 <event name="OnLeftUp"></event>
6725 <event name="OnMiddleDClick"></event>
6726 <event name="OnMiddleDown"></event>
6727 <event name="OnMiddleUp"></event>
6728 <event name="OnMotion"></event>
6729 <event name="OnMouseEvents"></event>
6730 <event name="OnMouseWheel"></event>
6731 <event name="OnPaint"></event>
6732 <event name="OnRightDClick"></event>
6733 <event name="OnRightDown"></event>
6734 <event name="OnRightUp"></event>
6735 <event name="OnSetFocus"></event>
6736 <event name="OnSize"></event>
6737 <event name="OnText"></event>
6738 <event name="OnTextEnter"></event>
6739 <event name="OnTextMaxLen"></event>
6740 <event name="OnTextURL"></event>
6741 <event name="OnUpdateUI"></event>
6742 </object>
6743 </object>
6744 <object class="sizeritem" expanded="1">
6745 <property name="border">5</property>
6746 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
6747 <property name="proportion">0</property>
6748 <object class="wxTextCtrl" expanded="1">
6749 <property name="bg"></property>
6750 <property name="context_help"></property>
6751 <property name="enabled">1</property>
6752 <property name="fg"></property>
6753 <property name="font"></property>
6754 <property name="hidden">0</property>
6755 <property name="id">wxID_ANY</property>
6756 <property name="maximum_size">-1,-1</property>
6757 <property name="maxlength">0</property>
6758 <property name="minimum_size">-1,-1</property>
6759 <property name="name">m_textCtrlField6</property>
6760 <property name="permission">protected</property>
6761 <property name="pos"></property>
6762 <property name="size">-1,-1</property>
6763 <property name="style"></property>
6764 <property name="subclass"></property>
6765 <property name="tooltip"></property>
6766 <property name="value"></property>
6767 <property name="window_extra_style"></property>
6768 <property name="window_name"></property>
6769 <property name="window_style"></property>
6770 <event name="OnChar"></event>
6771 <event name="OnEnterWindow"></event>
6772 <event name="OnEraseBackground"></event>
6773 <event name="OnKeyDown">OnKeyDown</event>
6774 <event name="OnKeyUp"></event>
6775 <event name="OnKillFocus"></event>
6776 <event name="OnLeaveWindow"></event>
6777 <event name="OnLeftDClick"></event>
6778 <event name="OnLeftDown"></event>
6779 <event name="OnLeftUp"></event>
6780 <event name="OnMiddleDClick"></event>
6781 <event name="OnMiddleDown"></event>
6782 <event name="OnMiddleUp"></event>
6783 <event name="OnMotion"></event>
6784 <event name="OnMouseEvents"></event>
6785 <event name="OnMouseWheel"></event>
6786 <event name="OnPaint"></event>
6787 <event name="OnRightDClick"></event>
6788 <event name="OnRightDown"></event>
6789 <event name="OnRightUp"></event>
6790 <event name="OnSetFocus"></event>
6791 <event name="OnSize"></event>
6792 <event name="OnText"></event>
6793 <event name="OnTextEnter"></event>
6794 <event name="OnTextMaxLen"></event>
6795 <event name="OnTextURL"></event>
6796 <event name="OnUpdateUI"></event>
6797 </object>
6798 </object>
6799 <object class="sizeritem" expanded="1">
6800 <property name="border">5</property>
6801 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
6802 <property name="proportion">0</property>
6803 <object class="wxButton" expanded="1">
6804 <property name="bg"></property>
6805 <property name="context_help"></property>
6806 <property name="default">0</property>
6807 <property name="enabled">1</property>
6808 <property name="fg"></property>
6809 <property name="font"></property>
6810 <property name="hidden">0</property>
6811 <property name="id">wxID_DEL6</property>
6812 <property name="label">Delete</property>
6813 <property name="maximum_size"></property>
6814 <property name="minimum_size">-1,-1</property>
6815 <property name="name">m_buttonDel6</property>
6816 <property name="permission">protected</property>
6817 <property name="pos"></property>
6818 <property name="size">60,20</property>
6819 <property name="style"></property>
6820 <property name="subclass"></property>
6821 <property name="tooltip"></property>
6822 <property name="window_extra_style"></property>
6823 <property name="window_name"></property>
6824 <property name="window_style"></property>
6825 <event name="OnButtonClick">OnButtonDel6</event>
6826 <event name="OnChar"></event>
6827 <event name="OnEnterWindow"></event>
6828 <event name="OnEraseBackground"></event>
6829 <event name="OnKeyDown"></event>
6830 <event name="OnKeyUp"></event>
6831 <event name="OnKillFocus"></event>
6832 <event name="OnLeaveWindow"></event>
6833 <event name="OnLeftDClick"></event>
6834 <event name="OnLeftDown"></event>
6835 <event name="OnLeftUp"></event>
6836 <event name="OnMiddleDClick"></event>
6837 <event name="OnMiddleDown"></event>
6838 <event name="OnMiddleUp"></event>
6839 <event name="OnMotion"></event>
6840 <event name="OnMouseEvents"></event>
6841 <event name="OnMouseWheel"></event>
6842 <event name="OnPaint"></event>
6843 <event name="OnRightDClick"></event>
6844 <event name="OnRightDown"></event>
6845 <event name="OnRightUp"></event>
6846 <event name="OnSetFocus"></event>
6847 <event name="OnSize"></event>
6848 <event name="OnUpdateUI"></event>
6849 </object>
6850 </object>
6851 <object class="sizeritem" expanded="1">
6852 <property name="border">5</property>
6853 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
6854 <property name="proportion">0</property>
6855 <object class="wxTextCtrl" expanded="1">
6856 <property name="bg"></property>
6857 <property name="context_help"></property>
6858 <property name="enabled">1</property>
6859 <property name="fg"></property>
6860 <property name="font"></property>
6861 <property name="hidden">0</property>
6862 <property name="id">wxID_ANY</property>
6863 <property name="maximum_size"></property>
6864 <property name="maxlength">0</property>
6865 <property name="minimum_size">150,-1</property>
6866 <property name="name">m_textCtrlLabel7</property>
6867 <property name="permission">protected</property>
6868 <property name="pos"></property>
6869 <property name="size"></property>
6870 <property name="style"></property>
6871 <property name="subclass"></property>
6872 <property name="tooltip"></property>
6873 <property name="value"></property>
6874 <property name="window_extra_style"></property>
6875 <property name="window_name"></property>
6876 <property name="window_style"></property>
6877 <event name="OnChar"></event>
6878 <event name="OnEnterWindow"></event>
6879 <event name="OnEraseBackground"></event>
6880 <event name="OnKeyDown">OnKeyDown</event>
6881 <event name="OnKeyUp"></event>
6882 <event name="OnKillFocus"></event>
6883 <event name="OnLeaveWindow"></event>
6884 <event name="OnLeftDClick"></event>
6885 <event name="OnLeftDown"></event>
6886 <event name="OnLeftUp"></event>
6887 <event name="OnMiddleDClick"></event>
6888 <event name="OnMiddleDown"></event>
6889 <event name="OnMiddleUp"></event>
6890 <event name="OnMotion"></event>
6891 <event name="OnMouseEvents"></event>
6892 <event name="OnMouseWheel"></event>
6893 <event name="OnPaint"></event>
6894 <event name="OnRightDClick"></event>
6895 <event name="OnRightDown"></event>
6896 <event name="OnRightUp"></event>
6897 <event name="OnSetFocus"></event>
6898 <event name="OnSize"></event>
6899 <event name="OnText"></event>
6900 <event name="OnTextEnter"></event>
6901 <event name="OnTextMaxLen"></event>
6902 <event name="OnTextURL"></event>
6903 <event name="OnUpdateUI"></event>
6904 </object>
6905 </object>
6906 <object class="sizeritem" expanded="1">
6907 <property name="border">5</property>
6908 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
6909 <property name="proportion">0</property>
6910 <object class="wxTextCtrl" expanded="1">
6911 <property name="bg"></property>
6912 <property name="context_help"></property>
6913 <property name="enabled">1</property>
6914 <property name="fg"></property>
6915 <property name="font"></property>
6916 <property name="hidden">0</property>
6917 <property name="id">wxID_ANY</property>
6918 <property name="maximum_size">-1,-1</property>
6919 <property name="maxlength">0</property>
6920 <property name="minimum_size">-1,-1</property>
6921 <property name="name">m_textCtrlField7</property>
6922 <property name="permission">protected</property>
6923 <property name="pos"></property>
6924 <property name="size">-1,-1</property>
6925 <property name="style"></property>
6926 <property name="subclass"></property>
6927 <property name="tooltip"></property>
6928 <property name="value"></property>
6929 <property name="window_extra_style"></property>
6930 <property name="window_name"></property>
6931 <property name="window_style"></property>
6932 <event name="OnChar"></event>
6933 <event name="OnEnterWindow"></event>
6934 <event name="OnEraseBackground"></event>
6935 <event name="OnKeyDown">OnKeyDown</event>
6936 <event name="OnKeyUp"></event>
6937 <event name="OnKillFocus"></event>
6938 <event name="OnLeaveWindow"></event>
6939 <event name="OnLeftDClick"></event>
6940 <event name="OnLeftDown"></event>
6941 <event name="OnLeftUp"></event>
6942 <event name="OnMiddleDClick"></event>
6943 <event name="OnMiddleDown"></event>
6944 <event name="OnMiddleUp"></event>
6945 <event name="OnMotion"></event>
6946 <event name="OnMouseEvents"></event>
6947 <event name="OnMouseWheel"></event>
6948 <event name="OnPaint"></event>
6949 <event name="OnRightDClick"></event>
6950 <event name="OnRightDown"></event>
6951 <event name="OnRightUp"></event>
6952 <event name="OnSetFocus"></event>
6953 <event name="OnSize"></event>
6954 <event name="OnText"></event>
6955 <event name="OnTextEnter"></event>
6956 <event name="OnTextMaxLen"></event>
6957 <event name="OnTextURL"></event>
6958 <event name="OnUpdateUI"></event>
6959 </object>
6960 </object>
6961 <object class="sizeritem" expanded="1">
6962 <property name="border">5</property>
6963 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
6964 <property name="proportion">0</property>
6965 <object class="wxButton" expanded="1">
6966 <property name="bg"></property>
6967 <property name="context_help"></property>
6968 <property name="default">0</property>
6969 <property name="enabled">1</property>
6970 <property name="fg"></property>
6971 <property name="font"></property>
6972 <property name="hidden">0</property>
6973 <property name="id">wxID_DEL7</property>
6974 <property name="label">Delete</property>
6975 <property name="maximum_size"></property>
6976 <property name="minimum_size">-1,-1</property>
6977 <property name="name">m_buttonDel7</property>
6978 <property name="permission">protected</property>
6979 <property name="pos"></property>
6980 <property name="size">60,20</property>
6981 <property name="style"></property>
6982 <property name="subclass"></property>
6983 <property name="tooltip"></property>
6984 <property name="window_extra_style"></property>
6985 <property name="window_name"></property>
6986 <property name="window_style"></property>
6987 <event name="OnButtonClick">OnButtonDel7</event>
6988 <event name="OnChar"></event>
6989 <event name="OnEnterWindow"></event>
6990 <event name="OnEraseBackground"></event>
6991 <event name="OnKeyDown"></event>
6992 <event name="OnKeyUp"></event>
6993 <event name="OnKillFocus"></event>
6994 <event name="OnLeaveWindow"></event>
6995 <event name="OnLeftDClick"></event>
6996 <event name="OnLeftDown"></event>
6997 <event name="OnLeftUp"></event>
6998 <event name="OnMiddleDClick"></event>
6999 <event name="OnMiddleDown"></event>
7000 <event name="OnMiddleUp"></event>
7001 <event name="OnMotion"></event>
7002 <event name="OnMouseEvents"></event>
7003 <event name="OnMouseWheel"></event>
7004 <event name="OnPaint"></event>
7005 <event name="OnRightDClick"></event>
7006 <event name="OnRightDown"></event>
7007 <event name="OnRightUp"></event>
7008 <event name="OnSetFocus"></event>
7009 <event name="OnSize"></event>
7010 <event name="OnUpdateUI"></event>
7011 </object>
7012 </object>
7013 <object class="sizeritem" expanded="1">
7014 <property name="border">5</property>
7015 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
7016 <property name="proportion">0</property>
7017 <object class="wxTextCtrl" expanded="1">
7018 <property name="bg"></property>
7019 <property name="context_help"></property>
7020 <property name="enabled">1</property>
7021 <property name="fg"></property>
7022 <property name="font"></property>
7023 <property name="hidden">0</property>
7024 <property name="id">wxID_ANY</property>
7025 <property name="maximum_size"></property>
7026 <property name="maxlength">0</property>
7027 <property name="minimum_size">150,-1</property>
7028 <property name="name">m_textCtrlLabel8</property>
7029 <property name="permission">protected</property>
7030 <property name="pos"></property>
7031 <property name="size"></property>
7032 <property name="style"></property>
7033 <property name="subclass"></property>
7034 <property name="tooltip"></property>
7035 <property name="value"></property>
7036 <property name="window_extra_style"></property>
7037 <property name="window_name"></property>
7038 <property name="window_style"></property>
7039 <event name="OnChar"></event>
7040 <event name="OnEnterWindow"></event>
7041 <event name="OnEraseBackground"></event>
7042 <event name="OnKeyDown">OnKeyDown</event>
7043 <event name="OnKeyUp"></event>
7044 <event name="OnKillFocus"></event>
7045 <event name="OnLeaveWindow"></event>
7046 <event name="OnLeftDClick"></event>
7047 <event name="OnLeftDown"></event>
7048 <event name="OnLeftUp"></event>
7049 <event name="OnMiddleDClick"></event>
7050 <event name="OnMiddleDown"></event>
7051 <event name="OnMiddleUp"></event>
7052 <event name="OnMotion"></event>
7053 <event name="OnMouseEvents"></event>
7054 <event name="OnMouseWheel"></event>
7055 <event name="OnPaint"></event>
7056 <event name="OnRightDClick"></event>
7057 <event name="OnRightDown"></event>
7058 <event name="OnRightUp"></event>
7059 <event name="OnSetFocus"></event>
7060 <event name="OnSize"></event>
7061 <event name="OnText"></event>
7062 <event name="OnTextEnter"></event>
7063 <event name="OnTextMaxLen"></event>
7064 <event name="OnTextURL"></event>
7065 <event name="OnUpdateUI"></event>
7066 </object>
7067 </object>
7068 <object class="sizeritem" expanded="1">
7069 <property name="border">5</property>
7070 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
7071 <property name="proportion">0</property>
7072 <object class="wxTextCtrl" expanded="1">
7073 <property name="bg"></property>
7074 <property name="context_help"></property>
7075 <property name="enabled">1</property>
7076 <property name="fg"></property>
7077 <property name="font"></property>
7078 <property name="hidden">0</property>
7079 <property name="id">wxID_ANY</property>
7080 <property name="maximum_size">-1,-1</property>
7081 <property name="maxlength">0</property>
7082 <property name="minimum_size">-1,-1</property>
7083 <property name="name">m_textCtrlField8</property>
7084 <property name="permission">protected</property>
7085 <property name="pos"></property>
7086 <property name="size">-1,-1</property>
7087 <property name="style"></property>
7088 <property name="subclass"></property>
7089 <property name="tooltip"></property>
7090 <property name="value"></property>
7091 <property name="window_extra_style"></property>
7092 <property name="window_name"></property>
7093 <property name="window_style"></property>
7094 <event name="OnChar"></event>
7095 <event name="OnEnterWindow"></event>
7096 <event name="OnEraseBackground"></event>
7097 <event name="OnKeyDown">OnKeyDown</event>
7098 <event name="OnKeyUp"></event>
7099 <event name="OnKillFocus"></event>
7100 <event name="OnLeaveWindow"></event>
7101 <event name="OnLeftDClick"></event>
7102 <event name="OnLeftDown"></event>
7103 <event name="OnLeftUp"></event>
7104 <event name="OnMiddleDClick"></event>
7105 <event name="OnMiddleDown"></event>
7106 <event name="OnMiddleUp"></event>
7107 <event name="OnMotion"></event>
7108 <event name="OnMouseEvents"></event>
7109 <event name="OnMouseWheel"></event>
7110 <event name="OnPaint"></event>
7111 <event name="OnRightDClick"></event>
7112 <event name="OnRightDown"></event>
7113 <event name="OnRightUp"></event>
7114 <event name="OnSetFocus"></event>
7115 <event name="OnSize"></event>
7116 <event name="OnText"></event>
7117 <event name="OnTextEnter"></event>
7118 <event name="OnTextMaxLen"></event>
7119 <event name="OnTextURL"></event>
7120 <event name="OnUpdateUI"></event>
7121 </object>
7122 </object>
7123 <object class="sizeritem" expanded="1">
7124 <property name="border">5</property>
7125 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
7126 <property name="proportion">0</property>
7127 <object class="wxButton" expanded="1">
7128 <property name="bg"></property>
7129 <property name="context_help"></property>
7130 <property name="default">0</property>
7131 <property name="enabled">1</property>
7132 <property name="fg"></property>
7133 <property name="font"></property>
7134 <property name="hidden">0</property>
7135 <property name="id">wxID_DEL8</property>
7136 <property name="label">Delete</property>
7137 <property name="maximum_size"></property>
7138 <property name="minimum_size">-1,-1</property>
7139 <property name="name">m_buttonDel8</property>
7140 <property name="permission">protected</property>
7141 <property name="pos"></property>
7142 <property name="size">60,20</property>
7143 <property name="style"></property>
7144 <property name="subclass"></property>
7145 <property name="tooltip"></property>
7146 <property name="window_extra_style"></property>
7147 <property name="window_name"></property>
7148 <property name="window_style"></property>
7149 <event name="OnButtonClick">OnButtonDel8</event>
7150 <event name="OnChar"></event>
7151 <event name="OnEnterWindow"></event>
7152 <event name="OnEraseBackground"></event>
7153 <event name="OnKeyDown"></event>
7154 <event name="OnKeyUp"></event>
7155 <event name="OnKillFocus"></event>
7156 <event name="OnLeaveWindow"></event>
7157 <event name="OnLeftDClick"></event>
7158 <event name="OnLeftDown"></event>
7159 <event name="OnLeftUp"></event>
7160 <event name="OnMiddleDClick"></event>
7161 <event name="OnMiddleDown"></event>
7162 <event name="OnMiddleUp"></event>
7163 <event name="OnMotion"></event>
7164 <event name="OnMouseEvents"></event>
7165 <event name="OnMouseWheel"></event>
7166 <event name="OnPaint"></event>
7167 <event name="OnRightDClick"></event>
7168 <event name="OnRightDown"></event>
7169 <event name="OnRightUp"></event>
7170 <event name="OnSetFocus"></event>
7171 <event name="OnSize"></event>
7172 <event name="OnUpdateUI"></event>
7173 </object>
7174 </object>
7175 <object class="sizeritem" expanded="1">
7176 <property name="border">5</property>
7177 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
7178 <property name="proportion">0</property>
7179 <object class="wxTextCtrl" expanded="1">
7180 <property name="bg"></property>
7181 <property name="context_help"></property>
7182 <property name="enabled">1</property>
7183 <property name="fg"></property>
7184 <property name="font"></property>
7185 <property name="hidden">0</property>
7186 <property name="id">wxID_ANY</property>
7187 <property name="maximum_size"></property>
7188 <property name="maxlength">0</property>
7189 <property name="minimum_size">150,-1</property>
7190 <property name="name">m_textCtrlLabel9</property>
7191 <property name="permission">protected</property>
7192 <property name="pos"></property>
7193 <property name="size"></property>
7194 <property name="style"></property>
7195 <property name="subclass"></property>
7196 <property name="tooltip"></property>
7197 <property name="value"></property>
7198 <property name="window_extra_style"></property>
7199 <property name="window_name"></property>
7200 <property name="window_style"></property>
7201 <event name="OnChar"></event>
7202 <event name="OnEnterWindow"></event>
7203 <event name="OnEraseBackground"></event>
7204 <event name="OnKeyDown">OnKeyDown</event>
7205 <event name="OnKeyUp"></event>
7206 <event name="OnKillFocus"></event>
7207 <event name="OnLeaveWindow"></event>
7208 <event name="OnLeftDClick"></event>
7209 <event name="OnLeftDown"></event>
7210 <event name="OnLeftUp"></event>
7211 <event name="OnMiddleDClick"></event>
7212 <event name="OnMiddleDown"></event>
7213 <event name="OnMiddleUp"></event>
7214 <event name="OnMotion"></event>
7215 <event name="OnMouseEvents"></event>
7216 <event name="OnMouseWheel"></event>
7217 <event name="OnPaint"></event>
7218 <event name="OnRightDClick"></event>
7219 <event name="OnRightDown"></event>
7220 <event name="OnRightUp"></event>
7221 <event name="OnSetFocus"></event>
7222 <event name="OnSize"></event>
7223 <event name="OnText"></event>
7224 <event name="OnTextEnter"></event>
7225 <event name="OnTextMaxLen"></event>
7226 <event name="OnTextURL"></event>
7227 <event name="OnUpdateUI"></event>
7228 </object>
7229 </object>
7230 <object class="sizeritem" expanded="1">
7231 <property name="border">5</property>
7232 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
7233 <property name="proportion">0</property>
7234 <object class="wxTextCtrl" expanded="1">
7235 <property name="bg"></property>
7236 <property name="context_help"></property>
7237 <property name="enabled">1</property>
7238 <property name="fg"></property>
7239 <property name="font"></property>
7240 <property name="hidden">0</property>
7241 <property name="id">wxID_ANY</property>
7242 <property name="maximum_size">-1,-1</property>
7243 <property name="maxlength">0</property>
7244 <property name="minimum_size">-1,-1</property>
7245 <property name="name">m_textCtrlField9</property>
7246 <property name="permission">protected</property>
7247 <property name="pos"></property>
7248 <property name="size">-1,-1</property>
7249 <property name="style"></property>
7250 <property name="subclass"></property>
7251 <property name="tooltip"></property>
7252 <property name="value"></property>
7253 <property name="window_extra_style"></property>
7254 <property name="window_name"></property>
7255 <property name="window_style"></property>
7256 <event name="OnChar"></event>
7257 <event name="OnEnterWindow"></event>
7258 <event name="OnEraseBackground"></event>
7259 <event name="OnKeyDown">OnKeyDown</event>
7260 <event name="OnKeyUp"></event>
7261 <event name="OnKillFocus"></event>
7262 <event name="OnLeaveWindow"></event>
7263 <event name="OnLeftDClick"></event>
7264 <event name="OnLeftDown"></event>
7265 <event name="OnLeftUp"></event>
7266 <event name="OnMiddleDClick"></event>
7267 <event name="OnMiddleDown"></event>
7268 <event name="OnMiddleUp"></event>
7269 <event name="OnMotion"></event>
7270 <event name="OnMouseEvents"></event>
7271 <event name="OnMouseWheel"></event>
7272 <event name="OnPaint"></event>
7273 <event name="OnRightDClick"></event>
7274 <event name="OnRightDown"></event>
7275 <event name="OnRightUp"></event>
7276 <event name="OnSetFocus"></event>
7277 <event name="OnSize"></event>
7278 <event name="OnText"></event>
7279 <event name="OnTextEnter"></event>
7280 <event name="OnTextMaxLen"></event>
7281 <event name="OnTextURL"></event>
7282 <event name="OnUpdateUI"></event>
7283 </object>
7284 </object>
7285 <object class="sizeritem" expanded="1">
7286 <property name="border">5</property>
7287 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
7288 <property name="proportion">0</property>
7289 <object class="wxButton" expanded="1">
7290 <property name="bg"></property>
7291 <property name="context_help"></property>
7292 <property name="default">0</property>
7293 <property name="enabled">1</property>
7294 <property name="fg"></property>
7295 <property name="font"></property>
7296 <property name="hidden">0</property>
7297 <property name="id">wxID_DEL9</property>
7298 <property name="label">Delete</property>
7299 <property name="maximum_size"></property>
7300 <property name="minimum_size">-1,-1</property>
7301 <property name="name">m_buttonDel9</property>
7302 <property name="permission">protected</property>
7303 <property name="pos"></property>
7304 <property name="size">60,20</property>
7305 <property name="style"></property>
7306 <property name="subclass"></property>
7307 <property name="tooltip"></property>
7308 <property name="window_extra_style"></property>
7309 <property name="window_name"></property>
7310 <property name="window_style"></property>
7311 <event name="OnButtonClick">OnButtonDel9</event>
7312 <event name="OnChar"></event>
7313 <event name="OnEnterWindow"></event>
7314 <event name="OnEraseBackground"></event>
7315 <event name="OnKeyDown"></event>
7316 <event name="OnKeyUp"></event>
7317 <event name="OnKillFocus"></event>
7318 <event name="OnLeaveWindow"></event>
7319 <event name="OnLeftDClick"></event>
7320 <event name="OnLeftDown"></event>
7321 <event name="OnLeftUp"></event>
7322 <event name="OnMiddleDClick"></event>
7323 <event name="OnMiddleDown"></event>
7324 <event name="OnMiddleUp"></event>
7325 <event name="OnMotion"></event>
7326 <event name="OnMouseEvents"></event>
7327 <event name="OnMouseWheel"></event>
7328 <event name="OnPaint"></event>
7329 <event name="OnRightDClick"></event>
7330 <event name="OnRightDown"></event>
7331 <event name="OnRightUp"></event>
7332 <event name="OnSetFocus"></event>
7333 <event name="OnSize"></event>
7334 <event name="OnUpdateUI"></event>
7335 </object>
7336 </object>
7337 <object class="sizeritem" expanded="1">
7338 <property name="border">5</property>
7339 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
7340 <property name="proportion">0</property>
7341 <object class="wxTextCtrl" expanded="1">
7342 <property name="bg"></property>
7343 <property name="context_help"></property>
7344 <property name="enabled">1</property>
7345 <property name="fg"></property>
7346 <property name="font"></property>
7347 <property name="hidden">0</property>
7348 <property name="id">wxID_ANY</property>
7349 <property name="maximum_size"></property>
7350 <property name="maxlength">0</property>
7351 <property name="minimum_size">150,-1</property>
7352 <property name="name">m_textCtrlLabel10</property>
7353 <property name="permission">protected</property>
7354 <property name="pos"></property>
7355 <property name="size"></property>
7356 <property name="style"></property>
7357 <property name="subclass"></property>
7358 <property name="tooltip"></property>
7359 <property name="value"></property>
7360 <property name="window_extra_style"></property>
7361 <property name="window_name"></property>
7362 <property name="window_style"></property>
7363 <event name="OnChar"></event>
7364 <event name="OnEnterWindow"></event>
7365 <event name="OnEraseBackground"></event>
7366 <event name="OnKeyDown">OnKeyDown</event>
7367 <event name="OnKeyUp"></event>
7368 <event name="OnKillFocus"></event>
7369 <event name="OnLeaveWindow"></event>
7370 <event name="OnLeftDClick"></event>
7371 <event name="OnLeftDown"></event>
7372 <event name="OnLeftUp"></event>
7373 <event name="OnMiddleDClick"></event>
7374 <event name="OnMiddleDown"></event>
7375 <event name="OnMiddleUp"></event>
7376 <event name="OnMotion"></event>
7377 <event name="OnMouseEvents"></event>
7378 <event name="OnMouseWheel"></event>
7379 <event name="OnPaint"></event>
7380 <event name="OnRightDClick"></event>
7381 <event name="OnRightDown"></event>
7382 <event name="OnRightUp"></event>
7383 <event name="OnSetFocus"></event>
7384 <event name="OnSize"></event>
7385 <event name="OnText"></event>
7386 <event name="OnTextEnter"></event>
7387 <event name="OnTextMaxLen"></event>
7388 <event name="OnTextURL"></event>
7389 <event name="OnUpdateUI"></event>
7390 </object>
7391 </object>
7392 <object class="sizeritem" expanded="1">
7393 <property name="border">5</property>
7394 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
7395 <property name="proportion">0</property>
7396 <object class="wxTextCtrl" expanded="1">
7397 <property name="bg"></property>
7398 <property name="context_help"></property>
7399 <property name="enabled">1</property>
7400 <property name="fg"></property>
7401 <property name="font"></property>
7402 <property name="hidden">0</property>
7403 <property name="id">wxID_ANY</property>
7404 <property name="maximum_size">-1,-1</property>
7405 <property name="maxlength">0</property>
7406 <property name="minimum_size">-1,-1</property>
7407 <property name="name">m_textCtrlField10</property>
7408 <property name="permission">protected</property>
7409 <property name="pos"></property>
7410 <property name="size">-1,-1</property>
7411 <property name="style"></property>
7412 <property name="subclass"></property>
7413 <property name="tooltip"></property>
7414 <property name="value"></property>
7415 <property name="window_extra_style"></property>
7416 <property name="window_name"></property>
7417 <property name="window_style"></property>
7418 <event name="OnChar"></event>
7419 <event name="OnEnterWindow"></event>
7420 <event name="OnEraseBackground"></event>
7421 <event name="OnKeyDown">OnKeyDown</event>
7422 <event name="OnKeyUp"></event>
7423 <event name="OnKillFocus"></event>
7424 <event name="OnLeaveWindow"></event>
7425 <event name="OnLeftDClick"></event>
7426 <event name="OnLeftDown"></event>
7427 <event name="OnLeftUp"></event>
7428 <event name="OnMiddleDClick"></event>
7429 <event name="OnMiddleDown"></event>
7430 <event name="OnMiddleUp"></event>
7431 <event name="OnMotion"></event>
7432 <event name="OnMouseEvents"></event>
7433 <event name="OnMouseWheel"></event>
7434 <event name="OnPaint"></event>
7435 <event name="OnRightDClick"></event>
7436 <event name="OnRightDown"></event>
7437 <event name="OnRightUp"></event>
7438 <event name="OnSetFocus"></event>
7439 <event name="OnSize"></event>
7440 <event name="OnText"></event>
7441 <event name="OnTextEnter"></event>
7442 <event name="OnTextMaxLen"></event>
7443 <event name="OnTextURL"></event>
7444 <event name="OnUpdateUI"></event>
7445 </object>
7446 </object>
7447 <object class="sizeritem" expanded="1">
7448 <property name="border">5</property>
7449 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
7450 <property name="proportion">0</property>
7451 <object class="wxButton" expanded="1">
7452 <property name="bg"></property>
7453 <property name="context_help"></property>
7454 <property name="default">0</property>
7455 <property name="enabled">1</property>
7456 <property name="fg"></property>
7457 <property name="font"></property>
7458 <property name="hidden">0</property>
7459 <property name="id">wxID_DEL10</property>
7460 <property name="label">Delete</property>
7461 <property name="maximum_size"></property>
7462 <property name="minimum_size">-1,-1</property>
7463 <property name="name">m_buttonDel10</property>
7464 <property name="permission">protected</property>
7465 <property name="pos"></property>
7466 <property name="size">60,20</property>
7467 <property name="style"></property>
7468 <property name="subclass"></property>
7469 <property name="tooltip"></property>
7470 <property name="window_extra_style"></property>
7471 <property name="window_name"></property>
7472 <property name="window_style"></property>
7473 <event name="OnButtonClick">OnButtonDel10</event>
7474 <event name="OnChar"></event>
7475 <event name="OnEnterWindow"></event>
7476 <event name="OnEraseBackground"></event>
7477 <event name="OnKeyDown"></event>
7478 <event name="OnKeyUp"></event>
7479 <event name="OnKillFocus"></event>
7480 <event name="OnLeaveWindow"></event>
7481 <event name="OnLeftDClick"></event>
7482 <event name="OnLeftDown"></event>
7483 <event name="OnLeftUp"></event>
7484 <event name="OnMiddleDClick"></event>
7485 <event name="OnMiddleDown"></event>
7486 <event name="OnMiddleUp"></event>
7487 <event name="OnMotion"></event>
7488 <event name="OnMouseEvents"></event>
7489 <event name="OnMouseWheel"></event>
7490 <event name="OnPaint"></event>
7491 <event name="OnRightDClick"></event>
7492 <event name="OnRightDown"></event>
7493 <event name="OnRightUp"></event>
7494 <event name="OnSetFocus"></event>
7495 <event name="OnSize"></event>
7496 <event name="OnUpdateUI"></event>
7497 </object>
7498 </object>
7499 <object class="sizeritem" expanded="1">
7500 <property name="border">5</property>
7501 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
7502 <property name="proportion">0</property>
7503 <object class="wxTextCtrl" expanded="1">
7504 <property name="bg"></property>
7505 <property name="context_help"></property>
7506 <property name="enabled">1</property>
7507 <property name="fg"></property>
7508 <property name="font"></property>
7509 <property name="hidden">0</property>
7510 <property name="id">wxID_ANY</property>
7511 <property name="maximum_size"></property>
7512 <property name="maxlength">0</property>
7513 <property name="minimum_size">150,-1</property>
7514 <property name="name">m_textCtrlLabel11</property>
7515 <property name="permission">protected</property>
7516 <property name="pos"></property>
7517 <property name="size"></property>
7518 <property name="style"></property>
7519 <property name="subclass"></property>
7520 <property name="tooltip"></property>
7521 <property name="value"></property>
7522 <property name="window_extra_style"></property>
7523 <property name="window_name"></property>
7524 <property name="window_style"></property>
7525 <event name="OnChar"></event>
7526 <event name="OnEnterWindow"></event>
7527 <event name="OnEraseBackground"></event>
7528 <event name="OnKeyDown">OnKeyDown</event>
7529 <event name="OnKeyUp"></event>
7530 <event name="OnKillFocus"></event>
7531 <event name="OnLeaveWindow"></event>
7532 <event name="OnLeftDClick"></event>
7533 <event name="OnLeftDown"></event>
7534 <event name="OnLeftUp"></event>
7535 <event name="OnMiddleDClick"></event>
7536 <event name="OnMiddleDown"></event>
7537 <event name="OnMiddleUp"></event>
7538 <event name="OnMotion"></event>
7539 <event name="OnMouseEvents"></event>
7540 <event name="OnMouseWheel"></event>
7541 <event name="OnPaint"></event>
7542 <event name="OnRightDClick"></event>
7543 <event name="OnRightDown"></event>
7544 <event name="OnRightUp"></event>
7545 <event name="OnSetFocus"></event>
7546 <event name="OnSize"></event>
7547 <event name="OnText"></event>
7548 <event name="OnTextEnter"></event>
7549 <event name="OnTextMaxLen"></event>
7550 <event name="OnTextURL"></event>
7551 <event name="OnUpdateUI"></event>
7552 </object>
7553 </object>
7554 <object class="sizeritem" expanded="1">
7555 <property name="border">5</property>
7556 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
7557 <property name="proportion">0</property>
7558 <object class="wxTextCtrl" expanded="1">
7559 <property name="bg"></property>
7560 <property name="context_help"></property>
7561 <property name="enabled">1</property>
7562 <property name="fg"></property>
7563 <property name="font"></property>
7564 <property name="hidden">0</property>
7565 <property name="id">wxID_ANY</property>
7566 <property name="maximum_size">-1,-1</property>
7567 <property name="maxlength">0</property>
7568 <property name="minimum_size">-1,-1</property>
7569 <property name="name">m_textCtrlField11</property>
7570 <property name="permission">protected</property>
7571 <property name="pos"></property>
7572 <property name="size">-1,-1</property>
7573 <property name="style"></property>
7574 <property name="subclass"></property>
7575 <property name="tooltip"></property>
7576 <property name="value"></property>
7577 <property name="window_extra_style"></property>
7578 <property name="window_name"></property>
7579 <property name="window_style"></property>
7580 <event name="OnChar"></event>
7581 <event name="OnEnterWindow"></event>
7582 <event name="OnEraseBackground"></event>
7583 <event name="OnKeyDown">OnKeyDown</event>
7584 <event name="OnKeyUp"></event>
7585 <event name="OnKillFocus"></event>
7586 <event name="OnLeaveWindow"></event>
7587 <event name="OnLeftDClick"></event>
7588 <event name="OnLeftDown"></event>
7589 <event name="OnLeftUp"></event>
7590 <event name="OnMiddleDClick"></event>
7591 <event name="OnMiddleDown"></event>
7592 <event name="OnMiddleUp"></event>
7593 <event name="OnMotion"></event>
7594 <event name="OnMouseEvents"></event>
7595 <event name="OnMouseWheel"></event>
7596 <event name="OnPaint"></event>
7597 <event name="OnRightDClick"></event>
7598 <event name="OnRightDown"></event>
7599 <event name="OnRightUp"></event>
7600 <event name="OnSetFocus"></event>
7601 <event name="OnSize"></event>
7602 <event name="OnText"></event>
7603 <event name="OnTextEnter"></event>
7604 <event name="OnTextMaxLen"></event>
7605 <event name="OnTextURL"></event>
7606 <event name="OnUpdateUI"></event>
7607 </object>
7608 </object>
7609 <object class="sizeritem" expanded="1">
7610 <property name="border">5</property>
7611 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
7612 <property name="proportion">0</property>
7613 <object class="wxButton" expanded="1">
7614 <property name="bg"></property>
7615 <property name="context_help"></property>
7616 <property name="default">0</property>
7617 <property name="enabled">1</property>
7618 <property name="fg"></property>
7619 <property name="font"></property>
7620 <property name="hidden">0</property>
7621 <property name="id">wxID_DEL11</property>
7622 <property name="label">Delete</property>
7623 <property name="maximum_size"></property>
7624 <property name="minimum_size">-1,-1</property>
7625 <property name="name">m_buttonDel11</property>
7626 <property name="permission">protected</property>
7627 <property name="pos"></property>
7628 <property name="size">60,20</property>
7629 <property name="style"></property>
7630 <property name="subclass"></property>
7631 <property name="tooltip"></property>
7632 <property name="window_extra_style"></property>
7633 <property name="window_name"></property>
7634 <property name="window_style"></property>
7635 <event name="OnButtonClick">OnButtonDel11</event>
7636 <event name="OnChar"></event>
7637 <event name="OnEnterWindow"></event>
7638 <event name="OnEraseBackground"></event>
7639 <event name="OnKeyDown"></event>
7640 <event name="OnKeyUp"></event>
7641 <event name="OnKillFocus"></event>
7642 <event name="OnLeaveWindow"></event>
7643 <event name="OnLeftDClick"></event>
7644 <event name="OnLeftDown"></event>
7645 <event name="OnLeftUp"></event>
7646 <event name="OnMiddleDClick"></event>
7647 <event name="OnMiddleDown"></event>
7648 <event name="OnMiddleUp"></event>
7649 <event name="OnMotion"></event>
7650 <event name="OnMouseEvents"></event>
7651 <event name="OnMouseWheel"></event>
7652 <event name="OnPaint"></event>
7653 <event name="OnRightDClick"></event>
7654 <event name="OnRightDown"></event>
7655 <event name="OnRightUp"></event>
7656 <event name="OnSetFocus"></event>
7657 <event name="OnSize"></event>
7658 <event name="OnUpdateUI"></event>
7659 </object>
7660 </object>
7661 <object class="sizeritem" expanded="1">
7662 <property name="border">5</property>
7663 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
7664 <property name="proportion">0</property>
7665 <object class="wxTextCtrl" expanded="1">
7666 <property name="bg"></property>
7667 <property name="context_help"></property>
7668 <property name="enabled">1</property>
7669 <property name="fg"></property>
7670 <property name="font"></property>
7671 <property name="hidden">0</property>
7672 <property name="id">wxID_ANY</property>
7673 <property name="maximum_size"></property>
7674 <property name="maxlength">0</property>
7675 <property name="minimum_size">150,-1</property>
7676 <property name="name">m_textCtrlLabel12</property>
7677 <property name="permission">protected</property>
7678 <property name="pos"></property>
7679 <property name="size"></property>
7680 <property name="style"></property>
7681 <property name="subclass"></property>
7682 <property name="tooltip"></property>
7683 <property name="value"></property>
7684 <property name="window_extra_style"></property>
7685 <property name="window_name"></property>
7686 <property name="window_style"></property>
7687 <event name="OnChar"></event>
7688 <event name="OnEnterWindow"></event>
7689 <event name="OnEraseBackground"></event>
7690 <event name="OnKeyDown">OnKeyDown</event>
7691 <event name="OnKeyUp"></event>
7692 <event name="OnKillFocus"></event>
7693 <event name="OnLeaveWindow"></event>
7694 <event name="OnLeftDClick"></event>
7695 <event name="OnLeftDown"></event>
7696 <event name="OnLeftUp"></event>
7697 <event name="OnMiddleDClick"></event>
7698 <event name="OnMiddleDown"></event>
7699 <event name="OnMiddleUp"></event>
7700 <event name="OnMotion"></event>
7701 <event name="OnMouseEvents"></event>
7702 <event name="OnMouseWheel"></event>
7703 <event name="OnPaint"></event>
7704 <event name="OnRightDClick"></event>
7705 <event name="OnRightDown"></event>
7706 <event name="OnRightUp"></event>
7707 <event name="OnSetFocus"></event>
7708 <event name="OnSize"></event>
7709 <event name="OnText"></event>
7710 <event name="OnTextEnter"></event>
7711 <event name="OnTextMaxLen"></event>
7712 <event name="OnTextURL"></event>
7713 <event name="OnUpdateUI"></event>
7714 </object>
7715 </object>
7716 <object class="sizeritem" expanded="1">
7717 <property name="border">5</property>
7718 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
7719 <property name="proportion">0</property>
7720 <object class="wxTextCtrl" expanded="1">
7721 <property name="bg"></property>
7722 <property name="context_help"></property>
7723 <property name="enabled">1</property>
7724 <property name="fg"></property>
7725 <property name="font"></property>
7726 <property name="hidden">0</property>
7727 <property name="id">wxID_ANY</property>
7728 <property name="maximum_size">-1,-1</property>
7729 <property name="maxlength">0</property>
7730 <property name="minimum_size">-1,-1</property>
7731 <property name="name">m_textCtrlField12</property>
7732 <property name="permission">protected</property>
7733 <property name="pos"></property>
7734 <property name="size">-1,-1</property>
7735 <property name="style"></property>
7736 <property name="subclass"></property>
7737 <property name="tooltip"></property>
7738 <property name="value"></property>
7739 <property name="window_extra_style"></property>
7740 <property name="window_name"></property>
7741 <property name="window_style"></property>
7742 <event name="OnChar"></event>
7743 <event name="OnEnterWindow"></event>
7744 <event name="OnEraseBackground"></event>
7745 <event name="OnKeyDown">OnKeyDown</event>
7746 <event name="OnKeyUp"></event>
7747 <event name="OnKillFocus"></event>
7748 <event name="OnLeaveWindow"></event>
7749 <event name="OnLeftDClick"></event>
7750 <event name="OnLeftDown"></event>
7751 <event name="OnLeftUp"></event>
7752 <event name="OnMiddleDClick"></event>
7753 <event name="OnMiddleDown"></event>
7754 <event name="OnMiddleUp"></event>
7755 <event name="OnMotion"></event>
7756 <event name="OnMouseEvents"></event>
7757 <event name="OnMouseWheel"></event>
7758 <event name="OnPaint"></event>
7759 <event name="OnRightDClick"></event>
7760 <event name="OnRightDown"></event>
7761 <event name="OnRightUp"></event>
7762 <event name="OnSetFocus"></event>
7763 <event name="OnSize"></event>
7764 <event name="OnText"></event>
7765 <event name="OnTextEnter"></event>
7766 <event name="OnTextMaxLen"></event>
7767 <event name="OnTextURL"></event>
7768 <event name="OnUpdateUI"></event>
7769 </object>
7770 </object>
7771 <object class="sizeritem" expanded="1">
7772 <property name="border">5</property>
7773 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
7774 <property name="proportion">0</property>
7775 <object class="wxButton" expanded="1">
7776 <property name="bg"></property>
7777 <property name="context_help"></property>
7778 <property name="default">0</property>
7779 <property name="enabled">1</property>
7780 <property name="fg"></property>
7781 <property name="font"></property>
7782 <property name="hidden">0</property>
7783 <property name="id">wxID_DEL12</property>
7784 <property name="label">Delete</property>
7785 <property name="maximum_size"></property>
7786 <property name="minimum_size">-1,-1</property>
7787 <property name="name">m_buttonDel12</property>
7788 <property name="permission">protected</property>
7789 <property name="pos"></property>
7790 <property name="size">60,20</property>
7791 <property name="style"></property>
7792 <property name="subclass"></property>
7793 <property name="tooltip"></property>
7794 <property name="window_extra_style"></property>
7795 <property name="window_name"></property>
7796 <property name="window_style"></property>
7797 <event name="OnButtonClick">OnButtonDel12</event>
7798 <event name="OnChar"></event>
7799 <event name="OnEnterWindow"></event>
7800 <event name="OnEraseBackground"></event>
7801 <event name="OnKeyDown"></event>
7802 <event name="OnKeyUp"></event>
7803 <event name="OnKillFocus"></event>
7804 <event name="OnLeaveWindow"></event>
7805 <event name="OnLeftDClick"></event>
7806 <event name="OnLeftDown"></event>
7807 <event name="OnLeftUp"></event>
7808 <event name="OnMiddleDClick"></event>
7809 <event name="OnMiddleDown"></event>
7810 <event name="OnMiddleUp"></event>
7811 <event name="OnMotion"></event>
7812 <event name="OnMouseEvents"></event>
7813 <event name="OnMouseWheel"></event>
7814 <event name="OnPaint"></event>
7815 <event name="OnRightDClick"></event>
7816 <event name="OnRightDown"></event>
7817 <event name="OnRightUp"></event>
7818 <event name="OnSetFocus"></event>
7819 <event name="OnSize"></event>
7820 <event name="OnUpdateUI"></event>
7821 </object>
7822 </object>
7823 <object class="sizeritem" expanded="1">
7824 <property name="border">5</property>
7825 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
7826 <property name="proportion">0</property>
7827 <object class="wxTextCtrl" expanded="1">
7828 <property name="bg"></property>
7829 <property name="context_help"></property>
7830 <property name="enabled">1</property>
7831 <property name="fg"></property>
7832 <property name="font"></property>
7833 <property name="hidden">0</property>
7834 <property name="id">wxID_ANY</property>
7835 <property name="maximum_size"></property>
7836 <property name="maxlength">0</property>
7837 <property name="minimum_size">150,-1</property>
7838 <property name="name">m_textCtrlLabel13</property>
7839 <property name="permission">protected</property>
7840 <property name="pos"></property>
7841 <property name="size"></property>
7842 <property name="style"></property>
7843 <property name="subclass"></property>
7844 <property name="tooltip"></property>
7845 <property name="value"></property>
7846 <property name="window_extra_style"></property>
7847 <property name="window_name"></property>
7848 <property name="window_style"></property>
7849 <event name="OnChar"></event>
7850 <event name="OnEnterWindow"></event>
7851 <event name="OnEraseBackground"></event>
7852 <event name="OnKeyDown">OnKeyDown</event>
7853 <event name="OnKeyUp"></event>
7854 <event name="OnKillFocus"></event>
7855 <event name="OnLeaveWindow"></event>
7856 <event name="OnLeftDClick"></event>
7857 <event name="OnLeftDown"></event>
7858 <event name="OnLeftUp"></event>
7859 <event name="OnMiddleDClick"></event>
7860 <event name="OnMiddleDown"></event>
7861 <event name="OnMiddleUp"></event>
7862 <event name="OnMotion"></event>
7863 <event name="OnMouseEvents"></event>
7864 <event name="OnMouseWheel"></event>
7865 <event name="OnPaint"></event>
7866 <event name="OnRightDClick"></event>
7867 <event name="OnRightDown"></event>
7868 <event name="OnRightUp"></event>
7869 <event name="OnSetFocus"></event>
7870 <event name="OnSize"></event>
7871 <event name="OnText"></event>
7872 <event name="OnTextEnter"></event>
7873 <event name="OnTextMaxLen"></event>
7874 <event name="OnTextURL"></event>
7875 <event name="OnUpdateUI"></event>
7876 </object>
7877 </object>
7878 <object class="sizeritem" expanded="1">
7879 <property name="border">5</property>
7880 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
7881 <property name="proportion">0</property>
7882 <object class="wxTextCtrl" expanded="1">
7883 <property name="bg"></property>
7884 <property name="context_help"></property>
7885 <property name="enabled">1</property>
7886 <property name="fg"></property>
7887 <property name="font"></property>
7888 <property name="hidden">0</property>
7889 <property name="id">wxID_ANY</property>
7890 <property name="maximum_size">-1,-1</property>
7891 <property name="maxlength">0</property>
7892 <property name="minimum_size">-1,-1</property>
7893 <property name="name">m_textCtrlField13</property>
7894 <property name="permission">protected</property>
7895 <property name="pos"></property>
7896 <property name="size">-1,-1</property>
7897 <property name="style"></property>
7898 <property name="subclass"></property>
7899 <property name="tooltip"></property>
7900 <property name="value"></property>
7901 <property name="window_extra_style"></property>
7902 <property name="window_name"></property>
7903 <property name="window_style"></property>
7904 <event name="OnChar"></event>
7905 <event name="OnEnterWindow"></event>
7906 <event name="OnEraseBackground"></event>
7907 <event name="OnKeyDown">OnKeyDown</event>
7908 <event name="OnKeyUp"></event>
7909 <event name="OnKillFocus"></event>
7910 <event name="OnLeaveWindow"></event>
7911 <event name="OnLeftDClick"></event>
7912 <event name="OnLeftDown"></event>
7913 <event name="OnLeftUp"></event>
7914 <event name="OnMiddleDClick"></event>
7915 <event name="OnMiddleDown"></event>
7916 <event name="OnMiddleUp"></event>
7917 <event name="OnMotion"></event>
7918 <event name="OnMouseEvents"></event>
7919 <event name="OnMouseWheel"></event>
7920 <event name="OnPaint"></event>
7921 <event name="OnRightDClick"></event>
7922 <event name="OnRightDown"></event>
7923 <event name="OnRightUp"></event>
7924 <event name="OnSetFocus"></event>
7925 <event name="OnSize"></event>
7926 <event name="OnText"></event>
7927 <event name="OnTextEnter"></event>
7928 <event name="OnTextMaxLen"></event>
7929 <event name="OnTextURL"></event>
7930 <event name="OnUpdateUI"></event>
7931 </object>
7932 </object>
7933 <object class="sizeritem" expanded="1">
7934 <property name="border">5</property>
7935 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
7936 <property name="proportion">0</property>
7937 <object class="wxButton" expanded="1">
7938 <property name="bg"></property>
7939 <property name="context_help"></property>
7940 <property name="default">0</property>
7941 <property name="enabled">1</property>
7942 <property name="fg"></property>
7943 <property name="font"></property>
7944 <property name="hidden">0</property>
7945 <property name="id">wxID_DEL13</property>
7946 <property name="label">Delete</property>
7947 <property name="maximum_size"></property>
7948 <property name="minimum_size">-1,-1</property>
7949 <property name="name">m_buttonDel13</property>
7950 <property name="permission">protected</property>
7951 <property name="pos"></property>
7952 <property name="size">60,20</property>
7953 <property name="style"></property>
7954 <property name="subclass"></property>
7955 <property name="tooltip"></property>
7956 <property name="window_extra_style"></property>
7957 <property name="window_name"></property>
7958 <property name="window_style"></property>
7959 <event name="OnButtonClick">OnButtonDel13</event>
7960 <event name="OnChar"></event>
7961 <event name="OnEnterWindow"></event>
7962 <event name="OnEraseBackground"></event>
7963 <event name="OnKeyDown"></event>
7964 <event name="OnKeyUp"></event>
7965 <event name="OnKillFocus"></event>
7966 <event name="OnLeaveWindow"></event>
7967 <event name="OnLeftDClick"></event>
7968 <event name="OnLeftDown"></event>
7969 <event name="OnLeftUp"></event>
7970 <event name="OnMiddleDClick"></event>
7971 <event name="OnMiddleDown"></event>
7972 <event name="OnMiddleUp"></event>
7973 <event name="OnMotion"></event>
7974 <event name="OnMouseEvents"></event>
7975 <event name="OnMouseWheel"></event>
7976 <event name="OnPaint"></event>
7977 <event name="OnRightDClick"></event>
7978 <event name="OnRightDown"></event>
7979 <event name="OnRightUp"></event>
7980 <event name="OnSetFocus"></event>
7981 <event name="OnSize"></event>
7982 <event name="OnUpdateUI"></event>
7983 </object>
7984 </object>
7985 <object class="sizeritem" expanded="1">
7986 <property name="border">5</property>
7987 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
7988 <property name="proportion">0</property>
7989 <object class="wxTextCtrl" expanded="1">
7990 <property name="bg"></property>
7991 <property name="context_help"></property>
7992 <property name="enabled">1</property>
7993 <property name="fg"></property>
7994 <property name="font"></property>
7995 <property name="hidden">0</property>
7996 <property name="id">wxID_ANY</property>
7997 <property name="maximum_size"></property>
7998 <property name="maxlength">0</property>
7999 <property name="minimum_size">150,-1</property>
8000 <property name="name">m_textCtrlLabel14</property>
8001 <property name="permission">protected</property>
8002 <property name="pos"></property>
8003 <property name="size"></property>
8004 <property name="style"></property>
8005 <property name="subclass"></property>
8006 <property name="tooltip"></property>
8007 <property name="value"></property>
8008 <property name="window_extra_style"></property>
8009 <property name="window_name"></property>
8010 <property name="window_style"></property>
8011 <event name="OnChar"></event>
8012 <event name="OnEnterWindow"></event>
8013 <event name="OnEraseBackground"></event>
8014 <event name="OnKeyDown">OnKeyDown</event>
8015 <event name="OnKeyUp"></event>
8016 <event name="OnKillFocus"></event>
8017 <event name="OnLeaveWindow"></event>
8018 <event name="OnLeftDClick"></event>
8019 <event name="OnLeftDown"></event>
8020 <event name="OnLeftUp"></event>
8021 <event name="OnMiddleDClick"></event>
8022 <event name="OnMiddleDown"></event>
8023 <event name="OnMiddleUp"></event>
8024 <event name="OnMotion"></event>
8025 <event name="OnMouseEvents"></event>
8026 <event name="OnMouseWheel"></event>
8027 <event name="OnPaint"></event>
8028 <event name="OnRightDClick"></event>
8029 <event name="OnRightDown"></event>
8030 <event name="OnRightUp"></event>
8031 <event name="OnSetFocus"></event>
8032 <event name="OnSize"></event>
8033 <event name="OnText"></event>
8034 <event name="OnTextEnter"></event>
8035 <event name="OnTextMaxLen"></event>
8036 <event name="OnTextURL"></event>
8037 <event name="OnUpdateUI"></event>
8038 </object>
8039 </object>
8040 <object class="sizeritem" expanded="1">
8041 <property name="border">5</property>
8042 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
8043 <property name="proportion">0</property>
8044 <object class="wxTextCtrl" expanded="1">
8045 <property name="bg"></property>
8046 <property name="context_help"></property>
8047 <property name="enabled">1</property>
8048 <property name="fg"></property>
8049 <property name="font"></property>
8050 <property name="hidden">0</property>
8051 <property name="id">wxID_ANY</property>
8052 <property name="maximum_size">-1,-1</property>
8053 <property name="maxlength">0</property>
8054 <property name="minimum_size">-1,-1</property>
8055 <property name="name">m_textCtrlField14</property>
8056 <property name="permission">protected</property>
8057 <property name="pos"></property>
8058 <property name="size">-1,-1</property>
8059 <property name="style"></property>
8060 <property name="subclass"></property>
8061 <property name="tooltip"></property>
8062 <property name="value"></property>
8063 <property name="window_extra_style"></property>
8064 <property name="window_name"></property>
8065 <property name="window_style"></property>
8066 <event name="OnChar"></event>
8067 <event name="OnEnterWindow"></event>
8068 <event name="OnEraseBackground"></event>
8069 <event name="OnKeyDown">OnKeyDown</event>
8070 <event name="OnKeyUp"></event>
8071 <event name="OnKillFocus"></event>
8072 <event name="OnLeaveWindow"></event>
8073 <event name="OnLeftDClick"></event>
8074 <event name="OnLeftDown"></event>
8075 <event name="OnLeftUp"></event>
8076 <event name="OnMiddleDClick"></event>
8077 <event name="OnMiddleDown"></event>
8078 <event name="OnMiddleUp"></event>
8079 <event name="OnMotion"></event>
8080 <event name="OnMouseEvents"></event>
8081 <event name="OnMouseWheel"></event>
8082 <event name="OnPaint"></event>
8083 <event name="OnRightDClick"></event>
8084 <event name="OnRightDown"></event>
8085 <event name="OnRightUp"></event>
8086 <event name="OnSetFocus"></event>
8087 <event name="OnSize"></event>
8088 <event name="OnText"></event>
8089 <event name="OnTextEnter"></event>
8090 <event name="OnTextMaxLen"></event>
8091 <event name="OnTextURL"></event>
8092 <event name="OnUpdateUI"></event>
8093 </object>
8094 </object>
8095 <object class="sizeritem" expanded="1">
8096 <property name="border">5</property>
8097 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
8098 <property name="proportion">0</property>
8099 <object class="wxButton" expanded="1">
8100 <property name="bg"></property>
8101 <property name="context_help"></property>
8102 <property name="default">0</property>
8103 <property name="enabled">1</property>
8104 <property name="fg"></property>
8105 <property name="font"></property>
8106 <property name="hidden">0</property>
8107 <property name="id">wxID_DEL14</property>
8108 <property name="label">Delete</property>
8109 <property name="maximum_size"></property>
8110 <property name="minimum_size">-1,-1</property>
8111 <property name="name">m_buttonDel14</property>
8112 <property name="permission">protected</property>
8113 <property name="pos"></property>
8114 <property name="size">60,20</property>
8115 <property name="style"></property>
8116 <property name="subclass"></property>
8117 <property name="tooltip"></property>
8118 <property name="window_extra_style"></property>
8119 <property name="window_name"></property>
8120 <property name="window_style"></property>
8121 <event name="OnButtonClick">OnButtonDel14</event>
8122 <event name="OnChar"></event>
8123 <event name="OnEnterWindow"></event>
8124 <event name="OnEraseBackground"></event>
8125 <event name="OnKeyDown"></event>
8126 <event name="OnKeyUp"></event>
8127 <event name="OnKillFocus"></event>
8128 <event name="OnLeaveWindow"></event>
8129 <event name="OnLeftDClick"></event>
8130 <event name="OnLeftDown"></event>
8131 <event name="OnLeftUp"></event>
8132 <event name="OnMiddleDClick"></event>
8133 <event name="OnMiddleDown"></event>
8134 <event name="OnMiddleUp"></event>
8135 <event name="OnMotion"></event>
8136 <event name="OnMouseEvents"></event>
8137 <event name="OnMouseWheel"></event>
8138 <event name="OnPaint"></event>
8139 <event name="OnRightDClick"></event>
8140 <event name="OnRightDown"></event>
8141 <event name="OnRightUp"></event>
8142 <event name="OnSetFocus"></event>
8143 <event name="OnSize"></event>
8144 <event name="OnUpdateUI"></event>
8145 </object>
8146 </object>
8147 <object class="sizeritem" expanded="1">
8148 <property name="border">5</property>
8149 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
8150 <property name="proportion">0</property>
8151 <object class="wxTextCtrl" expanded="1">
8152 <property name="bg"></property>
8153 <property name="context_help"></property>
8154 <property name="enabled">1</property>
8155 <property name="fg"></property>
8156 <property name="font"></property>
8157 <property name="hidden">0</property>
8158 <property name="id">wxID_ANY</property>
8159 <property name="maximum_size"></property>
8160 <property name="maxlength">0</property>
8161 <property name="minimum_size">150,-1</property>
8162 <property name="name">m_textCtrlLabel15</property>
8163 <property name="permission">protected</property>
8164 <property name="pos"></property>
8165 <property name="size"></property>
8166 <property name="style"></property>
8167 <property name="subclass"></property>
8168 <property name="tooltip"></property>
8169 <property name="value"></property>
8170 <property name="window_extra_style"></property>
8171 <property name="window_name"></property>
8172 <property name="window_style"></property>
8173 <event name="OnChar"></event>
8174 <event name="OnEnterWindow"></event>
8175 <event name="OnEraseBackground"></event>
8176 <event name="OnKeyDown">OnKeyDown</event>
8177 <event name="OnKeyUp"></event>
8178 <event name="OnKillFocus"></event>
8179 <event name="OnLeaveWindow"></event>
8180 <event name="OnLeftDClick"></event>
8181 <event name="OnLeftDown"></event>
8182 <event name="OnLeftUp"></event>
8183 <event name="OnMiddleDClick"></event>
8184 <event name="OnMiddleDown"></event>
8185 <event name="OnMiddleUp"></event>
8186 <event name="OnMotion"></event>
8187 <event name="OnMouseEvents"></event>
8188 <event name="OnMouseWheel"></event>
8189 <event name="OnPaint"></event>
8190 <event name="OnRightDClick"></event>
8191 <event name="OnRightDown"></event>
8192 <event name="OnRightUp"></event>
8193 <event name="OnSetFocus"></event>
8194 <event name="OnSize"></event>
8195 <event name="OnText"></event>
8196 <event name="OnTextEnter"></event>
8197 <event name="OnTextMaxLen"></event>
8198 <event name="OnTextURL"></event>
8199 <event name="OnUpdateUI"></event>
8200 </object>
8201 </object>
8202 <object class="sizeritem" expanded="1">
8203 <property name="border">5</property>
8204 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
8205 <property name="proportion">0</property>
8206 <object class="wxTextCtrl" expanded="1">
8207 <property name="bg"></property>
8208 <property name="context_help"></property>
8209 <property name="enabled">1</property>
8210 <property name="fg"></property>
8211 <property name="font"></property>
8212 <property name="hidden">0</property>
8213 <property name="id">wxID_ANY</property>
8214 <property name="maximum_size">-1,-1</property>
8215 <property name="maxlength">0</property>
8216 <property name="minimum_size">-1,-1</property>
8217 <property name="name">m_textCtrlField15</property>
8218 <property name="permission">protected</property>
8219 <property name="pos"></property>
8220 <property name="size">-1,-1</property>
8221 <property name="style"></property>
8222 <property name="subclass"></property>
8223 <property name="tooltip"></property>
8224 <property name="value"></property>
8225 <property name="window_extra_style"></property>
8226 <property name="window_name"></property>
8227 <property name="window_style"></property>
8228 <event name="OnChar"></event>
8229 <event name="OnEnterWindow"></event>
8230 <event name="OnEraseBackground"></event>
8231 <event name="OnKeyDown">OnKeyDown</event>
8232 <event name="OnKeyUp"></event>
8233 <event name="OnKillFocus"></event>
8234 <event name="OnLeaveWindow"></event>
8235 <event name="OnLeftDClick"></event>
8236 <event name="OnLeftDown"></event>
8237 <event name="OnLeftUp"></event>
8238 <event name="OnMiddleDClick"></event>
8239 <event name="OnMiddleDown"></event>
8240 <event name="OnMiddleUp"></event>
8241 <event name="OnMotion"></event>
8242 <event name="OnMouseEvents"></event>
8243 <event name="OnMouseWheel"></event>
8244 <event name="OnPaint"></event>
8245 <event name="OnRightDClick"></event>
8246 <event name="OnRightDown"></event>
8247 <event name="OnRightUp"></event>
8248 <event name="OnSetFocus"></event>
8249 <event name="OnSize"></event>
8250 <event name="OnText"></event>
8251 <event name="OnTextEnter"></event>
8252 <event name="OnTextMaxLen"></event>
8253 <event name="OnTextURL"></event>
8254 <event name="OnUpdateUI"></event>
8255 </object>
8256 </object>
8257 <object class="sizeritem" expanded="1">
8258 <property name="border">5</property>
8259 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
8260 <property name="proportion">0</property>
8261 <object class="wxButton" expanded="1">
8262 <property name="bg"></property>
8263 <property name="context_help"></property>
8264 <property name="default">0</property>
8265 <property name="enabled">1</property>
8266 <property name="fg"></property>
8267 <property name="font"></property>
8268 <property name="hidden">0</property>
8269 <property name="id">wxID_DEL15</property>
8270 <property name="label">Delete</property>
8271 <property name="maximum_size"></property>
8272 <property name="minimum_size">-1,-1</property>
8273 <property name="name">m_buttonDel15</property>
8274 <property name="permission">protected</property>
8275 <property name="pos"></property>
8276 <property name="size">60,20</property>
8277 <property name="style"></property>
8278 <property name="subclass"></property>
8279 <property name="tooltip"></property>
8280 <property name="window_extra_style"></property>
8281 <property name="window_name"></property>
8282 <property name="window_style"></property>
8283 <event name="OnButtonClick">OnButtonDel15</event>
8284 <event name="OnChar"></event>
8285 <event name="OnEnterWindow"></event>
8286 <event name="OnEraseBackground"></event>
8287 <event name="OnKeyDown"></event>
8288 <event name="OnKeyUp"></event>
8289 <event name="OnKillFocus"></event>
8290 <event name="OnLeaveWindow"></event>
8291 <event name="OnLeftDClick"></event>
8292 <event name="OnLeftDown"></event>
8293 <event name="OnLeftUp"></event>
8294 <event name="OnMiddleDClick"></event>
8295 <event name="OnMiddleDown"></event>
8296 <event name="OnMiddleUp"></event>
8297 <event name="OnMotion"></event>
8298 <event name="OnMouseEvents"></event>
8299 <event name="OnMouseWheel"></event>
8300 <event name="OnPaint"></event>
8301 <event name="OnRightDClick"></event>
8302 <event name="OnRightDown"></event>
8303 <event name="OnRightUp"></event>
8304 <event name="OnSetFocus"></event>
8305 <event name="OnSize"></event>
8306 <event name="OnUpdateUI"></event>
8307 </object>
8308 </object>
8309 <object class="sizeritem" expanded="1">
8310 <property name="border">5</property>
8311 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
8312 <property name="proportion">0</property>
8313 <object class="wxTextCtrl" expanded="1">
8314 <property name="bg"></property>
8315 <property name="context_help"></property>
8316 <property name="enabled">1</property>
8317 <property name="fg"></property>
8318 <property name="font"></property>
8319 <property name="hidden">0</property>
8320 <property name="id">wxID_ANY</property>
8321 <property name="maximum_size"></property>
8322 <property name="maxlength">0</property>
8323 <property name="minimum_size">150,-1</property>
8324 <property name="name">m_textCtrlLabel16</property>
8325 <property name="permission">protected</property>
8326 <property name="pos"></property>
8327 <property name="size"></property>
8328 <property name="style"></property>
8329 <property name="subclass"></property>
8330 <property name="tooltip"></property>
8331 <property name="value"></property>
8332 <property name="window_extra_style"></property>
8333 <property name="window_name"></property>
8334 <property name="window_style"></property>
8335 <event name="OnChar"></event>
8336 <event name="OnEnterWindow"></event>
8337 <event name="OnEraseBackground"></event>
8338 <event name="OnKeyDown">OnKeyDown</event>
8339 <event name="OnKeyUp"></event>
8340 <event name="OnKillFocus"></event>
8341 <event name="OnLeaveWindow"></event>
8342 <event name="OnLeftDClick"></event>
8343 <event name="OnLeftDown"></event>
8344 <event name="OnLeftUp"></event>
8345 <event name="OnMiddleDClick"></event>
8346 <event name="OnMiddleDown"></event>
8347 <event name="OnMiddleUp"></event>
8348 <event name="OnMotion"></event>
8349 <event name="OnMouseEvents"></event>
8350 <event name="OnMouseWheel"></event>
8351 <event name="OnPaint"></event>
8352 <event name="OnRightDClick"></event>
8353 <event name="OnRightDown"></event>
8354 <event name="OnRightUp"></event>
8355 <event name="OnSetFocus"></event>
8356 <event name="OnSize"></event>
8357 <event name="OnText"></event>
8358 <event name="OnTextEnter"></event>
8359 <event name="OnTextMaxLen"></event>
8360 <event name="OnTextURL"></event>
8361 <event name="OnUpdateUI"></event>
8362 </object>
8363 </object>
8364 <object class="sizeritem" expanded="1">
8365 <property name="border">5</property>
8366 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
8367 <property name="proportion">0</property>
8368 <object class="wxTextCtrl" expanded="1">
8369 <property name="bg"></property>
8370 <property name="context_help"></property>
8371 <property name="enabled">1</property>
8372 <property name="fg"></property>
8373 <property name="font"></property>
8374 <property name="hidden">0</property>
8375 <property name="id">wxID_ANY</property>
8376 <property name="maximum_size">-1,-1</property>
8377 <property name="maxlength">0</property>
8378 <property name="minimum_size">-1,-1</property>
8379 <property name="name">m_textCtrlField16</property>
8380 <property name="permission">protected</property>
8381 <property name="pos"></property>
8382 <property name="size">-1,-1</property>
8383 <property name="style"></property>
8384 <property name="subclass"></property>
8385 <property name="tooltip"></property>
8386 <property name="value"></property>
8387 <property name="window_extra_style"></property>
8388 <property name="window_name"></property>
8389 <property name="window_style"></property>
8390 <event name="OnChar"></event>
8391 <event name="OnEnterWindow"></event>
8392 <event name="OnEraseBackground"></event>
8393 <event name="OnKeyDown">OnKeyDown</event>
8394 <event name="OnKeyUp"></event>
8395 <event name="OnKillFocus"></event>
8396 <event name="OnLeaveWindow"></event>
8397 <event name="OnLeftDClick"></event>
8398 <event name="OnLeftDown"></event>
8399 <event name="OnLeftUp"></event>
8400 <event name="OnMiddleDClick"></event>
8401 <event name="OnMiddleDown"></event>
8402 <event name="OnMiddleUp"></event>
8403 <event name="OnMotion"></event>
8404 <event name="OnMouseEvents"></event>
8405 <event name="OnMouseWheel"></event>
8406 <event name="OnPaint"></event>
8407 <event name="OnRightDClick"></event>
8408 <event name="OnRightDown"></event>
8409 <event name="OnRightUp"></event>
8410 <event name="OnSetFocus"></event>
8411 <event name="OnSize"></event>
8412 <event name="OnText"></event>
8413 <event name="OnTextEnter"></event>
8414 <event name="OnTextMaxLen"></event>
8415 <event name="OnTextURL"></event>
8416 <event name="OnUpdateUI"></event>
8417 </object>
8418 </object>
8419 <object class="sizeritem" expanded="1">
8420 <property name="border">5</property>
8421 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
8422 <property name="proportion">0</property>
8423 <object class="wxButton" expanded="1">
8424 <property name="bg"></property>
8425 <property name="context_help"></property>
8426 <property name="default">0</property>
8427 <property name="enabled">1</property>
8428 <property name="fg"></property>
8429 <property name="font"></property>
8430 <property name="hidden">0</property>
8431 <property name="id">wxID_DEL16</property>
8432 <property name="label">Delete</property>
8433 <property name="maximum_size"></property>
8434 <property name="minimum_size">-1,-1</property>
8435 <property name="name">m_buttonDel16</property>
8436 <property name="permission">protected</property>
8437 <property name="pos"></property>
8438 <property name="size">60,20</property>
8439 <property name="style"></property>
8440 <property name="subclass"></property>
8441 <property name="tooltip"></property>
8442 <property name="window_extra_style"></property>
8443 <property name="window_name"></property>
8444 <property name="window_style"></property>
8445 <event name="OnButtonClick">OnButtonDel16</event>
8446 <event name="OnChar"></event>
8447 <event name="OnEnterWindow"></event>
8448 <event name="OnEraseBackground"></event>
8449 <event name="OnKeyDown"></event>
8450 <event name="OnKeyUp"></event>
8451 <event name="OnKillFocus"></event>
8452 <event name="OnLeaveWindow"></event>
8453 <event name="OnLeftDClick"></event>
8454 <event name="OnLeftDown"></event>
8455 <event name="OnLeftUp"></event>
8456 <event name="OnMiddleDClick"></event>
8457 <event name="OnMiddleDown"></event>
8458 <event name="OnMiddleUp"></event>
8459 <event name="OnMotion"></event>
8460 <event name="OnMouseEvents"></event>
8461 <event name="OnMouseWheel"></event>
8462 <event name="OnPaint"></event>
8463 <event name="OnRightDClick"></event>
8464 <event name="OnRightDown"></event>
8465 <event name="OnRightUp"></event>
8466 <event name="OnSetFocus"></event>
8467 <event name="OnSize"></event>
8468 <event name="OnUpdateUI"></event>
8469 </object>
8470 </object>
8471 <object class="sizeritem" expanded="1">
8472 <property name="border">5</property>
8473 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
8474 <property name="proportion">0</property>
8475 <object class="wxTextCtrl" expanded="1">
8476 <property name="bg"></property>
8477 <property name="context_help"></property>
8478 <property name="enabled">1</property>
8479 <property name="fg"></property>
8480 <property name="font"></property>
8481 <property name="hidden">0</property>
8482 <property name="id">wxID_ANY</property>
8483 <property name="maximum_size"></property>
8484 <property name="maxlength">0</property>
8485 <property name="minimum_size">150,-1</property>
8486 <property name="name">m_textCtrlLabel17</property>
8487 <property name="permission">protected</property>
8488 <property name="pos"></property>
8489 <property name="size"></property>
8490 <property name="style"></property>
8491 <property name="subclass"></property>
8492 <property name="tooltip"></property>
8493 <property name="value"></property>
8494 <property name="window_extra_style"></property>
8495 <property name="window_name"></property>
8496 <property name="window_style"></property>
8497 <event name="OnChar"></event>
8498 <event name="OnEnterWindow"></event>
8499 <event name="OnEraseBackground"></event>
8500 <event name="OnKeyDown">OnKeyDown</event>
8501 <event name="OnKeyUp"></event>
8502 <event name="OnKillFocus"></event>
8503 <event name="OnLeaveWindow"></event>
8504 <event name="OnLeftDClick"></event>
8505 <event name="OnLeftDown"></event>
8506 <event name="OnLeftUp"></event>
8507 <event name="OnMiddleDClick"></event>
8508 <event name="OnMiddleDown"></event>
8509 <event name="OnMiddleUp"></event>
8510 <event name="OnMotion"></event>
8511 <event name="OnMouseEvents"></event>
8512 <event name="OnMouseWheel"></event>
8513 <event name="OnPaint"></event>
8514 <event name="OnRightDClick"></event>
8515 <event name="OnRightDown"></event>
8516 <event name="OnRightUp"></event>
8517 <event name="OnSetFocus"></event>
8518 <event name="OnSize"></event>
8519 <event name="OnText"></event>
8520 <event name="OnTextEnter"></event>
8521 <event name="OnTextMaxLen"></event>
8522 <event name="OnTextURL"></event>
8523 <event name="OnUpdateUI"></event>
8524 </object>
8525 </object>
8526 <object class="sizeritem" expanded="1">
8527 <property name="border">5</property>
8528 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
8529 <property name="proportion">0</property>
8530 <object class="wxTextCtrl" expanded="1">
8531 <property name="bg"></property>
8532 <property name="context_help"></property>
8533 <property name="enabled">1</property>
8534 <property name="fg"></property>
8535 <property name="font"></property>
8536 <property name="hidden">0</property>
8537 <property name="id">wxID_ANY</property>
8538 <property name="maximum_size">-1,-1</property>
8539 <property name="maxlength">0</property>
8540 <property name="minimum_size">-1,-1</property>
8541 <property name="name">m_textCtrlField17</property>
8542 <property name="permission">protected</property>
8543 <property name="pos"></property>
8544 <property name="size">-1,-1</property>
8545 <property name="style"></property>
8546 <property name="subclass"></property>
8547 <property name="tooltip"></property>
8548 <property name="value"></property>
8549 <property name="window_extra_style"></property>
8550 <property name="window_name"></property>
8551 <property name="window_style"></property>
8552 <event name="OnChar"></event>
8553 <event name="OnEnterWindow"></event>
8554 <event name="OnEraseBackground"></event>
8555 <event name="OnKeyDown">OnKeyDown</event>
8556 <event name="OnKeyUp"></event>
8557 <event name="OnKillFocus"></event>
8558 <event name="OnLeaveWindow"></event>
8559 <event name="OnLeftDClick"></event>
8560 <event name="OnLeftDown"></event>
8561 <event name="OnLeftUp"></event>
8562 <event name="OnMiddleDClick"></event>
8563 <event name="OnMiddleDown"></event>
8564 <event name="OnMiddleUp"></event>
8565 <event name="OnMotion"></event>
8566 <event name="OnMouseEvents"></event>
8567 <event name="OnMouseWheel"></event>
8568 <event name="OnPaint"></event>
8569 <event name="OnRightDClick"></event>
8570 <event name="OnRightDown"></event>
8571 <event name="OnRightUp"></event>
8572 <event name="OnSetFocus"></event>
8573 <event name="OnSize"></event>
8574 <event name="OnText"></event>
8575 <event name="OnTextEnter"></event>
8576 <event name="OnTextMaxLen"></event>
8577 <event name="OnTextURL"></event>
8578 <event name="OnUpdateUI"></event>
8579 </object>
8580 </object>
8581 <object class="sizeritem" expanded="1">
8582 <property name="border">5</property>
8583 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
8584 <property name="proportion">0</property>
8585 <object class="wxButton" expanded="1">
8586 <property name="bg"></property>
8587 <property name="context_help"></property>
8588 <property name="default">0</property>
8589 <property name="enabled">1</property>
8590 <property name="fg"></property>
8591 <property name="font"></property>
8592 <property name="hidden">0</property>
8593 <property name="id">wxID_DEL17</property>
8594 <property name="label">Delete</property>
8595 <property name="maximum_size"></property>
8596 <property name="minimum_size">-1,-1</property>
8597 <property name="name">m_buttonDel17</property>
8598 <property name="permission">protected</property>
8599 <property name="pos"></property>
8600 <property name="size">60,20</property>
8601 <property name="style"></property>
8602 <property name="subclass"></property>
8603 <property name="tooltip"></property>
8604 <property name="window_extra_style"></property>
8605 <property name="window_name"></property>
8606 <property name="window_style"></property>
8607 <event name="OnButtonClick">OnButtonDel17</event>
8608 <event name="OnChar"></event>
8609 <event name="OnEnterWindow"></event>
8610 <event name="OnEraseBackground"></event>
8611 <event name="OnKeyDown"></event>
8612 <event name="OnKeyUp"></event>
8613 <event name="OnKillFocus"></event>
8614 <event name="OnLeaveWindow"></event>
8615 <event name="OnLeftDClick"></event>
8616 <event name="OnLeftDown"></event>
8617 <event name="OnLeftUp"></event>
8618 <event name="OnMiddleDClick"></event>
8619 <event name="OnMiddleDown"></event>
8620 <event name="OnMiddleUp"></event>
8621 <event name="OnMotion"></event>
8622 <event name="OnMouseEvents"></event>
8623 <event name="OnMouseWheel"></event>
8624 <event name="OnPaint"></event>
8625 <event name="OnRightDClick"></event>
8626 <event name="OnRightDown"></event>
8627 <event name="OnRightUp"></event>
8628 <event name="OnSetFocus"></event>
8629 <event name="OnSize"></event>
8630 <event name="OnUpdateUI"></event>
8631 </object>
8632 </object>
8633 <object class="sizeritem" expanded="1">
8634 <property name="border">5</property>
8635 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
8636 <property name="proportion">0</property>
8637 <object class="wxTextCtrl" expanded="1">
8638 <property name="bg"></property>
8639 <property name="context_help"></property>
8640 <property name="enabled">1</property>
8641 <property name="fg"></property>
8642 <property name="font"></property>
8643 <property name="hidden">0</property>
8644 <property name="id">wxID_ANY</property>
8645 <property name="maximum_size"></property>
8646 <property name="maxlength">0</property>
8647 <property name="minimum_size">150,-1</property>
8648 <property name="name">m_textCtrlLabel18</property>
8649 <property name="permission">protected</property>
8650 <property name="pos"></property>
8651 <property name="size"></property>
8652 <property name="style"></property>
8653 <property name="subclass"></property>
8654 <property name="tooltip"></property>
8655 <property name="value"></property>
8656 <property name="window_extra_style"></property>
8657 <property name="window_name"></property>
8658 <property name="window_style"></property>
8659 <event name="OnChar"></event>
8660 <event name="OnEnterWindow"></event>
8661 <event name="OnEraseBackground"></event>
8662 <event name="OnKeyDown">OnKeyDown</event>
8663 <event name="OnKeyUp"></event>
8664 <event name="OnKillFocus"></event>
8665 <event name="OnLeaveWindow"></event>
8666 <event name="OnLeftDClick"></event>
8667 <event name="OnLeftDown"></event>
8668 <event name="OnLeftUp"></event>
8669 <event name="OnMiddleDClick"></event>
8670 <event name="OnMiddleDown"></event>
8671 <event name="OnMiddleUp"></event>
8672 <event name="OnMotion"></event>
8673 <event name="OnMouseEvents"></event>
8674 <event name="OnMouseWheel"></event>
8675 <event name="OnPaint"></event>
8676 <event name="OnRightDClick"></event>
8677 <event name="OnRightDown"></event>
8678 <event name="OnRightUp"></event>
8679 <event name="OnSetFocus"></event>
8680 <event name="OnSize"></event>
8681 <event name="OnText"></event>
8682 <event name="OnTextEnter"></event>
8683 <event name="OnTextMaxLen"></event>
8684 <event name="OnTextURL"></event>
8685 <event name="OnUpdateUI"></event>
8686 </object>
8687 </object>
8688 <object class="sizeritem" expanded="1">
8689 <property name="border">5</property>
8690 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
8691 <property name="proportion">0</property>
8692 <object class="wxTextCtrl" expanded="1">
8693 <property name="bg"></property>
8694 <property name="context_help"></property>
8695 <property name="enabled">1</property>
8696 <property name="fg"></property>
8697 <property name="font"></property>
8698 <property name="hidden">0</property>
8699 <property name="id">wxID_ANY</property>
8700 <property name="maximum_size">-1,-1</property>
8701 <property name="maxlength">0</property>
8702 <property name="minimum_size">-1,-1</property>
8703 <property name="name">m_textCtrlField18</property>
8704 <property name="permission">protected</property>
8705 <property name="pos"></property>
8706 <property name="size">-1,-1</property>
8707 <property name="style"></property>
8708 <property name="subclass"></property>
8709 <property name="tooltip"></property>
8710 <property name="value"></property>
8711 <property name="window_extra_style"></property>
8712 <property name="window_name"></property>
8713 <property name="window_style"></property>
8714 <event name="OnChar"></event>
8715 <event name="OnEnterWindow"></event>
8716 <event name="OnEraseBackground"></event>
8717 <event name="OnKeyDown">OnKeyDown</event>
8718 <event name="OnKeyUp"></event>
8719 <event name="OnKillFocus"></event>
8720 <event name="OnLeaveWindow"></event>
8721 <event name="OnLeftDClick"></event>
8722 <event name="OnLeftDown"></event>
8723 <event name="OnLeftUp"></event>
8724 <event name="OnMiddleDClick"></event>
8725 <event name="OnMiddleDown"></event>
8726 <event name="OnMiddleUp"></event>
8727 <event name="OnMotion"></event>
8728 <event name="OnMouseEvents"></event>
8729 <event name="OnMouseWheel"></event>
8730 <event name="OnPaint"></event>
8731 <event name="OnRightDClick"></event>
8732 <event name="OnRightDown"></event>
8733 <event name="OnRightUp"></event>
8734 <event name="OnSetFocus"></event>
8735 <event name="OnSize"></event>
8736 <event name="OnText"></event>
8737 <event name="OnTextEnter"></event>
8738 <event name="OnTextMaxLen"></event>
8739 <event name="OnTextURL"></event>
8740 <event name="OnUpdateUI"></event>
8741 </object>
8742 </object>
8743 <object class="sizeritem" expanded="1">
8744 <property name="border">5</property>
8745 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
8746 <property name="proportion">0</property>
8747 <object class="wxButton" expanded="1">
8748 <property name="bg"></property>
8749 <property name="context_help"></property>
8750 <property name="default">0</property>
8751 <property name="enabled">1</property>
8752 <property name="fg"></property>
8753 <property name="font"></property>
8754 <property name="hidden">0</property>
8755 <property name="id">wxID_DEL18</property>
8756 <property name="label">Delete</property>
8757 <property name="maximum_size"></property>
8758 <property name="minimum_size">-1,-1</property>
8759 <property name="name">m_buttonDel18</property>
8760 <property name="permission">protected</property>
8761 <property name="pos"></property>
8762 <property name="size">60,20</property>
8763 <property name="style"></property>
8764 <property name="subclass"></property>
8765 <property name="tooltip"></property>
8766 <property name="window_extra_style"></property>
8767 <property name="window_name"></property>
8768 <property name="window_style"></property>
8769 <event name="OnButtonClick">OnButtonDel18</event>
8770 <event name="OnChar"></event>
8771 <event name="OnEnterWindow"></event>
8772 <event name="OnEraseBackground"></event>
8773 <event name="OnKeyDown"></event>
8774 <event name="OnKeyUp"></event>
8775 <event name="OnKillFocus"></event>
8776 <event name="OnLeaveWindow"></event>
8777 <event name="OnLeftDClick"></event>
8778 <event name="OnLeftDown"></event>
8779 <event name="OnLeftUp"></event>
8780 <event name="OnMiddleDClick"></event>
8781 <event name="OnMiddleDown"></event>
8782 <event name="OnMiddleUp"></event>
8783 <event name="OnMotion"></event>
8784 <event name="OnMouseEvents"></event>
8785 <event name="OnMouseWheel"></event>
8786 <event name="OnPaint"></event>
8787 <event name="OnRightDClick"></event>
8788 <event name="OnRightDown"></event>
8789 <event name="OnRightUp"></event>
8790 <event name="OnSetFocus"></event>
8791 <event name="OnSize"></event>
8792 <event name="OnUpdateUI"></event>
8793 </object>
8794 </object>
8795 <object class="sizeritem" expanded="1">
8796 <property name="border">5</property>
8797 <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
8798 <property name="proportion">0</property>
8799 <object class="wxTextCtrl" expanded="1">
8800 <property name="bg"></property>
8801 <property name="context_help"></property>
8802 <property name="enabled">1</property>
8803 <property name="fg"></property>
8804 <property name="font"></property>
8805 <property name="hidden">0</property>
8806 <property name="id">wxID_ANY</property>
8807 <property name="maximum_size"></property>
8808 <property name="maxlength">0</property>
8809 <property name="minimum_size">150,-1</property>
8810 <property name="name">m_textCtrlLabel19</property>
8811 <property name="permission">protected</property>
8812 <property name="pos"></property>
8813 <property name="size"></property>
8814 <property name="style"></property>
8815 <property name="subclass"></property>
8816 <property name="tooltip"></property>
8817 <property name="value"></property>
8818 <property name="window_extra_style"></property>
8819 <property name="window_name"></property>
8820 <property name="window_style"></property>
8821 <event name="OnChar"></event>
8822 <event name="OnEnterWindow"></event>
8823 <event name="OnEraseBackground"></event>
8824 <event name="OnKeyDown">OnKeyDown</event>
8825 <event name="OnKeyUp"></event>
8826 <event name="OnKillFocus"></event>
8827 <event name="OnLeaveWindow"></event>
8828 <event name="OnLeftDClick"></event>
8829 <event name="OnLeftDown"></event>
8830 <event name="OnLeftUp"></event>
8831 <event name="OnMiddleDClick"></event>
8832 <event name="OnMiddleDown"></event>
8833 <event name="OnMiddleUp"></event>
8834 <event name="OnMotion"></event>
8835 <event name="OnMouseEvents"></event>
8836 <event name="OnMouseWheel"></event>
8837 <event name="OnPaint"></event>
8838 <event name="OnRightDClick"></event>
8839 <event name="OnRightDown"></event>
8840 <event name="OnRightUp"></event>
8841 <event name="OnSetFocus"></event>
8842 <event name="OnSize"></event>
8843 <event name="OnText"></event>
8844 <event name="OnTextEnter"></event>
8845 <event name="OnTextMaxLen"></event>
8846 <event name="OnTextURL"></event>
8847 <event name="OnUpdateUI"></event>
8848 </object>
8849 </object>
8850 <object class="sizeritem" expanded="1">
8851 <property name="border">5</property>
8852 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
8853 <property name="proportion">0</property>
8854 <object class="wxTextCtrl" expanded="1">
8855 <property name="bg"></property>
8856 <property name="context_help"></property>
8857 <property name="enabled">1</property>
8858 <property name="fg"></property>
8859 <property name="font"></property>
8860 <property name="hidden">0</property>
8861 <property name="id">wxID_ANY</property>
8862 <property name="maximum_size">-1,-1</property>
8863 <property name="maxlength">0</property>
8864 <property name="minimum_size">-1,-1</property>
8865 <property name="name">m_textCtrlField19</property>
8866 <property name="permission">protected</property>
8867 <property name="pos"></property>
8868 <property name="size">-1,-1</property>
8869 <property name="style"></property>
8870 <property name="subclass"></property>
8871 <property name="tooltip"></property>
8872 <property name="value"></property>
8873 <property name="window_extra_style"></property>
8874 <property name="window_name"></property>
8875 <property name="window_style"></property>
8876 <event name="OnChar"></event>
8877 <event name="OnEnterWindow"></event>
8878 <event name="OnEraseBackground"></event>
8879 <event name="OnKeyDown">OnKeyDown</event>
8880 <event name="OnKeyUp"></event>
8881 <event name="OnKillFocus"></event>
8882 <event name="OnLeaveWindow"></event>
8883 <event name="OnLeftDClick"></event>
8884 <event name="OnLeftDown"></event>
8885 <event name="OnLeftUp"></event>
8886 <event name="OnMiddleDClick"></event>
8887 <event name="OnMiddleDown"></event>
8888 <event name="OnMiddleUp"></event>
8889 <event name="OnMotion"></event>
8890 <event name="OnMouseEvents"></event>
8891 <event name="OnMouseWheel"></event>
8892 <event name="OnPaint"></event>
8893 <event name="OnRightDClick"></event>
8894 <event name="OnRightDown"></event>
8895 <event name="OnRightUp"></event>
8896 <event name="OnSetFocus"></event>
8897 <event name="OnSize"></event>
8898 <event name="OnText"></event>
8899 <event name="OnTextEnter"></event>
8900 <event name="OnTextMaxLen"></event>
8901 <event name="OnTextURL"></event>
8902 <event name="OnUpdateUI"></event>
8903 </object>
8904 </object>
8905 <object class="sizeritem" expanded="1">
8906 <property name="border">5</property>
8907 <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property>
8908 <property name="proportion">0</property>
8909 <object class="wxButton" expanded="1">
8910 <property name="bg"></property>
8911 <property name="context_help"></property>
8912 <property name="default">0</property>
8913 <property name="enabled">1</property>
8914 <property name="fg"></property>
8915 <property name="font"></property>
8916 <property name="hidden">0</property>
8917 <property name="id">wxID_DEL19</property>
8918 <property name="label">Delete</property>
8919 <property name="maximum_size"></property>
8920 <property name="minimum_size">-1,-1</property>
8921 <property name="name">m_buttonDel19</property>
8922 <property name="permission">protected</property>
8923 <property name="pos"></property>
8924 <property name="size">60,20</property>
8925 <property name="style"></property>
8926 <property name="subclass"></property>
8927 <property name="tooltip"></property>
8928 <property name="window_extra_style"></property>
8929 <property name="window_name"></property>
8930 <property name="window_style"></property>
8931 <event name="OnButtonClick">OnButtonDel19</event>
8932 <event name="OnChar"></event>
8933 <event name="OnEnterWindow"></event>
8934 <event name="OnEraseBackground"></event>
8935 <event name="OnKeyDown"></event>
8936 <event name="OnKeyUp"></event>
8937 <event name="OnKillFocus"></event>
8938 <event name="OnLeaveWindow"></event>
8939 <event name="OnLeftDClick"></event>
8940 <event name="OnLeftDown"></event>
8941 <event name="OnLeftUp"></event>
8942 <event name="OnMiddleDClick"></event>
8943 <event name="OnMiddleDown"></event>
8944 <event name="OnMiddleUp"></event>
8945 <event name="OnMotion"></event>
8946 <event name="OnMouseEvents"></event>
8947 <event name="OnMouseWheel"></event>
8948 <event name="OnPaint"></event>
8949 <event name="OnRightDClick"></event>
8950 <event name="OnRightDown"></event>
8951 <event name="OnRightUp"></event>
8952 <event name="OnSetFocus"></event>
8953 <event name="OnSize"></event>
8954 <event name="OnUpdateUI"></event>
8955 </object>
8956 </object>
8957 </object>
8958 </object>
8959 <object class="sizeritem" expanded="1">
8960 <property name="border">5</property>
8961 <property name="flag">wxALIGN_CENTER_HORIZONTAL</property>
8962 <property name="proportion">0</property>
8963 <object class="wxBoxSizer" expanded="1">
8964 <property name="minimum_size"></property>
8965 <property name="name">bSizer25</property>
8966 <property name="orient">wxHORIZONTAL</property>
8967 <property name="permission">none</property>
8968 <object class="sizeritem" expanded="1">
8969 <property name="border">5</property>
8970 <property name="flag">wxALL</property>
8971 <property name="proportion">0</property>
8972 <object class="wxButton" expanded="1">
8973 <property name="bg"></property>
8974 <property name="context_help"></property>
8975 <property name="default">0</property>
8976 <property name="enabled">1</property>
8977 <property name="fg"></property>
8978 <property name="font"></property>
8979 <property name="hidden">0</property>
8980 <property name="id">wxID_ANY</property>
8981 <property name="label">&amp;Add Field</property>
8982 <property name="maximum_size"></property>
8983 <property name="minimum_size"></property>
8984 <property name="name">m_buttonAddField</property>
8985 <property name="permission">protected</property>
8986 <property name="pos"></property>
8987 <property name="size"></property>
8988 <property name="style"></property>
8989 <property name="subclass"></property>
8990 <property name="tooltip"></property>
8991 <property name="window_extra_style"></property>
8992 <property name="window_name"></property>
8993 <property name="window_style"></property>
8994 <event name="OnButtonClick">OnButtonAddField</event>
8995 <event name="OnChar"></event>
8996 <event name="OnEnterWindow"></event>
8997 <event name="OnEraseBackground"></event>
8998 <event name="OnKeyDown"></event>
8999 <event name="OnKeyUp"></event>
9000 <event name="OnKillFocus"></event>
9001 <event name="OnLeaveWindow"></event>
9002 <event name="OnLeftDClick"></event>
9003 <event name="OnLeftDown"></event>
9004 <event name="OnLeftUp"></event>
9005 <event name="OnMiddleDClick"></event>
9006 <event name="OnMiddleDown"></event>
9007 <event name="OnMiddleUp"></event>
9008 <event name="OnMotion"></event>
9009 <event name="OnMouseEvents"></event>
9010 <event name="OnMouseWheel"></event>
9011 <event name="OnPaint"></event>
9012 <event name="OnRightDClick"></event>
9013 <event name="OnRightDown"></event>
9014 <event name="OnRightUp"></event>
9015 <event name="OnSetFocus"></event>
9016 <event name="OnSize"></event>
9017 <event name="OnUpdateUI"></event>
9018 </object>
9019 </object>
9020 </object>
9021 </object>
9022 </object>
9023 </object>
9024 </object>
9025 <object class="sizeritem" expanded="1">
9026 <property name="border">5</property>
9027 <property name="flag">wxALIGN_RIGHT</property>
9028 <property name="proportion">0</property>
9029 <object class="wxBoxSizer" expanded="1">
9030 <property name="minimum_size"></property>
9031 <property name="name">bSizer26</property>
9032 <property name="orient">wxHORIZONTAL</property>
9033 <property name="permission">none</property>
9034 <object class="sizeritem" expanded="1">
9035 <property name="border">5</property>
9036 <property name="flag">wxALL</property>
9037 <property name="proportion">0</property>
9038 <object class="wxButton" expanded="1">
9039 <property name="bg"></property>
9040 <property name="context_help"></property>
9041 <property name="default">0</property>
9042 <property name="enabled">1</property>
9043 <property name="fg"></property>
9044 <property name="font"></property>
9045 <property name="hidden">0</property>
9046 <property name="id">wxID_BUTTONSEND</property>
9047 <property name="label">&amp;Send</property>
9048 <property name="maximum_size"></property>
9049 <property name="minimum_size">85,25</property>
9050 <property name="name">m_buttonOK</property>
9051 <property name="permission">protected</property>
9052 <property name="pos"></property>
9053 <property name="size"></property>
9054 <property name="style"></property>
9055 <property name="subclass"></property>
9056 <property name="tooltip"></property>
9057 <property name="window_extra_style"></property>
9058 <property name="window_name"></property>
9059 <property name="window_style"></property>
9060 <event name="OnButtonClick">OnButtonSend</event>
9061 <event name="OnChar"></event>
9062 <event name="OnEnterWindow"></event>
9063 <event name="OnEraseBackground"></event>
9064 <event name="OnKeyDown"></event>
9065 <event name="OnKeyUp"></event>
9066 <event name="OnKillFocus"></event>
9067 <event name="OnLeaveWindow"></event>
9068 <event name="OnLeftDClick"></event>
9069 <event name="OnLeftDown"></event>
9070 <event name="OnLeftUp"></event>
9071 <event name="OnMiddleDClick"></event>
9072 <event name="OnMiddleDown"></event>
9073 <event name="OnMiddleUp"></event>
9074 <event name="OnMotion"></event>
9075 <event name="OnMouseEvents"></event>
9076 <event name="OnMouseWheel"></event>
9077 <event name="OnPaint"></event>
9078 <event name="OnRightDClick"></event>
9079 <event name="OnRightDown"></event>
9080 <event name="OnRightUp"></event>
9081 <event name="OnSetFocus"></event>
9082 <event name="OnSize"></event>
9083 <event name="OnUpdateUI"></event>
9084 </object>
9085 </object>
9086 <object class="sizeritem" expanded="1">
9087 <property name="border">5</property>
9088 <property name="flag">wxALL</property>
9089 <property name="proportion">0</property>
9090 <object class="wxButton" expanded="1">
9091 <property name="bg"></property>
9092 <property name="context_help"></property>
9093 <property name="default">0</property>
9094 <property name="enabled">1</property>
9095 <property name="fg"></property>
9096 <property name="font"></property>
9097 <property name="hidden">0</property>
9098 <property name="id">wxID_BUTTONPREVIEW</property>
9099 <property name="label">&amp;Preview</property>
9100 <property name="maximum_size"></property>
9101 <property name="minimum_size">85,25</property>
9102 <property name="name">m_buttonPreview</property>
9103 <property name="permission">protected</property>
9104 <property name="pos"></property>
9105 <property name="size"></property>
9106 <property name="style"></property>
9107 <property name="subclass"></property>
9108 <property name="tooltip"></property>
9109 <property name="window_extra_style"></property>
9110 <property name="window_name"></property>
9111 <property name="window_style"></property>
9112 <event name="OnButtonClick">OnButtonPreview</event>
9113 <event name="OnChar"></event>
9114 <event name="OnEnterWindow"></event>
9115 <event name="OnEraseBackground"></event>
9116 <event name="OnKeyDown"></event>
9117 <event name="OnKeyUp"></event>
9118 <event name="OnKillFocus"></event>
9119 <event name="OnLeaveWindow"></event>
9120 <event name="OnLeftDClick"></event>
9121 <event name="OnLeftDown"></event>
9122 <event name="OnLeftUp"></event>
9123 <event name="OnMiddleDClick"></event>
9124 <event name="OnMiddleDown"></event>
9125 <event name="OnMiddleUp"></event>
9126 <event name="OnMotion"></event>
9127 <event name="OnMouseEvents"></event>
9128 <event name="OnMouseWheel"></event>
9129 <event name="OnPaint"></event>
9130 <event name="OnRightDClick"></event>
9131 <event name="OnRightDown"></event>
9132 <event name="OnRightUp"></event>
9133 <event name="OnSetFocus"></event>
9134 <event name="OnSize"></event>
9135 <event name="OnUpdateUI"></event>
9136 </object>
9137 </object>
9138 <object class="sizeritem" expanded="1">
9139 <property name="border">5</property>
9140 <property name="flag">wxALL</property>
9141 <property name="proportion">0</property>
9142 <object class="wxButton" expanded="1">
9143 <property name="bg"></property>
9144 <property name="context_help"></property>
9145 <property name="default">0</property>
9146 <property name="enabled">1</property>
9147 <property name="fg"></property>
9148 <property name="font"></property>
9149 <property name="hidden">0</property>
9150 <property name="id">wxID_CANCEL</property>
9151 <property name="label">Cancel</property>
9152 <property name="maximum_size"></property>
9153 <property name="minimum_size">85,25</property>
9154 <property name="name">m_buttonCancel</property>
9155 <property name="permission">protected</property>
9156 <property name="pos"></property>
9157 <property name="size"></property>
9158 <property name="style"></property>
9159 <property name="subclass"></property>
9160 <property name="tooltip"></property>
9161 <property name="window_extra_style"></property>
9162 <property name="window_name"></property>
9163 <property name="window_style"></property>
9164 <event name="OnButtonClick">OnButtonCancel</event>
9165 <event name="OnChar"></event>
9166 <event name="OnEnterWindow"></event>
9167 <event name="OnEraseBackground"></event>
9168 <event name="OnKeyDown"></event>
9169 <event name="OnKeyUp"></event>
9170 <event name="OnKillFocus"></event>
9171 <event name="OnLeaveWindow"></event>
9172 <event name="OnLeftDClick"></event>
9173 <event name="OnLeftDown"></event>
9174 <event name="OnLeftUp"></event>
9175 <event name="OnMiddleDClick"></event>
9176 <event name="OnMiddleDown"></event>
9177 <event name="OnMiddleUp"></event>
9178 <event name="OnMotion"></event>
9179 <event name="OnMouseEvents"></event>
9180 <event name="OnMouseWheel"></event>
9181 <event name="OnPaint"></event>
9182 <event name="OnRightDClick"></event>
9183 <event name="OnRightDown"></event>
9184 <event name="OnRightUp"></event>
9185 <event name="OnSetFocus"></event>
9186 <event name="OnSize"></event>
9187 <event name="OnUpdateUI"></event>
9188 </object>
9189 </object>
9190 </object>
9191 </object>
9192 </object>
9193 </object>
9194 <object class="Frame" expanded="0">
9195 <property name="bg">wxSYS_COLOUR_MENU</property>
9196 <property name="center"></property>
9197 <property name="context_help"></property>
9198 <property name="enabled">1</property>
9199 <property name="extra_style"></property>
9200 <property name="fg"></property>
9201 <property name="font"></property>
9202 <property name="hidden">0</property>
9203 <property name="id">wxID_ANY</property>
9204 <property name="maximum_size"></property>
9205 <property name="minimum_size"></property>
9206 <property name="name">CViewProductDialogBase</property>
9207 <property name="pos"></property>
9208 <property name="size">630,520</property>
9209 <property name="style">wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER</property>
9210 <property name="subclass"></property>
9211 <property name="title">Order Form</property>
9212 <property name="tooltip"></property>
9213 <property name="window_extra_style"></property>
9214 <property name="window_name"></property>
9215 <property name="window_style">wxTAB_TRAVERSAL</property>
9216 <property name="xrc_skip_sizer">1</property>
9217 <event name="OnActivate"></event>
9218 <event name="OnActivateApp"></event>
9219 <event name="OnChar"></event>
9220 <event name="OnClose"></event>
9221 <event name="OnEnterWindow"></event>
9222 <event name="OnEraseBackground"></event>
9223 <event name="OnHibernate"></event>
9224 <event name="OnIconize"></event>
9225 <event name="OnIdle"></event>
9226 <event name="OnKeyDown"></event>
9227 <event name="OnKeyUp"></event>
9228 <event name="OnKillFocus"></event>
9229 <event name="OnLeaveWindow"></event>
9230 <event name="OnLeftDClick"></event>
9231 <event name="OnLeftDown"></event>
9232 <event name="OnLeftUp"></event>
9233 <event name="OnMiddleDClick"></event>
9234 <event name="OnMiddleDown"></event>
9235 <event name="OnMiddleUp"></event>
9236 <event name="OnMotion"></event>
9237 <event name="OnMouseEvents"></event>
9238 <event name="OnMouseWheel"></event>
9239 <event name="OnPaint"></event>
9240 <event name="OnRightDClick"></event>
9241 <event name="OnRightDown"></event>
9242 <event name="OnRightUp"></event>
9243 <event name="OnSetFocus"></event>
9244 <event name="OnSize"></event>
9245 <event name="OnUpdateUI"></event>
9246 <object class="wxBoxSizer" expanded="1">
9247 <property name="minimum_size"></property>
9248 <property name="name">bSizer20</property>
9249 <property name="orient">wxVERTICAL</property>
9250 <property name="permission">none</property>
9251 <object class="sizeritem" expanded="1">
9252 <property name="border">5</property>
9253 <property name="flag">wxEXPAND</property>
9254 <property name="proportion">1</property>
9255 <object class="wxBoxSizer" expanded="1">
9256 <property name="minimum_size"></property>
9257 <property name="name">bSizer116</property>
9258 <property name="orient">wxHORIZONTAL</property>
9259 <property name="permission">none</property>
9260 <object class="sizeritem" expanded="1">
9261 <property name="border">5</property>
9262 <property name="flag">wxALL|wxEXPAND</property>
9263 <property name="proportion">1</property>
9264 <object class="wxHtmlWindow" expanded="1">
9265 <property name="bg"></property>
9266 <property name="context_help"></property>
9267 <property name="enabled">1</property>
9268 <property name="fg"></property>
9269 <property name="font"></property>
9270 <property name="hidden">1</property>
9271 <property name="id">wxID_ANY</property>
9272 <property name="maximum_size"></property>
9273 <property name="minimum_size"></property>
9274 <property name="name">m_htmlWinReviews</property>
9275 <property name="permission">protected</property>
9276 <property name="pos"></property>
9277 <property name="size"></property>
9278 <property name="style">wxHW_SCROLLBAR_AUTO</property>
9279 <property name="subclass"></property>
9280 <property name="tooltip"></property>
9281 <property name="window_extra_style"></property>
9282 <property name="window_name"></property>
9283 <property name="window_style"></property>
9284 <event name="OnChar"></event>
9285 <event name="OnEnterWindow"></event>
9286 <event name="OnEraseBackground"></event>
9287 <event name="OnHtmlCellClicked"></event>
9288 <event name="OnHtmlCellHover"></event>
9289 <event name="OnHtmlLinkClicked"></event>
9290 <event name="OnKeyDown"></event>
9291 <event name="OnKeyUp"></event>
9292 <event name="OnKillFocus"></event>
9293 <event name="OnLeaveWindow"></event>
9294 <event name="OnLeftDClick"></event>
9295 <event name="OnLeftDown"></event>
9296 <event name="OnLeftUp"></event>
9297 <event name="OnMiddleDClick"></event>
9298 <event name="OnMiddleDown"></event>
9299 <event name="OnMiddleUp"></event>
9300 <event name="OnMotion"></event>
9301 <event name="OnMouseEvents"></event>
9302 <event name="OnMouseWheel"></event>
9303 <event name="OnPaint"></event>
9304 <event name="OnRightDClick"></event>
9305 <event name="OnRightDown"></event>
9306 <event name="OnRightUp"></event>
9307 <event name="OnSetFocus"></event>
9308 <event name="OnSize"></event>
9309 <event name="OnUpdateUI"></event>
9310 </object>
9311 </object>
9312 <object class="sizeritem" expanded="1">
9313 <property name="border">5</property>
9314 <property name="flag">wxEXPAND|wxALL</property>
9315 <property name="proportion">1</property>
9316 <object class="wxScrolledWindow" expanded="1">
9317 <property name="bg">wxSYS_COLOUR_WINDOW</property>
9318 <property name="context_help"></property>
9319 <property name="enabled">1</property>
9320 <property name="fg"></property>
9321 <property name="font"></property>
9322 <property name="hidden">0</property>
9323 <property name="id">wxID_ANY</property>
9324 <property name="maximum_size"></property>
9325 <property name="minimum_size"></property>
9326 <property name="name">m_scrolledWindow</property>
9327 <property name="permission">protected</property>
9328 <property name="pos"></property>
9329 <property name="scroll_rate_x">5</property>
9330 <property name="scroll_rate_y">5</property>
9331 <property name="size"></property>
9332 <property name="subclass"></property>
9333 <property name="tooltip"></property>
9334 <property name="window_extra_style"></property>
9335 <property name="window_name"></property>
9336 <property name="window_style">wxHSCROLL|wxTAB_TRAVERSAL|wxVSCROLL</property>
9337 <event name="OnChar"></event>
9338 <event name="OnEnterWindow"></event>
9339 <event name="OnEraseBackground"></event>
9340 <event name="OnKeyDown"></event>
9341 <event name="OnKeyUp"></event>
9342 <event name="OnKillFocus"></event>
9343 <event name="OnLeaveWindow"></event>
9344 <event name="OnLeftDClick"></event>
9345 <event name="OnLeftDown"></event>
9346 <event name="OnLeftUp"></event>
9347 <event name="OnMiddleDClick"></event>
9348 <event name="OnMiddleDown"></event>
9349 <event name="OnMiddleUp"></event>
9350 <event name="OnMotion"></event>
9351 <event name="OnMouseEvents"></event>
9352 <event name="OnMouseWheel"></event>
9353 <event name="OnPaint"></event>
9354 <event name="OnRightDClick"></event>
9355 <event name="OnRightDown"></event>
9356 <event name="OnRightUp"></event>
9357 <event name="OnSetFocus"></event>
9358 <event name="OnSize"></event>
9359 <event name="OnUpdateUI"></event>
9360 <object class="wxBoxSizer" expanded="1">
9361 <property name="minimum_size"></property>
9362 <property name="name">bSizer21</property>
9363 <property name="orient">wxVERTICAL</property>
9364 <property name="permission">none</property>
9365 <object class="sizeritem" expanded="1">
9366 <property name="border">5</property>
9367 <property name="flag">wxEXPAND</property>
9368 <property name="proportion">0</property>
9369 <object class="wxRichTextCtrl" expanded="1">
9370 <property name="bg"></property>
9371 <property name="context_help"></property>
9372 <property name="enabled">1</property>
9373 <property name="fg"></property>
9374 <property name="font"></property>
9375 <property name="hidden">0</property>
9376 <property name="id">wxID_ANY</property>
9377 <property name="maximum_size"></property>
9378 <property name="minimum_size">-1,-1</property>
9379 <property name="name">m_richTextHeading</property>
9380 <property name="permission">protected</property>
9381 <property name="pos"></property>
9382 <property name="size">-1,50</property>
9383 <property name="style">wxTE_READONLY</property>
9384 <property name="subclass"></property>
9385 <property name="tooltip"></property>
9386 <property name="window_extra_style"></property>
9387 <property name="window_name"></property>
9388 <property name="window_style">wxNO_BORDER</property>
9389 <event name="OnChar"></event>
9390 <event name="OnEnterWindow"></event>
9391 <event name="OnEraseBackground"></event>
9392 <event name="OnKeyDown"></event>
9393 <event name="OnKeyUp"></event>
9394 <event name="OnKillFocus"></event>
9395 <event name="OnLeaveWindow"></event>
9396 <event name="OnLeftDClick"></event>
9397 <event name="OnLeftDown"></event>
9398 <event name="OnLeftUp"></event>
9399 <event name="OnMiddleDClick"></event>
9400 <event name="OnMiddleDown"></event>
9401 <event name="OnMiddleUp"></event>
9402 <event name="OnMotion"></event>
9403 <event name="OnMouseEvents"></event>
9404 <event name="OnMouseWheel"></event>
9405 <event name="OnPaint"></event>
9406 <event name="OnRichTextCharacter"></event>
9407 <event name="OnRichTextContentDeleted"></event>
9408 <event name="OnRichTextContentInserted"></event>
9409 <event name="OnRichTextDelete"></event>
9410 <event name="OnRichTextReturn"></event>
9411 <event name="OnRichTextStyleChanged"></event>
9412 <event name="OnRichTextStyleSheetChanged"></event>
9413 <event name="OnRichTextStyleSheetReplaced"></event>
9414 <event name="OnRichTextStyleSheetReplacing"></event>
9415 <event name="OnRightDClick"></event>
9416 <event name="OnRightDown"></event>
9417 <event name="OnRightUp"></event>
9418 <event name="OnSetFocus"></event>
9419 <event name="OnSize"></event>
9420 <event name="OnText"></event>
9421 <event name="OnTextEnter"></event>
9422 <event name="OnTextMaxLen"></event>
9423 <event name="OnTextURL"></event>
9424 <event name="OnUpdateUI"></event>
9425 </object>
9426 </object>
9427 <object class="sizeritem" expanded="1">
9428 <property name="border">5</property>
9429 <property name="flag">wxALL|wxEXPAND</property>
9430 <property name="proportion">0</property>
9431 <object class="wxStaticText" expanded="1">
9432 <property name="bg"></property>
9433 <property name="context_help"></property>
9434 <property name="enabled">1</property>
9435 <property name="fg"></property>
9436 <property name="font"></property>
9437 <property name="hidden">0</property>
9438 <property name="id">wxID_ANY</property>
9439 <property name="label">Order Form instructions here&#x0A;multiple lines&#x0A;1&#x0A;2&#x0A;3&#x0A;4&#x0A;5&#x0A;6</property>
9440 <property name="maximum_size"></property>
9441 <property name="minimum_size"></property>
9442 <property name="name">m_staticTextInstructions</property>
9443 <property name="permission">protected</property>
9444 <property name="pos"></property>
9445 <property name="size"></property>
9446 <property name="style"></property>
9447 <property name="subclass"></property>
9448 <property name="tooltip"></property>
9449 <property name="window_extra_style"></property>
9450 <property name="window_name"></property>
9451 <property name="window_style"></property>
9452 <property name="wrap">-1</property>
9453 <event name="OnChar"></event>
9454 <event name="OnEnterWindow"></event>
9455 <event name="OnEraseBackground"></event>
9456 <event name="OnKeyDown"></event>
9457 <event name="OnKeyUp"></event>
9458 <event name="OnKillFocus"></event>
9459 <event name="OnLeaveWindow"></event>
9460 <event name="OnLeftDClick"></event>
9461 <event name="OnLeftDown"></event>
9462 <event name="OnLeftUp"></event>
9463 <event name="OnMiddleDClick"></event>
9464 <event name="OnMiddleDown"></event>
9465 <event name="OnMiddleUp"></event>
9466 <event name="OnMotion"></event>
9467 <event name="OnMouseEvents"></event>
9468 <event name="OnMouseWheel"></event>
9469 <event name="OnPaint"></event>
9470 <event name="OnRightDClick"></event>
9471 <event name="OnRightDown"></event>
9472 <event name="OnRightUp"></event>
9473 <event name="OnSetFocus"></event>
9474 <event name="OnSize"></event>
9475 <event name="OnUpdateUI"></event>
9476 </object>
9477 </object>
9478 <object class="sizeritem" expanded="1">
9479 <property name="border">5</property>
9480 <property name="flag">wxALIGN_CENTER_HORIZONTAL</property>
9481 <property name="proportion">0</property>
9482 <object class="wxBoxSizer" expanded="1">
9483 <property name="minimum_size"></property>
9484 <property name="name">bSizer25</property>
9485 <property name="orient">wxHORIZONTAL</property>
9486 <property name="permission">none</property>
9487 <object class="sizeritem" expanded="1">
9488 <property name="border">5</property>
9489 <property name="flag">wxALL</property>
9490 <property name="proportion">0</property>
9491 <object class="wxButton" expanded="1">
9492 <property name="bg"></property>
9493 <property name="context_help"></property>
9494 <property name="default">0</property>
9495 <property name="enabled">1</property>
9496 <property name="fg"></property>
9497 <property name="font"></property>
9498 <property name="hidden">0</property>
9499 <property name="id">wxID_BUTTONSAMPLE</property>
9500 <property name="label">&amp;Submit</property>
9501 <property name="maximum_size"></property>
9502 <property name="minimum_size">-1,-1</property>
9503 <property name="name">m_buttonSubmitForm</property>
9504 <property name="permission">protected</property>
9505 <property name="pos"></property>
9506 <property name="size"></property>
9507 <property name="style"></property>
9508 <property name="subclass"></property>
9509 <property name="tooltip"></property>
9510 <property name="window_extra_style"></property>
9511 <property name="window_name"></property>
9512 <property name="window_style"></property>
9513 <event name="OnButtonClick">OnButtonSubmitForm</event>
9514 <event name="OnChar"></event>
9515 <event name="OnEnterWindow"></event>
9516 <event name="OnEraseBackground"></event>
9517 <event name="OnKeyDown"></event>
9518 <event name="OnKeyUp"></event>
9519 <event name="OnKillFocus"></event>
9520 <event name="OnLeaveWindow"></event>
9521 <event name="OnLeftDClick"></event>
9522 <event name="OnLeftDown"></event>
9523 <event name="OnLeftUp"></event>
9524 <event name="OnMiddleDClick"></event>
9525 <event name="OnMiddleDown"></event>
9526 <event name="OnMiddleUp"></event>
9527 <event name="OnMotion"></event>
9528 <event name="OnMouseEvents"></event>
9529 <event name="OnMouseWheel"></event>
9530 <event name="OnPaint"></event>
9531 <event name="OnRightDClick"></event>
9532 <event name="OnRightDown"></event>
9533 <event name="OnRightUp"></event>
9534 <event name="OnSetFocus"></event>
9535 <event name="OnSize"></event>
9536 <event name="OnUpdateUI"></event>
9537 </object>
9538 </object>
9539 <object class="sizeritem" expanded="1">
9540 <property name="border">5</property>
9541 <property name="flag">wxALL</property>
9542 <property name="proportion">0</property>
9543 <object class="wxButton" expanded="1">
9544 <property name="bg"></property>
9545 <property name="context_help"></property>
9546 <property name="default">0</property>
9547 <property name="enabled">1</property>
9548 <property name="fg"></property>
9549 <property name="font"></property>
9550 <property name="hidden">0</property>
9551 <property name="id">wxID_CANCEL2</property>
9552 <property name="label">Cancel</property>
9553 <property name="maximum_size"></property>
9554 <property name="minimum_size"></property>
9555 <property name="name">m_buttonCancelForm</property>
9556 <property name="permission">protected</property>
9557 <property name="pos"></property>
9558 <property name="size"></property>
9559 <property name="style"></property>
9560 <property name="subclass"></property>
9561 <property name="tooltip"></property>
9562 <property name="window_extra_style"></property>
9563 <property name="window_name"></property>
9564 <property name="window_style"></property>
9565 <event name="OnButtonClick">OnButtonCancelForm</event>
9566 <event name="OnChar"></event>
9567 <event name="OnEnterWindow"></event>
9568 <event name="OnEraseBackground"></event>
9569 <event name="OnKeyDown"></event>
9570 <event name="OnKeyUp"></event>
9571 <event name="OnKillFocus"></event>
9572 <event name="OnLeaveWindow"></event>
9573 <event name="OnLeftDClick"></event>
9574 <event name="OnLeftDown"></event>
9575 <event name="OnLeftUp"></event>
9576 <event name="OnMiddleDClick"></event>
9577 <event name="OnMiddleDown"></event>
9578 <event name="OnMiddleUp"></event>
9579 <event name="OnMotion"></event>
9580 <event name="OnMouseEvents"></event>
9581 <event name="OnMouseWheel"></event>
9582 <event name="OnPaint"></event>
9583 <event name="OnRightDClick"></event>
9584 <event name="OnRightDown"></event>
9585 <event name="OnRightUp"></event>
9586 <event name="OnSetFocus"></event>
9587 <event name="OnSize"></event>
9588 <event name="OnUpdateUI"></event>
9589 </object>
9590 </object>
9591 </object>
9592 </object>
9593 </object>
9594 </object>
9595 </object>
9596 </object>
9597 </object>
9598 <object class="sizeritem" expanded="1">
9599 <property name="border">5</property>
9600 <property name="flag">wxALIGN_RIGHT</property>
9601 <property name="proportion">0</property>
9602 <object class="wxBoxSizer" expanded="1">
9603 <property name="minimum_size"></property>
9604 <property name="name">bSizer26</property>
9605 <property name="orient">wxHORIZONTAL</property>
9606 <property name="permission">none</property>
9607 <object class="sizeritem" expanded="1">
9608 <property name="border">5</property>
9609 <property name="flag">wxALL</property>
9610 <property name="proportion">0</property>
9611 <object class="wxButton" expanded="1">
9612 <property name="bg"></property>
9613 <property name="context_help"></property>
9614 <property name="default">0</property>
9615 <property name="enabled">0</property>
9616 <property name="fg"></property>
9617 <property name="font"></property>
9618 <property name="hidden">0</property>
9619 <property name="id">wxID_BUTTONBACK</property>
9620 <property name="label">&lt; &amp;Back </property>
9621 <property name="maximum_size"></property>
9622 <property name="minimum_size">85,25</property>
9623 <property name="name">m_buttonBack</property>
9624 <property name="permission">protected</property>
9625 <property name="pos"></property>
9626 <property name="size"></property>
9627 <property name="style"></property>
9628 <property name="subclass"></property>
9629 <property name="tooltip"></property>
9630 <property name="window_extra_style"></property>
9631 <property name="window_name"></property>
9632 <property name="window_style"></property>
9633 <event name="OnButtonClick">OnButtonBack</event>
9634 <event name="OnChar"></event>
9635 <event name="OnEnterWindow"></event>
9636 <event name="OnEraseBackground"></event>
9637 <event name="OnKeyDown"></event>
9638 <event name="OnKeyUp"></event>
9639 <event name="OnKillFocus"></event>
9640 <event name="OnLeaveWindow"></event>
9641 <event name="OnLeftDClick"></event>
9642 <event name="OnLeftDown"></event>
9643 <event name="OnLeftUp"></event>
9644 <event name="OnMiddleDClick"></event>
9645 <event name="OnMiddleDown"></event>
9646 <event name="OnMiddleUp"></event>
9647 <event name="OnMotion"></event>
9648 <event name="OnMouseEvents"></event>
9649 <event name="OnMouseWheel"></event>
9650 <event name="OnPaint"></event>
9651 <event name="OnRightDClick"></event>
9652 <event name="OnRightDown"></event>
9653 <event name="OnRightUp"></event>
9654 <event name="OnSetFocus"></event>
9655 <event name="OnSize"></event>
9656 <event name="OnUpdateUI"></event>
9657 </object>
9658 </object>
9659 <object class="sizeritem" expanded="1">
9660 <property name="border">5</property>
9661 <property name="flag">wxALL</property>
9662 <property name="proportion">0</property>
9663 <object class="wxButton" expanded="1">
9664 <property name="bg"></property>
9665 <property name="context_help"></property>
9666 <property name="default">0</property>
9667 <property name="enabled">1</property>
9668 <property name="fg"></property>
9669 <property name="font"></property>
9670 <property name="hidden">0</property>
9671 <property name="id">wxID_BUTTONNEXT</property>
9672 <property name="label"> &amp;Next &gt;</property>
9673 <property name="maximum_size"></property>
9674 <property name="minimum_size">85,25</property>
9675 <property name="name">m_buttonNext</property>
9676 <property name="permission">protected</property>
9677 <property name="pos"></property>
9678 <property name="size"></property>
9679 <property name="style"></property>
9680 <property name="subclass"></property>
9681 <property name="tooltip"></property>
9682 <property name="window_extra_style"></property>
9683 <property name="window_name"></property>
9684 <property name="window_style"></property>
9685 <event name="OnButtonClick">OnButtonNext</event>
9686 <event name="OnChar"></event>
9687 <event name="OnEnterWindow"></event>
9688 <event name="OnEraseBackground"></event>
9689 <event name="OnKeyDown"></event>
9690 <event name="OnKeyUp"></event>
9691 <event name="OnKillFocus"></event>
9692 <event name="OnLeaveWindow"></event>
9693 <event name="OnLeftDClick"></event>
9694 <event name="OnLeftDown"></event>
9695 <event name="OnLeftUp"></event>
9696 <event name="OnMiddleDClick"></event>
9697 <event name="OnMiddleDown"></event>
9698 <event name="OnMiddleUp"></event>
9699 <event name="OnMotion"></event>
9700 <event name="OnMouseEvents"></event>
9701 <event name="OnMouseWheel"></event>
9702 <event name="OnPaint"></event>
9703 <event name="OnRightDClick"></event>
9704 <event name="OnRightDown"></event>
9705 <event name="OnRightUp"></event>
9706 <event name="OnSetFocus"></event>
9707 <event name="OnSize"></event>
9708 <event name="OnUpdateUI"></event>
9709 </object>
9710 </object>
9711 <object class="sizeritem" expanded="1">
9712 <property name="border">5</property>
9713 <property name="flag">wxALL</property>
9714 <property name="proportion">0</property>
9715 <object class="wxButton" expanded="1">
9716 <property name="bg"></property>
9717 <property name="context_help"></property>
9718 <property name="default">0</property>
9719 <property name="enabled">1</property>
9720 <property name="fg"></property>
9721 <property name="font"></property>
9722 <property name="hidden">0</property>
9723 <property name="id">wxID_CANCEL</property>
9724 <property name="label">Cancel</property>
9725 <property name="maximum_size"></property>
9726 <property name="minimum_size">85,25</property>
9727 <property name="name">m_buttonCancel</property>
9728 <property name="permission">protected</property>
9729 <property name="pos"></property>
9730 <property name="size"></property>
9731 <property name="style"></property>
9732 <property name="subclass"></property>
9733 <property name="tooltip"></property>
9734 <property name="window_extra_style"></property>
9735 <property name="window_name"></property>
9736 <property name="window_style"></property>
9737 <event name="OnButtonClick">OnButtonCancel</event>
9738 <event name="OnChar"></event>
9739 <event name="OnEnterWindow"></event>
9740 <event name="OnEraseBackground"></event>
9741 <event name="OnKeyDown"></event>
9742 <event name="OnKeyUp"></event>
9743 <event name="OnKillFocus"></event>
9744 <event name="OnLeaveWindow"></event>
9745 <event name="OnLeftDClick"></event>
9746 <event name="OnLeftDown"></event>
9747 <event name="OnLeftUp"></event>
9748 <event name="OnMiddleDClick"></event>
9749 <event name="OnMiddleDown"></event>
9750 <event name="OnMiddleUp"></event>
9751 <event name="OnMotion"></event>
9752 <event name="OnMouseEvents"></event>
9753 <event name="OnMouseWheel"></event>
9754 <event name="OnPaint"></event>
9755 <event name="OnRightDClick"></event>
9756 <event name="OnRightDown"></event>
9757 <event name="OnRightUp"></event>
9758 <event name="OnSetFocus"></event>
9759 <event name="OnSize"></event>
9760 <event name="OnUpdateUI"></event>
9761 </object>
9762 </object>
9763 </object>
9764 </object>
9765 </object>
9766 </object>
9767 <object class="Frame" expanded="0">
9768 <property name="bg">wxSYS_COLOUR_MENU</property>
9769 <property name="center"></property>
9770 <property name="context_help"></property>
9771 <property name="enabled">1</property>
9772 <property name="extra_style"></property>
9773 <property name="fg"></property>
9774 <property name="font"></property>
9775 <property name="hidden">0</property>
9776 <property name="id">wxID_ANY</property>
9777 <property name="maximum_size"></property>
9778 <property name="minimum_size"></property>
9779 <property name="name">CViewOrderDialogBase</property>
9780 <property name="pos"></property>
9781 <property name="size">630,520</property>
9782 <property name="style">wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER</property>
9783 <property name="subclass"></property>
9784 <property name="title">View Order</property>
9785 <property name="tooltip"></property>
9786 <property name="window_extra_style"></property>
9787 <property name="window_name"></property>
9788 <property name="window_style">wxTAB_TRAVERSAL</property>
9789 <property name="xrc_skip_sizer">1</property>
9790 <event name="OnActivate"></event>
9791 <event name="OnActivateApp"></event>
9792 <event name="OnChar"></event>
9793 <event name="OnClose"></event>
9794 <event name="OnEnterWindow"></event>
9795 <event name="OnEraseBackground"></event>
9796 <event name="OnHibernate"></event>
9797 <event name="OnIconize"></event>
9798 <event name="OnIdle"></event>
9799 <event name="OnKeyDown"></event>
9800 <event name="OnKeyUp"></event>
9801 <event name="OnKillFocus"></event>
9802 <event name="OnLeaveWindow"></event>
9803 <event name="OnLeftDClick"></event>
9804 <event name="OnLeftDown"></event>
9805 <event name="OnLeftUp"></event>
9806 <event name="OnMiddleDClick"></event>
9807 <event name="OnMiddleDown"></event>
9808 <event name="OnMiddleUp"></event>
9809 <event name="OnMotion"></event>
9810 <event name="OnMouseEvents"></event>
9811 <event name="OnMouseWheel"></event>
9812 <event name="OnPaint"></event>
9813 <event name="OnRightDClick"></event>
9814 <event name="OnRightDown"></event>
9815 <event name="OnRightUp"></event>
9816 <event name="OnSetFocus"></event>
9817 <event name="OnSize"></event>
9818 <event name="OnUpdateUI"></event>
9819 <object class="wxBoxSizer" expanded="1">
9820 <property name="minimum_size"></property>
9821 <property name="name">bSizer20</property>
9822 <property name="orient">wxVERTICAL</property>
9823 <property name="permission">none</property>
9824 <object class="sizeritem" expanded="1">
9825 <property name="border">5</property>
9826 <property name="flag">wxEXPAND</property>
9827 <property name="proportion">1</property>
9828 <object class="wxBoxSizer" expanded="1">
9829 <property name="minimum_size"></property>
9830 <property name="name">bSizer116</property>
9831 <property name="orient">wxHORIZONTAL</property>
9832 <property name="permission">none</property>
9833 <object class="sizeritem" expanded="1">
9834 <property name="border">5</property>
9835 <property name="flag">wxALL|wxEXPAND</property>
9836 <property name="proportion">1</property>
9837 <object class="wxHtmlWindow" expanded="1">
9838 <property name="bg"></property>
9839 <property name="context_help"></property>
9840 <property name="enabled">1</property>
9841 <property name="fg"></property>
9842 <property name="font"></property>
9843 <property name="hidden">0</property>
9844 <property name="id">wxID_ANY</property>
9845 <property name="maximum_size"></property>
9846 <property name="minimum_size"></property>
9847 <property name="name">m_htmlWin</property>
9848 <property name="permission">protected</property>
9849 <property name="pos"></property>
9850 <property name="size"></property>
9851 <property name="style">wxHW_SCROLLBAR_AUTO</property>
9852 <property name="subclass"></property>
9853 <property name="tooltip"></property>
9854 <property name="window_extra_style"></property>
9855 <property name="window_name"></property>
9856 <property name="window_style"></property>
9857 <event name="OnChar"></event>
9858 <event name="OnEnterWindow"></event>
9859 <event name="OnEraseBackground"></event>
9860 <event name="OnHtmlCellClicked"></event>
9861 <event name="OnHtmlCellHover"></event>
9862 <event name="OnHtmlLinkClicked"></event>
9863 <event name="OnKeyDown"></event>
9864 <event name="OnKeyUp"></event>
9865 <event name="OnKillFocus"></event>
9866 <event name="OnLeaveWindow"></event>
9867 <event name="OnLeftDClick"></event>
9868 <event name="OnLeftDown"></event>
9869 <event name="OnLeftUp"></event>
9870 <event name="OnMiddleDClick"></event>
9871 <event name="OnMiddleDown"></event>
9872 <event name="OnMiddleUp"></event>
9873 <event name="OnMotion"></event>
9874 <event name="OnMouseEvents"></event>
9875 <event name="OnMouseWheel"></event>
9876 <event name="OnPaint"></event>
9877 <event name="OnRightDClick"></event>
9878 <event name="OnRightDown"></event>
9879 <event name="OnRightUp"></event>
9880 <event name="OnSetFocus"></event>
9881 <event name="OnSize"></event>
9882 <event name="OnUpdateUI"></event>
9883 </object>
9884 </object>
9885 </object>
9886 </object>
9887 <object class="sizeritem" expanded="1">
9888 <property name="border">5</property>
9889 <property name="flag">wxALIGN_RIGHT</property>
9890 <property name="proportion">0</property>
9891 <object class="wxBoxSizer" expanded="1">
9892 <property name="minimum_size"></property>
9893 <property name="name">bSizer26</property>
9894 <property name="orient">wxHORIZONTAL</property>
9895 <property name="permission">none</property>
9896 <object class="sizeritem" expanded="1">
9897 <property name="border">5</property>
9898 <property name="flag">wxALL</property>
9899 <property name="proportion">0</property>
9900 <object class="wxButton" expanded="1">
9901 <property name="bg"></property>
9902 <property name="context_help"></property>
9903 <property name="default">0</property>
9904 <property name="enabled">1</property>
9905 <property name="fg"></property>
9906 <property name="font"></property>
9907 <property name="hidden">0</property>
9908 <property name="id">wxID_OK</property>
9909 <property name="label">OK</property>
9910 <property name="maximum_size"></property>
9911 <property name="minimum_size">85,25</property>
9912 <property name="name">m_buttonOK</property>
9913 <property name="permission">protected</property>
9914 <property name="pos"></property>
9915 <property name="size"></property>
9916 <property name="style"></property>
9917 <property name="subclass"></property>
9918 <property name="tooltip"></property>
9919 <property name="window_extra_style"></property>
9920 <property name="window_name"></property>
9921 <property name="window_style"></property>
9922 <event name="OnButtonClick">OnButtonOK</event>
9923 <event name="OnChar"></event>
9924 <event name="OnEnterWindow"></event>
9925 <event name="OnEraseBackground"></event>
9926 <event name="OnKeyDown"></event>
9927 <event name="OnKeyUp"></event>
9928 <event name="OnKillFocus"></event>
9929 <event name="OnLeaveWindow"></event>
9930 <event name="OnLeftDClick"></event>
9931 <event name="OnLeftDown"></event>
9932 <event name="OnLeftUp"></event>
9933 <event name="OnMiddleDClick"></event>
9934 <event name="OnMiddleDown"></event>
9935 <event name="OnMiddleUp"></event>
9936 <event name="OnMotion"></event>
9937 <event name="OnMouseEvents"></event>
9938 <event name="OnMouseWheel"></event>
9939 <event name="OnPaint"></event>
9940 <event name="OnRightDClick"></event>
9941 <event name="OnRightDown"></event>
9942 <event name="OnRightUp"></event>
9943 <event name="OnSetFocus"></event>
9944 <event name="OnSize"></event>
9945 <event name="OnUpdateUI"></event>
9946 </object>
9947 </object>
9948 </object>
9949 </object>
9950 </object>
9951 </object>
9952 <object class="Frame" expanded="0">
9953 <property name="bg">wxSYS_COLOUR_MENU</property>
9954 <property name="center"></property>
9955 <property name="context_help"></property>
9956 <property name="enabled">1</property>
9957 <property name="extra_style"></property>
9958 <property name="fg"></property>
9959 <property name="font"></property>
9960 <property name="hidden">0</property>
9961 <property name="id">wxID_ANY</property>
9962 <property name="maximum_size"></property>
9963 <property name="minimum_size"></property>
9964 <property name="name">CEditReviewDialogBase</property>
9965 <property name="pos"></property>
9966 <property name="size">630,440</property>
9967 <property name="style">wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER</property>
9968 <property name="subclass"></property>
9969 <property name="title">Enter Review</property>
9970 <property name="tooltip"></property>
9971 <property name="window_extra_style"></property>
9972 <property name="window_name"></property>
9973 <property name="window_style">wxTAB_TRAVERSAL</property>
9974 <property name="xrc_skip_sizer">1</property>
9975 <event name="OnActivate"></event>
9976 <event name="OnActivateApp"></event>
9977 <event name="OnChar"></event>
9978 <event name="OnClose"></event>
9979 <event name="OnEnterWindow"></event>
9980 <event name="OnEraseBackground"></event>
9981 <event name="OnHibernate"></event>
9982 <event name="OnIconize"></event>
9983 <event name="OnIdle"></event>
9984 <event name="OnKeyDown"></event>
9985 <event name="OnKeyUp"></event>
9986 <event name="OnKillFocus"></event>
9987 <event name="OnLeaveWindow"></event>
9988 <event name="OnLeftDClick"></event>
9989 <event name="OnLeftDown"></event>
9990 <event name="OnLeftUp"></event>
9991 <event name="OnMiddleDClick"></event>
9992 <event name="OnMiddleDown"></event>
9993 <event name="OnMiddleUp"></event>
9994 <event name="OnMotion"></event>
9995 <event name="OnMouseEvents"></event>
9996 <event name="OnMouseWheel"></event>
9997 <event name="OnPaint"></event>
9998 <event name="OnRightDClick"></event>
9999 <event name="OnRightDown"></event>
10000 <event name="OnRightUp"></event>
10001 <event name="OnSetFocus"></event>
10002 <event name="OnSize"></event>
10003 <event name="OnUpdateUI"></event>
10004 <object class="wxBoxSizer" expanded="1">
10005 <property name="minimum_size"></property>
10006 <property name="name">bSizer112</property>
10007 <property name="orient">wxVERTICAL</property>
10008 <property name="permission">none</property>
10009 <object class="sizeritem" expanded="1">
10010 <property name="border">5</property>
10011 <property name="flag"></property>
10012 <property name="proportion">0</property>
10013 <object class="spacer" expanded="1">
10014 <property name="height">3</property>
10015 <property name="permission">protected</property>
10016 <property name="width">0</property>
10017 </object>
10018 </object>
10019 <object class="sizeritem" expanded="1">
10020 <property name="border">5</property>
10021 <property name="flag">wxALL|wxEXPAND</property>
10022 <property name="proportion">0</property>
10023 <object class="wxStaticText" expanded="1">
10024 <property name="bg"></property>
10025 <property name="context_help"></property>
10026 <property name="enabled">1</property>
10027 <property name="fg"></property>
10028 <property name="font"></property>
10029 <property name="hidden">0</property>
10030 <property name="id">wxID_ANY</property>
10031 <property name="label"></property>
10032 <property name="maximum_size"></property>
10033 <property name="minimum_size"></property>
10034 <property name="name">m_staticTextSeller</property>
10035 <property name="permission">protected</property>
10036 <property name="pos"></property>
10037 <property name="size"></property>
10038 <property name="style"></property>
10039 <property name="subclass"></property>
10040 <property name="tooltip"></property>
10041 <property name="window_extra_style"></property>
10042 <property name="window_name"></property>
10043 <property name="window_style"></property>
10044 <property name="wrap">-1</property>
10045 <event name="OnChar"></event>
10046 <event name="OnEnterWindow"></event>
10047 <event name="OnEraseBackground"></event>
10048 <event name="OnKeyDown"></event>
10049 <event name="OnKeyUp"></event>
10050 <event name="OnKillFocus"></event>
10051 <event name="OnLeaveWindow"></event>
10052 <event name="OnLeftDClick"></event>
10053 <event name="OnLeftDown"></event>
10054 <event name="OnLeftUp"></event>
10055 <event name="OnMiddleDClick"></event>
10056 <event name="OnMiddleDown"></event>
10057 <event name="OnMiddleUp"></event>
10058 <event name="OnMotion"></event>
10059 <event name="OnMouseEvents"></event>
10060 <event name="OnMouseWheel"></event>
10061 <event name="OnPaint"></event>
10062 <event name="OnRightDClick"></event>
10063 <event name="OnRightDown"></event>
10064 <event name="OnRightUp"></event>
10065 <event name="OnSetFocus"></event>
10066 <event name="OnSize"></event>
10067 <event name="OnUpdateUI"></event>
10068 </object>
10069 </object>
10070 <object class="sizeritem" expanded="1">
10071 <property name="border">5</property>
10072 <property name="flag"></property>
10073 <property name="proportion">0</property>
10074 <object class="spacer" expanded="1">
10075 <property name="height">3</property>
10076 <property name="permission">protected</property>
10077 <property name="width">0</property>
10078 </object>
10079 </object>
10080 <object class="sizeritem" expanded="1">
10081 <property name="border">5</property>
10082 <property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
10083 <property name="proportion">0</property>
10084 <object class="wxStaticText" expanded="1">
10085 <property name="bg"></property>
10086 <property name="context_help"></property>
10087 <property name="enabled">1</property>
10088 <property name="fg"></property>
10089 <property name="font"></property>
10090 <property name="hidden">0</property>
10091 <property name="id">wxID_ANY</property>
10092 <property name="label">Rating</property>
10093 <property name="maximum_size"></property>
10094 <property name="minimum_size"></property>
10095 <property name="name">m_staticText110</property>
10096 <property name="permission">protected</property>
10097 <property name="pos"></property>
10098 <property name="size"></property>
10099 <property name="style"></property>
10100 <property name="subclass"></property>
10101 <property name="tooltip"></property>
10102 <property name="window_extra_style"></property>
10103 <property name="window_name"></property>
10104 <property name="window_style"></property>
10105 <property name="wrap">-1</property>
10106 <event name="OnChar"></event>
10107 <event name="OnEnterWindow"></event>
10108 <event name="OnEraseBackground"></event>
10109 <event name="OnKeyDown"></event>
10110 <event name="OnKeyUp"></event>
10111 <event name="OnKillFocus"></event>
10112 <event name="OnLeaveWindow"></event>
10113 <event name="OnLeftDClick"></event>
10114 <event name="OnLeftDown"></event>
10115 <event name="OnLeftUp"></event>
10116 <event name="OnMiddleDClick"></event>
10117 <event name="OnMiddleDown"></event>
10118 <event name="OnMiddleUp"></event>
10119 <event name="OnMotion"></event>
10120 <event name="OnMouseEvents"></event>
10121 <event name="OnMouseWheel"></event>
10122 <event name="OnPaint"></event>
10123 <event name="OnRightDClick"></event>
10124 <event name="OnRightDown"></event>
10125 <event name="OnRightUp"></event>
10126 <event name="OnSetFocus"></event>
10127 <event name="OnSize"></event>
10128 <event name="OnUpdateUI"></event>
10129 </object>
10130 </object>
10131 <object class="sizeritem" expanded="1">
10132 <property name="border">5</property>
10133 <property name="flag">wxALL</property>
10134 <property name="proportion">0</property>
10135 <object class="wxChoice" expanded="1">
10136 <property name="bg"></property>
10137 <property name="choices">&quot; 1 star&quot; &quot; 2 stars&quot; &quot; 3 stars&quot; &quot; 4 stars&quot; &quot; 5 stars&quot;</property>
10138 <property name="context_help"></property>
10139 <property name="enabled">1</property>
10140 <property name="fg"></property>
10141 <property name="font"></property>
10142 <property name="hidden">0</property>
10143 <property name="id">wxID_ANY</property>
10144 <property name="maximum_size"></property>
10145 <property name="minimum_size"></property>
10146 <property name="name">m_choiceStars</property>
10147 <property name="permission">protected</property>
10148 <property name="pos"></property>
10149 <property name="selection">0</property>
10150 <property name="size"></property>
10151 <property name="subclass"></property>
10152 <property name="tooltip"></property>
10153 <property name="window_extra_style"></property>
10154 <property name="window_name"></property>
10155 <property name="window_style"></property>
10156 <event name="OnChar"></event>
10157 <event name="OnChoice"></event>
10158 <event name="OnEnterWindow"></event>
10159 <event name="OnEraseBackground"></event>
10160 <event name="OnKeyDown"></event>
10161 <event name="OnKeyUp"></event>
10162 <event name="OnKillFocus"></event>
10163 <event name="OnLeaveWindow"></event>
10164 <event name="OnLeftDClick"></event>
10165 <event name="OnLeftDown"></event>
10166 <event name="OnLeftUp"></event>
10167 <event name="OnMiddleDClick"></event>
10168 <event name="OnMiddleDown"></event>
10169 <event name="OnMiddleUp"></event>
10170 <event name="OnMotion"></event>
10171 <event name="OnMouseEvents"></event>
10172 <event name="OnMouseWheel"></event>
10173 <event name="OnPaint"></event>
10174 <event name="OnRightDClick"></event>
10175 <event name="OnRightDown"></event>
10176 <event name="OnRightUp"></event>
10177 <event name="OnSetFocus"></event>
10178 <event name="OnSize"></event>
10179 <event name="OnUpdateUI"></event>
10180 </object>
10181 </object>
10182 <object class="sizeritem" expanded="1">
10183 <property name="border">5</property>
10184 <property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
10185 <property name="proportion">0</property>
10186 <object class="wxStaticText" expanded="1">
10187 <property name="bg"></property>
10188 <property name="context_help"></property>
10189 <property name="enabled">1</property>
10190 <property name="fg"></property>
10191 <property name="font"></property>
10192 <property name="hidden">0</property>
10193 <property name="id">wxID_ANY</property>
10194 <property name="label">Review</property>
10195 <property name="maximum_size"></property>
10196 <property name="minimum_size"></property>
10197 <property name="name">m_staticText43</property>
10198 <property name="permission">protected</property>
10199 <property name="pos"></property>
10200 <property name="size"></property>
10201 <property name="style"></property>
10202 <property name="subclass"></property>
10203 <property name="tooltip"></property>
10204 <property name="window_extra_style"></property>
10205 <property name="window_name"></property>
10206 <property name="window_style"></property>
10207 <property name="wrap">-1</property>
10208 <event name="OnChar"></event>
10209 <event name="OnEnterWindow"></event>
10210 <event name="OnEraseBackground"></event>
10211 <event name="OnKeyDown"></event>
10212 <event name="OnKeyUp"></event>
10213 <event name="OnKillFocus"></event>
10214 <event name="OnLeaveWindow"></event>
10215 <event name="OnLeftDClick"></event>
10216 <event name="OnLeftDown"></event>
10217 <event name="OnLeftUp"></event>
10218 <event name="OnMiddleDClick"></event>
10219 <event name="OnMiddleDown"></event>
10220 <event name="OnMiddleUp"></event>
10221 <event name="OnMotion"></event>
10222 <event name="OnMouseEvents"></event>
10223 <event name="OnMouseWheel"></event>
10224 <event name="OnPaint"></event>
10225 <event name="OnRightDClick"></event>
10226 <event name="OnRightDown"></event>
10227 <event name="OnRightUp"></event>
10228 <event name="OnSetFocus"></event>
10229 <event name="OnSize"></event>
10230 <event name="OnUpdateUI"></event>
10231 </object>
10232 </object>
10233 <object class="sizeritem" expanded="1">
10234 <property name="border">5</property>
10235 <property name="flag">wxALL|wxEXPAND</property>
10236 <property name="proportion">1</property>
10237 <object class="wxTextCtrl" expanded="1">
10238 <property name="bg"></property>
10239 <property name="context_help"></property>
10240 <property name="enabled">1</property>
10241 <property name="fg"></property>
10242 <property name="font"></property>
10243 <property name="hidden">0</property>
10244 <property name="id">wxID_ANY</property>
10245 <property name="maximum_size"></property>
10246 <property name="maxlength">0</property>
10247 <property name="minimum_size"></property>
10248 <property name="name">m_textCtrlReview</property>
10249 <property name="permission">protected</property>
10250 <property name="pos"></property>
10251 <property name="size"></property>
10252 <property name="style">wxTE_MULTILINE</property>
10253 <property name="subclass"></property>
10254 <property name="tooltip"></property>
10255 <property name="value"></property>
10256 <property name="window_extra_style"></property>
10257 <property name="window_name"></property>
10258 <property name="window_style"></property>
10259 <event name="OnChar"></event>
10260 <event name="OnEnterWindow"></event>
10261 <event name="OnEraseBackground"></event>
10262 <event name="OnKeyDown">OnKeyDown</event>
10263 <event name="OnKeyUp"></event>
10264 <event name="OnKillFocus"></event>
10265 <event name="OnLeaveWindow"></event>
10266 <event name="OnLeftDClick"></event>
10267 <event name="OnLeftDown"></event>
10268 <event name="OnLeftUp"></event>
10269 <event name="OnMiddleDClick"></event>
10270 <event name="OnMiddleDown"></event>
10271 <event name="OnMiddleUp"></event>
10272 <event name="OnMotion"></event>
10273 <event name="OnMouseEvents"></event>
10274 <event name="OnMouseWheel"></event>
10275 <event name="OnPaint"></event>
10276 <event name="OnRightDClick"></event>
10277 <event name="OnRightDown"></event>
10278 <event name="OnRightUp"></event>
10279 <event name="OnSetFocus"></event>
10280 <event name="OnSize"></event>
10281 <event name="OnText"></event>
10282 <event name="OnTextEnter"></event>
10283 <event name="OnTextMaxLen"></event>
10284 <event name="OnTextURL"></event>
10285 <event name="OnUpdateUI"></event>
10286 </object>
10287 </object>
10288 <object class="sizeritem" expanded="1">
10289 <property name="border">5</property>
10290 <property name="flag">wxALIGN_RIGHT</property>
10291 <property name="proportion">0</property>
10292 <object class="wxBoxSizer" expanded="1">
10293 <property name="minimum_size"></property>
10294 <property name="name">bSizer113</property>
10295 <property name="orient">wxHORIZONTAL</property>
10296 <property name="permission">none</property>
10297 <object class="sizeritem" expanded="1">
10298 <property name="border">5</property>
10299 <property name="flag">wxALL</property>
10300 <property name="proportion">0</property>
10301 <object class="wxButton" expanded="1">
10302 <property name="bg"></property>
10303 <property name="context_help"></property>
10304 <property name="default">0</property>
10305 <property name="enabled">1</property>
10306 <property name="fg"></property>
10307 <property name="font"></property>
10308 <property name="hidden">0</property>
10309 <property name="id">wxID_SUBMIT</property>
10310 <property name="label">&amp;Submit</property>
10311 <property name="maximum_size"></property>
10312 <property name="minimum_size">85,25</property>
10313 <property name="name">m_buttonSubmit</property>
10314 <property name="permission">protected</property>
10315 <property name="pos"></property>
10316 <property name="size"></property>
10317 <property name="style"></property>
10318 <property name="subclass"></property>
10319 <property name="tooltip"></property>
10320 <property name="window_extra_style"></property>
10321 <property name="window_name"></property>
10322 <property name="window_style"></property>
10323 <event name="OnButtonClick">OnButtonSubmit</event>
10324 <event name="OnChar"></event>
10325 <event name="OnEnterWindow"></event>
10326 <event name="OnEraseBackground"></event>
10327 <event name="OnKeyDown"></event>
10328 <event name="OnKeyUp"></event>
10329 <event name="OnKillFocus"></event>
10330 <event name="OnLeaveWindow"></event>
10331 <event name="OnLeftDClick"></event>
10332 <event name="OnLeftDown"></event>
10333 <event name="OnLeftUp"></event>
10334 <event name="OnMiddleDClick"></event>
10335 <event name="OnMiddleDown"></event>
10336 <event name="OnMiddleUp"></event>
10337 <event name="OnMotion"></event>
10338 <event name="OnMouseEvents"></event>
10339 <event name="OnMouseWheel"></event>
10340 <event name="OnPaint"></event>
10341 <event name="OnRightDClick"></event>
10342 <event name="OnRightDown"></event>
10343 <event name="OnRightUp"></event>
10344 <event name="OnSetFocus"></event>
10345 <event name="OnSize"></event>
10346 <event name="OnUpdateUI"></event>
10347 </object>
10348 </object>
10349 <object class="sizeritem" expanded="1">
10350 <property name="border">5</property>
10351 <property name="flag">wxALL</property>
10352 <property name="proportion">0</property>
10353 <object class="wxButton" expanded="1">
10354 <property name="bg"></property>
10355 <property name="context_help"></property>
10356 <property name="default">0</property>
10357 <property name="enabled">1</property>
10358 <property name="fg"></property>
10359 <property name="font"></property>
10360 <property name="hidden">0</property>
10361 <property name="id">wxID_CANCEL</property>
10362 <property name="label">Cancel</property>
10363 <property name="maximum_size"></property>
10364 <property name="minimum_size">85,25</property>
10365 <property name="name">m_buttonCancel</property>
10366 <property name="permission">protected</property>
10367 <property name="pos"></property>
10368 <property name="size"></property>
10369 <property name="style"></property>
10370 <property name="subclass"></property>
10371 <property name="tooltip"></property>
10372 <property name="window_extra_style"></property>
10373 <property name="window_name"></property>
10374 <property name="window_style"></property>
10375 <event name="OnButtonClick">OnButtonCancel</event>
10376 <event name="OnChar"></event>
10377 <event name="OnEnterWindow"></event>
10378 <event name="OnEraseBackground"></event>
10379 <event name="OnKeyDown"></event>
10380 <event name="OnKeyUp"></event>
10381 <event name="OnKillFocus"></event>
10382 <event name="OnLeaveWindow"></event>
10383 <event name="OnLeftDClick"></event>
10384 <event name="OnLeftDown"></event>
10385 <event name="OnLeftUp"></event>
10386 <event name="OnMiddleDClick"></event>
10387 <event name="OnMiddleDown"></event>
10388 <event name="OnMiddleUp"></event>
10389 <event name="OnMotion"></event>
10390 <event name="OnMouseEvents"></event>
10391 <event name="OnMouseWheel"></event>
10392 <event name="OnPaint"></event>
10393 <event name="OnRightDClick"></event>
10394 <event name="OnRightDown"></event>
10395 <event name="OnRightUp"></event>
10396 <event name="OnSetFocus"></event>
10397 <event name="OnSize"></event>
10398 <event name="OnUpdateUI"></event>
10399 </object>
10400 </object>
10401 </object>
10402 </object>
10403 </object>
10404 </object>
10405 <object class="Frame" expanded="0">
10406 <property name="bg">wxSYS_COLOUR_BTNFACE</property>
10407 <property name="center"></property>
10408 <property name="context_help"></property>
10409 <property name="enabled">1</property>
10410 <property name="extra_style"></property>
10411 <property name="fg"></property>
10412 <property name="font"></property>
10413 <property name="hidden">0</property>
10414 <property name="id">wxID_ANY</property>
10415 <property name="maximum_size"></property>
10416 <property name="minimum_size"></property>
10417 <property name="name">CPokerLobbyDialogBase</property>
10418 <property name="pos"></property>
10419 <property name="size">586,457</property>
10420 <property name="style">wxDEFAULT_FRAME_STYLE</property>
10421 <property name="subclass"></property>
10422 <property name="title">Poker Lobby</property>
10423 <property name="tooltip"></property>
10424 <property name="window_extra_style"></property>
10425 <property name="window_name"></property>
10426 <property name="window_style">wxTAB_TRAVERSAL</property>
10427 <property name="xrc_skip_sizer">1</property>
10428 <event name="OnActivate"></event>
10429 <event name="OnActivateApp"></event>
10430 <event name="OnChar"></event>
10431 <event name="OnClose"></event>
10432 <event name="OnEnterWindow"></event>
10433 <event name="OnEraseBackground"></event>
10434 <event name="OnHibernate"></event>
10435 <event name="OnIconize"></event>
10436 <event name="OnIdle"></event>
10437 <event name="OnKeyDown"></event>
10438 <event name="OnKeyUp"></event>
10439 <event name="OnKillFocus"></event>
10440 <event name="OnLeaveWindow"></event>
10441 <event name="OnLeftDClick"></event>
10442 <event name="OnLeftDown"></event>
10443 <event name="OnLeftUp"></event>
10444 <event name="OnMiddleDClick"></event>
10445 <event name="OnMiddleDown"></event>
10446 <event name="OnMiddleUp"></event>
10447 <event name="OnMotion"></event>
10448 <event name="OnMouseEvents"></event>
10449 <event name="OnMouseWheel"></event>
10450 <event name="OnPaint"></event>
10451 <event name="OnRightDClick"></event>
10452 <event name="OnRightDown"></event>
10453 <event name="OnRightUp"></event>
10454 <event name="OnSetFocus"></event>
10455 <event name="OnSize"></event>
10456 <event name="OnUpdateUI"></event>
10457 <object class="wxBoxSizer" expanded="1">
10458 <property name="minimum_size"></property>
10459 <property name="name">bSizer156</property>
10460 <property name="orient">wxHORIZONTAL</property>
10461 <property name="permission">none</property>
10462 <object class="sizeritem" expanded="1">
10463 <property name="border">5</property>
10464 <property name="flag">wxEXPAND|wxTOP|wxBOTTOM|wxLEFT</property>
10465 <property name="proportion">0</property>
10466 <object class="wxTreeCtrl" expanded="1">
10467 <property name="bg"></property>
10468 <property name="context_help"></property>
10469 <property name="enabled">1</property>
10470 <property name="fg"></property>
10471 <property name="font"></property>
10472 <property name="hidden">0</property>
10473 <property name="id">wxID_ANY</property>
10474 <property name="maximum_size"></property>
10475 <property name="minimum_size">130,-1</property>
10476 <property name="name">m_treeCtrl</property>
10477 <property name="permission">protected</property>
10478 <property name="pos"></property>
10479 <property name="size"></property>
10480 <property name="style">wxTR_HAS_BUTTONS|wxTR_HIDE_ROOT|wxTR_LINES_AT_ROOT</property>
10481 <property name="subclass"></property>
10482 <property name="tooltip"></property>
10483 <property name="window_extra_style"></property>
10484 <property name="window_name"></property>
10485 <property name="window_style"></property>
10486 <event name="OnChar"></event>
10487 <event name="OnEnterWindow"></event>
10488 <event name="OnEraseBackground"></event>
10489 <event name="OnKeyDown"></event>
10490 <event name="OnKeyUp"></event>
10491 <event name="OnKillFocus"></event>
10492 <event name="OnLeaveWindow"></event>
10493 <event name="OnLeftDClick"></event>
10494 <event name="OnLeftDown"></event>
10495 <event name="OnLeftUp"></event>
10496 <event name="OnMiddleDClick"></event>
10497 <event name="OnMiddleDown"></event>
10498 <event name="OnMiddleUp"></event>
10499 <event name="OnMotion"></event>
10500 <event name="OnMouseEvents"></event>
10501 <event name="OnMouseWheel"></event>
10502 <event name="OnPaint"></event>
10503 <event name="OnRightDClick"></event>
10504 <event name="OnRightDown"></event>
10505 <event name="OnRightUp"></event>
10506 <event name="OnSetFocus"></event>
10507 <event name="OnSize"></event>
10508 <event name="OnTreeBeginDrag"></event>
10509 <event name="OnTreeBeginLabelEdit"></event>
10510 <event name="OnTreeBeginRDrag"></event>
10511 <event name="OnTreeDeleteItem"></event>
10512 <event name="OnTreeEndDrag"></event>
10513 <event name="OnTreeEndLabelEdit"></event>
10514 <event name="OnTreeGetInfo"></event>
10515 <event name="OnTreeItemActivated"></event>
10516 <event name="OnTreeItemCollapsed"></event>
10517 <event name="OnTreeItemCollapsing"></event>
10518 <event name="OnTreeItemExpanded"></event>
10519 <event name="OnTreeItemExpanding"></event>
10520 <event name="OnTreeItemGetTooltip"></event>
10521 <event name="OnTreeItemMenu"></event>
10522 <event name="OnTreeItemMiddleClick"></event>
10523 <event name="OnTreeItemRightClick"></event>
10524 <event name="OnTreeKeyDown"></event>
10525 <event name="OnTreeSelChanged">OnTreeSelChanged</event>
10526 <event name="OnTreeSelChanging"></event>
10527 <event name="OnTreeSetInfo"></event>
10528 <event name="OnTreeStateImageClick"></event>
10529 <event name="OnUpdateUI"></event>
10530 </object>
10531 </object>
10532 <object class="sizeritem" expanded="1">
10533 <property name="border">5</property>
10534 <property name="flag">wxEXPAND</property>
10535 <property name="proportion">1</property>
10536 <object class="wxBoxSizer" expanded="1">
10537 <property name="minimum_size"></property>
10538 <property name="name">bSizer172</property>
10539 <property name="orient">wxVERTICAL</property>
10540 <property name="permission">none</property>
10541 <object class="sizeritem" expanded="1">
10542 <property name="border">5</property>
10543 <property name="flag">wxEXPAND|wxALL</property>
10544 <property name="proportion">1</property>
10545 <object class="wxListCtrl" expanded="1">
10546 <property name="bg"></property>
10547 <property name="context_help"></property>
10548 <property name="enabled">1</property>
10549 <property name="fg"></property>
10550 <property name="font"></property>
10551 <property name="hidden">0</property>
10552 <property name="id">wxID_ANY</property>
10553 <property name="maximum_size"></property>
10554 <property name="minimum_size"></property>
10555 <property name="name">m_listCtrl</property>
10556 <property name="permission">protected</property>
10557 <property name="pos"></property>
10558 <property name="size"></property>
10559 <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT</property>
10560 <property name="subclass"></property>
10561 <property name="tooltip"></property>
10562 <property name="window_extra_style"></property>
10563 <property name="window_name"></property>
10564 <property name="window_style"></property>
10565 <event name="OnChar"></event>
10566 <event name="OnEnterWindow"></event>
10567 <event name="OnEraseBackground"></event>
10568 <event name="OnKeyDown"></event>
10569 <event name="OnKeyUp"></event>
10570 <event name="OnKillFocus"></event>
10571 <event name="OnLeaveWindow"></event>
10572 <event name="OnLeftDClick"></event>
10573 <event name="OnLeftDown"></event>
10574 <event name="OnLeftUp"></event>
10575 <event name="OnListBeginDrag"></event>
10576 <event name="OnListBeginLabelEdit"></event>
10577 <event name="OnListBeginRDrag"></event>
10578 <event name="OnListCacheHint"></event>
10579 <event name="OnListColBeginDrag"></event>
10580 <event name="OnListColClick"></event>
10581 <event name="OnListColDragging"></event>
10582 <event name="OnListColEndDrag"></event>
10583 <event name="OnListColRightClick"></event>
10584 <event name="OnListDeleteAllItems"></event>
10585 <event name="OnListDeleteItem"></event>
10586 <event name="OnListEndLabelEdit"></event>
10587 <event name="OnListInsertItem"></event>
10588 <event name="OnListItemActivated">OnListItemActivated</event>
10589 <event name="OnListItemDeselected"></event>
10590 <event name="OnListItemFocused"></event>
10591 <event name="OnListItemMiddleClick"></event>
10592 <event name="OnListItemRightClick"></event>
10593 <event name="OnListItemSelected">OnListItemSelected</event>
10594 <event name="OnListKeyDown"></event>
10595 <event name="OnMiddleDClick"></event>
10596 <event name="OnMiddleDown"></event>
10597 <event name="OnMiddleUp"></event>
10598 <event name="OnMotion"></event>
10599 <event name="OnMouseEvents"></event>
10600 <event name="OnMouseWheel"></event>
10601 <event name="OnPaint"></event>
10602 <event name="OnRightDClick"></event>
10603 <event name="OnRightDown"></event>
10604 <event name="OnRightUp"></event>
10605 <event name="OnSetFocus"></event>
10606 <event name="OnSize"></event>
10607 <event name="OnUpdateUI"></event>
10608 </object>
10609 </object>
10610 <object class="sizeritem" expanded="1">
10611 <property name="border">5</property>
10612 <property name="flag">wxALL</property>
10613 <property name="proportion">0</property>
10614 <object class="wxButton" expanded="1">
10615 <property name="bg"></property>
10616 <property name="context_help"></property>
10617 <property name="default">0</property>
10618 <property name="enabled">1</property>
10619 <property name="fg"></property>
10620 <property name="font"></property>
10621 <property name="hidden">0</property>
10622 <property name="id">wxID_OPENNEWTABLE</property>
10623 <property name="label">&amp;Open New Table</property>
10624 <property name="maximum_size"></property>
10625 <property name="minimum_size"></property>
10626 <property name="name">m_buttonNewTable</property>
10627 <property name="permission">protected</property>
10628 <property name="pos"></property>
10629 <property name="size"></property>
10630 <property name="style"></property>
10631 <property name="subclass"></property>
10632 <property name="tooltip"></property>
10633 <property name="window_extra_style"></property>
10634 <property name="window_name"></property>
10635 <property name="window_style"></property>
10636 <event name="OnButtonClick">OnButtonNewTable</event>
10637 <event name="OnChar"></event>
10638 <event name="OnEnterWindow"></event>
10639 <event name="OnEraseBackground"></event>
10640 <event name="OnKeyDown"></event>
10641 <event name="OnKeyUp"></event>
10642 <event name="OnKillFocus"></event>
10643 <event name="OnLeaveWindow"></event>
10644 <event name="OnLeftDClick"></event>
10645 <event name="OnLeftDown"></event>
10646 <event name="OnLeftUp"></event>
10647 <event name="OnMiddleDClick"></event>
10648 <event name="OnMiddleDown"></event>
10649 <event name="OnMiddleUp"></event>
10650 <event name="OnMotion"></event>
10651 <event name="OnMouseEvents"></event>
10652 <event name="OnMouseWheel"></event>
10653 <event name="OnPaint"></event>
10654 <event name="OnRightDClick"></event>
10655 <event name="OnRightDown"></event>
10656 <event name="OnRightUp"></event>
10657 <event name="OnSetFocus"></event>
10658 <event name="OnSize"></event>
10659 <event name="OnUpdateUI"></event>
10660 </object>
10661 </object>
10662 </object>
10663 </object>
10664 </object>
10665 </object>
10666 <object class="Frame" expanded="0">
10667 <property name="bg"></property>
10668 <property name="center"></property>
10669 <property name="context_help"></property>
10670 <property name="enabled">1</property>
10671 <property name="extra_style"></property>
10672 <property name="fg"></property>
10673 <property name="font"></property>
10674 <property name="hidden">0</property>
10675 <property name="id">wxID_ANY</property>
10676 <property name="maximum_size"></property>
10677 <property name="minimum_size"></property>
10678 <property name="name">CPokerDialogBase</property>
10679 <property name="pos"></property>
10680 <property name="size">806,550</property>
10681 <property name="style">wxDEFAULT_FRAME_STYLE|wxFRAME_NO_TASKBAR</property>
10682 <property name="subclass"></property>
10683 <property name="title">Poker</property>
10684 <property name="tooltip"></property>
10685 <property name="window_extra_style"></property>
10686 <property name="window_name"></property>
10687 <property name="window_style">wxFULL_REPAINT_ON_RESIZE|wxTAB_TRAVERSAL</property>
10688 <property name="xrc_skip_sizer">1</property>
10689 <event name="OnActivate"></event>
10690 <event name="OnActivateApp"></event>
10691 <event name="OnChar"></event>
10692 <event name="OnClose">OnClose</event>
10693 <event name="OnEnterWindow"></event>
10694 <event name="OnEraseBackground"></event>
10695 <event name="OnHibernate"></event>
10696 <event name="OnIconize"></event>
10697 <event name="OnIdle"></event>
10698 <event name="OnKeyDown"></event>
10699 <event name="OnKeyUp"></event>
10700 <event name="OnKillFocus"></event>
10701 <event name="OnLeaveWindow"></event>
10702 <event name="OnLeftDClick"></event>
10703 <event name="OnLeftDown"></event>
10704 <event name="OnLeftUp"></event>
10705 <event name="OnMiddleDClick"></event>
10706 <event name="OnMiddleDown"></event>
10707 <event name="OnMiddleUp"></event>
10708 <event name="OnMotion"></event>
10709 <event name="OnMouseEvents">OnMouseEvents</event>
10710 <event name="OnMouseWheel"></event>
10711 <event name="OnPaint">OnPaint</event>
10712 <event name="OnRightDClick"></event>
10713 <event name="OnRightDown"></event>
10714 <event name="OnRightUp"></event>
10715 <event name="OnSetFocus"></event>
10716 <event name="OnSize">OnSize</event>
10717 <event name="OnUpdateUI"></event>
10718 <object class="wxBoxSizer" expanded="1">
10719 <property name="minimum_size"></property>
10720 <property name="name">bSizer174</property>
10721 <property name="orient">wxVERTICAL</property>
10722 <property name="permission">none</property>
10723 <object class="sizeritem" expanded="1">
10724 <property name="border">5</property>
10725 <property name="flag">wxALL</property>
10726 <property name="proportion">0</property>
10727 <object class="wxCheckBox" expanded="1">
10728 <property name="bg"></property>
10729 <property name="checked">0</property>
10730 <property name="context_help"></property>
10731 <property name="enabled">1</property>
10732 <property name="fg"></property>
10733 <property name="font"></property>
10734 <property name="hidden">0</property>
10735 <property name="id">wxID_ANY</property>
10736 <property name="label">Deal Me Out</property>
10737 <property name="maximum_size"></property>
10738 <property name="minimum_size"></property>
10739 <property name="name">m_checkSitOut</property>
10740 <property name="permission">public</property>
10741 <property name="pos"></property>
10742 <property name="size"></property>
10743 <property name="style"></property>
10744 <property name="subclass"></property>
10745 <property name="tooltip"></property>
10746 <property name="window_extra_style"></property>
10747 <property name="window_name"></property>
10748 <property name="window_style"></property>
10749 <event name="OnChar"></event>
10750 <event name="OnCheckBox">OnCheckSitOut</event>
10751 <event name="OnEnterWindow"></event>
10752 <event name="OnEraseBackground"></event>
10753 <event name="OnKeyDown"></event>
10754 <event name="OnKeyUp"></event>
10755 <event name="OnKillFocus"></event>
10756 <event name="OnLeaveWindow"></event>
10757 <event name="OnLeftDClick"></event>
10758 <event name="OnLeftDown"></event>
10759 <event name="OnLeftUp"></event>
10760 <event name="OnMiddleDClick"></event>
10761 <event name="OnMiddleDown"></event>
10762 <event name="OnMiddleUp"></event>
10763 <event name="OnMotion"></event>
10764 <event name="OnMouseEvents"></event>
10765 <event name="OnMouseWheel"></event>
10766 <event name="OnPaint"></event>
10767 <event name="OnRightDClick"></event>
10768 <event name="OnRightDown"></event>
10769 <event name="OnRightUp"></event>
10770 <event name="OnSetFocus"></event>
10771 <event name="OnSize"></event>
10772 <event name="OnUpdateUI"></event>
10773 </object>
10774 </object>
10775 <object class="sizeritem" expanded="1">
10776 <property name="border">5</property>
10777 <property name="flag">wxALL</property>
10778 <property name="proportion">0</property>
10779 <object class="wxButton" expanded="1">
10780 <property name="bg"></property>
10781 <property name="context_help"></property>
10782 <property name="default">0</property>
10783 <property name="enabled">1</property>
10784 <property name="fg"></property>
10785 <property name="font"></property>
10786 <property name="hidden">0</property>
10787 <property name="id">wxID_DEALHAND</property>
10788 <property name="label">&amp;Deal Hand</property>
10789 <property name="maximum_size"></property>
10790 <property name="minimum_size"></property>
10791 <property name="name">m_buttonDealHand</property>
10792 <property name="permission">protected</property>
10793 <property name="pos"></property>
10794 <property name="size">150,25</property>
10795 <property name="style"></property>
10796 <property name="subclass"></property>
10797 <property name="tooltip"></property>
10798 <property name="window_extra_style"></property>
10799 <property name="window_name"></property>
10800 <property name="window_style"></property>
10801 <event name="OnButtonClick">OnButtonDealHand</event>
10802 <event name="OnChar"></event>
10803 <event name="OnEnterWindow"></event>
10804 <event name="OnEraseBackground"></event>
10805 <event name="OnKeyDown"></event>
10806 <event name="OnKeyUp"></event>
10807 <event name="OnKillFocus"></event>
10808 <event name="OnLeaveWindow"></event>
10809 <event name="OnLeftDClick"></event>
10810 <event name="OnLeftDown"></event>
10811 <event name="OnLeftUp"></event>
10812 <event name="OnMiddleDClick"></event>
10813 <event name="OnMiddleDown"></event>
10814 <event name="OnMiddleUp"></event>
10815 <event name="OnMotion"></event>
10816 <event name="OnMouseEvents"></event>
10817 <event name="OnMouseWheel"></event>
10818 <event name="OnPaint"></event>
10819 <event name="OnRightDClick"></event>
10820 <event name="OnRightDown"></event>
10821 <event name="OnRightUp"></event>
10822 <event name="OnSetFocus"></event>
10823 <event name="OnSize"></event>
10824 <event name="OnUpdateUI"></event>
10825 </object>
10826 </object>
10827 <object class="sizeritem" expanded="1">
10828 <property name="border">5</property>
10829 <property name="flag">wxALL</property>
10830 <property name="proportion">0</property>
10831 <object class="wxButton" expanded="1">
10832 <property name="bg"></property>
10833 <property name="context_help"></property>
10834 <property name="default">0</property>
10835 <property name="enabled">1</property>
10836 <property name="fg"></property>
10837 <property name="font"></property>
10838 <property name="hidden">0</property>
10839 <property name="id">wxID_FOLD</property>
10840 <property name="label">&amp;Fold</property>
10841 <property name="maximum_size"></property>
10842 <property name="minimum_size"></property>
10843 <property name="name">m_buttonFold</property>
10844 <property name="permission">protected</property>
10845 <property name="pos"></property>
10846 <property name="size">80,25</property>
10847 <property name="style"></property>
10848 <property name="subclass"></property>
10849 <property name="tooltip"></property>
10850 <property name="window_extra_style"></property>
10851 <property name="window_name"></property>
10852 <property name="window_style"></property>
10853 <event name="OnButtonClick">OnButtonFold</event>
10854 <event name="OnChar"></event>
10855 <event name="OnEnterWindow"></event>
10856 <event name="OnEraseBackground"></event>
10857 <event name="OnKeyDown"></event>
10858 <event name="OnKeyUp"></event>
10859 <event name="OnKillFocus"></event>
10860 <event name="OnLeaveWindow"></event>
10861 <event name="OnLeftDClick"></event>
10862 <event name="OnLeftDown"></event>
10863 <event name="OnLeftUp"></event>
10864 <event name="OnMiddleDClick"></event>
10865 <event name="OnMiddleDown"></event>
10866 <event name="OnMiddleUp"></event>
10867 <event name="OnMotion"></event>
10868 <event name="OnMouseEvents"></event>
10869 <event name="OnMouseWheel"></event>
10870 <event name="OnPaint"></event>
10871 <event name="OnRightDClick"></event>
10872 <event name="OnRightDown"></event>
10873 <event name="OnRightUp"></event>
10874 <event name="OnSetFocus"></event>
10875 <event name="OnSize"></event>
10876 <event name="OnUpdateUI"></event>
10877 </object>
10878 </object>
10879 <object class="sizeritem" expanded="1">
10880 <property name="border">5</property>
10881 <property name="flag">wxALL</property>
10882 <property name="proportion">0</property>
10883 <object class="wxButton" expanded="1">
10884 <property name="bg"></property>
10885 <property name="context_help"></property>
10886 <property name="default">0</property>
10887 <property name="enabled">1</property>
10888 <property name="fg"></property>
10889 <property name="font"></property>
10890 <property name="hidden">0</property>
10891 <property name="id">wxID_CALL</property>
10892 <property name="label">&amp;Call</property>
10893 <property name="maximum_size"></property>
10894 <property name="minimum_size"></property>
10895 <property name="name">m_buttonCall</property>
10896 <property name="permission">protected</property>
10897 <property name="pos"></property>
10898 <property name="size">80,25</property>
10899 <property name="style"></property>
10900 <property name="subclass"></property>
10901 <property name="tooltip"></property>
10902 <property name="window_extra_style"></property>
10903 <property name="window_name"></property>
10904 <property name="window_style"></property>
10905 <event name="OnButtonClick">OnButtonCall</event>
10906 <event name="OnChar"></event>
10907 <event name="OnEnterWindow"></event>
10908 <event name="OnEraseBackground"></event>
10909 <event name="OnKeyDown"></event>
10910 <event name="OnKeyUp"></event>
10911 <event name="OnKillFocus"></event>
10912 <event name="OnLeaveWindow"></event>
10913 <event name="OnLeftDClick"></event>
10914 <event name="OnLeftDown"></event>
10915 <event name="OnLeftUp"></event>
10916 <event name="OnMiddleDClick"></event>
10917 <event name="OnMiddleDown"></event>
10918 <event name="OnMiddleUp"></event>
10919 <event name="OnMotion"></event>
10920 <event name="OnMouseEvents"></event>
10921 <event name="OnMouseWheel"></event>
10922 <event name="OnPaint"></event>
10923 <event name="OnRightDClick"></event>
10924 <event name="OnRightDown"></event>
10925 <event name="OnRightUp"></event>
10926 <event name="OnSetFocus"></event>
10927 <event name="OnSize"></event>
10928 <event name="OnUpdateUI"></event>
10929 </object>
10930 </object>
10931 <object class="sizeritem" expanded="1">
10932 <property name="border">5</property>
10933 <property name="flag">wxALL</property>
10934 <property name="proportion">0</property>
10935 <object class="wxButton" expanded="1">
10936 <property name="bg"></property>
10937 <property name="context_help"></property>
10938 <property name="default">0</property>
10939 <property name="enabled">1</property>
10940 <property name="fg"></property>
10941 <property name="font"></property>
10942 <property name="hidden">0</property>
10943 <property name="id">wxID_RAISE</property>
10944 <property name="label">&amp;Raise</property>
10945 <property name="maximum_size"></property>
10946 <property name="minimum_size"></property>
10947 <property name="name">m_buttonRaise</property>
10948 <property name="permission">protected</property>
10949 <property name="pos"></property>
10950 <property name="size">80,25</property>
10951 <property name="style"></property>
10952 <property name="subclass"></property>
10953 <property name="tooltip"></property>
10954 <property name="window_extra_style"></property>
10955 <property name="window_name"></property>
10956 <property name="window_style"></property>
10957 <event name="OnButtonClick">OnButtonRaise</event>
10958 <event name="OnChar"></event>
10959 <event name="OnEnterWindow"></event>
10960 <event name="OnEraseBackground"></event>
10961 <event name="OnKeyDown"></event>
10962 <event name="OnKeyUp"></event>
10963 <event name="OnKillFocus"></event>
10964 <event name="OnLeaveWindow"></event>
10965 <event name="OnLeftDClick"></event>
10966 <event name="OnLeftDown"></event>
10967 <event name="OnLeftUp"></event>
10968 <event name="OnMiddleDClick"></event>
10969 <event name="OnMiddleDown"></event>
10970 <event name="OnMiddleUp"></event>
10971 <event name="OnMotion"></event>
10972 <event name="OnMouseEvents"></event>
10973 <event name="OnMouseWheel"></event>
10974 <event name="OnPaint"></event>
10975 <event name="OnRightDClick"></event>
10976 <event name="OnRightDown"></event>
10977 <event name="OnRightUp"></event>
10978 <event name="OnSetFocus"></event>
10979 <event name="OnSize"></event>
10980 <event name="OnUpdateUI"></event>
10981 </object>
10982 </object>
10983 <object class="sizeritem" expanded="1">
10984 <property name="border">5</property>
10985 <property name="flag">wxALL</property>
10986 <property name="proportion">0</property>
10987 <object class="wxButton" expanded="1">
10988 <property name="bg"></property>
10989 <property name="context_help"></property>
10990 <property name="default">0</property>
10991 <property name="enabled">1</property>
10992 <property name="fg"></property>
10993 <property name="font"></property>
10994 <property name="hidden">0</property>
10995 <property name="id">wxID_LEAVETABLE</property>
10996 <property name="label">&amp;Leave Table</property>
10997 <property name="maximum_size"></property>
10998 <property name="minimum_size"></property>
10999 <property name="name">m_buttonLeaveTable</property>
11000 <property name="permission">protected</property>
11001 <property name="pos"></property>
11002 <property name="size">90,25</property>
11003 <property name="style"></property>
11004 <property name="subclass"></property>
11005 <property name="tooltip"></property>
11006 <property name="window_extra_style"></property>
11007 <property name="window_name"></property>
11008 <property name="window_style"></property>
11009 <event name="OnButtonClick">OnButtonLeaveTable</event>
11010 <event name="OnChar"></event>
11011 <event name="OnEnterWindow"></event>
11012 <event name="OnEraseBackground"></event>
11013 <event name="OnKeyDown"></event>
11014 <event name="OnKeyUp"></event>
11015 <event name="OnKillFocus"></event>
11016 <event name="OnLeaveWindow"></event>
11017 <event name="OnLeftDClick"></event>
11018 <event name="OnLeftDown"></event>
11019 <event name="OnLeftUp"></event>
11020 <event name="OnMiddleDClick"></event>
11021 <event name="OnMiddleDown"></event>
11022 <event name="OnMiddleUp"></event>
11023 <event name="OnMotion"></event>
11024 <event name="OnMouseEvents"></event>
11025 <event name="OnMouseWheel"></event>
11026 <event name="OnPaint"></event>
11027 <event name="OnRightDClick"></event>
11028 <event name="OnRightDown"></event>
11029 <event name="OnRightUp"></event>
11030 <event name="OnSetFocus"></event>
11031 <event name="OnSize"></event>
11032 <event name="OnUpdateUI"></event>
11033 </object>
11034 </object>
11035 <object class="sizeritem" expanded="1">
11036 <property name="border">5</property>
11037 <property name="flag">wxALL</property>
11038 <property name="proportion">0</property>
11039 <object class="wxTextCtrl" expanded="1">
11040 <property name="bg"></property>
11041 <property name="context_help"></property>
11042 <property name="enabled">1</property>
11043 <property name="fg"></property>
11044 <property name="font"></property>
11045 <property name="hidden">0</property>
11046 <property name="id">wxID_DITCHPLAYER</property>
11047 <property name="maximum_size"></property>
11048 <property name="maxlength">0</property>
11049 <property name="minimum_size"></property>
11050 <property name="name">m_textDitchPlayer</property>
11051 <property name="permission">protected</property>
11052 <property name="pos"></property>
11053 <property name="size">45,-1</property>
11054 <property name="style">wxTE_PROCESS_ENTER</property>
11055 <property name="subclass"></property>
11056 <property name="tooltip"></property>
11057 <property name="value"></property>
11058 <property name="window_extra_style"></property>
11059 <property name="window_name"></property>
11060 <property name="window_style"></property>
11061 <event name="OnChar"></event>
11062 <event name="OnEnterWindow"></event>
11063 <event name="OnEraseBackground"></event>
11064 <event name="OnKeyDown"></event>
11065 <event name="OnKeyUp"></event>
11066 <event name="OnKillFocus"></event>
11067 <event name="OnLeaveWindow"></event>
11068 <event name="OnLeftDClick"></event>
11069 <event name="OnLeftDown"></event>
11070 <event name="OnLeftUp"></event>
11071 <event name="OnMiddleDClick"></event>
11072 <event name="OnMiddleDown"></event>
11073 <event name="OnMiddleUp"></event>
11074 <event name="OnMotion"></event>
11075 <event name="OnMouseEvents"></event>
11076 <event name="OnMouseWheel"></event>
11077 <event name="OnPaint"></event>
11078 <event name="OnRightDClick"></event>
11079 <event name="OnRightDown"></event>
11080 <event name="OnRightUp"></event>
11081 <event name="OnSetFocus"></event>
11082 <event name="OnSize"></event>
11083 <event name="OnText"></event>
11084 <event name="OnTextEnter">OnDitchPlayer</event>
11085 <event name="OnTextMaxLen"></event>
11086 <event name="OnTextURL"></event>
11087 <event name="OnUpdateUI"></event>
11088 </object>
11089 </object>
11090 <object class="sizeritem" expanded="1">
11091 <property name="border">5</property>
11092 <property name="flag">wxALL</property>
11093 <property name="proportion">0</property>
11094 <object class="wxCheckBox" expanded="1">
11095 <property name="bg"></property>
11096 <property name="checked">0</property>
11097 <property name="context_help"></property>
11098 <property name="enabled">1</property>
11099 <property name="fg"></property>
11100 <property name="font"></property>
11101 <property name="hidden">0</property>
11102 <property name="id">wxID_ANY</property>
11103 <property name="label">FOLD</property>
11104 <property name="maximum_size"></property>
11105 <property name="minimum_size"></property>
11106 <property name="name">m_checkPreFold</property>
11107 <property name="permission">public</property>
11108 <property name="pos"></property>
11109 <property name="size">100,-1</property>
11110 <property name="style"></property>
11111 <property name="subclass"></property>
11112 <property name="tooltip"></property>
11113 <property name="window_extra_style"></property>
11114 <property name="window_name"></property>
11115 <property name="window_style"></property>
11116 <event name="OnChar"></event>
11117 <event name="OnCheckBox">OnCheckPreFold</event>
11118 <event name="OnEnterWindow"></event>
11119 <event name="OnEraseBackground"></event>
11120 <event name="OnKeyDown"></event>
11121 <event name="OnKeyUp"></event>
11122 <event name="OnKillFocus"></event>
11123 <event name="OnLeaveWindow"></event>
11124 <event name="OnLeftDClick"></event>
11125 <event name="OnLeftDown"></event>
11126 <event name="OnLeftUp"></event>
11127 <event name="OnMiddleDClick"></event>
11128 <event name="OnMiddleDown"></event>
11129 <event name="OnMiddleUp"></event>
11130 <event name="OnMotion"></event>
11131 <event name="OnMouseEvents"></event>
11132 <event name="OnMouseWheel"></event>
11133 <event name="OnPaint"></event>
11134 <event name="OnRightDClick"></event>
11135 <event name="OnRightDown"></event>
11136 <event name="OnRightUp"></event>
11137 <event name="OnSetFocus"></event>
11138 <event name="OnSize"></event>
11139 <event name="OnUpdateUI"></event>
11140 </object>
11141 </object>
11142 <object class="sizeritem" expanded="1">
11143 <property name="border">5</property>
11144 <property name="flag">wxALL</property>
11145 <property name="proportion">0</property>
11146 <object class="wxCheckBox" expanded="1">
11147 <property name="bg"></property>
11148 <property name="checked">0</property>
11149 <property name="context_help"></property>
11150 <property name="enabled">1</property>
11151 <property name="fg"></property>
11152 <property name="font"></property>
11153 <property name="hidden">0</property>
11154 <property name="id">wxID_ANY</property>
11155 <property name="label">CALL</property>
11156 <property name="maximum_size"></property>
11157 <property name="minimum_size"></property>
11158 <property name="name">m_checkPreCall</property>
11159 <property name="permission">public</property>
11160 <property name="pos"></property>
11161 <property name="size">100,-1</property>
11162 <property name="style"></property>
11163 <property name="subclass"></property>
11164 <property name="tooltip"></property>
11165 <property name="window_extra_style"></property>
11166 <property name="window_name"></property>
11167 <property name="window_style"></property>
11168 <event name="OnChar"></event>
11169 <event name="OnCheckBox">OnCheckPreCall</event>
11170 <event name="OnEnterWindow"></event>
11171 <event name="OnEraseBackground"></event>
11172 <event name="OnKeyDown"></event>
11173 <event name="OnKeyUp"></event>
11174 <event name="OnKillFocus"></event>
11175 <event name="OnLeaveWindow"></event>
11176 <event name="OnLeftDClick"></event>
11177 <event name="OnLeftDown"></event>
11178 <event name="OnLeftUp"></event>
11179 <event name="OnMiddleDClick"></event>
11180 <event name="OnMiddleDown"></event>
11181 <event name="OnMiddleUp"></event>
11182 <event name="OnMotion"></event>
11183 <event name="OnMouseEvents"></event>
11184 <event name="OnMouseWheel"></event>
11185 <event name="OnPaint"></event>
11186 <event name="OnRightDClick"></event>
11187 <event name="OnRightDown"></event>
11188 <event name="OnRightUp"></event>
11189 <event name="OnSetFocus"></event>
11190 <event name="OnSize"></event>
11191 <event name="OnUpdateUI"></event>
11192 </object>
11193 </object>
11194 <object class="sizeritem" expanded="1">
11195 <property name="border">5</property>
11196 <property name="flag">wxALL</property>
11197 <property name="proportion">0</property>
11198 <object class="wxCheckBox" expanded="1">
11199 <property name="bg"></property>
11200 <property name="checked">0</property>
11201 <property name="context_help"></property>
11202 <property name="enabled">1</property>
11203 <property name="fg"></property>
11204 <property name="font"></property>
11205 <property name="hidden">0</property>
11206 <property name="id">wxID_ANY</property>
11207 <property name="label">CALL ANY</property>
11208 <property name="maximum_size"></property>
11209 <property name="minimum_size"></property>
11210 <property name="name">m_checkPreCallAny</property>
11211 <property name="permission">public</property>
11212 <property name="pos"></property>
11213 <property name="size">100,-1</property>
11214 <property name="style"></property>
11215 <property name="subclass"></property>
11216 <property name="tooltip"></property>
11217 <property name="window_extra_style"></property>
11218 <property name="window_name"></property>
11219 <property name="window_style"></property>
11220 <event name="OnChar"></event>
11221 <event name="OnCheckBox">OnCheckPreCallAny</event>
11222 <event name="OnEnterWindow"></event>
11223 <event name="OnEraseBackground"></event>
11224 <event name="OnKeyDown"></event>
11225 <event name="OnKeyUp"></event>
11226 <event name="OnKillFocus"></event>
11227 <event name="OnLeaveWindow"></event>
11228 <event name="OnLeftDClick"></event>
11229 <event name="OnLeftDown"></event>
11230 <event name="OnLeftUp"></event>
11231 <event name="OnMiddleDClick"></event>
11232 <event name="OnMiddleDown"></event>
11233 <event name="OnMiddleUp"></event>
11234 <event name="OnMotion"></event>
11235 <event name="OnMouseEvents"></event>
11236 <event name="OnMouseWheel"></event>
11237 <event name="OnPaint"></event>
11238 <event name="OnRightDClick"></event>
11239 <event name="OnRightDown"></event>
11240 <event name="OnRightUp"></event>
11241 <event name="OnSetFocus"></event>
11242 <event name="OnSize"></event>
11243 <event name="OnUpdateUI"></event>
11244 </object>
11245 </object>
11246 <object class="sizeritem" expanded="1">
11247 <property name="border">5</property>
11248 <property name="flag">wxALL</property>
11249 <property name="proportion">0</property>
11250 <object class="wxCheckBox" expanded="1">
11251 <property name="bg"></property>
11252 <property name="checked">0</property>
11253 <property name="context_help"></property>
11254 <property name="enabled">1</property>
11255 <property name="fg"></property>
11256 <property name="font"></property>
11257 <property name="hidden">0</property>
11258 <property name="id">wxID_ANY</property>
11259 <property name="label">RAISE</property>
11260 <property name="maximum_size"></property>
11261 <property name="minimum_size"></property>
11262 <property name="name">m_checkPreRaise</property>
11263 <property name="permission">public</property>
11264 <property name="pos"></property>
11265 <property name="size">100,-1</property>
11266 <property name="style"></property>
11267 <property name="subclass"></property>
11268 <property name="tooltip"></property>
11269 <property name="window_extra_style"></property>
11270 <property name="window_name"></property>
11271 <property name="window_style"></property>
11272 <event name="OnChar"></event>
11273 <event name="OnCheckBox">OnCheckPreRaise</event>
11274 <event name="OnEnterWindow"></event>
11275 <event name="OnEraseBackground"></event>
11276 <event name="OnKeyDown"></event>
11277 <event name="OnKeyUp"></event>
11278 <event name="OnKillFocus"></event>
11279 <event name="OnLeaveWindow"></event>
11280 <event name="OnLeftDClick"></event>
11281 <event name="OnLeftDown"></event>
11282 <event name="OnLeftUp"></event>
11283 <event name="OnMiddleDClick"></event>
11284 <event name="OnMiddleDown"></event>
11285 <event name="OnMiddleUp"></event>
11286 <event name="OnMotion"></event>
11287 <event name="OnMouseEvents"></event>
11288 <event name="OnMouseWheel"></event>
11289 <event name="OnPaint"></event>
11290 <event name="OnRightDClick"></event>
11291 <event name="OnRightDown"></event>
11292 <event name="OnRightUp"></event>
11293 <event name="OnSetFocus"></event>
11294 <event name="OnSize"></event>
11295 <event name="OnUpdateUI"></event>
11296 </object>
11297 </object>
11298 <object class="sizeritem" expanded="1">
11299 <property name="border">5</property>
11300 <property name="flag">wxALL</property>
11301 <property name="proportion">0</property>
11302 <object class="wxCheckBox" expanded="1">
11303 <property name="bg"></property>
11304 <property name="checked">0</property>
11305 <property name="context_help"></property>
11306 <property name="enabled">1</property>
11307 <property name="fg"></property>
11308 <property name="font"></property>
11309 <property name="hidden">0</property>
11310 <property name="id">wxID_ANY</property>
11311 <property name="label">RAISE ANY</property>
11312 <property name="maximum_size"></property>
11313 <property name="minimum_size"></property>
11314 <property name="name">m_checkPreRaiseAny</property>
11315 <property name="permission">public</property>
11316 <property name="pos"></property>
11317 <property name="size">100,-1</property>
11318 <property name="style"></property>
11319 <property name="subclass"></property>
11320 <property name="tooltip"></property>
11321 <property name="window_extra_style"></property>
11322 <property name="window_name"></property>
11323 <property name="window_style"></property>
11324 <event name="OnChar"></event>
11325 <event name="OnCheckBox">OnCheckPreRaiseAny</event>
11326 <event name="OnEnterWindow"></event>
11327 <event name="OnEraseBackground"></event>
11328 <event name="OnKeyDown"></event>
11329 <event name="OnKeyUp"></event>
11330 <event name="OnKillFocus"></event>
11331 <event name="OnLeaveWindow"></event>
11332 <event name="OnLeftDClick"></event>
11333 <event name="OnLeftDown"></event>
11334 <event name="OnLeftUp"></event>
11335 <event name="OnMiddleDClick"></event>
11336 <event name="OnMiddleDown"></event>
11337 <event name="OnMiddleUp"></event>
11338 <event name="OnMotion"></event>
11339 <event name="OnMouseEvents"></event>
11340 <event name="OnMouseWheel"></event>
11341 <event name="OnPaint"></event>
11342 <event name="OnRightDClick"></event>
11343 <event name="OnRightDown"></event>
11344 <event name="OnRightUp"></event>
11345 <event name="OnSetFocus"></event>
11346 <event name="OnSize"></event>
11347 <event name="OnUpdateUI"></event>
11348 </object>
11349 </object>
11350 </object>
11351 <object class="wxStatusBar" expanded="1">
11352 <property name="bg"></property>
11353 <property name="context_help"></property>
11354 <property name="enabled">1</property>
11355 <property name="fg"></property>
11356 <property name="fields">1</property>
11357 <property name="font"></property>
11358 <property name="hidden">0</property>
11359 <property name="id">wxID_ANY</property>
11360 <property name="maximum_size"></property>
11361 <property name="minimum_size"></property>
11362 <property name="name">m_statusBar</property>
11363 <property name="permission">public</property>
11364 <property name="pos"></property>
11365 <property name="size"></property>
11366 <property name="style">wxST_SIZEGRIP</property>
11367 <property name="subclass"></property>
11368 <property name="tooltip"></property>
11369 <property name="window_extra_style"></property>
11370 <property name="window_name"></property>
11371 <property name="window_style"></property>
11372 <event name="OnChar"></event>
11373 <event name="OnEnterWindow"></event>
11374 <event name="OnEraseBackground"></event>
11375 <event name="OnKeyDown"></event>
11376 <event name="OnKeyUp"></event>
11377 <event name="OnKillFocus"></event>
11378 <event name="OnLeaveWindow"></event>
11379 <event name="OnLeftDClick"></event>
11380 <event name="OnLeftDown"></event>
11381 <event name="OnLeftUp"></event>
11382 <event name="OnMiddleDClick"></event>
11383 <event name="OnMiddleDown"></event>
11384 <event name="OnMiddleUp"></event>
11385 <event name="OnMotion"></event>
11386 <event name="OnMouseEvents"></event>
11387 <event name="OnMouseWheel"></event>
11388 <event name="OnPaint"></event>
11389 <event name="OnRightDClick"></event>
11390 <event name="OnRightDown"></event>
11391 <event name="OnRightUp"></event>
11392 <event name="OnSetFocus"></event>
11393 <event name="OnSize"></event>
11394 <event name="OnUpdateUI"></event>
11395 </object>
11396 </object>
11397 <object class="Dialog" expanded="0">
11398 <property name="bg"></property>
11399 <property name="center"></property>
11400 <property name="context_help"></property>
11401 <property name="enabled">1</property>
11402 <property name="extra_style"></property>
11403 <property name="fg"></property>
11404 <property name="font"></property>
11405 <property name="hidden">0</property>
11406 <property name="id">wxID_ANY</property>
11407 <property name="maximum_size"></property>
11408 <property name="minimum_size"></property>
11409 <property name="name">CGetTextFromUserDialogBase</property>
11410 <property name="pos"></property>
11411 <property name="size">403,138</property>
11412 <property name="style">wxDEFAULT_DIALOG_STYLE</property>
11413 <property name="subclass"></property>
11414 <property name="title"></property>
11415 <property name="tooltip"></property>
11416 <property name="window_extra_style"></property>
11417 <property name="window_name"></property>
11418 <property name="window_style"></property>
11419 <event name="OnActivate"></event>
11420 <event name="OnActivateApp"></event>
11421 <event name="OnChar"></event>
11422 <event name="OnClose">OnClose</event>
11423 <event name="OnEnterWindow"></event>
11424 <event name="OnEraseBackground"></event>
11425 <event name="OnHibernate"></event>
11426 <event name="OnIconize"></event>
11427 <event name="OnIdle"></event>
11428 <event name="OnInitDialog"></event>
11429 <event name="OnKeyDown"></event>
11430 <event name="OnKeyUp"></event>
11431 <event name="OnKillFocus"></event>
11432 <event name="OnLeaveWindow"></event>
11433 <event name="OnLeftDClick"></event>
11434 <event name="OnLeftDown"></event>
11435 <event name="OnLeftUp"></event>
11436 <event name="OnMiddleDClick"></event>
11437 <event name="OnMiddleDown"></event>
11438 <event name="OnMiddleUp"></event>
11439 <event name="OnMotion"></event>
11440 <event name="OnMouseEvents"></event>
11441 <event name="OnMouseWheel"></event>
11442 <event name="OnPaint"></event>
11443 <event name="OnRightDClick"></event>
11444 <event name="OnRightDown"></event>
11445 <event name="OnRightUp"></event>
11446 <event name="OnSetFocus"></event>
11447 <event name="OnSize"></event>
11448 <event name="OnUpdateUI"></event>
11449 <object class="wxBoxSizer" expanded="1">
11450 <property name="minimum_size"></property>
11451 <property name="name">bSizer79</property>
11452 <property name="orient">wxVERTICAL</property>
11453 <property name="permission">none</property>
11454 <object class="sizeritem" expanded="1">
11455 <property name="border">10</property>
11456 <property name="flag">wxEXPAND|wxALL</property>
11457 <property name="proportion">1</property>
11458 <object class="wxBoxSizer" expanded="1">
11459 <property name="minimum_size"></property>
11460 <property name="name">bSizer81</property>
11461 <property name="orient">wxVERTICAL</property>
11462 <property name="permission">none</property>
11463 <object class="sizeritem" expanded="1">
11464 <property name="border">5</property>
11465 <property name="flag">wxEXPAND</property>
11466 <property name="proportion">1</property>
11467 <object class="spacer" expanded="1">
11468 <property name="height">0</property>
11469 <property name="permission">protected</property>
11470 <property name="width">0</property>
11471 </object>
11472 </object>
11473 <object class="sizeritem" expanded="1">
11474 <property name="border">5</property>
11475 <property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
11476 <property name="proportion">0</property>
11477 <object class="wxStaticText" expanded="1">
11478 <property name="bg"></property>
11479 <property name="context_help"></property>
11480 <property name="enabled">1</property>
11481 <property name="fg"></property>
11482 <property name="font"></property>
11483 <property name="hidden">0</property>
11484 <property name="id">wxID_ANY</property>
11485 <property name="label"></property>
11486 <property name="maximum_size"></property>
11487 <property name="minimum_size"></property>
11488 <property name="name">m_staticTextMessage1</property>
11489 <property name="permission">protected</property>
11490 <property name="pos"></property>
11491 <property name="size"></property>
11492 <property name="style"></property>
11493 <property name="subclass"></property>
11494 <property name="tooltip"></property>
11495 <property name="window_extra_style"></property>
11496 <property name="window_name"></property>
11497 <property name="window_style"></property>
11498 <property name="wrap">-1</property>
11499 <event name="OnChar"></event>
11500 <event name="OnEnterWindow"></event>
11501 <event name="OnEraseBackground"></event>
11502 <event name="OnKeyDown"></event>
11503 <event name="OnKeyUp"></event>
11504 <event name="OnKillFocus"></event>
11505 <event name="OnLeaveWindow"></event>
11506 <event name="OnLeftDClick"></event>
11507 <event name="OnLeftDown"></event>
11508 <event name="OnLeftUp"></event>
11509 <event name="OnMiddleDClick"></event>
11510 <event name="OnMiddleDown"></event>
11511 <event name="OnMiddleUp"></event>
11512 <event name="OnMotion"></event>
11513 <event name="OnMouseEvents"></event>
11514 <event name="OnMouseWheel"></event>
11515 <event name="OnPaint"></event>
11516 <event name="OnRightDClick"></event>
11517 <event name="OnRightDown"></event>
11518 <event name="OnRightUp"></event>
11519 <event name="OnSetFocus"></event>
11520 <event name="OnSize"></event>
11521 <event name="OnUpdateUI"></event>
11522 </object>
11523 </object>
11524 <object class="sizeritem" expanded="1">
11525 <property name="border">5</property>
11526 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL</property>
11527 <property name="proportion">0</property>
11528 <object class="wxTextCtrl" expanded="1">
11529 <property name="bg"></property>
11530 <property name="context_help"></property>
11531 <property name="enabled">1</property>
11532 <property name="fg"></property>
11533 <property name="font"></property>
11534 <property name="hidden">0</property>
11535 <property name="id">wxID_TEXTCTRL</property>
11536 <property name="maximum_size"></property>
11537 <property name="maxlength">0</property>
11538 <property name="minimum_size"></property>
11539 <property name="name">m_textCtrl1</property>
11540 <property name="permission">protected</property>
11541 <property name="pos"></property>
11542 <property name="size"></property>
11543 <property name="style">wxTE_PROCESS_ENTER</property>
11544 <property name="subclass"></property>
11545 <property name="tooltip"></property>
11546 <property name="value"></property>
11547 <property name="window_extra_style"></property>
11548 <property name="window_name"></property>
11549 <property name="window_style"></property>
11550 <event name="OnChar"></event>
11551 <event name="OnEnterWindow"></event>
11552 <event name="OnEraseBackground"></event>
11553 <event name="OnKeyDown">OnKeyDown</event>
11554 <event name="OnKeyUp"></event>
11555 <event name="OnKillFocus"></event>
11556 <event name="OnLeaveWindow"></event>
11557 <event name="OnLeftDClick"></event>
11558 <event name="OnLeftDown"></event>
11559 <event name="OnLeftUp"></event>
11560 <event name="OnMiddleDClick"></event>
11561 <event name="OnMiddleDown"></event>
11562 <event name="OnMiddleUp"></event>
11563 <event name="OnMotion"></event>
11564 <event name="OnMouseEvents"></event>
11565 <event name="OnMouseWheel"></event>
11566 <event name="OnPaint"></event>
11567 <event name="OnRightDClick"></event>
11568 <event name="OnRightDown"></event>
11569 <event name="OnRightUp"></event>
11570 <event name="OnSetFocus"></event>
11571 <event name="OnSize"></event>
11572 <event name="OnText"></event>
11573 <event name="OnTextEnter"></event>
11574 <event name="OnTextMaxLen"></event>
11575 <event name="OnTextURL"></event>
11576 <event name="OnUpdateUI"></event>
11577 </object>
11578 </object>
11579 <object class="sizeritem" expanded="1">
11580 <property name="border">5</property>
11581 <property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
11582 <property name="proportion">0</property>
11583 <object class="wxStaticText" expanded="1">
11584 <property name="bg"></property>
11585 <property name="context_help"></property>
11586 <property name="enabled">1</property>
11587 <property name="fg"></property>
11588 <property name="font"></property>
11589 <property name="hidden">1</property>
11590 <property name="id">wxID_ANY</property>
11591 <property name="label"></property>
11592 <property name="maximum_size"></property>
11593 <property name="minimum_size"></property>
11594 <property name="name">m_staticTextMessage2</property>
11595 <property name="permission">protected</property>
11596 <property name="pos"></property>
11597 <property name="size"></property>
11598 <property name="style"></property>
11599 <property name="subclass"></property>
11600 <property name="tooltip"></property>
11601 <property name="window_extra_style"></property>
11602 <property name="window_name"></property>
11603 <property name="window_style"></property>
11604 <property name="wrap">-1</property>
11605 <event name="OnChar"></event>
11606 <event name="OnEnterWindow"></event>
11607 <event name="OnEraseBackground"></event>
11608 <event name="OnKeyDown"></event>
11609 <event name="OnKeyUp"></event>
11610 <event name="OnKillFocus"></event>
11611 <event name="OnLeaveWindow"></event>
11612 <event name="OnLeftDClick"></event>
11613 <event name="OnLeftDown"></event>
11614 <event name="OnLeftUp"></event>
11615 <event name="OnMiddleDClick"></event>
11616 <event name="OnMiddleDown"></event>
11617 <event name="OnMiddleUp"></event>
11618 <event name="OnMotion"></event>
11619 <event name="OnMouseEvents"></event>
11620 <event name="OnMouseWheel"></event>
11621 <event name="OnPaint"></event>
11622 <event name="OnRightDClick"></event>
11623 <event name="OnRightDown"></event>
11624 <event name="OnRightUp"></event>
11625 <event name="OnSetFocus"></event>
11626 <event name="OnSize"></event>
11627 <event name="OnUpdateUI"></event>
11628 </object>
11629 </object>
11630 <object class="sizeritem" expanded="1">
11631 <property name="border">5</property>
11632 <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL</property>
11633 <property name="proportion">0</property>
11634 <object class="wxTextCtrl" expanded="1">
11635 <property name="bg"></property>
11636 <property name="context_help"></property>
11637 <property name="enabled">1</property>
11638 <property name="fg"></property>
11639 <property name="font"></property>
11640 <property name="hidden">1</property>
11641 <property name="id">wxID_TEXTCTRL</property>
11642 <property name="maximum_size"></property>
11643 <property name="maxlength">0</property>
11644 <property name="minimum_size"></property>
11645 <property name="name">m_textCtrl2</property>
11646 <property name="permission">protected</property>
11647 <property name="pos"></property>
11648 <property name="size"></property>
11649 <property name="style">wxTE_PROCESS_ENTER</property>
11650 <property name="subclass"></property>
11651 <property name="tooltip"></property>
11652 <property name="value"></property>
11653 <property name="window_extra_style"></property>
11654 <property name="window_name"></property>
11655 <property name="window_style"></property>
11656 <event name="OnChar"></event>
11657 <event name="OnEnterWindow"></event>
11658 <event name="OnEraseBackground"></event>
11659 <event name="OnKeyDown">OnKeyDown</event>
11660 <event name="OnKeyUp"></event>
11661 <event name="OnKillFocus"></event>
11662 <event name="OnLeaveWindow"></event>
11663 <event name="OnLeftDClick"></event>
11664 <event name="OnLeftDown"></event>
11665 <event name="OnLeftUp"></event>
11666 <event name="OnMiddleDClick"></event>
11667 <event name="OnMiddleDown"></event>
11668 <event name="OnMiddleUp"></event>
11669 <event name="OnMotion"></event>
11670 <event name="OnMouseEvents"></event>
11671 <event name="OnMouseWheel"></event>
11672 <event name="OnPaint"></event>
11673 <event name="OnRightDClick"></event>
11674 <event name="OnRightDown"></event>
11675 <event name="OnRightUp"></event>
11676 <event name="OnSetFocus"></event>
11677 <event name="OnSize"></event>
11678 <event name="OnText"></event>
11679 <event name="OnTextEnter"></event>
11680 <event name="OnTextMaxLen"></event>
11681 <event name="OnTextURL"></event>
11682 <event name="OnUpdateUI"></event>
11683 </object>
11684 </object>
11685 <object class="sizeritem" expanded="1">
11686 <property name="border">5</property>
11687 <property name="flag">wxEXPAND</property>
11688 <property name="proportion">1</property>
11689 <object class="spacer" expanded="1">
11690 <property name="height">0</property>
11691 <property name="permission">protected</property>
11692 <property name="width">0</property>
11693 </object>
11694 </object>
11695 </object>
11696 </object>
11697 <object class="sizeritem" expanded="1">
11698 <property name="border">5</property>
11699 <property name="flag">wxEXPAND</property>
11700 <property name="proportion">0</property>
11701 <object class="wxBoxSizer" expanded="1">
11702 <property name="minimum_size"></property>
11703 <property name="name">bSizer80</property>
11704 <property name="orient">wxHORIZONTAL</property>
11705 <property name="permission">none</property>
11706 <object class="sizeritem" expanded="1">
11707 <property name="border">5</property>
11708 <property name="flag">wxEXPAND</property>
11709 <property name="proportion">1</property>
11710 <object class="spacer" expanded="1">
11711 <property name="height">0</property>
11712 <property name="permission">protected</property>
11713 <property name="width">0</property>
11714 </object>
11715 </object>
11716 <object class="sizeritem" expanded="1">
11717 <property name="border">5</property>
11718 <property name="flag">wxALL</property>
11719 <property name="proportion">0</property>
11720 <object class="wxButton" expanded="1">
11721 <property name="bg"></property>
11722 <property name="context_help"></property>
11723 <property name="default">0</property>
11724 <property name="enabled">1</property>
11725 <property name="fg"></property>
11726 <property name="font"></property>
11727 <property name="hidden">0</property>
11728 <property name="id">wxID_OK</property>
11729 <property name="label">OK</property>
11730 <property name="maximum_size"></property>
11731 <property name="minimum_size">85,25</property>
11732 <property name="name">m_buttonOK</property>
11733 <property name="permission">protected</property>
11734 <property name="pos"></property>
11735 <property name="size">-1,-1</property>
11736 <property name="style"></property>
11737 <property name="subclass"></property>
11738 <property name="tooltip"></property>
11739 <property name="window_extra_style"></property>
11740 <property name="window_name"></property>
11741 <property name="window_style"></property>
11742 <event name="OnButtonClick">OnButtonOK</event>
11743 <event name="OnChar"></event>
11744 <event name="OnEnterWindow"></event>
11745 <event name="OnEraseBackground"></event>
11746 <event name="OnKeyDown"></event>
11747 <event name="OnKeyUp"></event>
11748 <event name="OnKillFocus"></event>
11749 <event name="OnLeaveWindow"></event>
11750 <event name="OnLeftDClick"></event>
11751 <event name="OnLeftDown"></event>
11752 <event name="OnLeftUp"></event>
11753 <event name="OnMiddleDClick"></event>
11754 <event name="OnMiddleDown"></event>
11755 <event name="OnMiddleUp"></event>
11756 <event name="OnMotion"></event>
11757 <event name="OnMouseEvents"></event>
11758 <event name="OnMouseWheel"></event>
11759 <event name="OnPaint"></event>
11760 <event name="OnRightDClick"></event>
11761 <event name="OnRightDown"></event>
11762 <event name="OnRightUp"></event>
11763 <event name="OnSetFocus"></event>
11764 <event name="OnSize"></event>
11765 <event name="OnUpdateUI"></event>
11766 </object>
11767 </object>
11768 <object class="sizeritem" expanded="1">
11769 <property name="border">5</property>
11770 <property name="flag">wxALL</property>
11771 <property name="proportion">0</property>
11772 <object class="wxButton" expanded="1">
11773 <property name="bg"></property>
11774 <property name="context_help"></property>
11775 <property name="default">0</property>
11776 <property name="enabled">1</property>
11777 <property name="fg"></property>
11778 <property name="font"></property>
11779 <property name="hidden">0</property>
11780 <property name="id">wxID_CANCEL</property>
11781 <property name="label">Cancel</property>
11782 <property name="maximum_size"></property>
11783 <property name="minimum_size">85,25</property>
11784 <property name="name">m_buttonCancel</property>
11785 <property name="permission">protected</property>
11786 <property name="pos"></property>
11787 <property name="size"></property>
11788 <property name="style"></property>
11789 <property name="subclass"></property>
11790 <property name="tooltip"></property>
11791 <property name="window_extra_style"></property>
11792 <property name="window_name"></property>
11793 <property name="window_style"></property>
11794 <event name="OnButtonClick">OnButtonCancel</event>
11795 <event name="OnChar"></event>
11796 <event name="OnEnterWindow"></event>
11797 <event name="OnEraseBackground"></event>
11798 <event name="OnKeyDown"></event>
11799 <event name="OnKeyUp"></event>
11800 <event name="OnKillFocus"></event>
11801 <event name="OnLeaveWindow"></event>
11802 <event name="OnLeftDClick"></event>
11803 <event name="OnLeftDown"></event>
11804 <event name="OnLeftUp"></event>
11805 <event name="OnMiddleDClick"></event>
11806 <event name="OnMiddleDown"></event>
11807 <event name="OnMiddleUp"></event>
11808 <event name="OnMotion"></event>
11809 <event name="OnMouseEvents"></event>
11810 <event name="OnMouseWheel"></event>
11811 <event name="OnPaint"></event>
11812 <event name="OnRightDClick"></event>
11813 <event name="OnRightDown"></event>
11814 <event name="OnRightUp"></event>
11815 <event name="OnSetFocus"></event>
11816 <event name="OnSize"></event>
11817 <event name="OnUpdateUI"></event>
11818 </object>
11819 </object>
11820 </object>
11821 </object>
11822 </object>
11823 </object>
11824 </object>
11825</wxFormBuilder_Project>
diff --git a/src/util.cpp b/src/util.cpp
index 7f56530..68bd18e 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -8,6 +8,99 @@
8 8
9bool fDebug = false; 9bool fDebug = false;
10 10
11// ---------------------------------------------------------------------------
12// Categorized, burst-collapsing logging -- see the LogPrint doc comment in
13// util.h for the problem this solves.
14// ---------------------------------------------------------------------------
15
16// Categories that explain the pool/worker/payout pipeline are on unconditionally:
17// silence there is exactly the "worker stuck, nothing then happens" complaint
18// this exists to fix, so it can't be opted out of by forgetting -debug.
19// "net" and "nostr" cover the per-address connection/discovery chatter that
20// used to dominate debug.log; they're gated behind fDebug like the printf()
21// calls they replace, so default output stays quiet unless requested.
22static bool LogCategoryDefaultOn(const char* category)
23{
24 return strcmp(category, "pool") == 0 ||
25 strcmp(category, "worker") == 0 ||
26 strcmp(category, "payout") == 0;
27}
28
29bool LogAcceptsCategory(const char* category)
30{
31 if (LogCategoryDefaultOn(category))
32 return true;
33 return fDebug;
34}
35
36// Only collapse bursts from the exact same call site within this window;
37// a different LogPrint() call (different file/line) is never merged with
38// this one, so unrelated messages never get mixed into one summary.
39static const int64 DEDUP_WINDOW_SECS = 3;
40
41struct LogDedupState {
42 int64 windowStart; // GetTime() when the current window opened
43 int suppressed; // calls swallowed so far this window
44 std::string lastMsg; // most recent message text, for the summary line
45};
46
47static std::map<std::string, LogDedupState> g_logDedup;
48static CCriticalSection cs_logDedup;
49
50void LogPrintDedup(const char* category, const char* file, int line, const std::string& msgIn)
51{
52 // Call sites follow the existing printf() convention of ending their
53 // format string with \n; strip it here so the single \n this function
54 // adds below doesn't turn into a blank line.
55 std::string msg = msgIn;
56 while (!msg.empty() && (msg.back() == '\n' || msg.back() == '\r'))
57 msg.pop_back();
58
59 char key[512];
60 my_snprintf(key, sizeof(key), "%s|%s:%d", category, file, line);
61
62 int64 now = GetTime();
63 bool fEmitNow = false;
64 int suppressedToFlush = 0;
65 std::string flushedMsg;
66
67 CRITICAL_BLOCK(cs_logDedup)
68 {
69 std::map<std::string, LogDedupState>::iterator it = g_logDedup.find(key);
70 if (it == g_logDedup.end())
71 {
72 // First time this call site has fired (or its last window is long
73 // gone) -- print it directly and open a fresh window.
74 g_logDedup[key] = LogDedupState{now, 0, msg};
75 fEmitNow = true;
76 }
77 else if (now - it->second.windowStart >= DEDUP_WINDOW_SECS)
78 {
79 // Window rolled over: flush what was suppressed during it (if
80 // anything), then start a new window with this call printed.
81 suppressedToFlush = it->second.suppressed;
82 flushedMsg = it->second.lastMsg;
83 it->second.windowStart = now;
84 it->second.suppressed = 0;
85 it->second.lastMsg = msg;
86 fEmitNow = true;
87 }
88 else
89 {
90 // Still inside the window and already printed one line for it:
91 // count this occurrence instead of writing another near-duplicate.
92 it->second.suppressed++;
93 it->second.lastMsg = msg;
94 }
95 }
96
97 if (suppressedToFlush > 0)
98 OutputDebugStringF("[%s] (%d similar in %llds, last: %s)\n",
99 category, suppressedToFlush, (long long)DEDUP_WINDOW_SECS, flushedMsg.c_str());
100 if (fEmitNow)
101 OutputDebugStringF("[%s] %s\n", category, msg.c_str());
102}
103
11 104
12 105
13 106
@@ -200,11 +293,16 @@ void PrintException(std::exception* pex, const char* pszThread)
200 snprintf(pszMessage, sizeof(pszMessage), 293 snprintf(pszMessage, sizeof(pszMessage),
201 "UNKNOWN EXCEPTION \n%s in %s \n", pszModule, pszThread); 294 "UNKNOWN EXCEPTION \n%s in %s \n", pszModule, pszThread);
202 printf("\n\n************************\n%s", pszMessage); 295 printf("\n\n************************\n%s", pszMessage);
203 // Suppress the dialog and rethrow during shutdown — threads unwinding on 296 // Do NOT rethrow here. Every caller of PrintException (via
204 // exit cause spurious "UNKNOWN EXCEPTION" popups that aren't real errors. 297 // CATCH_PRINT_EXCEPTION) is a thread wrapped in its own
205 // Show error in GUI via repaint signal — GUI polls g_errorMessage 298 // "try { ThreadFoo2() } catch(...) { log, sleep, loop again }" self-healing
206 if (!fShutdown) 299 // retry loop -- that's the whole point of the wrapper. Rethrowing from
207 throw; 300 // inside that catch block escapes the retry loop entirely (nothing above
301 // it in the thread catches it) and takes down the whole process with
302 // std::terminate() on the very first transient error -- a flaky relay
303 // connection, a malformed message, anything -- instead of letting the
304 // thread log it, sleep 5s, and try again like it's designed to.
305 // Show error in GUI via repaint signal -- GUI polls g_errorMessage
208} 306}
209 307
210 308
diff --git a/src/util.h b/src/util.h
index c53293a..641b838 100644
--- a/src/util.h
+++ b/src/util.h
@@ -26,11 +26,14 @@ typedef unsigned long long uint64;
26#define UEND(a) ((unsigned char*)&((&(a))[1])) 26#define UEND(a) ((unsigned char*)&((&(a))[1]))
27#define ARRAYLEN(array) (sizeof(array)/sizeof((array)[0])) 27#define ARRAYLEN(array) (sizeof(array)/sizeof((array)[0]))
28 28
29// Route printf to debug.log (and the console) on the GUI Windows build and on 29// Route printf to debug.log (and the console on non-Windows) everywhere.
30// the headless Linux build alike. 30// (Previously gated on `defined(_WINDOWS) || !defined(_WIN32)` -- but
31#if defined(_WINDOWS) || !defined(_WIN32) 31// _WINDOWS is only ever defined by the legacy, unused makefile.vc build;
32// the real Windows build (makefile.mingw) never defines it, so on actual
33// Windows this condition was always false and debug.log was never written.
34// OutputDebugStringF() is already platform-safe internally: it always
35// writes debug.log, and only echoes to the console when not on Windows.)
32#define printf OutputDebugStringF 36#define printf OutputDebugStringF
33#endif
34 37
35#ifdef snprintf 38#ifdef snprintf
36#undef snprintf 39#undef snprintf
@@ -70,6 +73,35 @@ inline T& REF(const T& val)
70 73
71extern bool fDebug; 74extern bool fDebug;
72 75
76// ---------------------------------------------------------------------------
77// Categorized, burst-collapsing logging
78//
79// Plain printf() (routed to OutputDebugStringF below) writes every call
80// unfiltered to debug.log. That's fine for one-off events, but a loop that
81// logs once per item -- once per discovered peer, once per connect attempt,
82// once per share -- turns debug.log into a wall of near-identical lines that
83// differ only by an address, while the line that actually explains a stuck
84// flow ("Stratum: no job available for ...") scrolls off screen under the
85// noise. LogPrint() is a drop-in replacement for printf() that fixes both
86// problems without touching call sites' formatting:
87//
88// 1. Category tag: every call names the subsystem it belongs to ("pool",
89// "worker", "payout", "net", "nostr", ...). LogAcceptsCategory()
90// controls what's written (see util.cpp); the pool/worker/payout flow
91// the person actually needs visibility into is on by default.
92// 2. Burst collapse: repeated LogPrint() calls from the *same source line*
93// only emit one line per DEDUP_WINDOW_SECS; if more calls land inside
94// that window they're counted instead of reprinted, and the count is
95// flushed as a single "(xN similar in Ws)" line the moment the window
96// rolls over. A loop discovering 500 peers by address now produces a
97// small, bounded number of lines instead of 500 -- log growth is capped
98// by elapsed time, not by how many similar events happen to fire.
99// ---------------------------------------------------------------------------
100bool LogAcceptsCategory(const char* category);
101void LogPrintDedup(const char* category, const char* file, int line, const std::string& msg);
102#define LogPrint(category, ...) \
103 do { if (LogAcceptsCategory(category)) LogPrintDedup((category), __FILE__, __LINE__, strprintf(__VA_ARGS__)); } while (0)
104
73void RandAddSeed(bool fPerfmon=false); 105void RandAddSeed(bool fPerfmon=false);
74int my_snprintf(char* buffer, size_t limit, const char* format, ...); 106int my_snprintf(char* buffer, size_t limit, const char* format, ...);
75string strprintf(const char* format, ...); 107string strprintf(const char* format, ...);
@@ -231,7 +263,7 @@ void PrintHex(const T pbegin, const T pend, const char* pszFormat="%s", bool fSp
231 263
232 264
233 265
234// Forward declaration — defined in main.cpp 266// Forward declaration -- defined in main.cpp
235string GetAppDir(); 267string GetAppDir();
236 268
237inline int OutputDebugStringF(const char* pszFormat, ...) 269inline int OutputDebugStringF(const char* pszFormat, ...)