Commit Graph
867 Commits
Author SHA1 Message Date
German KhokhlovandClaude Opus 5.5 005b4dc9dc fix(i18n): Spanish keeps the HUD codes RANGE and SPD, as its glossary says
The review fixes had turned RANGE into DIST. and SPD into VEL.; the
Spanish glossary keeps HDG, BRG, CRS, FOV, DEST, SPD, RANGE and ALT in
English like cockpit avionics. The glossary now records the terms the
review settled: ACTIVO / INACTIVO, marcador, resplandor, Ciber,
NOTICIAS, INCL. / ALT.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 16:20:26 +04:00
German KhokhlovandClaude Opus 5.5 896952c085 fix(i18n): Contacts panel text and distances in the UI language
The Contacts panel builds its markup in a variable before innerHTML, so
the unmarked-text check missed it: the window caption, "Named areas", the
"at least" count and each cohort's reason stayed English, and distances
read "4.6 km" in every language.

The reason stays English in the cohort summary, which the voice analyst
reads too; it now also carries its template, and the panel shows it in
the UI language. Distances and counts use the locale's number format
and unit.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 23:36:30 +04:00
German KhokhlovandClaude Opus 5.5 03207ca0fc fix(i18n): Google controls, vessel units and counts follow the UI language
Screens that only open with provider keys showed a few gaps:

- Google Street View's own controls (Map Data, Terms, Report a problem)
  and its addresses were always English: the Maps script now loads with
  the UI language. English adds no parameter, as before.
- The selected-vessel HUD line kept KT and DEG after translated labels.
- Layer counts used a decimal point (12.0K); other languages use their
  own separator (12,0K).
- A collapsed rail title was cut with an ellipsis in Russian; tighter
  tracking fits it whole. English is unchanged.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 23:11:37 +04:00
German KhokhlovandClaude Opus 5.5 7db0abc396 fix(i18n): Spanish review fixes; report translations left in English
A screenshot review of the Spanish UI found:

- Text left in English. Catalog entries copied from English (Bloom,
  Cyber, Pin, NEWS, SITE, ON/OFF, RANGE, PITCH, HGT…) and the radio
  music genres, which never went through t(). The genres are translated
  in es and ru now.
- Wording: gender agreement, calques of the English, hints that name
  buttons that do not exist, and one concept worded two ways.
- Layout: the DESACTIVADO pill squeezed layer names until words broke
  mid-word; the scene and camera selects showed one word; a collapsed
  rail title pushed its button out of the card; the image slot line and
  a comparison readout were cut or split.

The layout fixes are scoped to languages other than English, so English
stays pixel-identical. Visual-style slider values now use the locale's
decimal separator (0,85).

npm run i18n now reports a translation that is identical to the
English, unless src/i18n/same-as-english.json lists it for that language
(codes, product names, words spelled the same).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 21:53:57 +04:00
German KhokhlovandClaude Opus 5.5 9f1e409193 fix(i18n): Street Level errors in the UI language; hint row wraps
The Street Level error line and its toasts showed provider errors as
thrown (Google's key-rejected message stayed English). They go through
translateKnown now. In a translation the coverage hint no longer shrinks
to a narrow column beside OPEN GOOGLE STREET VIEW: the button takes its
own line when both do not fit. English layout is unchanged.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 20:47:00 +04:00
German KhokhlovandClaude Opus 5.5 8b0bb031b6 Merge origin/main: Google Street View provider, translated
Main added the Google Street View street-level provider and key guidance
that offers another source. Its new text goes through t()/msg() with ru
and es entries; the key guidance the panel shows is built in the UI
language by src/ui/keyGuidance.js, while keySetupCore.mjs keeps the
English sentences the server and AI tools use.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 20:34:43 +04:00
German KhokhlovandClaude Opus 5.5 3db77272bc fix(i18n): English HUD summary keeps its original shape
The fallback summary reads "NORMAL CITY NEAR …" again in English; the
translations keep the " · " separators that stop the style and view band
reading as one phrase.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 20:11:57 +04:00
German KhokhlovandClaude Opus 5.5 2c74057b5e fix(i18n): keep values the AI tools read in English
- Satellite class in analyst records and voice payloads stays English
  ("STATION", "COMMS"), so voice filters on the class work in every
  language; cards and the legend still show the translated label.
- Layer source names (OSM routing, ALPR sources) stay English in layer
  state; the layer row translates them.
- New translateKnown(): catalog text when there is an entry, the given text
  otherwise, with no warning. The layer row uses it for loading labels and
  errors, Recent Imagery for its notices.
- Mark the remaining Recent Imagery and wind messages.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 20:09:45 +04:00
German KhokhlovandClaude Opus 5.5 0c647a791b fix(i18n): toast, boot labels and AI tool text found in review
- The Space Missions cancellation failure toast read "[object Object]" in
  every language: the options object was passed as the message. The English
  message is the second argument again, the translation the third.
- Header text is translated before panel chrome builds its collapse labels,
  so the dock and display toggles no longer read "Expand VISUAL PRESETS" in
  another language.
- The voice "show data layers" result keeps the English layer name
  (row data-layer-name), not the translated row text.
- The Google 3D unavailable reason is translated in full.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 20:07:09 +04:00
German KhokhlovandClaude Opus 5.5 9d01f9bfcd fix(i18n): keep English pixel-identical and stored data English
From the English-parity and breakage review against main:
- English wording back to main: "Configured Source", the "SHARED SUBJECT"
  fallback, CCTV calibration "RANGE 120m".
- Voice header and CCTV calibration chip/select tweaks for long labels now
  apply to non-English only (html:not([lang='en'])); English matches main.
  The scene select font change is scoped the same way.
- New scenes and shots store their default title in English ("Scene 3",
  "Shot 2") and translate it when shown, so a title captured in one language
  does not leak into projects, storage or shared JSON.
- Choosing a language with storage blocked keeps it in ?lang instead of
  silently doing nothing.
- One picked import file shows its name again.
- qa-l9-matrix reads the voice state from data-status, not the label.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 20:03:54 +04:00
German KhokhlovandClaude Opus 5.5 a28e29e05e fix(i18n): restore English output changed by the i18n foundation
A side-by-side English comparison with main found text the branch changed:
- Layer list names: #601 let its own catalog names win over the panel's
  English names, so "Live Vessels" read "Live AIS Vessels", "Bike Share"
  "Bikeshare", "Cameras" "CCTV", "Data Centers" "Datacenters", "Active Fires"
  "FIRMS Active Fires". The panel names win again.
- HUD feed-state suffix is "UNAVAILABLE LIVE AIS VESSELS" again (Russian keeps
  its colon); the mission panel aria-label is "Selected Space Mission" again;
  scene shot timing is "4.0s + 0.9s" again.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 20:00:03 +04:00
German KhokhlovandClaude Opus 5.5 f3da0e1761 docs(i18n): keep WHOT/BHOT and Ironbow untranslated in ru
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 19:37:14 +04:00
German KhokhlovandClaude Opus 5.5 e3375f82f2 fix(i18n): keep the advisory number with its № sign
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 19:22:51 +04:00
German KhokhlovandClaude Opus 5.5 54dce5b3bd fix(i18n): second screenshot review: remaining English, numbers and wraps
From the re-shot Russian screenshots:
- Translated: weather frame/imagery status errors, HUD summary provenance
  ("НЕДОСТУПНО: СУДА AIS ОНЛАЙН"), Bhote Koshi map labels, cockpit signal
  distances (КМ). The HUD summary fields are separated with " · " in every
  language, so the style name and view band no longer read as one phrase.
- Numbers follow the locale: cockpit altitude ("26 175"), precipitation.
- No breaks inside codes and dates: ADS-B and similar in layer rows,
  Sentinel-2, cyclone issue dates (word joiner; the UI font has no U+2011),
  no-break space after label colons in cyclone details.
- Layout: count lines under ALPR, short unavailable chip (context
  "status chip"), roomier draw segments, tighter CCTV calibration chips,
  two-line beat titles and media card titles, wrapping weather status.
- Wording: ru advisory is «сводка» (was «бюллетень»; "Advisory center" is
  «Центр циклона по сводке»), Street View is «Просмотр улиц», OPACITY
  «НЕПРОЗР.», synced «синхр.», Area «Зона»; the import dialog no longer says
  "this scene" for several scenes. Glossary updated.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 19:13:12 +04:00
Said Turksever 9beadbda63 Merge pull request #966 from asturksever/pr/google-street-view
Street Level: Google Street View as the second imagery provider
2026-10-13 15:23:02 +01:00
Said TurkseverandClaude Opus 5.5 b1efd22f02 feat(street-level): one imagery source at a time; IC8 review fixes
- One provider is lit at a time: lighting a chip darkens the others, and a
  chip click records every registered provider's switch in one update so
  the share link keeps the swap (also off Google 3D, where Street View is
  not listed). The layer starts with the first default-on provider
  (Mapillary, free); params that light several keep the one already on,
  so reapplying them never flips (litByParams). The now-unreachable
  "several lit" chip paths are gone.
- Leaving Google 3D during a Street View lookup ends it without an error
  or a stuck loading state (openImage's early return resets it; the
  lookup loop rechecks availability).
- A source swap during a lookup no longer reports "no imagery".
- Street View lit off Google 3D says the panel needs the Google 3D map.
- Comments trimmed to the why; keySetupCore.test.mjs back to upstream's
  formatting plus the one new test (was a 551-line reformat).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 15:10:58 +01:00
Said TurkseverandClaude Opus 5.5 64d939f3d2 feat(street-level): Street View polish — name, filters, legend, marker
- The chip reads GOOGLE STREET VIEW (and its caption link likewise).
- Providers declare the imagery filters they honour (`filters`, default
  pano + since). Street View declares none: every panorama is 360° and it
  draws no coverage to thin, so its lookups ignore the filters and the
  panel hides IMAGERY and SINCE while it is the only lit provider.
- The legend lists only providers that draw coverage lines, with
  Selected only beside one: Street View alone shows no legend.
- Providers may pick their on-globe marker (`marker`); Street View's is a
  Google-blue field-of-view cone from a white-ringed dot, in place of
  GEV's amber pin, and switches back for a Mapillary photo.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 14:05:57 +01:00
Said Turksever eb07b9d5ad Merge remote-tracking branch 'origin/pr/google-street-view' into pr/google-street-view 2026-10-13 13:36:13 +01:00
Said TurkseverandClaude Opus 5.5 48ca99a38a fix(street-level): keep OPEN STREET VIEW whole beside a long coverage line
.scene-btn (flex: 1) loads after street-level.css and outranked the
button's flex: 0 0 auto, so with Mapillary and Street View both lit the
button shrank to its 72px minimum and its one-line label ran past the
panel edge. Scope the rule under .sl-meta-row; the coverage line wraps
instead. The live gate gives the share-link check 30 s, as the link is
written only once the view rests.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 13:36:01 +01:00
Said Turksever f1d77888d5 Merge branch 'main' into pr/google-street-view 2026-10-12 18:40:02 +01:00
German KhokhlovandClaude Opus 5.5 2b6ccad732 fix(i18n): fix Russian layouts and the gaps the screenshot review found
A review of the Russian UI screenshots found ~90 places where longer words
broke the layout or text was still English. Fixed so they hold for any
language, then shortened where a control is short by design.

- Layout: label columns that size to their text (weather and wind settings,
  Recent Imagery slots and opacity, style sliders, display panel), layer
  list names and icons, buttons that wrap instead of overflowing (CCTV,
  scenes, Bhote Koshi), voice header that always shows the cost, styled
  EN | ES | RU chips, voice error tray above the dock.
- t() context: t('CLEAR', { context: 'action' }) is «СБРОСИТЬ» while the sky
  stays «ЯСНО»; also used for radio categories, voice states and directions.
- Units and dates follow the locale through src/ui/unitLabels.js
  (formatQuantity: localized number, translated unit, non-breaking space):
  wind, pressure, cyclones, directions, CCTV, SDR gain, scene timing, flight
  tooltip, Recent Imagery dates and resolution.
- Newly translated: directions turn-by-turn steps (built from the maneuver;
  English matches the server word for word), HUD mode and summary, voice
  card states, radio categories on the globe, CCTV status, layer source
  lines, scene dialogs (Cancel, file pickers), Bhote Koshi statuses, titles,
  comparison dates and caveat, Recent Imagery notices. Stored data and text
  for AI tools stay English.
- es and ru: 1,885 messages each.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-12 21:18:03 +04:00
German KhokhlovandClaude Opus 5.5 3129e531e6 feat(i18n): translate the whole interface
Mark every UI string the unmarked-text check reported (534) plus text it
cannot see (helpers, joined labels, runtime-built panels), and translate
the result to Spanish and Russian: 1,679 messages each.

- Kept on purpose, with the reason where the text lives: provider and
  product names, place and camera names, codes and units, dB values, the HUD
  terminal readouts, demo shot titles that saved projects look up by title,
  and text for AI tools and the voice model.
- Modules shared with the server or AI tools stay free of the i18n import
  (local msg); the wind reading and voice session stay English and are
  translated where the page shows them.
- npm test now runs the unmarked-text check.
- Fixes on the way: a duplicated radio privacy paragraph, the contact panel
  toggle saying Expand while open, the CSS filter mistaking &amp; for CSS.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-12 19:24:42 +04:00
German KhokhlovandClaude Opus 5.5 ee72133574 feat(i18n): find UI text that is not marked for translation
npm run i18n now also lists, and fails on, markup text and title /
aria-label / placeholder without data-i18n*, and string literals that reach
the page (textContent, innerHTML, setAttribute, toasts, label:/title:
properties and similar) without t(), tn() or msg(). Opt-outs say why where
the text lives: translate="no" and data-i18n-runtime in markup,
// i18n-ignore in code. src/tools/ is skipped: its text is for AI clients.

534 places are reported today; npm test does not run this part yet.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-12 18:41:34 +04:00
German KhokhlovandClaude Opus 5.5 6ff7afcc8b fix(i18n): translate the Street Level and Draw panels
Both panels landed after the original string extraction, so they rendered
English in every locale. Mark their markup and runtime text (status, SINCE
stops, provider tooltips, coverage meta, viewer captions, draw hints and
colours), the layer-list names kept in PANEL_LABELS, and add 90 es and ru
entries. Street Level is «Уличные снимки» / «A pie de calle».

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-12 18:32:28 +04:00
Said Turksever 8b8ccc9a81 Merge pull request #936 from xiehuanyi/fix/tle-resync-after-missing-line
fix(satellites): retain later TLE sets after missing lines
2026-10-12 15:15:32 +01:00
German KhokhlovandClaude Opus 5.5 eee905e787 fix(i18n): translate visual preset parameter sliders
The slider labels (Sensitivity, Bloom, Pixelation, …) live in the shader
modules and were rendered raw, so they stayed English in every locale.
Mark them with msg() and render them through t(); add es and ru entries.
WHOT/BHOT and Ironbow keep their names. Russian Bloom is now «Свечение».

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-12 18:11:20 +04:00
Said TurkseverandClaude Opus 5.5 10f1986e38 fix(street-level): IC8 follow-ups for Google Street View
- An open after a failed one is no longer failed by the old panorama's
  status: only status_changed can reject; position_changed only resolves.
- A nearest lookup aborted, timed out or refused while Google's script
  loads no longer sends its getPanorama request once the script arrives.
- A panorama-details lookup that never answers times out after 10 s,
  cools down and retries; an unmount releases lookups in flight, and
  their late answers are dropped.
- Every Maps loader on a page shares one script load and ready callback,
  and either can retry a failed script.
- OPEN STREET VIEW aimed at the sky opens nothing and says to aim at a
  street, instead of looking up the camera footprint.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-12 13:52:39 +01:00
German KhokhlovandClaude Opus 5.5 70936b58b9 feat(i18n): ship Spanish
Register es next to ru (selector shows EN | ES | RU) and complete the
catalog against the current English: the 13 messages added since #602,
the "many" plural form Intl.PluralRules('es') selects for exact millions,
and fixes where the English had changed (e.g. "hace hace" in LIVE ·
updated, minutes written as metres). Terminology made consistent (buque,
aeronave, incendio activo); key names stay in English. Meir's wording is
kept everywhere else. Adds docs/translations/es.md.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-12 14:33:43 +04:00
Said TurkseverandClaude Opus 5.5 76db4114ff Merge upstream/main into pr/google-street-view
Conflicts with upstream's Street Level provider composition and share-state
codec, resolved:

- Street View's switch moves from its own share option (`g`) to upstream's
  provider-switch field (`r`, e.g. `0.r.google-1`); a link without it keeps
  Street View off. Docs and the browser gate follow.
- createApplicationStreetLevel keeps upstream's injectable provider list;
  its default, once the application supplies its Street Level source, is
  Mapillary plus Google Street View. Without that source there are none, as
  upstream intends.
- The coverage hint keeps upstream's empty-composition message and joins
  every switched-on provider's hint otherwise.
- CHANGELOG, README and SECURITY keep both sides' entries.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-12 11:32:05 +01:00
Meir MichanieandGerman Khokhlov 47cfdb823e feat(i18n): Spanish catalog
Meir Michanie's Spanish translation from #602 (9d69e11, 4ba5d69), converted
to the English-keyed format: one entry per English message in
src/i18n/locales/es.json, translations unchanged. Also carries the es-only
CCTV control-row wrap rule.

Co-Authored-By: German Khokhlov <[email protected]>
2026-10-12 14:26:08 +04:00
German KhokhlovandClaude Opus 5.5 acac88ee49 docs(i18n): move the Russian glossary to docs/translations/ru.md
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-12 14:12:01 +04:00
German KhokhlovandClaude Opus 5.5 5d1c43bfaf docs(i18n): clarify where a placeholder may go
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-12 14:08:38 +04:00
German KhokhlovandClaude Opus 5.5 4dcbf7fbfa docs(i18n): add a developer guide for t, tn, msg and data-i18n
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-12 14:03:30 +04:00
German KhokhlovandClaude Opus 5.5 13efd411b6 refactor(i18n): key messages by English text; add Russian
Replace the semantic keys with the English source text, so code reads as the
UI does and English needs no catalog: t('Save keys'), tn(count, one, other)
for plurals, msg() for text stored in data, and bare data-i18n* markup that
translates the element's own English. Other languages are one flat JSON each.

- Simplify src/i18n: drop namespaces, the configurable locale pair
  (GEV_DEFAULT_LOCALE / GEV_SECONDARY_LOCALE) and its build defines. Locale
  comes from ?lang=, the stored choice, then browser languages.
- Add scripts/i18n.mjs (npm run i18n): extracts every message from t/tn/msg
  and markup, and fails on missing, unused, placeholder-mismatched or
  wrongly-shaped plural entries. npm test runs it via catalog.test.mjs.
- Add Russian (src/i18n/locales/ru.json, 833 messages), started from the
  community catalog in #312 and reviewed against the current English.
- Fix data-i18n placed on parents that would wipe their children (cockpit
  LEVEL and local weather cells, first-run EXPLORE MANUALLY tile), and a
  doubled degree sign in the TRACK ACQUIRED signal.
- Rewrite docs/TRANSLATORS.md for the new workflow; drop sections the earlier
  merge resurrected in docs/CURRENT-STATE.md.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-12 13:48:56 +04:00
Meir Michanie dfbaeafbd8 i18n: sync catalogs with upstream key-setup and vision-style additions
- keySetup.unlocks.openai follows the registry's new wording
  ('API key or ChatGPT OAuth')
- add keySetup.unlocks.mapillary for the new Mapillary client-token key
- add vision.styleNameAnime/styleNameSnow for the new anime/snow cockpit
  vision modes
- add layers.meta.dataSourceUnavailable for the unavailable-layer tooltip
  fallback introduced upstream
2026-10-10 23:28:10 +02:00
Meir Michanie 71f7a58169 Merge remote-tracking branch 'upstream/main' into core-rb2
# Conflicts:
#	CHANGELOG.md
#	build/vite.js
#	scripts/package-boundaries.json
#	server/standalone/vite.config.js
#	src/app/scene.js
#	src/layers/vessels/queries.js
#	src/standalone/application.js
#	src/tooling/viteBuild.test.mjs
#	src/ui/cockpitInstruments.js
#	src/ui/layerPanel.js
#	src/ui/panelPositionControls.js
2026-10-10 23:15:54 +02:00
Huanyi Xie cc4ed6b3ba Merge current main and retain the TLE recovery changelog 2026-10-10 13:33:44 +03:00
Sameh Khamis 591f299d11 Merge pull request #986 from bilawalsidhu/fix/healthy-empty-vessel-coverage
Handle healthy empty vessel coverage without an outage
2026-10-09 20:59:43 -07:00
Sameh Khamis 27a986f40f Accept authoritative empty vessel coverage without an outage 2026-10-09 20:50:19 -07:00
Sameh Khamis 89e566aa9b Merge pull request #985 from bilawalsidhu/fix/street-level-provider-sharing
Preserve custom Street Level provider switches in shared state
2026-10-09 20:03:02 -07:00
Sameh Khamis 7ed47a2b79 Merge branch 'main' into fix/street-level-provider-sharing 2026-10-09 19:56:27 -07:00
Sameh Khamis 90a1442c9c Merge pull request #984 from bilawalsidhu/refactor/route-imagery-sources
Separate Directions and Recent Imagery acquisition sources
2026-10-09 19:56:17 -07:00
Sameh Khamis 7acf55e187 Merge branch 'main' into refactor/route-imagery-sources 2026-10-09 19:47:09 -07:00
Sameh Khamis 2fe70f63f8 Merge pull request #983 from bilawalsidhu/feat/optional-catalog-sources
Make catalog feeds optional and configurable at startup
2026-10-09 19:47:03 -07:00
Sameh Khamis f289a1ce03 Merge branch 'main' into feat/optional-catalog-sources 2026-10-09 19:37:39 -07:00
Sameh Khamis e626137a7a Merge pull request #982 from bilawalsidhu/fix/optional-street-level-providers
Fix startup with optional Street Level providers
2026-10-09 19:37:14 -07:00
Sameh Khamis eacfc1b06a Persist explicit provider toggles through the layer state coordinator 2026-10-09 19:09:30 -07:00
Sameh Khamis 3ba8c6d61b Use a neutral compact switch codec and clarify provider size limits 2026-10-09 18:47:04 -07:00
Sameh Khamis fbe118aab9 Merge branch 'refactor/route-imagery-sources' into fix/street-level-provider-sharing 2026-10-09 18:44:12 -07:00
Sameh Khamis 8d7c47ec39 Merge branch 'feat/optional-catalog-sources' into refactor/route-imagery-sources
# Conflicts:
#	CHANGELOG.md
2026-10-09 18:44:07 -07:00