Compare commits

..

10 Commits

Author SHA1 Message Date
zyphlar
766a4fb2a3 add csv diff
Signed-off-by: zyphlar <zyphlar@gmail.com>
2026-01-01 12:45:56 -08:00
zyphlar
6dc3036fcf htmldir
Signed-off-by: zyphlar <zyphlar@noreply.codeberg.org>
2026-01-01 06:08:10 +01:00
zyphlar
36a65945ba remove branch and unused vars
Signed-off-by: zyphlar <zyphlar@noreply.codeberg.org>
2026-01-01 00:01:28 +01:00
zyphlar
5c53a3cad6 actually use cities.txt
Signed-off-by: zyphlar <zyphlar@noreply.codeberg.org>
2025-12-31 22:50:15 +01:00
zyphlar
3bea0b32a2 change arguments
Signed-off-by: zyphlar <zyphlar@noreply.codeberg.org>
2025-12-31 08:23:53 +01:00
zyphlar
925ce544bc use test branch
Signed-off-by: zyphlar <zyphlar@noreply.codeberg.org>
2025-12-31 06:57:52 +01:00
zyphlar
599b3b81ec typo
Signed-off-by: zyphlar <zyphlar@noreply.codeberg.org>
2025-12-30 15:27:04 -08:00
zyphlar
2d981cde05 clone main repo too
Signed-off-by: zyphlar <zyphlar@noreply.codeberg.org>
2025-12-30 15:27:04 -08:00
zyphlar
8670cb7b43 update pbf
Either move to o5m for subways or remove from here

Signed-off-by: zyphlar <zyphlar@noreply.codeberg.org>
2025-12-30 15:27:04 -08:00
zyphlar
a73ffe96c5 fix cicd
Signed-off-by: zyphlar <zyphlar@noreply.codeberg.org>
2025-12-30 15:27:04 -08:00
30 changed files with 186 additions and 152 deletions

View File

@@ -1,13 +1,17 @@
name: process_subways name: compare_subways
on: on:
workflow_dispatch: # Manual trigger workflow_dispatch: # Manual trigger
schedule:
# Run daily at 00:00 UTC
- cron: '0 0 * * *'
env: env:
PLANET: /home/planet/planet/planet.o5m #PLANET: /home/planet/planet/planet-latest.pbf
TMPDIR: /tmp #TMPDIR: /tmp
HTML_DIR: "/mnt/4tbexternal/osm-planet/subway/validator" HTML_DIR: "/mnt/4tbexternal/osm-planet/subway/validator"
DUMP: "$HTML_DIR" #DUMP: "$HTML_DIR"
SKIP_PLANET_UPDATE: "1" #SKIP_PLANET_UPDATE: "1"
SPREADSHEET_ID: "1SEW1-NiNOnA2qDwievcxYV1FOaQl1mb1fdeyqAxHu3k"
DEBIAN_FRONTEND: nonnteractive DEBIAN_FRONTEND: nonnteractive
TZ: Etc/UTC TZ: Etc/UTC
@@ -22,20 +26,68 @@ jobs:
volumes: volumes:
- /mnt/4tbexternal:/mnt/4tbexternal - /mnt/4tbexternal:/mnt/4tbexternal
concurrency: concurrency:
group: ${{ github.workflow }}-process-subways-${{ github.event.pull_request.number || github.ref }} group: ${{ github.workflow }}-compare-subways-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true cancel-in-progress: true
steps: steps:
- uses: actions/cache@v4 - uses: actions/cache@v4
with: with:
path: "~" path: "~"
key: cache-${{ github.run_id }}-${{ github.run_attempt }} key: cache-${{ github.run_id }}-${{ github.run_attempt }}}
- name: Checkout subways repo - name: Checkout main repo
shell: bash
run: |
echo "Cloning $FORGEJO_SERVER_URL/$FORGEJO_REPOSITORY branch $FORGEJO_REF_NAME"
cd ~
git clone --depth 1 --recurse-submodules --shallow-submodules -b $FORGEJO_REF_NAME --single-branch $FORGEJO_SERVER_URL/$FORGEJO_REPOSITORY.git comaps
- name: Checkout subways repo (TODO zy-fix-validation)
shell: bash shell: bash
run: | run: |
cd ~ cd ~
git clone --depth 1 --single-branch https://codeberg.org/comaps/subways.git git clone --depth 1 --single-branch https://codeberg.org/comaps/subways.git
update-planet-pbf:
name: Update PBF Planet
runs-on: mapfilemaker
container:
image: codeberg.org/comaps/maps_generator:f6d53d54f794
volumes:
- /mnt/4tbexternal/:/mnt/4tbexternal/
- /mnt/4tbexternal/osm-planet:/home/planet
concurrency:
group: ${{ github.workflow }}-compare-subways-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
steps:
- name: Download Planet File if Absent
shell: bash
# TODO: replace wget2 with curl -Z
run: |
if [ ! -d /home/planet/planet/ ]; then
mkdir -p /home/planet/planet/
fi
if [ ! -f /home/planet/planet/planet-latest.osm.pbf ]; then
cd /home/planet/planet/
wget2 --verbose --progress=bar --continue https://ftpmirror.your.org/pub/openstreetmap/pbf/planet-latest.osm.pbf
else
echo "planet-latest.osm.pbf was found, raw download not required."
fi
- name: Update PBF Planet
shell: bash
run: |
cd /home/planet/planet/
rm -f planet-latest-new.osm.pbf
pyosmium-up-to-date planet-latest.osm.pbf -o planet-latest-new.osm.pbf -v --size 16384
mv planet-latest-new.osm.pbf planet-latest.osm.pbf
- name: Notify Zulip
run: |
curl -X POST https://comaps.zulipchat.com/api/v1/messages \
-u $ZULIP_BOT_EMAIL:$ZULIP_API_KEY \
--data-urlencode type=stream \
--data-urlencode 'to="DevOps"' \
--data-urlencode topic=codeberg-bot \
--data-urlencode 'content=PBF planet update is done!'
update-planet-o5m: update-planet-o5m:
if: false
name: Update O5M Planet name: Update O5M Planet
runs-on: mapfilemaker runs-on: mapfilemaker
container: container:
@@ -44,7 +96,7 @@ jobs:
- /mnt/4tbexternal/:/mnt/4tbexternal/ - /mnt/4tbexternal/:/mnt/4tbexternal/
- /mnt/4tbexternal/osm-planet:/home/planet - /mnt/4tbexternal/osm-planet:/home/planet
concurrency: concurrency:
group: ${{ github.workflow }}-process-subways-${{ github.event.pull_request.number || github.ref }} group: ${{ github.workflow }}-compare-subways-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true cancel-in-progress: true
steps: steps:
- name: Check for O5M Planet File - name: Check for O5M Planet File
@@ -82,9 +134,8 @@ jobs:
--data-urlencode topic=codeberg-bot \ --data-urlencode topic=codeberg-bot \
--data-urlencode 'content=O5M planet update is done!' --data-urlencode 'content=O5M planet update is done!'
update-subways: compare-subways:
if: inputs.run-subways name: Compare Subways
name: Update Subways
runs-on: mapfilemaker runs-on: mapfilemaker
needs: needs:
- clone-repos - clone-repos
@@ -94,31 +145,19 @@ jobs:
- /mnt/4tbexternal/:/mnt/4tbexternal/ - /mnt/4tbexternal/:/mnt/4tbexternal/
- /mnt/4tbexternal/osm-planet:/home/planet - /mnt/4tbexternal/osm-planet:/home/planet
concurrency: concurrency:
group: ${{ github.workflow }}-map-generator-${{ github.event.pull_request.number || github.ref }} group: ${{ github.workflow }}-compare-subways-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true cancel-in-progress: true
steps: steps:
- uses: actions/cache@v4 - uses: actions/cache@v4
with: with:
path: "~" path: "~"
key: cache-${{ github.run_id }}-${{ github.run_attempt }} key: cache-${{ github.run_id }}-${{ github.run_attempt }}
- name: Update Subways - name: Compare Subways
shell: bash shell: bash
run: | run: |
cd ~/comaps/ cd ~/comaps/
cp tools/unix/maps/settings.sh.prod tools/unix/maps/settings.sh cp tools/unix/maps/settings.sh.prod tools/unix/maps/settings.sh
./tools/unix/maps/generate_subways.sh ./tools/unix/maps/generate_subways.sh
- name: Compare with VK validation
shell: bash
run: |
cd ~/subways
if [ -f "$HTML_DIR/index.html" ]; then
echo "Comparing local validation with VK's validation..."
python3 ./scripts/compare_html_validation.py "$HTML_DIR/index.html" \
--vk-url "https://maps.vk.com/osm/tools/subways/latest/index.html"
else
echo "Local index.html not found at $HTML_DIR/index.html"
exit 1
fi
- name: Notify Zulip - name: Notify Zulip
run: | run: |
curl -X POST https://comaps.zulipchat.com/api/v1/messages \ curl -X POST https://comaps.zulipchat.com/api/v1/messages \
@@ -127,3 +166,46 @@ jobs:
--data-urlencode 'to="DevOps"' \ --data-urlencode 'to="DevOps"' \
--data-urlencode topic=codeberg-bot \ --data-urlencode topic=codeberg-bot \
--data-urlencode 'content=Subways are done!' --data-urlencode 'content=Subways are done!'
- name: Compare with VK validation
shell: bash
run: |
cd ~/subways
if [ -f "$HTML_DIR/cities.txt" ]; then
echo "Comparing local validation with VK's validation..."
python3 ./scripts/compare_html_validation.py "$HTML_DIR/cities.txt" \
--remote-url "https://maps.vk.com/osm/tools/subways/latest/cities.txt"
else
echo "Local cities.txt not found at $HTML_DIR/cities.txt"
exit 1
fi
- name: Compare Google Sheets Data
shell: bash
run: |
set -e
# Download the Google Sheets data
GOOGLE_SHEETS_URL="https://docs.google.com/spreadsheets/d/${SPREADSHEET_ID}/export?format=csv"
echo "Downloading Google Sheets data from: $GOOGLE_SHEETS_URL"
curl -sL "$GOOGLE_SHEETS_URL" -o /tmp/google_sheets.csv
# Normalize line endings to avoid spurious diffs
sed 's/\r$//' source_data/Rapid.csv > /tmp/local_normalized.csv
sed 's/\r$//' /tmp/google_sheets.csv > /tmp/google_normalized.csv
# Generate unified diff
echo ""
echo "Differences between local Rapid.csv and Google Sheets:"
echo ""
if diff -u /tmp/local_normalized.csv /tmp/google_normalized.csv > /tmp/full_diff.txt; then
echo "No differences found! Local Rapid.csv is in sync with Google Sheets."
exit 0
else
cat /tmp/full_diff.txt
echo ""
echo "The above diff can be saved as a patch and applied with:"
echo " patch source_data/Rapid.csv < patch-file"
echo "or by manually reviewing and applying the changes."
exit 1
fi

View File

@@ -116,6 +116,20 @@ endif()
message(STATUS "Build type: " ${CMAKE_BUILD_TYPE}) message(STATUS "Build type: " ${CMAKE_BUILD_TYPE})
if (PLATFORM_LINUX OR PLATFORM_ANDROID)
find_program(LLD_FOUND ld.lld)
if (LLD_FOUND)
message(STATUS "Using ld.lld linker")
set(CMAKE_EXE_LINKER_FLAGS "-fuse-ld=lld")
else()
find_program(GOLD_FOUND ld.gold)
if (GOLD_FOUND)
message(STATUS "Using ld.gold")
set(CMAKE_EXE_LINKER_FLAGS "-fuse-ld=gold")
endif()
endif()
endif()
if (NOT SKIP_TESTS) if (NOT SKIP_TESTS)
enable_testing() enable_testing()
# Enables ctest -T memcheck with valgrind # Enables ctest -T memcheck with valgrind

2
NOTICE
View File

@@ -1,6 +1,6 @@
Copyright 2020 My.com B.V. (Mail.Ru Group) Copyright 2020 My.com B.V. (Mail.Ru Group)
Copyright 2025 Organic Maps Contributors Copyright 2025 Organic Maps Contributors
Copyright 2026 CoMaps Contributors Copyright 2025 CoMaps Contributors
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.

View File

@@ -351,7 +351,6 @@ dependencies {
implementation libs.androidx.recyclerview implementation libs.androidx.recyclerview
implementation libs.androidx.work.runtime implementation libs.androidx.work.runtime
implementation libs.androidx.lifecycle.process implementation libs.androidx.lifecycle.process
implementation libs.androidx.documentfile
implementation libs.android.material implementation libs.android.material
// Fix for app/organicmaps/util/FileUploadWorker.java:14: error: cannot access ListenableFuture // Fix for app/organicmaps/util/FileUploadWorker.java:14: error: cannot access ListenableFuture
// https://github.com/organicmaps/organicmaps/issues/6106 // https://github.com/organicmaps/organicmaps/issues/6106

View File

@@ -27,7 +27,7 @@
android:layout_marginTop="@dimen/margin_base"> android:layout_marginTop="@dimen/margin_base">
<RadioButton <RadioButton
style="@style/MwmTextAppearance.Subtitle1" style="@style/TextAppearance.Subtitle1"
android:id="@+id/sort_by_default" android:id="@+id/sort_by_default"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View File

@@ -13,6 +13,7 @@
android:paddingTop="@dimen/margin_half" android:paddingTop="@dimen/margin_half"
android:paddingBottom="@dimen/margin_half" android:paddingBottom="@dimen/margin_half"
android:layout_marginEnd="@dimen/margin_base" android:layout_marginEnd="@dimen/margin_base"
android:background="?cardBackground"
android:textAppearance="@style/MwmTextAppearance.Caption" android:textAppearance="@style/MwmTextAppearance.Caption"
tools:text="Downloaded" tools:text="Downloaded"
tools:background="#80FF0000"/> tools:background="#80FF0000"/>

View File

@@ -6,7 +6,7 @@
android:id="@+id/rl__bookmark_details" android:id="@+id/rl__bookmark_details"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="?appBackground" android:background="?cardBackground"
android:padding="@dimen/margin_half"> android:padding="@dimen/margin_half">
<LinearLayout <LinearLayout
android:id="@+id/ll__bookmark_name" android:id="@+id/ll__bookmark_name"

View File

@@ -3,7 +3,7 @@
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:orientation="vertical"
android:background="?appBackground" android:background="?cardBackground"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar
@@ -69,6 +69,7 @@
android:inputType="textMultiLine"/> android:inputType="textMultiLine"/>
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
<View <View
android:background="?cardBackground"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"/> android:layout_height="match_parent"/>
</LinearLayout> </LinearLayout>

View File

@@ -4,7 +4,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
style="@style/MwmWidget.Floating" style="@style/MwmWidget.Floating"
android:background="?appBackground" android:background="?cardBackground"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<include layout="@layout/toolbar_with_search"/> <include layout="@layout/toolbar_with_search"/>

View File

@@ -4,7 +4,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="?appBackground"> android:background="?cardBackground">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar" android:id="@+id/toolbar"
style="@style/MwmWidget.ToolbarStyle" style="@style/MwmWidget.ToolbarStyle"

View File

@@ -10,12 +10,13 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:id="@+id/frameLayout" android:id="@+id/frameLayout"
android:background="?appBackground"> android:background="?cardBackground">
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/phones_recycler" android:id="@+id/phones_recycler"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?cardBackground"
android:scrollbars="vertical" /> android:scrollbars="vertical" />
</FrameLayout> </FrameLayout>

View File

@@ -61,12 +61,12 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:clickable="true" android:clickable="true"
android:focusable="true" android:focusable="true"
android:background="?appBackground"> android:background="?cardBackground">
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler" android:id="@+id/recycler"
android:clipToPadding="false" android:clipToPadding="false"
android:background="?appBackground" android:background="?cardBackground"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
/> />

View File

@@ -9,7 +9,7 @@
style="@style/MwmWidget.FrameLayout.Elevation" style="@style/MwmWidget.FrameLayout.Elevation"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="?appBackground" android:background="?windowBackgroundForced"
android:layout_above="@+id/tv__mode_switch" android:layout_above="@+id/tv__mode_switch"
android:layout_below="@id/toolbar"/> android:layout_below="@id/toolbar"/>
@@ -19,7 +19,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignTop="@+id/tv__mode_switch" android:layout_alignTop="@+id/tv__mode_switch"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:background="?appBackground"/> android:background="?cardBackground"/>
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
android:id="@+id/tv__mode_switch" android:id="@+id/tv__mode_switch"

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<ScrollView <ScrollView
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@@ -17,8 +17,9 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
style="@style/MwmWidget.M3.Editor.CardView" style="@style/MwmWidget.M3.Editor.CardView"
app:cardBackgroundColor="?cardBackground" card_view:cardBackgroundColor="?cardBackground"
app:cardElevation="4dp"> card_view:cardCornerRadius="2dp"
card_view:cardElevation="4dp">
<com.google.android.material.textfield.TextInputEditText <com.google.android.material.textfield.TextInputEditText
android:id="@+id/et__timetable" android:id="@+id/et__timetable"
@@ -39,9 +40,9 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_half" android:layout_marginTop="@dimen/margin_half"
style="@style/MwmWidget.M3.Editor.CardView" card_view:cardBackgroundColor="?cardBackground"
app:cardBackgroundColor="?cardBackground" card_view:cardCornerRadius="2dp"
app:cardElevation="4dp"> card_view:cardElevation="4dp">
<LinearLayout <LinearLayout
android:id="@+id/examples" android:id="@+id/examples"

View File

@@ -3,7 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?appBackground" android:background="?cardBackground"
android:padding="@dimen/margin_base"> android:padding="@dimen/margin_base">
<LinearLayout <LinearLayout

View File

@@ -5,7 +5,7 @@
style="@style/MwmTextAppearance.Headline6" style="@style/MwmTextAppearance.Headline6"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?appBackground" android:background="?windowBackgroundForced"
android:gravity="start|center_vertical" android:gravity="start|center_vertical"
android:paddingStart="@dimen/margin_base" android:paddingStart="@dimen/margin_base"
android:paddingTop="@dimen/margin_base_plus" android:paddingTop="@dimen/margin_base_plus"

View File

@@ -6,7 +6,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_gravity="center" android:layout_gravity="center"
android:orientation="vertical" android:orientation="vertical"
android:background="?appBackground" android:background="?cardBackground"
android:padding="@dimen/margin_base"> android:padding="@dimen/margin_base">
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@@ -4,7 +4,7 @@
android:id="@+id/menu_frame" android:id="@+id/menu_frame"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?appBackground" android:background="?cardBackground"
android:clickable="true" android:clickable="true"
android:visibility="gone" android:visibility="gone"
tools:visibility="visible"> tools:visibility="visible">

View File

@@ -2,7 +2,7 @@
<LinearLayout <LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:orientation="horizontal"
android:background="?appBackground" android:background="?cardBackground"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">

View File

@@ -29,7 +29,7 @@
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?appBackground" android:background="?cardBackground"
android:padding="@dimen/margin_base" android:padding="@dimen/margin_base"
android:text="@string/editor_focus_map_on_location" android:text="@string/editor_focus_map_on_location"
app:layout_constraintTop_toBottomOf="@+id/toolbar_point_chooser" /> app:layout_constraintTop_toBottomOf="@+id/toolbar_point_chooser" />

View File

@@ -4,5 +4,5 @@
android:id="@+id/recycler" android:id="@+id/recycler"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?appBackground" android:background="?cardBackground"
android:scrollbars="vertical"/> android:scrollbars="vertical"/>

View File

@@ -6,7 +6,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:minHeight="@dimen/height_block_base" android:minHeight="@dimen/height_block_base"
android:background="?appBackground" android:background="?cardBackground"
android:baselineAligned="false"> android:baselineAligned="false">
<LinearLayout <LinearLayout
android:id="@+id/btn__search_point" android:id="@+id/btn__search_point"

View File

@@ -1,15 +1,15 @@
[versions] [versions]
androidGradlePlugin = "8.13.2" androidGradlePlugin = "8.11.2"
androidxCarApp = "1.7.0" androidxCarApp = "1.7.0"
[libraries] [libraries]
android-tools = { module = "com.android.tools.build:gradle", version.ref = "androidGradlePlugin" } android-tools = { module = "com.android.tools.build:gradle", version.ref = "androidGradlePlugin" }
triplet-play-publisher = { module = "com.github.triplet.gradle:play-publisher", version = "3.13.0" } triplet-play-publisher = { module = "com.github.triplet.gradle:play-publisher", version = "3.12.1" }
huawei-publish = { module = "ru.cian:huawei-publish-gradle-plugin", version = "1.4.2" } huawei-publish = { module = "ru.cian:huawei-publish-gradle-plugin", version = "1.4.2" }
android-tools-desugar = { module = "com.android.tools:desugar_jdk_libs", version = "2.1.5" } android-tools-desugar = { module = "com.android.tools:desugar_jdk_libs", version = "2.1.5" }
microg-services-location = { module = "org.microg.gms:play-services-location", version = "0.3.6.244735" } microg-services-location = { module = "org.microg.gms:play-services-location", version = "0.3.6.244735" }
androidx-core = { module = "androidx.core:core", version = "1.17.0" } androidx-core = { module = "androidx.core:core", version = "1.17.0" }
jetbrains-kotlin-bom = { module = "org.jetbrains.kotlin:kotlin-bom", version = "2.2.21" } jetbrains-kotlin-bom = { module = "org.jetbrains.kotlin:kotlin-bom", version = "2.2.20" }
androidx-annotation = { module = "androidx.annotation:annotation", version = "1.9.1" } androidx-annotation = { module = "androidx.annotation:annotation", version = "1.9.1" }
androidx-appcompat = { module = "androidx.appcompat:appcompat", version = "1.7.1" } androidx-appcompat = { module = "androidx.appcompat:appcompat", version = "1.7.1" }
androidx-car-app = { module = "androidx.car.app:app", version.ref = "androidxCarApp" } androidx-car-app = { module = "androidx.car.app:app", version.ref = "androidxCarApp" }
@@ -21,13 +21,12 @@ androidx-recyclerview = { module = "androidx.recyclerview:recyclerview", version
androidx-work-runtime = { module = "androidx.work:work-runtime", version = "2.10.5" } androidx-work-runtime = { module = "androidx.work:work-runtime", version = "2.10.5" }
androidx-lifecycle-process = { module = "androidx.lifecycle:lifecycle-process", version = "2.9.4" } androidx-lifecycle-process = { module = "androidx.lifecycle:lifecycle-process", version = "2.9.4" }
androidx-media = { module = "androidx.media:media", version = "1.7.1" } androidx-media = { module = "androidx.media:media", version = "1.7.1" }
androidx-documentfile= { module = "androidx.documentfile:documentfile", version ="1.1.0" }
android-material = { module = "com.google.android.material:material", version = "1.12.0" } android-material = { module = "com.google.android.material:material", version = "1.12.0" }
google-guava = { module = "com.google.guava:guava", version = "33.5.0-android" } google-guava = { module = "com.google.guava:guava", version = "33.4.8-android" }
appdevnext-androidchart = { module = "com.github.AppDevNext:AndroidChart", version = "3.1.0.31" } appdevnext-androidchart = { module = "com.github.AppDevNext:AndroidChart", version = "3.1.0.31" }
androidx-test-junit = { module = "androidx.test.ext:junit", version = "1.3.0" } androidx-test-junit = { module = "androidx.test.ext:junit", version = "1.3.0" }
junit = { module = "junit:junit", version = "4.13.2" } junit = { module = "junit:junit", version = "4.13.2" }
mockito-core = { module = "org.mockito:mockito-core", version = "5.21.0" } mockito-core = { module = "org.mockito:mockito-core", version = "5.20.0" }
[plugins] [plugins]
android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" } android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" }

View File

@@ -126,7 +126,6 @@ dependencies {
implementation libs.androidx.recyclerview implementation libs.androidx.recyclerview
implementation libs.androidx.preference implementation libs.androidx.preference
implementation libs.android.material implementation libs.android.material
implementation libs.androidx.documentfile
testImplementation libs.junit testImplementation libs.junit
} }

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="26" height="33" version="1.1" viewBox="0 0 26 33" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="linearGradient1" x1="13" x2="13" y1="1" y2="30" gradientUnits="userSpaceOnUse">
<stop stop-color="#e8514e" offset="0"/>
<stop stop-color="#cc3633" offset="1"/>
</linearGradient>
<filter id="filter1" x="-.0882" y="-.441" width="1.1764" height="1.882" color-interpolation-filters="sRGB">
<feGaussianBlur stdDeviation="0.55125"/>
</filter>
</defs>
<ellipse cx="13" cy="30.177" rx="7.5" ry="1.5" filter="url(#filter1)" opacity=".1" stroke-linecap="round" stroke-linejoin="round"/>
<path d="m13 1c-6.3513 0-11.5 5.1487-11.5 11.5 2.4e-4 4.6124 2.7473 8.7238 6.8871 10.534 0.76685 0.33537 1.7261 1.1233 2.097 1.8742l2.5159 5.0935 2.5159-5.0935c0.37091-0.75091 1.3301-1.5388 2.0969-1.8742 4.1398-1.8104 6.8869-5.9219 6.8871-10.534 0-6.3513-5.1487-11.5-11.5-11.5z" fill="url(#linearGradient1)" stroke="#fff" stroke-linejoin="round" stroke-width="2"/>
<path d="m11.91 13.481-0.31705-4.7458q-0.08917-1.3871-0.08917-1.9915 0-0.82234 0.42603-1.2781 0.43594-0.46566 1.1394-0.46566 0.85206 0 1.1394 0.59446 0.28732 0.58456 0.28732 1.6942 0 0.65391-0.06935 1.3276l-0.42603 4.8845q-0.06935 0.87188-0.29723 1.3375-0.22788 0.46566-0.75299 0.46566-0.53502 0-0.74308-0.44585-0.20806-0.45576-0.29724-1.3772zm1.0998 6.5193q-0.60437 0-1.0601-0.3864-0.44585-0.39631-0.44585-1.0998 0-0.61428 0.42603-1.0403 0.43594-0.43594 1.0601-0.43594t1.0601 0.43594q0.44585 0.42603 0.44585 1.0403 0 0.69354-0.44585 1.0898-0.44585 0.39631-1.0403 0.39631z" fill="#fff" aria-label="!" data-font-family="Arial Rounded MT Bold"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,25 +1,15 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" width="26" height="33" viewBox="0 0 26 33"> <?xml version="1.0" encoding="UTF-8"?>
<defs> <svg width="26" height="33" version="1.1" viewBox="0 0 26 33" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<linearGradient id="a" x1="13" x2="13" y1="1" y2="30" gradientUnits="userSpaceOnUse"> <defs>
<stop offset="0" stop-color="#e8514e"/> <linearGradient id="linearGradient1" x1="13" x2="13" y1="1" y2="30" gradientUnits="userSpaceOnUse">
<stop offset="1" stop-color="#cc3633"/> <stop stop-color="#e8514e" offset="0"/>
</linearGradient> <stop stop-color="#cc3633" offset="1"/>
<linearGradient xlink:href="#a" id="d" x1="13" x2="13" y1="1" y2="30" gradientTransform="translate(.122 .703)" gradientUnits="userSpaceOnUse"/> </linearGradient>
<filter id="b" width="1.176" height="1.882" x="-.088" y="-.441" color-interpolation-filters="sRGB"> <filter id="filter1" x="-.0882" y="-.441" width="1.1764" height="1.882" color-interpolation-filters="sRGB">
<feGaussianBlur stdDeviation=".551"/> <feGaussianBlur stdDeviation="0.55125"/>
</filter> </filter>
<filter id="c" width="1.176" height="1.882" x="-.088" y="-.441" color-interpolation-filters="sRGB"> </defs>
<feGaussianBlur stdDeviation=".551"/> <ellipse cx="13" cy="30.177" rx="7.5" ry="1.5" filter="url(#filter1)" opacity=".1" stroke-linecap="round" stroke-linejoin="round"/>
</filter> <path d="m13 1c-6.3513 0-11.5 5.1487-11.5 11.5 2.4e-4 4.6124 2.7473 8.7238 6.8871 10.534 0.76685 0.33537 1.7261 1.1233 2.097 1.8742l2.5159 5.0935 2.5159-5.0935c0.37091-0.75091 1.3301-1.5388 2.0969-1.8742 4.1398-1.8104 6.8869-5.9219 6.8871-10.534 0-6.3513-5.1487-11.5-11.5-11.5z" fill="url(#linearGradient1)" stroke="#fff" stroke-linejoin="round" stroke-width="2"/>
</defs> <path d="m11.91 13.481-0.31705-4.7458q-0.08917-1.3871-0.08917-1.9915 0-0.82234 0.42603-1.2781 0.43594-0.46566 1.1394-0.46566 0.85206 0 1.1394 0.59446 0.28732 0.58456 0.28732 1.6942 0 0.65391-0.06935 1.3276l-0.42603 4.8845q-0.06935 0.87188-0.29723 1.3375-0.22788 0.46566-0.75299 0.46566-0.53502 0-0.74308-0.44585-0.20806-0.45576-0.29724-1.3772zm1.0998 6.5193q-0.60437 0-1.0601-0.3864-0.44585-0.39631-0.44585-1.0998 0-0.61428 0.42603-1.0403 0.43594-0.43594 1.0601-0.43594t1.0601 0.43594q0.44585 0.42603 0.44585 1.0403 0 0.69354-0.44585 1.0898-0.44585 0.39631-1.0403 0.39631z" fill="#fff" aria-label="!" data-font-family="Arial Rounded MT Bold"/>
<ellipse cx="13.122" cy="30.88" filter="url(#b)" opacity=".1" rx="7.5" ry="1.5" style="filter:url(#c)"/>
<path fill="url(#a)" stroke="#000" stroke-linejoin="round" stroke-width="2" d="M13.122 1.703c-6.352 0-11.5 5.149-11.5 11.5a11.5 11.5 0 0 0 6.887 10.534c.766.335 1.726 1.123 2.097 1.874l2.516 5.094 2.515-5.094c.371-.75 1.33-1.539 2.097-1.874a11.5 11.5 0 0 0 6.887-10.534c0-6.351-5.148-11.5-11.5-11.5z" style="fill:url(#d)"/>
<path d="M17.228 10.192v3.071h1.198v-3.071ZM17.228 7.424v1.721h1.198V7.423ZM7.088 10.192v3.071h1.198v-3.071ZM7.088 7.424v1.721h1.198V7.423Z" style="fill:#000;stroke-width:1.19817;stroke-linecap:square;stroke-linejoin:round" transform="translate(.365 -.337)"/>
<path d="m34.133 11.683-2.257-.84.1-2.405 2.32-.648 1.332 2.006z" style="fill:#000;fill-opacity:1;stroke-width:6;stroke-linecap:square;stroke-linejoin:round" transform="rotate(38.951 8.225 -4.95)scale(.63342)"/>
<path d="M34.79 11.804 31.165 9.71l3.627-2.094Z" style="fill:#000;fill-opacity:1;stroke-width:6;stroke-linecap:square;stroke-linejoin:round" transform="rotate(38.951 16.064 -7.581)scale(.80453)"/>
<path d="M34.79 11.804 31.165 9.71l3.627-2.094Z" style="fill:#000;fill-opacity:1;stroke-width:6;stroke-linecap:square;stroke-linejoin:round" transform="rotate(-33.724 21.526 30.482)scale(.76175)"/>
<path d="M7.088 14.395v3.071h1.198v-3.071zM7.088 18.514v1.723h1.198v-1.723zM17.228 14.395v3.071h1.198v-3.071zM17.228 18.514v1.723h1.198v-1.723z" style="fill:#000;stroke-width:1.19817;stroke-linecap:square;stroke-linejoin:round" transform="translate(.365 -.337)"/>
<path d="m34.133 11.683-2.257-.84.1-2.405 2.32-.648 1.332 2.006z" style="fill:#000;fill-opacity:1;stroke-width:6;stroke-linecap:square;stroke-linejoin:round" transform="rotate(218.951 18.726 11.626)scale(.63342)"/>
<path d="M34.79 11.804 31.165 9.71l3.627-2.094Z" style="fill:#000;fill-opacity:1;stroke-width:6;stroke-linecap:square;stroke-linejoin:round" transform="rotate(218.951 22.916 15.042)scale(.80453)"/>
<path d="M34.79 11.804 31.165 9.71l3.627-2.094Z" style="fill:#000;fill-opacity:1;stroke-width:6;stroke-linecap:square;stroke-linejoin:round" transform="rotate(146.276 17.093 9.794)scale(.76175)"/>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="26" height="33" version="1.1" viewBox="0 0 26 33" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="linearGradient1" x1="13" x2="13" y1="1" y2="30" gradientUnits="userSpaceOnUse">
<stop stop-color="#e8514e" offset="0"/>
<stop stop-color="#cc3633" offset="1"/>
</linearGradient>
<filter id="filter1" x="-.0882" y="-.441" width="1.1764" height="1.882" color-interpolation-filters="sRGB">
<feGaussianBlur stdDeviation="0.55125"/>
</filter>
</defs>
<ellipse cx="13" cy="30.177" rx="7.5" ry="1.5" filter="url(#filter1)" opacity=".1" stroke-linecap="round" stroke-linejoin="round"/>
<path d="m13 1c-6.3513 0-11.5 5.1487-11.5 11.5 2.4e-4 4.6124 2.7473 8.7238 6.8871 10.534 0.76685 0.33537 1.7261 1.1233 2.097 1.8742l2.5159 5.0935 2.5159-5.0935c0.37091-0.75091 1.3301-1.5388 2.0969-1.8742 4.1398-1.8104 6.8869-5.9219 6.8871-10.534 0-6.3513-5.1487-11.5-11.5-11.5z" fill="url(#linearGradient1)" stroke="#fff" stroke-linejoin="round" stroke-width="2"/>
<path d="m11.91 13.481-0.31705-4.7458q-0.08917-1.3871-0.08917-1.9915 0-0.82234 0.42603-1.2781 0.43594-0.46566 1.1394-0.46566 0.85206 0 1.1394 0.59446 0.28732 0.58456 0.28732 1.6942 0 0.65391-0.06935 1.3276l-0.42603 4.8845q-0.06935 0.87188-0.29723 1.3375-0.22788 0.46566-0.75299 0.46566-0.53502 0-0.74308-0.44585-0.20806-0.45576-0.29724-1.3772zm1.0998 6.5193q-0.60437 0-1.0601-0.3864-0.44585-0.39631-0.44585-1.0998 0-0.61428 0.42603-1.0403 0.43594-0.43594 1.0601-0.43594t1.0601 0.43594q0.44585 0.42603 0.44585 1.0403 0 0.69354-0.44585 1.0898-0.44585 0.39631-1.0403 0.39631z" fill="#fff" aria-label="!" data-font-family="Arial Rounded MT Bold"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,25 +1,15 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" width="26" height="33" viewBox="0 0 26 33"> <?xml version="1.0" encoding="UTF-8"?>
<defs> <svg width="26" height="33" version="1.1" viewBox="0 0 26 33" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<linearGradient id="a" x1="13" x2="13" y1="1" y2="30" gradientUnits="userSpaceOnUse"> <defs>
<stop offset="0" stop-color="#e8514e"/> <linearGradient id="linearGradient1" x1="13" x2="13" y1="1" y2="30" gradientUnits="userSpaceOnUse">
<stop offset="1" stop-color="#cc3633"/> <stop stop-color="#e8514e" offset="0"/>
</linearGradient> <stop stop-color="#cc3633" offset="1"/>
<linearGradient xlink:href="#a" id="d" x1="13" x2="13" y1="1" y2="30" gradientTransform="translate(.122 .703)" gradientUnits="userSpaceOnUse"/> </linearGradient>
<filter id="b" width="1.176" height="1.882" x="-.088" y="-.441" color-interpolation-filters="sRGB"> <filter id="filter1" x="-.0882" y="-.441" width="1.1764" height="1.882" color-interpolation-filters="sRGB">
<feGaussianBlur stdDeviation=".551"/> <feGaussianBlur stdDeviation="0.55125"/>
</filter> </filter>
<filter id="c" width="1.176" height="1.882" x="-.088" y="-.441" color-interpolation-filters="sRGB"> </defs>
<feGaussianBlur stdDeviation=".551"/> <ellipse cx="13" cy="30.177" rx="7.5" ry="1.5" filter="url(#filter1)" opacity=".1" stroke-linecap="round" stroke-linejoin="round"/>
</filter> <path d="m13 1c-6.3513 0-11.5 5.1487-11.5 11.5 2.4e-4 4.6124 2.7473 8.7238 6.8871 10.534 0.76685 0.33537 1.7261 1.1233 2.097 1.8742l2.5159 5.0935 2.5159-5.0935c0.37091-0.75091 1.3301-1.5388 2.0969-1.8742 4.1398-1.8104 6.8869-5.9219 6.8871-10.534 0-6.3513-5.1487-11.5-11.5-11.5z" fill="url(#linearGradient1)" stroke="#fff" stroke-linejoin="round" stroke-width="2"/>
</defs> <path d="m11.91 13.481-0.31705-4.7458q-0.08917-1.3871-0.08917-1.9915 0-0.82234 0.42603-1.2781 0.43594-0.46566 1.1394-0.46566 0.85206 0 1.1394 0.59446 0.28732 0.58456 0.28732 1.6942 0 0.65391-0.06935 1.3276l-0.42603 4.8845q-0.06935 0.87188-0.29723 1.3375-0.22788 0.46566-0.75299 0.46566-0.53502 0-0.74308-0.44585-0.20806-0.45576-0.29724-1.3772zm1.0998 6.5193q-0.60437 0-1.0601-0.3864-0.44585-0.39631-0.44585-1.0998 0-0.61428 0.42603-1.0403 0.43594-0.43594 1.0601-0.43594t1.0601 0.43594q0.44585 0.42603 0.44585 1.0403 0 0.69354-0.44585 1.0898-0.44585 0.39631-1.0403 0.39631z" fill="#fff" aria-label="!" data-font-family="Arial Rounded MT Bold"/>
<ellipse cx="13.122" cy="30.88" filter="url(#b)" opacity=".1" rx="7.5" ry="1.5" style="filter:url(#c)"/>
<path fill="url(#a)" stroke="#fff" stroke-linejoin="round" stroke-width="2" d="M13.122 1.703c-6.352 0-11.5 5.149-11.5 11.5a11.5 11.5 0 0 0 6.887 10.534c.766.335 1.726 1.123 2.097 1.874l2.516 5.094 2.515-5.094c.371-.75 1.33-1.539 2.097-1.874a11.5 11.5 0 0 0 6.887-10.534c0-6.351-5.148-11.5-11.5-11.5z" style="fill:url(#d)"/>
<path d="M17.228 10.192v3.071h1.198v-3.071ZM17.228 7.424v1.721h1.198V7.423ZM7.088 10.192v3.071h1.198v-3.071ZM7.088 7.424v1.721h1.198V7.423Z" style="fill:#fff;stroke-width:1.19817;stroke-linecap:square;stroke-linejoin:round" transform="translate(.365 -.337)"/>
<path d="m34.133 11.683-2.257-.84.1-2.405 2.32-.648 1.332 2.006z" style="fill:#fff;fill-opacity:1;stroke-width:6;stroke-linecap:square;stroke-linejoin:round" transform="rotate(38.951 8.225 -4.95)scale(.63342)"/>
<path d="M34.79 11.804 31.165 9.71l3.627-2.094Z" style="fill:#fff;fill-opacity:1;stroke-width:6;stroke-linecap:square;stroke-linejoin:round" transform="rotate(38.951 16.064 -7.581)scale(.80453)"/>
<path d="M34.79 11.804 31.165 9.71l3.627-2.094Z" style="fill:#fff;fill-opacity:1;stroke-width:6;stroke-linecap:square;stroke-linejoin:round" transform="rotate(-33.724 21.526 30.482)scale(.76175)"/>
<path d="M7.088 14.395v3.071h1.198v-3.071zM7.088 18.514v1.723h1.198v-1.723zM17.228 14.395v3.071h1.198v-3.071zM17.228 18.514v1.723h1.198v-1.723z" style="fill:#fff;stroke-width:1.19817;stroke-linecap:square;stroke-linejoin:round" transform="translate(.365 -.337)"/>
<path d="m34.133 11.683-2.257-.84.1-2.405 2.32-.648 1.332 2.006z" style="fill:#fff;fill-opacity:1;stroke-width:6;stroke-linecap:square;stroke-linejoin:round" transform="rotate(218.951 18.726 11.626)scale(.63342)"/>
<path d="M34.79 11.804 31.165 9.71l3.627-2.094Z" style="fill:#fff;fill-opacity:1;stroke-width:6;stroke-linecap:square;stroke-linejoin:round" transform="rotate(218.951 22.916 15.042)scale(.80453)"/>
<path d="M34.79 11.804 31.165 9.71l3.627-2.094Z" style="fill:#fff;fill-opacity:1;stroke-width:6;stroke-linecap:square;stroke-linejoin:round" transform="rotate(146.276 17.093 9.794)scale(.76175)"/>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1 +1 @@
© 2026 CoMaps Contributors © 2025 CoMaps Contributors

View File

@@ -22,26 +22,13 @@ vim /etc/nginx/nginx.conf
access_log /var/log/nginx/access.log comaps; access_log /var/log/nginx/access.log comaps;
``` ```
if using Apache, try this:
```
LogFormat "0.0.0.0 %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" comaps
CustomLog ${APACHE_LOG_DIR}/access.log comaps
```
### set up monitoring: ### set up monitoring:
apt install goaccess apt install goaccess
edit /etc/goaccess/goaccess.conf and uncomment: edit /etc/goaccess/goaccess.conf and uncomment time-format %H:%M:%S, date-format %Y-%m-%d, log-format COMBINED
- time-format %H:%M:%S
- date-format %d/%b/%Y
- log-format COMBINED
vim /etc/crontab vim /etc/crontab
`*/5 * * * * root /usr/bin/goaccess /var/log/nginx/access.log -o /var/www/html/monitor.html` `*/5 * * * * root /usr/bin/goaccess /var/log/nginx/access.log -o /var/www/html/monitor.html`
or Apache: `*/5 * * * * root /usr/bin/goaccess /var/log/apache2/access.log -o /var/www/html/monitor.html`
### set up basic http pages/responses: ### set up basic http pages/responses:
cd /var/www/html/ cd /var/www/html/
mkdir maps mkdir maps