├── .github
└── workflows
│ └── pr-test.yml
├── .gitignore
├── .readthedocs.yml
├── LICENSE
├── Makefile
├── README.md
├── STYLE.md
├── circleguard
├── __init__.py
├── circleguard.py
├── frametime_graph.py
├── game_version.py
├── hitobjects.py
├── investigations.py
├── judgment.py
├── loadables.py
├── loader.py
├── map_info.py
├── mod.py
├── postgres.py
├── span.py
├── utils.py
└── version.py
├── docs
├── advanced-usage.rst
├── appendix.rst
├── caching.rst
├── conf.py
├── contributing.rst
├── foreword.rst
├── index.rst
├── loading.rst
├── replay-containers.rst
├── representing-replays.rst
└── using-circleguard.rst
├── readme_resources
└── logo.png
├── setup.py
└── tests
├── __init__.py
├── benchmark_hits.py
├── benchmarks.py
├── resources
├── auto
│ ├── auto-1.osr
│ ├── auto-2.osr
│ ├── auto-3.osr
│ ├── auto-4.osr
│ ├── auto-5.osr
│ ├── cursordance-1.osr
│ ├── cursordance-2.osr
│ ├── cursordance-3.osr
│ ├── cursordance-4.osr
│ ├── cursordance-5.osr
│ ├── cursordance-6.osr
│ ├── cursordance-7.osr
│ ├── pilot-1.osr
│ ├── pilot-2.osr
│ └── pilot-3.osr
├── corrected_replay1.osr
├── example_replay.osr
├── legit
│ ├── 2_histogram_peaks
│ │ ├── replay-osu_1115068_3537832838.osr
│ │ ├── replay-osu_1649060_2653254255.osr
│ │ ├── replay-osu_1649528_2728075053.osr
│ │ ├── replay-osu_1681124_2636614839.osr
│ │ ├── replay-osu_2058788_3072716370.osr
│ │ ├── replay-osu_255700_1740153425.osr
│ │ ├── replay-osu_276366_1720366862.osr
│ │ ├── replay-osu_332962_1722917912.osr
│ │ ├── replay-osu_338544_1718949811.osr
│ │ ├── replay-osu_838487_3513254185.osr
│ │ └── replay-osu_988793_2526343524.osr
│ ├── 3_histogram_peaks
│ │ ├── Malai_-_Big_Time_Rush_-_Worldwide_Paris_London_Tokyo_2021-05-29_Osu-1.osr
│ │ ├── Malai_-_Big_Time_Rush_-_Worldwide_Paris_London_Tokyo_2021-05-29_Osu.osr
│ │ ├── Malai_-_Travis_Scott_-_SICKO_MODE_feat._Drake_Insane_2021-05-29_Osu.osr
│ │ └── replay-osu_2520609_3690741716.osr
│ ├── legit-1.osr
│ ├── legit-10.osr
│ ├── legit-11.osr
│ ├── legit-12.osr
│ ├── legit-2.osr
│ ├── legit-3.osr
│ ├── legit-4.osr
│ ├── legit-5.osr
│ ├── legit-6.osr
│ ├── legit-7.osr
│ ├── legit-8.osr
│ ├── legit-9.osr
│ ├── legit_100fps_30s_map_no_keypresses_nm.osr
│ ├── legit_100fps_30s_map_with_keypresses_nm.osr
│ ├── legit_100fps_98s_map_no_keypresses_nm-1.osr
│ ├── legit_100fps_98s_map_no_keypresses_nm-2.osr
│ ├── legit_120fps_dt-1.osr
│ ├── legit_120fps_dt-2.osr
│ ├── legit_120fps_nm.osr
│ ├── legit_144fps-nm.osr
│ ├── legit_144fps_dt.osr
│ ├── legit_144fps_nmrx.osr
│ ├── legit_1peak_nm.osr
│ ├── legit_1peak_short_frames_from_break_nm.osr
│ ├── legit_288fps_dt.osr
│ ├── legit_2peaks_dtrx.osr
│ ├── legit_2peaks_nm-1.osr
│ ├── legit_2peaks_nm-2.osr
│ ├── legit_2peaks_short_frames_from_break_nm.osr
│ ├── legit_3peaks_dt-1.osr
│ ├── legit_3peaks_dt-2.osr
│ ├── legit_3peaks_dtrx.osr
│ ├── legit_3peaks_nm-1.osr
│ ├── legit_frametime-1.osr
│ ├── legit_frametime-10.osr
│ ├── legit_frametime-11.osr
│ ├── legit_frametime-12.osr
│ ├── legit_frametime-13.osr
│ ├── legit_frametime-14.osr
│ ├── legit_frametime-15.osr
│ ├── legit_frametime-2.osr
│ ├── legit_frametime-3.osr
│ ├── legit_frametime-4.osr
│ ├── legit_frametime-5.osr
│ ├── legit_frametime-6.osr
│ ├── legit_frametime-7.osr
│ ├── legit_frametime-8.osr
│ ├── legit_frametime-9.osr
│ ├── legit_lots_of_lag_frames_dt.osr
│ ├── legit_lots_of_lag_frames_nm-1.osr
│ ├── legit_lots_of_lag_frames_nm-2.osr
│ ├── legit_lots_of_short_frames_really_messy_nm.osr
│ ├── legit_old_replay_dt.osr
│ ├── legit_old_replay_ht.osr
│ ├── legit_snaps-1.osr
│ ├── legit_snaps-10.osr
│ ├── legit_snaps-11.osr
│ ├── legit_snaps-12.osr
│ ├── legit_snaps-13.osr
│ ├── legit_snaps-14.osr
│ ├── legit_snaps-15.osr
│ ├── legit_snaps-16.osr
│ ├── legit_snaps-17.osr
│ ├── legit_snaps-18.osr
│ ├── legit_snaps-19.osr
│ ├── legit_snaps-2.osr
│ ├── legit_snaps-20.osr
│ ├── legit_snaps-21.osr
│ ├── legit_snaps-22.osr
│ ├── legit_snaps-23.osr
│ ├── legit_snaps-24.osr
│ ├── legit_snaps-3.osr
│ ├── legit_snaps-4.osr
│ ├── legit_snaps-5.osr
│ ├── legit_snaps-6.osr
│ ├── legit_snaps-7.osr
│ ├── legit_snaps-8.osr
│ ├── legit_snaps-9.osr
│ ├── legit_triangle_shape_really_messy_dt-1.osr
│ ├── legit_triangle_shape_really_messy_dt-2.osr
│ ├── legit_unlimited_fps_dt-1.osr
│ ├── legit_unlimited_fps_dt-2.osr
│ ├── legit_unlimited_fps_nm-1.osr
│ ├── legit_unlimited_fps_nm-2.osr
│ ├── legit_unlimited_fps_nm-3.osr
│ ├── legit_wide_peak_dt.osr
│ ├── legit_wide_peak_long_map_nm.osr
│ ├── low_frametime_old
│ │ ├── replay-osu_16266_138416739.osr
│ │ ├── replay-osu_22993_236660902.osr
│ │ ├── replay-osu_24722_433541214.osr
│ │ ├── replay-osu_26502_203747354.osr
│ │ ├── replay-osu_26799_401403603.osr
│ │ └── replay-osu_86044_552532194.osr
│ ├── low_histogram_peak
│ │ ├── replay-osu_2261702_3613908998.osr
│ │ └── replay-osu_2397803_3626238208.osr
│ ├── low_similarity
│ │ ├── replay-osu_1352234_2953940624.osr
│ │ ├── replay-osu_1352234_3354603437.osr
│ │ ├── replay-osu_16266_756655679.osr
│ │ ├── replay-osu_16266_815970815.osr
│ │ ├── replay-osu_1817356_3004221396.osr
│ │ ├── replay-osu_1817356_3396967055.osr
│ │ ├── replay-osu_1871291_3218608210.osr
│ │ ├── replay-osu_1871291_3222258037.osr
│ │ ├── replay-osu_1909836_3099438014.osr
│ │ ├── replay-osu_1909836_3586026443.osr
│ │ ├── replay-osu_2505634_3170492636.osr
│ │ ├── replay-osu_2505634_3301915571.osr
│ │ ├── replay-osu_2510846_3519733477.osr
│ │ ├── replay-osu_2510846_3576606916.osr
│ │ ├── replay-osu_2511210_3293960241.osr
│ │ ├── replay-osu_2511210_3597195342.osr
│ │ ├── replay-osu_2513983_3438227958.osr
│ │ ├── replay-osu_2513983_3531785446.osr
│ │ ├── replay-osu_2528044_3431786037.osr
│ │ ├── replay-osu_2528044_3583239446.osr
│ │ ├── replay-osu_2544530_3381338195.osr
│ │ ├── replay-osu_2544530_3517917994.osr
│ │ ├── replay-osu_2635266_3298780630.osr
│ │ ├── replay-osu_2635266_3302908426.osr
│ │ ├── replay-osu_2665747_3550690802.osr
│ │ ├── replay-osu_2665747_3562357907.osr
│ │ ├── replay-osu_2769504_3439027349.osr
│ │ ├── replay-osu_2769504_3509136743.osr
│ │ ├── replay-osu_341_1503979225.osr
│ │ └── replay-osu_341_944992613.osr
│ └── replay-osu_1049018_3681047610.osr
├── other
│ └── empty_replay_data.osr
├── relax_cheated
│ ├── blatant
│ │ ├── relax_cheated-4.osr
│ │ ├── replay-osu_1373950_2900807505.osr
│ │ └── replay-osu_1617643_2750716353.osr
│ ├── relax_cheated-1.osr
│ └── relax_cheated-2.osr
├── stealing
│ ├── stolen-1-1.osr
│ ├── stolen-1-2.osr
│ ├── stolen-10-1.osr
│ ├── stolen-10-2.osr
│ ├── stolen-100-1.osr
│ ├── stolen-100-2.osr
│ ├── stolen-101-1.osr
│ ├── stolen-101-2.osr
│ ├── stolen-102-1.osr
│ ├── stolen-102-2.osr
│ ├── stolen-103-1.osr
│ ├── stolen-103-2.osr
│ ├── stolen-104-1.osr
│ ├── stolen-104-2.osr
│ ├── stolen-105-1.osr
│ ├── stolen-105-2.osr
│ ├── stolen-106-1.osr
│ ├── stolen-106-2.osr
│ ├── stolen-107-1.osr
│ ├── stolen-107-2.osr
│ ├── stolen-108-1.osr
│ ├── stolen-108-2.osr
│ ├── stolen-109-1.osr
│ ├── stolen-109-2.osr
│ ├── stolen-11-1.osr
│ ├── stolen-11-2.osr
│ ├── stolen-110-1.osr
│ ├── stolen-110-2.osr
│ ├── stolen-111-1.osr
│ ├── stolen-111-2.osr
│ ├── stolen-112-1.osr
│ ├── stolen-112-2.osr
│ ├── stolen-113-1.osr
│ ├── stolen-113-2.osr
│ ├── stolen-114-1.osr
│ ├── stolen-114-2.osr
│ ├── stolen-115-1.osr
│ ├── stolen-115-2.osr
│ ├── stolen-116-1.osr
│ ├── stolen-116-2.osr
│ ├── stolen-117-1.osr
│ ├── stolen-117-2.osr
│ ├── stolen-118-1.osr
│ ├── stolen-118-2.osr
│ ├── stolen-119-1.osr
│ ├── stolen-119-2.osr
│ ├── stolen-12-1.osr
│ ├── stolen-12-2.osr
│ ├── stolen-120-1.osr
│ ├── stolen-120-2.osr
│ ├── stolen-121-1.osr
│ ├── stolen-121-2.osr
│ ├── stolen-122-1.osr
│ ├── stolen-122-2.osr
│ ├── stolen-123-1.osr
│ ├── stolen-123-2.osr
│ ├── stolen-124-1.osr
│ ├── stolen-124-2.osr
│ ├── stolen-125-1.osr
│ ├── stolen-125-2.osr
│ ├── stolen-126-1.osr
│ ├── stolen-126-2.osr
│ ├── stolen-127-1.osr
│ ├── stolen-127-2.osr
│ ├── stolen-128-1.osr
│ ├── stolen-128-2.osr
│ ├── stolen-129-1.osr
│ ├── stolen-129-2.osr
│ ├── stolen-13-1.osr
│ ├── stolen-13-2.osr
│ ├── stolen-130-1.osr
│ ├── stolen-130-2.osr
│ ├── stolen-131-1.osr
│ ├── stolen-131-2.osr
│ ├── stolen-132-1.osr
│ ├── stolen-132-2.osr
│ ├── stolen-133-1.osr
│ ├── stolen-133-2.osr
│ ├── stolen-134-1.osr
│ ├── stolen-134-2.osr
│ ├── stolen-135-1.osr
│ ├── stolen-135-2.osr
│ ├── stolen-136-1.osr
│ ├── stolen-136-2.osr
│ ├── stolen-137-1.osr
│ ├── stolen-137-2.osr
│ ├── stolen-138-1.osr
│ ├── stolen-138-2.osr
│ ├── stolen-139-1.osr
│ ├── stolen-139-2.osr
│ ├── stolen-14-1.osr
│ ├── stolen-14-2.osr
│ ├── stolen-140-1.osr
│ ├── stolen-140-2.osr
│ ├── stolen-141-1.osr
│ ├── stolen-141-2.osr
│ ├── stolen-142-1.osr
│ ├── stolen-142-2.osr
│ ├── stolen-143-1.osr
│ ├── stolen-143-2.osr
│ ├── stolen-144-1.osr
│ ├── stolen-144-2.osr
│ ├── stolen-145-1.osr
│ ├── stolen-145-2.osr
│ ├── stolen-146-1.osr
│ ├── stolen-146-2.osr
│ ├── stolen-15-1.osr
│ ├── stolen-15-2.osr
│ ├── stolen-16-1.osr
│ ├── stolen-16-2.osr
│ ├── stolen-17-1.osr
│ ├── stolen-17-2.osr
│ ├── stolen-18-1.osr
│ ├── stolen-18-2.osr
│ ├── stolen-19-1.osr
│ ├── stolen-19-2.osr
│ ├── stolen-2-1.osr
│ ├── stolen-2-2.osr
│ ├── stolen-20-1.osr
│ ├── stolen-20-2.osr
│ ├── stolen-21-1.osr
│ ├── stolen-21-2.osr
│ ├── stolen-22-1.osr
│ ├── stolen-22-2.osr
│ ├── stolen-23-1.osr
│ ├── stolen-23-2.osr
│ ├── stolen-24-1.osr
│ ├── stolen-24-2.osr
│ ├── stolen-25-1.osr
│ ├── stolen-25-2.osr
│ ├── stolen-26-1.osr
│ ├── stolen-26-2.osr
│ ├── stolen-27-1.osr
│ ├── stolen-27-2.osr
│ ├── stolen-28-1.osr
│ ├── stolen-28-2.osr
│ ├── stolen-29-1.osr
│ ├── stolen-29-2.osr
│ ├── stolen-3-1.osr
│ ├── stolen-3-2.osr
│ ├── stolen-30-1.osr
│ ├── stolen-30-2.osr
│ ├── stolen-31-1.osr
│ ├── stolen-31-2.osr
│ ├── stolen-32-1.osr
│ ├── stolen-32-2.osr
│ ├── stolen-33-1.osr
│ ├── stolen-33-2.osr
│ ├── stolen-34-1.osr
│ ├── stolen-34-2.osr
│ ├── stolen-35-1.osr
│ ├── stolen-35-2.osr
│ ├── stolen-36-1.osr
│ ├── stolen-36-2.osr
│ ├── stolen-37-1.osr
│ ├── stolen-37-2.osr
│ ├── stolen-38-1.osr
│ ├── stolen-38-2.osr
│ ├── stolen-39-1.osr
│ ├── stolen-39-2.osr
│ ├── stolen-4-1.osr
│ ├── stolen-4-2.osr
│ ├── stolen-40-1.osr
│ ├── stolen-40-2.osr
│ ├── stolen-41-1.osr
│ ├── stolen-41-2.osr
│ ├── stolen-42-1.osr
│ ├── stolen-42-2.osr
│ ├── stolen-43-1.osr
│ ├── stolen-43-2.osr
│ ├── stolen-44-1.osr
│ ├── stolen-44-2.osr
│ ├── stolen-45-1.osr
│ ├── stolen-45-2.osr
│ ├── stolen-46-1.osr
│ ├── stolen-46-2.osr
│ ├── stolen-47-1.osr
│ ├── stolen-47-2.osr
│ ├── stolen-48-1.osr
│ ├── stolen-48-2.osr
│ ├── stolen-49-1.osr
│ ├── stolen-49-2.osr
│ ├── stolen-5-1.osr
│ ├── stolen-5-2.osr
│ ├── stolen-50-1.osr
│ ├── stolen-50-2.osr
│ ├── stolen-51-1.osr
│ ├── stolen-51-2.osr
│ ├── stolen-52-1.osr
│ ├── stolen-52-2.osr
│ ├── stolen-53-1.osr
│ ├── stolen-53-2.osr
│ ├── stolen-54-1.osr
│ ├── stolen-54-2.osr
│ ├── stolen-55-1.osr
│ ├── stolen-55-2.osr
│ ├── stolen-56-1.osr
│ ├── stolen-56-2.osr
│ ├── stolen-57-1.osr
│ ├── stolen-57-2.osr
│ ├── stolen-58-1.osr
│ ├── stolen-58-2.osr
│ ├── stolen-59-1.osr
│ ├── stolen-59-2.osr
│ ├── stolen-6-1.osr
│ ├── stolen-6-2.osr
│ ├── stolen-60-1.osr
│ ├── stolen-60-2.osr
│ ├── stolen-61-1.osr
│ ├── stolen-61-2.osr
│ ├── stolen-62-1.osr
│ ├── stolen-62-2.osr
│ ├── stolen-63-1.osr
│ ├── stolen-63-2.osr
│ ├── stolen-64-1.osr
│ ├── stolen-64-2.osr
│ ├── stolen-65-1.osr
│ ├── stolen-65-2.osr
│ ├── stolen-66-1.osr
│ ├── stolen-66-2.osr
│ ├── stolen-67-1.osr
│ ├── stolen-67-2.osr
│ ├── stolen-68-1.osr
│ ├── stolen-68-2.osr
│ ├── stolen-69-1.osr
│ ├── stolen-69-2.osr
│ ├── stolen-7-1.osr
│ ├── stolen-7-2.osr
│ ├── stolen-70-1.osr
│ ├── stolen-70-2.osr
│ ├── stolen-71-1.osr
│ ├── stolen-71-2.osr
│ ├── stolen-72-1.osr
│ ├── stolen-72-2.osr
│ ├── stolen-73-1.osr
│ ├── stolen-73-2.osr
│ ├── stolen-74-1.osr
│ ├── stolen-74-2.osr
│ ├── stolen-75-1.osr
│ ├── stolen-75-2.osr
│ ├── stolen-76-1.osr
│ ├── stolen-76-2.osr
│ ├── stolen-77-1.osr
│ ├── stolen-77-2.osr
│ ├── stolen-78-1.osr
│ ├── stolen-78-2.osr
│ ├── stolen-79-1.osr
│ ├── stolen-79-2.osr
│ ├── stolen-8-1.osr
│ ├── stolen-8-2.osr
│ ├── stolen-80-1.osr
│ ├── stolen-80-2.osr
│ ├── stolen-81-1.osr
│ ├── stolen-81-2.osr
│ ├── stolen-82-1.osr
│ ├── stolen-82-2.osr
│ ├── stolen-83-1.osr
│ ├── stolen-83-2.osr
│ ├── stolen-84-1.osr
│ ├── stolen-84-2.osr
│ ├── stolen-85-1.osr
│ ├── stolen-85-2.osr
│ ├── stolen-86-1.osr
│ ├── stolen-86-2.osr
│ ├── stolen-87-1.osr
│ ├── stolen-87-2.osr
│ ├── stolen-88-1.osr
│ ├── stolen-88-2.osr
│ ├── stolen-89-1.osr
│ ├── stolen-89-2.osr
│ ├── stolen-9-1.osr
│ ├── stolen-9-2.osr
│ ├── stolen-90-1.osr
│ ├── stolen-90-2.osr
│ ├── stolen-91-1.osr
│ ├── stolen-91-2.osr
│ ├── stolen-92-1.osr
│ ├── stolen-92-2.osr
│ ├── stolen-93-1.osr
│ ├── stolen-93-2.osr
│ ├── stolen-94-1.osr
│ ├── stolen-94-2.osr
│ ├── stolen-95-1.osr
│ ├── stolen-95-2.osr
│ ├── stolen-96-1.osr
│ ├── stolen-96-2.osr
│ ├── stolen-97-1.osr
│ ├── stolen-97-2.osr
│ ├── stolen-98-1.osr
│ ├── stolen-98-2.osr
│ ├── stolen-99-1.osr
│ ├── stolen-99-2.osr
│ ├── stolen-high-sim-1-1.osr
│ ├── stolen-high-sim-1-2.osr
│ ├── stolen-time-shifted-1-1.osr
│ ├── stolen-time-shifted-1-2.osr
│ ├── stolen-time-shifted-2-1.osr
│ ├── stolen-time-shifted-2-2.osr
│ ├── stolen-time-shifted-3-1.osr
│ ├── stolen-time-shifted-3-2.osr
│ ├── stolen-time-shifted-4-1.osr
│ ├── stolen-time-shifted-4-2.osr
│ ├── stolen-time-shifted-5-1.osr
│ ├── stolen-time-shifted-5-2.osr
│ ├── stolen_remod-1-1.osr
│ └── stolen_remod-1-2.osr
├── stolen_replay1.osr
├── stolen_replay2.osr
└── timewarped
│ ├── replay-osu_1617643_3616134026.osr
│ ├── replay-osu_1619564_3542160594.osr
│ ├── replay-osu_1627149_3504526013.osr
│ ├── replay-osu_1627149_3568354130.osr
│ ├── replay-osu_1627149_3569654267.osr
│ ├── replay-osu_1627149_3604376654.osr
│ ├── replay-osu_1627149_3616523285.osr
│ ├── replay-osu_1627149_3620632389.osr
│ ├── replay-osu_1627149_3628388697.osr
│ ├── replay-osu_1627149_3630701927.osr
│ ├── replay-osu_1627149_3633640709.osr
│ ├── replay-osu_1827412_3633264590.osr
│ ├── replay-osu_1936782_3597057114.osr
│ ├── replay-osu_2156323_3124536556.osr
│ ├── replay-osu_2204925_3620893121.osr
│ ├── replay-osu_2421268_3503295355.osr
│ ├── replay-osu_2580525_3625505463.osr
│ ├── replay-osu_655468_3606599780.osr
│ ├── replay-osu_848233_3606931282.osr
│ ├── replay-osu_848235_3599791477.osr
│ ├── timewarped-1.osr
│ ├── timewarped-2.osr
│ ├── timewarped-3.osr
│ ├── timewarped-4.osr
│ ├── timewarped_144fps_90%_dt.osr
│ ├── timewarped_144fps_90%_nm.osr
│ ├── timewarped_144fps_90%_nmrx.osr
│ ├── timewarped_144fps_95%_dt.osr
│ ├── timewarped_144fps_95%_nm.osr
│ ├── timewarped_unlimitedfps_90%_dt-1.osr
│ ├── timewarped_unlimitedfps_90%_dt-2.osr
│ ├── timewarped_unlimitedfps_90%_nm-1.osr
│ ├── timewarped_unlimitedfps_90%_nm-2.osr
│ ├── timewarped_unlimitedfps_90%_nm-3.osr
│ ├── timewarped_unlimitedfps_95%_dt-1.osr
│ ├── timewarped_unlimitedfps_95%_dt-2.osr
│ ├── timewarped_unlimitedfps_95%_nm-1.osr
│ ├── timewarped_unlimitedfps_95%_nm-2.osr
│ └── timewarped_unlimitedfps_95%_nm-3.osr
├── test_investigations.py
├── test_keyless_circleguard.py
├── test_loadables.py
├── test_loader.py
├── test_mod.py
└── utils.py
/.github/workflows/pr-test.yml:
--------------------------------------------------------------------------------
1 | on: pull_request
2 | name: Pull Request - Run Tests
3 |
4 | permissions:
5 | contents: read
6 |
7 | jobs:
8 | build:
9 | runs-on: ubuntu-latest
10 |
11 | env:
12 | OSU_API_KEY: ${{ secrets.OSU_API_KEY }}
13 |
14 | steps:
15 | - uses: actions/checkout@v4
16 |
17 | - name: Set up Python 3.9
18 | uses: actions/setup-python@v4
19 | with:
20 | python-version: 3.9
21 |
22 | - name: Install Dependencies
23 | run: |
24 | python -m pip install --upgrade pip
25 | pip install -e .
26 |
27 | - name: Run Tests
28 | run: python -m unittest
29 |
--------------------------------------------------------------------------------
/.readthedocs.yml:
--------------------------------------------------------------------------------
1 | # Read the Docs configuration file
2 | # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
3 |
4 | # Required
5 | version: 2
6 |
7 | # Build documentation in the source/ directory with Sphinx
8 | sphinx:
9 | configuration: source/conf.py
10 |
11 | # Optionally set the version of Python and requirements required to build your docs
12 | python:
13 | version: 3.7
14 | install:
15 | - method: pip
16 | path: .
17 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | # Minimal makefile for Sphinx documentation
2 | #
3 |
4 | # You can set these variables from the command line, and also
5 | # from the environment for the first two.
6 | SPHINXOPTS ?=
7 | SPHINXBUILD ?= sphinx-build
8 | SOURCEDIR = docs
9 | BUILDDIR = build
10 |
11 | # Put it first so that "make" without argument is like "make help".
12 | help:
13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
14 |
15 | .PHONY: help Makefile
16 |
17 | # Catch-all target: route all unknown targets to Sphinx using the new
18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
19 | %: Makefile
20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
21 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | [](https://pypi.org/project/circleguard/)
4 |
5 | # Circlecore ([documentation](https://circleguard.github.io/circlecore/))
6 |
7 | Circlecore is a utilities library for osu!. Features include:
8 |
9 | * Unstable Rate calculation
10 | * Judgments calculation (classifying all hitobjects into misses, hit300s, hit100s, hit50s, or sliderbreaks)
11 | * Similarity calculation between two replays, for replay stealing detection
12 | * Frametime calculation, for timewarp detection
13 | * Jerky, suspicious movement detection (called Snaps)
14 |
15 | Circlecore is used by [Circleguard](https://github.com/circleguard/circleguard), a replay analysis tool.
16 |
17 | Circlecore is developed and maintained by:
18 |
19 | * [tybug](https://github.com/tybug)
20 | * [samuelhklumpers](https://github.com/samuelhklumpers)
21 |
22 | ## Installation
23 |
24 | Circlecore can be installed from pip:
25 |
26 | ```bash
27 | pip install circleguard
28 | ```
29 |
30 | This documentation refers to the project as `circlecore` to differentiate it from our organization [Circleguard](https://github.com/circleguard) and the replay analysis tool [Circleguard](https://github.com/circleguard/circleguard). However, `circlecore` is installed from pypi with the name `circleguard`, and is imported as such in code (`import circleguard`).
31 |
32 | ## Links
33 |
34 | Github:
35 | Documentation:
36 | Discord:
37 |
38 | ## Usage
39 |
40 | We have a full tutorial and documentation at . If you really want to jump right in, below is a quickstart guide:
41 |
42 | ```python
43 | from circleguard import *
44 |
45 | # replace "key" with your api key
46 | cg = Circleguard("key")
47 | # replay on http://osu.ppy.sh/b/221777 by http://osu.ppy.sh/u/2757689
48 | replay = ReplayMap(221777, 2757689)
49 |
50 | print(cg.ur(replay)) # unstable rate
51 | print(cg.frametime(replay)) # average frametime
52 | print(cg.frametimes(replay)) # full frametime list
53 | print(cg.hits(replay)) # where the replay hits hitobjects
54 | print(cg.snaps(replay)) # any jerky/suspicious movement
55 |
56 | replay2 = ReplayMap(221777, 4196808)
57 | print(cg.similarity(replay, replay2)) # how similar the replays are
58 |
59 | # ReplayMap isn't the only way to represent replays; we can also
60 | # get a beatmap's top 3 plays
61 | map_ = cg.Map(221777, span="1-3")
62 | # or a User's fifteenth and twentieth best plays
63 | user = cg.User(124493, span="15, 20")
64 | # or a local replay
65 | replay3 = ReplayPath("/path/to/local/osr/replay.osr")
66 | # and more. You can find them all at
67 | # https://circleguard.github.io/circlecore/appendix.html#circleguard.loadables.Loadable
68 |
69 | # maps and users can be iterated over
70 | for r in map_:
71 | print(cg.ur(r))
72 | ```
73 |
74 | ## Contributing
75 |
76 | Join [our discord](https://discord.gg/VNnkTjm) and ask how you can help, or look around for open issues which interest you and tackle those. Pull requests are welcome!
77 |
--------------------------------------------------------------------------------
/STYLE.md:
--------------------------------------------------------------------------------
1 | # Style
2 |
3 | We follow [numpy style](https://numpydoc.readthedocs.io/en/latest/format.html#docstring-standard) docstrings, with the following exceptions.
4 |
5 | ## Backticks
6 |
7 | We use [sphinx](http://www.sphinx-doc.org/en/master/) to build our documentation, and as such use double backticks to represent inline literals such as variables, whereas numpy suggests a single backtick.
8 |
9 | ### Numpy
10 |
11 | ```python
12 | def add(a, b):
13 | """
14 | Adds `a` and `b`.
15 |
16 | Parameters
17 | ----------
18 | a: int
19 | The first number to add.
20 | b: int
21 | The second number to add.
22 |
23 | Returns
24 | -------
25 | int
26 | The sum of `a` and `b`.
27 | """
28 | return a + b
29 | ```
30 |
31 | ### Circlecore
32 |
33 | ```python
34 | def add(a, b):
35 | """
36 | Adds ``a`` and ``b``.
37 |
38 | Parameters
39 | ----------
40 | a: int
41 | The first number to add.
42 | b: int
43 | The second number to add.
44 |
45 | Returns
46 | -------
47 | int
48 | The sum of ``a`` and ``b``.
49 | """
50 | return a + b
51 | ```
52 |
53 | ## Colons
54 |
55 | Numpy has colons in the middle of the argument name and its type. For no reason other than aesthetics, we place the colon to the side of the name.
56 |
57 | ### Numpy
58 |
59 | ```python
60 | def add(a, b):
61 | """
62 | Adds ``a`` and ``b``.
63 |
64 | Parameters
65 | ----------
66 | a : int
67 | The first number to add.
68 | b : int
69 | The second number to add.
70 |
71 | Returns
72 | -------
73 | int
74 | The sum of ``a`` and ``b``.
75 | """
76 | return a + b
77 | ```
78 |
79 | ### Circlecore
80 |
81 | ```python
82 | def add(a, b):
83 | """
84 | Adds ``a`` and ``b``.
85 |
86 | Parameters
87 | ----------
88 | a: int
89 | The first number to add.
90 | b: int
91 | The second number to add.
92 |
93 | Returns
94 | -------
95 | int
96 | The sum of ``a`` and ``b``.
97 | """
98 | return a + b
99 | ```
100 |
--------------------------------------------------------------------------------
/circleguard/__init__.py:
--------------------------------------------------------------------------------
1 | import logging
2 |
3 | from ossapi.ossapi import APIException, InvalidKeyException, ReplayUnavailableException
4 |
5 | from circleguard.circleguard import Circleguard, KeylessCircleguard, set_options
6 | from circleguard.game_version import GameVersion, NoGameVersion
7 | from circleguard.hitobjects import Circle, Hitobject, Slider, Spinner
8 | from circleguard.investigations import Snap
9 | from circleguard.judgment import Hit, Judgment, JudgmentType, Miss
10 | from circleguard.loadables import (
11 | CachedReplay,
12 | Loadable,
13 | LoadableContainer,
14 | Map,
15 | MapUser,
16 | Replay,
17 | ReplayCache,
18 | ReplayContainer,
19 | ReplayDir,
20 | ReplayID,
21 | ReplayMap,
22 | ReplayOssapi,
23 | ReplayPath,
24 | ReplayString,
25 | User,
26 | )
27 | from circleguard.loader import Loader, NoInfoAvailableException
28 | from circleguard.mod import Mod
29 | from circleguard.span import Span
30 | from circleguard.utils import (
31 | TRACE,
32 | ColoredFormatter,
33 | Key,
34 | RatelimitWeight,
35 | convert_statistic,
36 | fuzzy_mods,
37 | hitradius,
38 | hitwindow,
39 | hitwindows,
40 | order,
41 | replay_pairs,
42 | )
43 | from circleguard.version import __version__
44 |
45 | logging.addLevelName(TRACE, "TRACE")
46 | formatter = ColoredFormatter(
47 | "[%(threadName)s][%(name)s][%(levelname)s] %(message)s (%(filename)s:%(lineno)s)"
48 | )
49 | handler_stream = logging.StreamHandler()
50 | handler_stream.setFormatter(formatter)
51 | logging.getLogger("circleguard").addHandler(handler_stream)
52 |
53 | # don't expose ColoredFormatter to consumers
54 | del ColoredFormatter
55 |
56 | __all__ = [
57 | # core
58 | "Circleguard",
59 | "KeylessCircleguard",
60 | "set_options",
61 | # loadables
62 | "ReplayContainer",
63 | "Map",
64 | "User",
65 | "MapUser",
66 | "ReplayCache",
67 | "Replay",
68 | "ReplayMap",
69 | "ReplayPath",
70 | "CachedReplay",
71 | "Loadable",
72 | "ReplayID",
73 | "ReplayDir",
74 | "ReplayString",
75 | "LoadableContainer",
76 | "ReplayOssapi",
77 | # enums
78 | "Key",
79 | "RatelimitWeight",
80 | # mod
81 | "Mod",
82 | # utils
83 | "convert_statistic",
84 | "order",
85 | "Key",
86 | "RatelimitWeight",
87 | "TRACE",
88 | "replay_pairs",
89 | "fuzzy_mods",
90 | "hitwindow",
91 | "hitwindows",
92 | "hitradius",
93 | # loader
94 | "Loader",
95 | # exceptions
96 | "APIException",
97 | "NoInfoAvailableException",
98 | "InvalidKeyException",
99 | "ReplayUnavailableException",
100 | # version
101 | "__version__",
102 | # investigation-related classes
103 | "Snap",
104 | "Judgment",
105 | "Hit",
106 | "Miss",
107 | "JudgmentType",
108 | # span
109 | "Span",
110 | # GameVersion
111 | "GameVersion",
112 | "NoGameVersion",
113 | # hitobjects
114 | "Hitobject",
115 | "Circle",
116 | "Slider",
117 | "Spinner",
118 | ]
119 |
--------------------------------------------------------------------------------
/circleguard/frametime_graph.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 |
3 | try:
4 | from matplotlib import pyplot
5 | except ImportError:
6 | raise ImportError("matplotlib must be installed to create frametime graphs")
7 |
8 | from circleguard.circleguard import KeylessCircleguard
9 | from circleguard.mod import Mod
10 |
11 | # classes that import optional modules have to be in their own file, or else
12 | # they get imported and evaluated (and potentially error) when circlecore is
13 | # imported. We can fix this by wrapping the entire definition in a
14 | # try/catch/pass, but then we can't give a nice error message when people try to
15 | # use this class without installing matplotlib. Another file isn't the end of
16 | # the world.
17 |
18 |
19 | class FrametimeGraph:
20 | # for any frametimes larger than this, chuck them into a single bin.
21 | # matplotlib can't really handle that many bins otherwise
22 | MAX_FRAMETIME = 50
23 |
24 | def __init__(self, replay, cv, figure, show_expected_frametime):
25 | self.cv = cv
26 | # figsize is in inches for whatever reason lol
27 | self.figure = figure or pyplot.figure(figsize=(5, 5))
28 | self.show_expected_frametime = show_expected_frametime
29 | conversion_factor_raw = self._conversion_factor(replay)
30 | self.conversion_factor = conversion_factor_raw if self.cv else 1
31 | self.expected_frametime = 16 + 2 / 3
32 | if not self.cv:
33 | self.expected_frametime /= conversion_factor_raw
34 |
35 | # replay is guaranteed to be loaded when we get it
36 | cg = KeylessCircleguard()
37 | # we convert the frametimes manually if necessary later on instead of
38 | # relying on our conversion in this method, since there are a few
39 | # oddities about the frametime graph which make it easier this way.
40 | frametimes = cg.frametimes(replay, cv=False)
41 |
42 | self.figure.suptitle(
43 | f"Frametimes for {replay.username} "
44 | f"+{replay.mods.short_name()} on b/{replay.map_id}"
45 | )
46 |
47 | self.max_frametime = max(frametimes)
48 | if self.max_frametime > self.MAX_FRAMETIME:
49 | self.plot_with_break(frametimes)
50 | else:
51 | self.plot_normal(frametimes)
52 |
53 | def plot_normal(self, frametimes):
54 | frametimes = self.conversion_factor * frametimes
55 | ax = self.figure.subplots()
56 |
57 | bins = np.arange(
58 | 0, (self.conversion_factor * self.max_frametime) + 1, self.conversion_factor
59 | )
60 | ax.hist(frametimes, bins)
61 | ax.set_xlabel("Frametime")
62 | ax.set_ylabel("Count")
63 |
64 | if self.show_expected_frametime:
65 | ax.axvline(x=self.expected_frametime, color="red")
66 |
67 | # adapted from
68 | # https://matplotlib.org/examples/pylab_examples/broken_axis.html
69 | def plot_with_break(self, frametimes):
70 | # gridspec_kw to make outlier plot smaller than the main one.
71 | # https://stackoverflow.com/a/35881382
72 | ax1, ax2 = self.figure.subplots(
73 | 1, 2, sharey=True, gridspec_kw={"width_ratios": [3, 1]}
74 | )
75 | ax1.spines["right"].set_visible(False)
76 | ax2.spines["left"].set_visible(False)
77 | ax1.set_xlabel("Frametime")
78 | ax1.set_ylabel("Count")
79 |
80 | ax2.tick_params(left=False)
81 |
82 | low_frametime_truth_arr = frametimes <= self.MAX_FRAMETIME
83 | low_frametimes = frametimes[low_frametime_truth_arr]
84 | high_frametimes = frametimes[~low_frametime_truth_arr]
85 |
86 | low_frametimes = self.conversion_factor * low_frametimes
87 | high_frametimes = self.conversion_factor * high_frametimes
88 |
89 | bins = np.arange(
90 | 0, (self.conversion_factor * self.MAX_FRAMETIME) + 1, self.conversion_factor
91 | )
92 | ax1.hist(low_frametimes, bins)
93 | # -1 in case high_frametimes has only one frame
94 | bins = [min(high_frametimes) - 1, self.conversion_factor * self.max_frametime]
95 | ax2.hist(high_frametimes, bins)
96 |
97 | if self.show_expected_frametime:
98 | ax1.axvline(x=self.expected_frametime, color="red")
99 |
100 | def _conversion_factor(self, replay):
101 | if Mod.DT in replay.mods:
102 | return 1 / 1.5
103 | if Mod.HT in replay.mods:
104 | return 1 / 0.75
105 | return 1
106 |
--------------------------------------------------------------------------------
/circleguard/game_version.py:
--------------------------------------------------------------------------------
1 | class GameVersion(int):
2 | """
3 | Information about the version of osu! a
4 | :class:`~circleguard.loadables.Replay` was played on.
5 |
6 | Parameters
7 | ----------
8 | version: int
9 | The version of osu! to represent.
10 |
11 | concrete: bool
12 | Whether ``version`` is the actual version of osu! the replay was played
13 | on (in which case ``concrete`` should be ``True``), or just an
14 | approximation of the version of osu! the replay was played on (in which
15 | case ``concrete`` should be ``False``).
16 | |br|
17 | If the version is an approximation, you are not restricted to actual
18 | released versions of the game (for instance, osu! has no 20200908
19 | version of the game, only 20200831), but may use any day of any month
20 | of any year as your version. Circleguard will see that your version
21 | is just an estimate (as ``concrete`` will be ``False``), and act
22 | accordingly.
23 |
24 | Notes
25 | -----
26 | osu!'s versioning scheme uses a variation of Calender Versioning
27 | (https://calver.org/), which means that a release's version is the day that
28 | release was released. A new version pushed out on 09/08/2020 (MM/DD/YYYY),
29 | for instance, would have a version of 20200809 (YYYYMMDD).
30 | |br|
31 | We provide :func:`~circleguard.game_version.GameVersion.from_datetime` as a
32 | convenience for when you have a :class:`datetime.datetime` object
33 | representing the day an osu! version was released, and want to create a
34 | ``GameVersion`` from that.
35 | |br|
36 | This class subclasses ``int`` so consumers don't need to know or expect a
37 | special class when they access ``replay.game_version``. For instance, to
38 | get the numeric value of the game version, they would have to do
39 | ``replay.game_version.version`` as opposed to ``replay.game_version`` here.
40 | """
41 |
42 | def __new__(cls, version, concrete):
43 | ret = int.__new__(GameVersion, version)
44 | ret.concrete = concrete
45 | return ret
46 |
47 | @staticmethod
48 | def from_datetime(datetime, concrete):
49 | """
50 | Provided as a convenience for converting a :class:`datetime.datetime`
51 | object to a ``GameVersion`` object.
52 |
53 | Parameters
54 | ----------
55 | datetime: :class:`datetime.datetime`
56 | The datetime to convert to a ``GameVersion`` object.
57 | concrete: bool
58 | Whether this version is concrete (ie, fully accurate) or not (ie,
59 | just an estimate of the replay's actual version).
60 |
61 | Returns
62 | -------
63 | :class:`~.GameVersion`
64 | The result of converting ``datetime`` to a ``GameVersion``.
65 | """
66 | version = int(datetime.strftime("%Y%m%d"))
67 | return GameVersion(version, concrete)
68 |
69 | def available(self):
70 | """
71 | Whether we can provide any information about the osu! version a replay
72 | was played on, whether that is a fully accurate version or just an
73 | estimate of the version.
74 | """
75 | return self != -1
76 |
77 |
78 | class NoGameVersion(GameVersion):
79 | """
80 | Used when a :class:`~circleguard.loadables.Replay` has no information about
81 | its version, and cannot even estimate its version.
82 | """
83 |
84 | def __new__(cls):
85 | return super().__new__(NoGameVersion, -1, None)
86 |
--------------------------------------------------------------------------------
/circleguard/hitobjects.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | from slider.beatmap import (
3 | Circle as SliderCircle,
4 | Slider as SliderSlider,
5 | Spinner as SliderSpinner,
6 | )
7 | from slider.mod import circle_radius
8 |
9 | from circleguard.mod import Mod
10 |
11 | # We define our own hitobjects as the slider library's hitobjects have too many
12 | # attributes and methods we don't care about, and they also lock position
13 | # behind an extra attribute access (``hitobj.position.x``` vs ``hitobj.x``)
14 | # which I'm not a fan of.
15 | # Another necessary change is our hitobjects are "replay/map aware", which means
16 | # they know how large they are (or potentially how difficult they are to hit
17 | # as a result of OD if that is necessary in the future) and where they are (for
18 | # HR) because we know with what mods and on what map the hitobject was played
19 | # with.
20 |
21 |
22 | class Hitobject:
23 | """
24 | A Hitobject in osu! gameplay, with a time and a position.
25 | """
26 |
27 | def __init__(self, time, xy):
28 | # TODO remove ``t`` in core 6.0.0, ``time`` should be preferred
29 | self.t = time
30 | self.time = time
31 | self.xy = xy
32 | self.x = xy[0]
33 | self.y = xy[1]
34 |
35 | @classmethod
36 | def from_slider_hitobj(cls, hitobj, replay, beatmap, already_converted=False):
37 | """
38 | Instantiates a circleguard hitobject from a
39 | :class:`slider.beatmap.HitObject`, a
40 | :class:`circleguard.loadables.Replay`, that the hitobject was hit on,
41 | and a :class:`slider.beatmap.Beatmap` that the hitobject is found in.
42 |
43 | The `already_converted` parameter is only to work around
44 | https://github.com/llllllllll/slider/issues/80 and will be removed when
45 | it is fixed.
46 | """
47 | easy = Mod.EZ in replay.mods
48 | hard_rock = Mod.HR in replay.mods
49 | CS = beatmap.cs(easy=easy, hard_rock=hard_rock)
50 |
51 | # Convert to ms.
52 | t = hitobj.time.total_seconds() * 1000
53 | # Due to floating point errors, ``t`` could actually be something
54 | # like ``129824.99999999999`` or ``128705.00000000001``, so round to the
55 | # nearest int.
56 | t = int(round(t))
57 |
58 | if hard_rock and not already_converted:
59 | hitobj = hitobj.hard_rock
60 |
61 | xy = [hitobj.position.x, hitobj.position.y]
62 | xy = np.array(xy)
63 |
64 | radius = circle_radius(CS)
65 |
66 | if isinstance(hitobj, SliderCircle):
67 | return Circle(t, xy, radius)
68 | if isinstance(hitobj, SliderSlider):
69 | return Slider(t, xy, radius)
70 | if isinstance(hitobj, SliderSpinner):
71 | return Spinner(t, xy)
72 |
73 | def __eq__(self, other):
74 | return self.time == other.time and self.xy == other.xy
75 |
76 | def __hash__(self):
77 | return hash((self.time, self.xy))
78 |
79 |
80 | class Circle(Hitobject):
81 | """
82 | A circle in osu! gameplay, with a time, position, and radius.
83 | """
84 |
85 | def __init__(self, time, xy, radius):
86 | super().__init__(time, xy)
87 | self.radius = radius
88 |
89 | def __eq__(self, other):
90 | return (
91 | self.time == other.time
92 | and self.xy == other.xy
93 | and self.radius == other.radius
94 | )
95 |
96 | def __hash__(self):
97 | return hash((self.time, self.xy, self.radius))
98 |
99 |
100 | class Slider(Hitobject):
101 | """
102 | A slider in osu! gameplay, with a time, position, and radius.
103 | """
104 |
105 | def __init__(self, time, xy, radius):
106 | super().__init__(time, xy)
107 | self.radius = radius
108 |
109 | def __eq__(self, other):
110 | return (
111 | self.time == other.time
112 | and self.xy == other.xy
113 | and self.radius == other.radius
114 | )
115 |
116 | def __hash__(self):
117 | return hash((self.time, self.xy, self.radius))
118 |
119 |
120 | class Spinner(Hitobject):
121 | """
122 | A spinner in osu! gameplay, with a time and position.
123 | """
124 |
125 | def __init__(self, time, xy):
126 | super().__init__(time, xy)
127 |
--------------------------------------------------------------------------------
/circleguard/map_info.py:
--------------------------------------------------------------------------------
1 | # TODO: remove in core 6.0.0, in favor of ``Replay#map_available`` (and
2 | # possibly other mechanisms).
3 | class MapInfo:
4 | """
5 | Represents the information necessary to load a beatmap.
6 |
7 | Notes
8 | -----
9 | If multiple ways to load a beatmap are known, all ways should be provided
10 | so consumers can choose the order of ways to load the beatmap.
11 |
12 | If a way to load a beatmap is *not* available, it should be left as
13 | ``None``.
14 | """
15 |
16 | def __init__(self, *, map_id=None, path=None):
17 | self.map_id = map_id
18 | self.path = path
19 |
20 | def available(self):
21 | """
22 | Whether this beatmap can be loaded with the information we have or not.
23 | """
24 | return bool(self.map_id) or bool(self.path)
25 |
--------------------------------------------------------------------------------
/circleguard/mod.py:
--------------------------------------------------------------------------------
1 | # this file is left as an alias so that we can pretend the Mod class comes from
2 | # circlecore, even though we're really using ossapi's Mod class. The Mod class
3 | # used to live in circlecore so consumers may have imported it directly, so
4 | # this linkage needs to exist at least until core 6.0.0. After that we can
5 | # reassess whether it makes sense to leave this or convert our mod imports to
6 | # import from ossapi instead. I think we will want to convert them, but a
7 | # problem for future me.
8 | from ossapi.mod import Mod, ModCombination # noqa: F401
9 |
--------------------------------------------------------------------------------
/circleguard/postgres.py:
--------------------------------------------------------------------------------
1 | import logging
2 |
3 | import wtc
4 | from ossapi import OssapiV1
5 |
6 | try:
7 | import psycopg2
8 | except ImportError:
9 | raise ImportError("psycopg2 must be installed to use PostgresLoader")
10 |
11 | from circleguard.circleguard import Circleguard
12 | from circleguard.loader import Loader
13 | from circleguard.utils import TRACE
14 |
15 |
16 | class PostgresCircleguard(Circleguard):
17 | """
18 | A postgres variant of the default sqlite-backed circleguard.
19 | """
20 |
21 | def __init__(
22 | self,
23 | key,
24 | db_username,
25 | db_password,
26 | db_host,
27 | db_port,
28 | db_name,
29 | write_to_cache=True,
30 | slider_dir=None,
31 | ):
32 | loader = PostgresLoader(
33 | key, db_username, db_password, db_host, db_port, db_name, write_to_cache
34 | )
35 | super().__init__(key, loader=loader, slider_dir=slider_dir)
36 |
37 |
38 | class PostgresLoader(Loader):
39 | """
40 | A postgres variant of the default sqlite-backed loader.
41 | """
42 |
43 | def __init__(
44 | self,
45 | key,
46 | db_username,
47 | db_password,
48 | db_host,
49 | db_port,
50 | db_name,
51 | write_to_cache=True,
52 | ):
53 | self.api = OssapiV1(key)
54 | self.log = logging.getLogger(__name__)
55 |
56 | self._conn = None
57 | self._cursor = None
58 | self.write_to_cache = write_to_cache
59 | self.read_from_cache = True
60 |
61 | self._conn = psycopg2.connect(
62 | user=db_username,
63 | password=db_password,
64 | host=db_host,
65 | port=db_port,
66 | database=db_name,
67 | )
68 | self._cursor = self._conn.cursor()
69 |
70 | def _check_cache(self, replay_info):
71 | """
72 | Checks the cache for a replay matching ``replay_info``.
73 |
74 | Parameters
75 | ----------
76 | replay_info: :class:`~circleguard.loader.ReplayInfo`
77 | The replay info to search for a matching replay with.
78 |
79 | Returns
80 | -------
81 | str or None
82 | The replay data in decompressed lzma form if the cache contains the
83 | replay, or None if not.
84 | """
85 | if not self.read_from_cache:
86 | return None
87 |
88 | replay_id = replay_info.replay_id
89 |
90 | self.log.log(TRACE, "Checking cache for replay info %s", replay_info)
91 | self._cursor.execute(
92 | "SELECT replay_data FROM replays WHERE " "replay_id= %s", [replay_id]
93 | )
94 | result = self._cursor.fetchone()
95 | if result:
96 | self.log.debug("Loading replay for replay info %s from cache", replay_info)
97 | return wtc.decompress(result[0], decompressed_lzma=True)
98 | self.log.log(TRACE, "No replay found in cache")
99 |
100 | def _cache(self, lzma_bytes, replay_info):
101 | """
102 | Compresses and caches the given lzma_bytes to the database, linking it
103 | to the given replay_info. If an entry with the given replay info already
104 | exists, it is overwritten.
105 |
106 | Parameters
107 | ----------
108 | lzma_bytes: str
109 | The lzma stream to compress and insert into the db.
110 | replay_info: :class:`~circleguard.loader.ReplayInfo`
111 | The ReplayInfo object representing this replay.
112 | """
113 | if not self.write_to_cache:
114 | return
115 |
116 | compressed_bytes = wtc.compress(lzma_bytes)
117 | beatmap_id = replay_info.beatmap_id
118 | user_id = replay_info.user_id
119 | mods = replay_info.mods.value
120 | replay_id = replay_info.replay_id
121 |
122 | self.log.log(TRACE, "Writing compressed lzma to db")
123 | self._cursor.execute(
124 | "INSERT INTO replays VALUES(%s, %s, %s, %s, %s)",
125 | [replay_id, beatmap_id, user_id, compressed_bytes, mods],
126 | )
127 | self._conn.commit()
128 |
--------------------------------------------------------------------------------
/circleguard/span.py:
--------------------------------------------------------------------------------
1 | class Span(set):
2 | """
3 | A set of numbers represented by a string, which can include ranges or
4 | single numbers, separated by a comma.
5 |
6 | Notes
7 | -----
8 | Spans can only range from 1 to 100 inclusive.
9 |
10 | Examples
11 | --------
12 | >>> Span("1-3,6,2-4")
13 | {1, 2, 3, 4, 6}
14 | """
15 |
16 | def __init__(self, data):
17 | # allow passing as either span or string
18 | if not isinstance(data, (Span, str)):
19 | raise ValueError(
20 | f"Expected data to be a str or Span, got type " f"{type(data)}."
21 | )
22 | if isinstance(data, Span):
23 | # python allows initializing a set with a set
24 | super().__init__(data)
25 | elif isinstance(data, str):
26 | span_set = self._to_set(data)
27 | super().__init__(span_set)
28 |
29 | if max(self) > 100:
30 | raise ValueError(
31 | "Spans can only range from 1 to 100 inclusive. "
32 | f"The largest element passed was {max(self)}"
33 | )
34 |
35 | def _to_set(self, span):
36 | """
37 | Converts a span to the set of numbers covered by that span.
38 |
39 | Parameters
40 | ----------
41 | span: str
42 | The span of numbers to convert to a set. A number may occur more
43 | than once - whether explicitly or in a range - in the span, but
44 | will only occur once in the returned set.
45 |
46 | Returns
47 | -------
48 | set
49 | The set of numbers described by the ``span``.
50 |
51 | Examples
52 | --------
53 | >>> _to_set("1-3,6,2-4")
54 | {1, 2, 3, 4, 6}
55 | """
56 | ret = set()
57 | for s in span.split(","):
58 | if "-" in s:
59 | p = s.split("-")
60 | l = list(range(int(p[0]), int(p[1]) + 1))
61 | ret.update(l)
62 | else:
63 | ret.add(int(s))
64 | return ret
65 |
--------------------------------------------------------------------------------
/circleguard/version.py:
--------------------------------------------------------------------------------
1 | __version__ = "5.4.3"
2 |
--------------------------------------------------------------------------------
/docs/appendix.rst:
--------------------------------------------------------------------------------
1 | ..
2 | Can't use `..automodule:: circleguard` or else
3 | :class:`~circleguard.cacher.Cacher` won't work, only
4 | :class:`circleguard.Cacher` will. We want the extra level of specificity.
5 |
6 | Appendix
7 | ========
8 |
9 | Circleguard
10 | -----------
11 | .. automodule:: circleguard.circleguard
12 | :members:
13 |
14 | Game Version
15 | ------------
16 | .. automodule:: circleguard.game_version
17 | :members:
18 |
19 | Hit Objects
20 | -----------
21 | .. automodule:: circleguard.hitobjects
22 | :members:
23 |
24 | Investigations
25 | --------------
26 | .. automodule:: circleguard.investigations
27 | :members:
28 |
29 | Judgment
30 | --------
31 | .. automodule:: circleguard.judgment
32 | :members:
33 |
34 | Loadables
35 | ---------
36 | .. automodule:: circleguard.loadables
37 | :members:
38 |
39 | Loader
40 | ------
41 | .. automodule:: circleguard.loader
42 | :members:
43 |
44 | Map Info
45 | --------
46 | .. automodule:: circleguard.map_info
47 | :members:
48 |
49 | Mod
50 | ------
51 | .. automodule:: circleguard.mod
52 | :members:
53 |
54 | Span
55 | ----
56 | .. automodule:: circleguard.span
57 | :members:
58 |
59 | Utils
60 | -----
61 | .. automodule:: circleguard.utils
62 | :members:
63 |
--------------------------------------------------------------------------------
/docs/caching.rst:
--------------------------------------------------------------------------------
1 | Caching
2 | =======
3 |
4 | Because the replay_data api endpoint is heavily ratelimited (10/min), we provide replay caching in |Circleguard|.
5 | You can pass a ``db_path`` to |Circleguard| and any replay it loads will be cached there. This cache lives in an
6 | (sqlite) ``.db`` file and will persist across runs.
7 |
8 | .. code-block:: python
9 |
10 | cg = Circleguard("key", db_path="./cg_cache.db")
11 |
12 | If the given path does not exist, circleguard will create fresh a db file there and use it. If the path is a
13 | pre-existing databse file created by circleguard, that database will be used. Any other file existing at the path
14 | will result in an error.
15 |
16 | When loading a replay, we first check if the replay exists in the database, and load it from there if so. If not,
17 | we load it from the api (or local file in the case of |ReplayPath|), compress the replays using
18 | `WTC compression `_, and store in the database.
19 |
20 | .. code-block:: python
21 |
22 | r1 = ReplayMap(221777, 2757689)
23 | r2 = ReplayMap(221777, 2757689)
24 | print("loading from api")
25 | cg.load(r1) # replay gets loaded from the api and cached
26 | print("loading from cache")
27 | cg.load(r2) # loaded from our cache, not the api
28 | # we can do this as many times as we want - we won't ever
29 | # hit the api ratelimit since we're loading from the cache
30 | for i in range(0, 5):
31 | print("loading from cache")
32 | r = ReplayMap(221777, 2757689)
33 | cg.load(r)
34 |
35 | .. warning::
36 |
37 | WTC compression is lossy, so replays loaded from the api and loaded from cache will be slightly different.
38 | The loss is on the order of 0.1 precision in the xy coordinate of frames, which is not enough to impact
39 | the average use case, but could make a difference in some scenarios.
40 |
41 | If you want to use a cache in "read only" mode (use previously cached replays, but don't cache new replays), pass
42 | ``cache=False`` to |Circleguard|:
43 |
44 | .. code-block:: python
45 |
46 | cg = Circleguard("key", db_path="./db.db", cache=False)
47 |
48 | slider_dir
49 | ~~~~~~~~~~
50 |
51 | We use `slider `_ to manage the download and parsing of beatmaps. We download beatmaps
52 | when certain functions are called, such as |cg.hits|, that require the beatmap the replay was played on to work.
53 |
54 | If ``slider_dir`` is passed, downloaded beatmaps will be cached to that directory (which must exist). You can use the same
55 | directory the |Circleguard| cache db file is in if you'd like.
56 |
57 | .. code-block:: python
58 |
59 | cg = Circleguard("key", db_path="./dbs/db.db", slider_dir="./dbs/")
60 | r = ReplayMap(221777, 2757689)
61 | cg.hits(r) # downloads https://osu.ppy.sh/b/221777 and caches it in slider_dir
62 |
63 | If ``slider_dir`` is not passed, we still use slider to download beatmaps, but cache them to a newly created temporary directory
64 | instead. This means beatmaps will be cached with respect to a single |Circleguard| object, but will not persist across runs.
65 |
66 | Loadables
67 | ~~~~~~~~~
68 |
69 | A |Replay| or |ReplayContainer| also has a ``cache`` parameter, which determines if it should be cached when loaded.
70 |
71 | .. note::
72 |
73 | The ``cache`` parameter has no effect if |Circleguard| was not passed a ``db_path`` or if |Circleguard| was
74 | instantiated with ``cache=False``.
75 |
76 | This parameter is ``True`` by default, but by passing ``False`` we can selectively force certain loadables to not be cached
77 | when they're loaded:
78 |
79 | .. code-block:: python
80 |
81 | cg = Circleguard("key", db_path="./db.db")
82 | r1 = ReplayMap(221777, 2757689, cache=True)
83 | r2 = ReplayMap(1524183, 12092800, cache=False)
84 | cg.load(r1) # gets cached
85 | cg.load(r2) # does not get cached
86 |
87 | For a |ReplayContainer|, ``cache`` cascades to its |Replay|\s:
88 |
89 | .. code-block:: python
90 |
91 | cg = Circleguard("key", db_path="./db.db")
92 | m = Map(221777, span="1-2", cache=False)
93 | cg.load(m) # neither replay in `m` cached
94 |
--------------------------------------------------------------------------------
/docs/contributing.rst:
--------------------------------------------------------------------------------
1 | Contributing
2 | ============
3 |
4 | If you'd like to contribute to circleguard, pull requests are always welcome!
5 |
6 | I do a decent job of keeping track of issues through the `circlecore github `_;
7 | find one that interests you and give it a shot. You can also always ask what you can help with on
8 | `the discord `_. I don't bite, I promise :)
9 |
--------------------------------------------------------------------------------
/docs/foreword.rst:
--------------------------------------------------------------------------------
1 | Foreword
2 | ========
3 |
4 | The following pages serve as an introduction to circleguard. Although they would ideally be exhaustive, they are likely not.
5 | The source code is rather well documented, and you should refer to it whenever necessary. You can also browse the documentation
6 | for all classes, methods, etc by visiting the :doc:`../appendix`.
7 |
8 | You are also welcome to ask questions on the `discord `_.
9 |
10 | To aid in readability, ``import`` statements have been ommitted from all example code blocks. Please supply your own.
11 |
--------------------------------------------------------------------------------
/docs/index.rst:
--------------------------------------------------------------------------------
1 | Circlecore
2 | ==========
3 |
4 | Circlecore is a utilities library for osu!. Features include:
5 |
6 | * Unstable Rate calculation
7 | * Judgments calculation (classifying all hitobjects into misses, hit300s, hit100s, hit50s, or sliderbreaks)
8 | * Similarity calculation between two replays, for replay stealing detection
9 | * Frametime calculation, for timewarp detection
10 | * Jerky, suspicious movement detection (called Snaps)
11 |
12 | Circlecore is used by `Circleguard `__, a replay analysis tool.
13 |
14 | Circlecore is developed and maintained by:
15 |
16 | * `tybug `__
17 | * `samuelhklumpers `__
18 |
19 | Installation
20 | ------------
21 |
22 | Circlecore can be installed from pip:
23 |
24 | .. code-block:: console
25 |
26 | $ pip install circleguard
27 |
28 | .. note::
29 |
30 | This page refers to the project as ``circlecore`` to differentiate it from our organization
31 | `Circleguard `__ and our gui application Circleguard_. However, ``circlecore`` is installed
32 | from pypi with the name ``circleguard``, and is imported as such in python (``import circleguard``) We will also refer to it
33 | as ``circleguard`` for the remainder of the documentation.
34 |
35 | Links
36 | -----
37 |
38 | | Github: https://github.com/circleguard/circlecore
39 | | Documentation: https://circleguard.github.io/circlecore/
40 | | Discord: https://discord.gg/VNnkTjm
41 |
42 |
43 | ..
44 | couple notes about these toctrees - the first toctree is so our sidebar has
45 | a link back to the index page. the ``self`` keyword comes with its share of
46 | issues (https://github.com/sphinx-doc/sphinx/issues/2103), but none that matter
47 | that much to us. It's better than using ``index`` which works but generates
48 | many warnings when building.
49 |
50 | Hidden toctrees appear on the sidebar but not as text on the table of contents
51 | displayed on this page.
52 |
53 | .. toctree::
54 | :hidden:
55 |
56 | self
57 |
58 | .. toctree::
59 | :maxdepth: 2
60 | :caption: Tutorial
61 |
62 | foreword
63 | representing-replays
64 | using-circleguard
65 | replay-containers
66 | loading
67 | caching
68 | advanced-usage
69 |
70 | .. toctree::
71 | :caption: Contributing
72 |
73 | contributing
74 |
75 | .. toctree::
76 | :caption: Appendix
77 | :hidden:
78 |
79 | appendix
80 |
--------------------------------------------------------------------------------
/docs/replay-containers.rst:
--------------------------------------------------------------------------------
1 | Replay Containers
2 | =================
3 |
4 | Whereas a |Replay| represents a single replay, a |ReplayContainer| represents a set of replays. This is useful for if you want to
5 | operate over the entire leaderboard of a map, a user's top plays, etc.
6 |
7 | Map
8 | ---
9 |
10 | A |Map| represents a beatmap's top plays (ie leaderboard), as seen on the osu! website.
11 |
12 | When instantiating a |Map|, you must specify which scores you want from the map via the ``span`` argument:
13 |
14 | .. code-block:: python
15 |
16 | # top 3 replays on the map
17 | m1 = Map(221777, span="1-3")
18 |
19 | # first, second, and 85th replays on the map
20 | m2 = Map(221777, span="1-2, 85")
21 |
22 | # 10th, 11th, 20th, and 25th replays on the map
23 | m3 = Map(221777, spn="10, 11, 20, 25")
24 |
25 | We can also select replays set with a certain mod combination:
26 |
27 | .. code-block:: python
28 |
29 | # top 2 HR scores (this means ONLY HR, not "HR plus any other mod")
30 | m1 = Map(221777, span="1-2", mods=Mod.HR)
31 |
32 | # third best HDHR score
33 | m2 = Map(221777, span="3", mods=Mod.HDHR)
34 |
35 | User
36 | ----
37 |
38 | A |User| represents the top plays of a user, as seen on their profile.
39 |
40 | Similar to a |Map|, you must specify which scores of the user you want, and you can optionally
41 | specify a mod combination to receive scores set with only that mod:
42 |
43 | .. code-block:: python
44 |
45 | # top 2 scores of the user
46 | u = User(2757689, span="1-2")
47 |
48 | # second and third best scores with only HD
49 | u = User(2757689, span="2-3", mods=Mod.HD)
50 |
51 | Map User
52 | --------
53 |
54 | A |MapUser| represents all of a user's plays on a beatmap. This is often only one score if the user has only ever
55 | played the map with a single mod combination, but could be more depending on how many times they've played the map
56 | with different mods.
57 |
58 | Unlike |Map| and |User|, you are not required to specify which scores you would like via ``span``. |MapUser| assumes you want all
59 | of the scores the user has set on the beatmap:
60 |
61 | .. code-block:: python
62 |
63 | # all replays by cookiezi on everything will freeze
64 | mu = MapUser(555797, 124493)
65 |
66 | You can still optionally specify a ``span`` argument if you would like:
67 |
68 | .. code-block:: python
69 |
70 | # only cookiezi's second best replay on everything will freeze
71 | mu = MapUser(555797, 124493, span="2")
72 |
73 | Replay Dir
74 | ----------
75 |
76 | A |ReplayDir| represents replays stored locally in a folder. This replay container creates |ReplayPath| objects. Any file ending
77 | in ``.osr`` is recognized as a replay file. Nested directories are currently not supported.
78 |
79 | .. code-block:: python
80 |
81 | # all replays in `/Users/tybug/Desktop/replays`
82 | r_dir = ReplayDir("/Users/tybug/Desktop/replays")
83 |
84 |
85 | Accessing Replays
86 | -----------------
87 |
88 | A |ReplayContainer| is iterable, so you can retrieve |Replay| instances contained by the |ReplayContainer| in the usual ways.
89 |
90 | Index access:
91 |
92 | .. code-block:: python
93 |
94 | m = Map(221777, "1-2")
95 | cg.load_info(m)
96 | print(m[0])
97 |
98 | Iterating:
99 |
100 | .. code-block:: python
101 |
102 | for replay in m:
103 | print(replay)
104 |
105 | Creating a list from the |ReplayContainer| (or alternatively calling |all_replays|):
106 |
107 | .. code-block:: python
108 |
109 | print(list(m))
110 | print(m.all_replays())
111 |
112 | We've used a method above, |cg.load_info|, that we haven't introduced yet. We will cover this method on the very next page
113 | (under :ref:`info-loading`).
114 |
--------------------------------------------------------------------------------
/docs/representing-replays.rst:
--------------------------------------------------------------------------------
1 | Representing Replays
2 | ====================
3 |
4 | Before you can use circleguard to calculate statistics of replays or do other operations on replays, you need
5 | to know how to represent replays.
6 |
7 | All replay classes you can instantiate are subclasses of |Replay|. We cover each class below.
8 |
9 | Replay Map
10 | ----------
11 |
12 | A |ReplayMap| represents a replay by a user on a map. To get the highest scoring replay by the user
13 | ``2757689`` on the map ``221777``:
14 |
15 | .. code-block:: python
16 |
17 | replay = ReplayMap(221777, 2757689)
18 |
19 | To restrict this to a replay with a certain mod combination, use the ``mods`` argument. To get specifically the ``HDHR`` by
20 | the same user as above:
21 |
22 | .. code-block:: python
23 |
24 | replay = ReplayMap(221777, 2757689, mods=Mod.HD + Mod.HR)
25 |
26 |
27 | Replay Path
28 | -----------
29 |
30 | A |ReplayPath| represents a replay stored locally in an ``osr`` file. To get the replay stored in the file
31 | at ``/path/to/your/replay.osr``:
32 |
33 | .. code-block:: python
34 |
35 | replay = ReplayPath("/path/to/your/replay.osr")
36 |
37 |
38 | Replay ID
39 | ---------
40 |
41 | A |ReplayID| represents a replay that was submitted online and is represented by a unique replay id.
42 |
43 | .. code-block:: python
44 |
45 | r = ReplayID(2177560145) # cookiezi on freedom dive
46 |
47 | .. warning::
48 |
49 | We can only retrieve the replay data, and nothing else, for a |ReplayID| due to limitations with the api.
50 | This means we do not know with what mods or on what map a |ReplayID| was played on. This limits
51 | what kinds of functions can be called on it. For instance, |cg.ur| and |cg.hits| both require
52 | knowing what beatmap the replay was played on, and will reject a |ReplayID|.
53 |
54 |
55 | Replay String
56 | -------------
57 |
58 | A |ReplayString| represents a replay file which has been read into a string object. This replay class is rarely used.
59 |
60 | .. code-block:: python
61 |
62 | replay_data_str = open("/path/to/your/replay.osr", "rb").read()
63 | replay = ReplayString(replay_data_str)
64 |
--------------------------------------------------------------------------------
/readme_resources/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/readme_resources/logo.png
--------------------------------------------------------------------------------
/setup.py:
--------------------------------------------------------------------------------
1 | import re
2 | from distutils.core import setup
3 |
4 | from setuptools import find_packages
5 |
6 | with open("README.md") as readme:
7 | long_description = readme.read()
8 |
9 | # https://stackoverflow.com/a/7071358
10 | VERSION = "Unknown"
11 | VERSION_RE = r"^__version__ = ['\"]([^'\"]*)['\"]"
12 |
13 | with open("circleguard/version.py") as f:
14 | match = re.search(VERSION_RE, f.read())
15 | if match:
16 | VERSION = match.group(1)
17 | else:
18 | raise RuntimeError("Unable to find version string in circleguard/version.py")
19 |
20 | setup(
21 | name="circleguard",
22 | version=VERSION,
23 | description="A utilities library for osu!. Provides support for parsing "
24 | "replays from a file or from the api, as well as support for unstable "
25 | "rate, hits, similarity, and frametime calculations.",
26 | long_description=long_description,
27 | long_description_content_type="text/markdown",
28 | classifiers=[
29 | "Programming Language :: Python :: 3",
30 | "Intended Audience :: Developers",
31 | "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
32 | "Operating System :: OS Independent",
33 | ],
34 | keywords=["osu!, python, cheat-detection, replay-stealing, remodding"],
35 | author="Liam DeVoe",
36 | author_email="orionldevoe@gmail.com",
37 | url="https://github.com/circleguard/circlecore",
38 | download_url="https://github.com/circleguard/circlecore/tarball/v" + VERSION,
39 | packages=find_packages(),
40 | install_requires=[
41 | "osrparse~=6.0",
42 | "ossapi>=3.0.0",
43 | "wtc==1.2.1",
44 | "numpy",
45 | "requests",
46 | "slider>=0.5.1",
47 | "scipy",
48 | ],
49 | extras_require={"graphing": ["matplotlib"]},
50 | )
51 |
--------------------------------------------------------------------------------
/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/__init__.py
--------------------------------------------------------------------------------
/tests/benchmark_hits.py:
--------------------------------------------------------------------------------
1 | import cProfile
2 | from pstats import Stats
3 |
4 | from utils import KEY, RES
5 |
6 | from circleguard import Circleguard, ReplayPath
7 |
8 | # TODO not sure how useful this benchmark is tbh, rework or remove
9 |
10 |
11 | def benchmark_hits_ur(statistic):
12 | """
13 | Parameters
14 | ----------
15 | statistic: {"hits", "ur", "both"}
16 | What statistics to calculate
17 | """
18 | profiler = cProfile.Profile()
19 |
20 | num_calls = 20
21 |
22 | def benchmark_func():
23 | cg = Circleguard(KEY)
24 | replay = ReplayPath(RES / "legit" / "legit-1.osr")
25 | if statistic in ["hits", "both"]:
26 | cg.hits(replay)
27 | if statistic in ["both", "ur"]:
28 | cg.ur(replay)
29 |
30 | profiler.enable()
31 | for _ in range(num_calls):
32 | benchmark_func()
33 |
34 | profiler.disable()
35 |
36 | stats = Stats(profiler)
37 | print(
38 | f'Average time per call with statistic "{statistic}": {stats.total_tt / num_calls:3f} ({num_calls} calls)'
39 | )
40 |
41 |
42 | if __name__ == "__main__":
43 | benchmark_hits_ur(statistic="hits")
44 | benchmark_hits_ur(statistic="ur")
45 | benchmark_hits_ur(statistic="both")
46 |
--------------------------------------------------------------------------------
/tests/benchmarks.py:
--------------------------------------------------------------------------------
1 | # Benchmarks for circleguard. These are not strictly "tests" and will not be run
2 | # by unittest, but it felt appropriate to place them in the tests folder.
3 |
4 | import cProfile
5 | from pstats import Stats
6 |
7 | from utils import KEY, RES
8 |
9 | from circleguard import Circleguard, ReplayPath
10 |
11 | cg = Circleguard(KEY)
12 |
13 | replay1 = ReplayPath(RES / "legit" / "legit-1.osr")
14 | cg.load(replay1)
15 |
16 |
17 | def benchmark_ur(with_cache):
18 | """
19 | Parameters
20 | ----------
21 | with_cache: {"none", "replay", "beatmap", "both"}
22 | What caches to use when calculating the ur of the replay. If "replay",
23 | a replay that has already been loaded is used. If "beatmap", the beatmap
24 | is downloaded on the first call, and is cached thereafter. If "both",
25 | both of the above caches apply.
26 | """
27 | profiler = cProfile.Profile()
28 |
29 | if with_cache == "none":
30 | num_calls = 10
31 |
32 | def benchmark_func():
33 | # creating a new cg object is a hacky way to force a new slider
34 | # cache
35 | cg = Circleguard(KEY)
36 | replay = ReplayPath(RES / "legit" / "legit-1.osr")
37 | cg.ur(replay)
38 |
39 | elif with_cache == "replay":
40 | num_calls = 10
41 |
42 | def benchmark_func():
43 | cg = Circleguard(KEY)
44 | cg.ur(replay1)
45 |
46 | elif with_cache == "beatmap":
47 | num_calls = 100
48 |
49 | def benchmark_func():
50 | replay = ReplayPath(RES / "legit" / "legit-1.osr")
51 | cg.ur(replay)
52 |
53 | elif with_cache == "both":
54 | num_calls = 100
55 |
56 | def benchmark_func():
57 | cg.ur(replay1)
58 |
59 | profiler.enable()
60 | for _ in range(num_calls):
61 | benchmark_func()
62 |
63 | profiler.disable()
64 |
65 | stats = Stats(profiler)
66 | print(
67 | f'Average time per call with cache "{with_cache}": {stats.total_tt / num_calls:3f} ({num_calls} calls)'
68 | )
69 |
70 |
71 | if __name__ == "__main__":
72 | benchmark_ur(with_cache="none")
73 | benchmark_ur(with_cache="beatmap")
74 | benchmark_ur(with_cache="replay")
75 | benchmark_ur(with_cache="both")
76 |
--------------------------------------------------------------------------------
/tests/resources/auto/auto-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/auto/auto-1.osr
--------------------------------------------------------------------------------
/tests/resources/auto/auto-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/auto/auto-2.osr
--------------------------------------------------------------------------------
/tests/resources/auto/auto-3.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/auto/auto-3.osr
--------------------------------------------------------------------------------
/tests/resources/auto/auto-4.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/auto/auto-4.osr
--------------------------------------------------------------------------------
/tests/resources/auto/auto-5.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/auto/auto-5.osr
--------------------------------------------------------------------------------
/tests/resources/auto/cursordance-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/auto/cursordance-1.osr
--------------------------------------------------------------------------------
/tests/resources/auto/cursordance-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/auto/cursordance-2.osr
--------------------------------------------------------------------------------
/tests/resources/auto/cursordance-3.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/auto/cursordance-3.osr
--------------------------------------------------------------------------------
/tests/resources/auto/cursordance-4.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/auto/cursordance-4.osr
--------------------------------------------------------------------------------
/tests/resources/auto/cursordance-5.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/auto/cursordance-5.osr
--------------------------------------------------------------------------------
/tests/resources/auto/cursordance-6.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/auto/cursordance-6.osr
--------------------------------------------------------------------------------
/tests/resources/auto/cursordance-7.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/auto/cursordance-7.osr
--------------------------------------------------------------------------------
/tests/resources/auto/pilot-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/auto/pilot-1.osr
--------------------------------------------------------------------------------
/tests/resources/auto/pilot-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/auto/pilot-2.osr
--------------------------------------------------------------------------------
/tests/resources/auto/pilot-3.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/auto/pilot-3.osr
--------------------------------------------------------------------------------
/tests/resources/corrected_replay1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/corrected_replay1.osr
--------------------------------------------------------------------------------
/tests/resources/example_replay.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/example_replay.osr
--------------------------------------------------------------------------------
/tests/resources/legit/2_histogram_peaks/replay-osu_1115068_3537832838.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/2_histogram_peaks/replay-osu_1115068_3537832838.osr
--------------------------------------------------------------------------------
/tests/resources/legit/2_histogram_peaks/replay-osu_1649060_2653254255.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/2_histogram_peaks/replay-osu_1649060_2653254255.osr
--------------------------------------------------------------------------------
/tests/resources/legit/2_histogram_peaks/replay-osu_1649528_2728075053.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/2_histogram_peaks/replay-osu_1649528_2728075053.osr
--------------------------------------------------------------------------------
/tests/resources/legit/2_histogram_peaks/replay-osu_1681124_2636614839.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/2_histogram_peaks/replay-osu_1681124_2636614839.osr
--------------------------------------------------------------------------------
/tests/resources/legit/2_histogram_peaks/replay-osu_2058788_3072716370.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/2_histogram_peaks/replay-osu_2058788_3072716370.osr
--------------------------------------------------------------------------------
/tests/resources/legit/2_histogram_peaks/replay-osu_255700_1740153425.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/2_histogram_peaks/replay-osu_255700_1740153425.osr
--------------------------------------------------------------------------------
/tests/resources/legit/2_histogram_peaks/replay-osu_276366_1720366862.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/2_histogram_peaks/replay-osu_276366_1720366862.osr
--------------------------------------------------------------------------------
/tests/resources/legit/2_histogram_peaks/replay-osu_332962_1722917912.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/2_histogram_peaks/replay-osu_332962_1722917912.osr
--------------------------------------------------------------------------------
/tests/resources/legit/2_histogram_peaks/replay-osu_338544_1718949811.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/2_histogram_peaks/replay-osu_338544_1718949811.osr
--------------------------------------------------------------------------------
/tests/resources/legit/2_histogram_peaks/replay-osu_838487_3513254185.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/2_histogram_peaks/replay-osu_838487_3513254185.osr
--------------------------------------------------------------------------------
/tests/resources/legit/2_histogram_peaks/replay-osu_988793_2526343524.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/2_histogram_peaks/replay-osu_988793_2526343524.osr
--------------------------------------------------------------------------------
/tests/resources/legit/3_histogram_peaks/Malai_-_Big_Time_Rush_-_Worldwide_Paris_London_Tokyo_2021-05-29_Osu-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/3_histogram_peaks/Malai_-_Big_Time_Rush_-_Worldwide_Paris_London_Tokyo_2021-05-29_Osu-1.osr
--------------------------------------------------------------------------------
/tests/resources/legit/3_histogram_peaks/Malai_-_Big_Time_Rush_-_Worldwide_Paris_London_Tokyo_2021-05-29_Osu.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/3_histogram_peaks/Malai_-_Big_Time_Rush_-_Worldwide_Paris_London_Tokyo_2021-05-29_Osu.osr
--------------------------------------------------------------------------------
/tests/resources/legit/3_histogram_peaks/Malai_-_Travis_Scott_-_SICKO_MODE_feat._Drake_Insane_2021-05-29_Osu.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/3_histogram_peaks/Malai_-_Travis_Scott_-_SICKO_MODE_feat._Drake_Insane_2021-05-29_Osu.osr
--------------------------------------------------------------------------------
/tests/resources/legit/3_histogram_peaks/replay-osu_2520609_3690741716.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/3_histogram_peaks/replay-osu_2520609_3690741716.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit-1.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit-10.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit-10.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit-11.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit-11.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit-12.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit-12.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit-2.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit-3.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit-3.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit-4.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit-4.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit-5.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit-5.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit-6.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit-6.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit-7.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit-7.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit-8.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit-8.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit-9.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit-9.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_100fps_30s_map_no_keypresses_nm.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_100fps_30s_map_no_keypresses_nm.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_100fps_30s_map_with_keypresses_nm.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_100fps_30s_map_with_keypresses_nm.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_100fps_98s_map_no_keypresses_nm-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_100fps_98s_map_no_keypresses_nm-1.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_100fps_98s_map_no_keypresses_nm-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_100fps_98s_map_no_keypresses_nm-2.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_120fps_dt-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_120fps_dt-1.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_120fps_dt-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_120fps_dt-2.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_120fps_nm.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_120fps_nm.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_144fps-nm.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_144fps-nm.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_144fps_dt.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_144fps_dt.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_144fps_nmrx.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_144fps_nmrx.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_1peak_nm.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_1peak_nm.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_1peak_short_frames_from_break_nm.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_1peak_short_frames_from_break_nm.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_288fps_dt.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_288fps_dt.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_2peaks_dtrx.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_2peaks_dtrx.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_2peaks_nm-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_2peaks_nm-1.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_2peaks_nm-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_2peaks_nm-2.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_2peaks_short_frames_from_break_nm.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_2peaks_short_frames_from_break_nm.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_3peaks_dt-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_3peaks_dt-1.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_3peaks_dt-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_3peaks_dt-2.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_3peaks_dtrx.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_3peaks_dtrx.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_3peaks_nm-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_3peaks_nm-1.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_frametime-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_frametime-1.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_frametime-10.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_frametime-10.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_frametime-11.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_frametime-11.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_frametime-12.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_frametime-12.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_frametime-13.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_frametime-13.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_frametime-14.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_frametime-14.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_frametime-15.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_frametime-15.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_frametime-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_frametime-2.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_frametime-3.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_frametime-3.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_frametime-4.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_frametime-4.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_frametime-5.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_frametime-5.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_frametime-6.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_frametime-6.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_frametime-7.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_frametime-7.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_frametime-8.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_frametime-8.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_frametime-9.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_frametime-9.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_lots_of_lag_frames_dt.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_lots_of_lag_frames_dt.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_lots_of_lag_frames_nm-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_lots_of_lag_frames_nm-1.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_lots_of_lag_frames_nm-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_lots_of_lag_frames_nm-2.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_lots_of_short_frames_really_messy_nm.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_lots_of_short_frames_really_messy_nm.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_old_replay_dt.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_old_replay_dt.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_old_replay_ht.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_old_replay_ht.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-1.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-10.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-10.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-11.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-11.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-12.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-12.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-13.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-13.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-14.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-14.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-15.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-15.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-16.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-16.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-17.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-17.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-18.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-18.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-19.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-19.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-2.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-20.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-20.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-21.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-21.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-22.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-22.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-23.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-23.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-24.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-24.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-3.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-3.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-4.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-4.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-5.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-5.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-6.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-6.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-7.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-7.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-8.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-8.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_snaps-9.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_snaps-9.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_triangle_shape_really_messy_dt-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_triangle_shape_really_messy_dt-1.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_triangle_shape_really_messy_dt-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_triangle_shape_really_messy_dt-2.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_unlimited_fps_dt-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_unlimited_fps_dt-1.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_unlimited_fps_dt-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_unlimited_fps_dt-2.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_unlimited_fps_nm-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_unlimited_fps_nm-1.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_unlimited_fps_nm-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_unlimited_fps_nm-2.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_unlimited_fps_nm-3.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_unlimited_fps_nm-3.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_wide_peak_dt.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_wide_peak_dt.osr
--------------------------------------------------------------------------------
/tests/resources/legit/legit_wide_peak_long_map_nm.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/legit_wide_peak_long_map_nm.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_frametime_old/replay-osu_16266_138416739.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_frametime_old/replay-osu_16266_138416739.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_frametime_old/replay-osu_22993_236660902.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_frametime_old/replay-osu_22993_236660902.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_frametime_old/replay-osu_24722_433541214.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_frametime_old/replay-osu_24722_433541214.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_frametime_old/replay-osu_26502_203747354.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_frametime_old/replay-osu_26502_203747354.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_frametime_old/replay-osu_26799_401403603.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_frametime_old/replay-osu_26799_401403603.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_frametime_old/replay-osu_86044_552532194.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_frametime_old/replay-osu_86044_552532194.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_histogram_peak/replay-osu_2261702_3613908998.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_histogram_peak/replay-osu_2261702_3613908998.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_histogram_peak/replay-osu_2397803_3626238208.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_histogram_peak/replay-osu_2397803_3626238208.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_1352234_2953940624.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_1352234_2953940624.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_1352234_3354603437.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_1352234_3354603437.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_16266_756655679.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_16266_756655679.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_16266_815970815.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_16266_815970815.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_1817356_3004221396.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_1817356_3004221396.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_1817356_3396967055.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_1817356_3396967055.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_1871291_3218608210.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_1871291_3218608210.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_1871291_3222258037.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_1871291_3222258037.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_1909836_3099438014.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_1909836_3099438014.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_1909836_3586026443.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_1909836_3586026443.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_2505634_3170492636.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_2505634_3170492636.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_2505634_3301915571.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_2505634_3301915571.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_2510846_3519733477.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_2510846_3519733477.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_2510846_3576606916.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_2510846_3576606916.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_2511210_3293960241.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_2511210_3293960241.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_2511210_3597195342.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_2511210_3597195342.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_2513983_3438227958.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_2513983_3438227958.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_2513983_3531785446.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_2513983_3531785446.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_2528044_3431786037.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_2528044_3431786037.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_2528044_3583239446.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_2528044_3583239446.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_2544530_3381338195.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_2544530_3381338195.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_2544530_3517917994.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_2544530_3517917994.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_2635266_3298780630.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_2635266_3298780630.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_2635266_3302908426.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_2635266_3302908426.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_2665747_3550690802.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_2665747_3550690802.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_2665747_3562357907.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_2665747_3562357907.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_2769504_3439027349.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_2769504_3439027349.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_2769504_3509136743.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_2769504_3509136743.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_341_1503979225.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_341_1503979225.osr
--------------------------------------------------------------------------------
/tests/resources/legit/low_similarity/replay-osu_341_944992613.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/low_similarity/replay-osu_341_944992613.osr
--------------------------------------------------------------------------------
/tests/resources/legit/replay-osu_1049018_3681047610.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/legit/replay-osu_1049018_3681047610.osr
--------------------------------------------------------------------------------
/tests/resources/other/empty_replay_data.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/other/empty_replay_data.osr
--------------------------------------------------------------------------------
/tests/resources/relax_cheated/blatant/relax_cheated-4.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/relax_cheated/blatant/relax_cheated-4.osr
--------------------------------------------------------------------------------
/tests/resources/relax_cheated/blatant/replay-osu_1373950_2900807505.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/relax_cheated/blatant/replay-osu_1373950_2900807505.osr
--------------------------------------------------------------------------------
/tests/resources/relax_cheated/blatant/replay-osu_1617643_2750716353.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/relax_cheated/blatant/replay-osu_1617643_2750716353.osr
--------------------------------------------------------------------------------
/tests/resources/relax_cheated/relax_cheated-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/relax_cheated/relax_cheated-1.osr
--------------------------------------------------------------------------------
/tests/resources/relax_cheated/relax_cheated-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/relax_cheated/relax_cheated-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-1-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-1-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-1-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-1-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-10-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-10-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-10-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-10-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-100-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-100-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-100-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-100-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-101-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-101-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-101-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-101-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-102-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-102-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-102-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-102-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-103-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-103-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-103-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-103-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-104-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-104-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-104-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-104-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-105-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-105-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-105-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-105-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-106-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-106-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-106-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-106-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-107-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-107-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-107-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-107-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-108-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-108-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-108-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-108-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-109-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-109-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-109-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-109-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-11-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-11-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-11-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-11-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-110-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-110-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-110-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-110-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-111-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-111-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-111-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-111-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-112-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-112-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-112-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-112-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-113-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-113-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-113-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-113-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-114-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-114-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-114-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-114-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-115-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-115-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-115-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-115-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-116-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-116-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-116-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-116-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-117-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-117-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-117-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-117-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-118-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-118-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-118-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-118-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-119-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-119-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-119-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-119-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-12-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-12-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-12-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-12-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-120-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-120-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-120-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-120-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-121-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-121-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-121-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-121-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-122-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-122-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-122-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-122-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-123-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-123-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-123-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-123-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-124-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-124-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-124-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-124-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-125-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-125-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-125-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-125-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-126-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-126-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-126-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-126-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-127-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-127-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-127-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-127-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-128-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-128-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-128-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-128-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-129-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-129-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-129-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-129-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-13-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-13-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-13-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-13-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-130-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-130-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-130-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-130-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-131-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-131-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-131-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-131-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-132-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-132-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-132-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-132-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-133-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-133-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-133-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-133-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-134-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-134-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-134-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-134-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-135-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-135-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-135-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-135-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-136-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-136-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-136-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-136-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-137-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-137-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-137-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-137-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-138-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-138-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-138-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-138-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-139-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-139-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-139-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-139-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-14-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-14-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-14-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-14-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-140-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-140-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-140-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-140-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-141-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-141-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-141-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-141-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-142-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-142-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-142-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-142-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-143-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-143-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-143-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-143-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-144-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-144-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-144-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-144-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-145-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-145-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-145-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-145-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-146-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-146-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-146-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-146-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-15-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-15-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-15-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-15-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-16-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-16-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-16-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-16-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-17-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-17-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-17-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-17-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-18-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-18-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-18-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-18-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-19-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-19-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-19-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-19-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-2-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-2-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-2-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-2-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-20-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-20-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-20-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-20-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-21-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-21-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-21-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-21-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-22-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-22-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-22-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-22-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-23-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-23-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-23-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-23-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-24-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-24-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-24-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-24-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-25-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-25-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-25-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-25-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-26-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-26-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-26-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-26-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-27-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-27-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-27-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-27-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-28-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-28-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-28-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-28-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-29-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-29-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-29-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-29-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-3-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-3-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-3-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-3-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-30-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-30-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-30-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-30-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-31-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-31-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-31-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-31-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-32-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-32-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-32-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-32-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-33-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-33-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-33-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-33-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-34-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-34-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-34-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-34-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-35-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-35-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-35-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-35-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-36-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-36-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-36-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-36-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-37-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-37-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-37-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-37-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-38-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-38-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-38-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-38-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-39-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-39-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-39-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-39-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-4-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-4-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-4-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-4-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-40-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-40-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-40-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-40-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-41-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-41-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-41-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-41-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-42-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-42-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-42-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-42-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-43-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-43-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-43-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-43-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-44-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-44-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-44-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-44-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-45-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-45-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-45-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-45-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-46-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-46-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-46-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-46-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-47-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-47-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-47-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-47-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-48-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-48-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-48-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-48-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-49-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-49-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-49-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-49-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-5-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-5-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-5-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-5-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-50-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-50-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-50-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-50-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-51-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-51-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-51-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-51-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-52-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-52-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-52-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-52-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-53-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-53-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-53-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-53-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-54-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-54-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-54-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-54-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-55-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-55-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-55-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-55-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-56-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-56-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-56-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-56-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-57-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-57-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-57-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-57-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-58-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-58-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-58-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-58-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-59-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-59-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-59-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-59-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-6-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-6-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-6-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-6-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-60-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-60-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-60-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-60-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-61-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-61-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-61-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-61-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-62-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-62-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-62-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-62-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-63-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-63-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-63-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-63-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-64-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-64-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-64-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-64-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-65-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-65-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-65-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-65-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-66-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-66-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-66-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-66-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-67-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-67-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-67-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-67-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-68-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-68-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-68-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-68-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-69-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-69-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-69-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-69-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-7-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-7-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-7-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-7-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-70-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-70-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-70-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-70-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-71-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-71-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-71-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-71-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-72-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-72-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-72-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-72-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-73-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-73-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-73-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-73-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-74-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-74-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-74-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-74-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-75-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-75-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-75-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-75-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-76-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-76-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-76-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-76-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-77-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-77-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-77-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-77-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-78-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-78-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-78-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-78-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-79-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-79-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-79-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-79-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-8-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-8-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-8-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-8-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-80-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-80-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-80-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-80-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-81-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-81-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-81-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-81-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-82-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-82-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-82-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-82-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-83-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-83-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-83-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-83-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-84-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-84-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-84-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-84-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-85-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-85-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-85-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-85-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-86-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-86-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-86-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-86-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-87-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-87-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-87-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-87-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-88-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-88-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-88-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-88-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-89-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-89-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-89-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-89-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-9-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-9-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-9-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-9-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-90-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-90-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-90-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-90-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-91-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-91-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-91-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-91-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-92-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-92-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-92-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-92-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-93-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-93-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-93-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-93-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-94-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-94-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-94-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-94-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-95-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-95-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-95-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-95-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-96-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-96-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-96-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-96-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-97-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-97-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-97-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-97-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-98-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-98-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-98-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-98-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-99-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-99-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-99-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-99-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-high-sim-1-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-high-sim-1-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-high-sim-1-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-high-sim-1-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-time-shifted-1-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-time-shifted-1-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-time-shifted-1-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-time-shifted-1-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-time-shifted-2-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-time-shifted-2-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-time-shifted-2-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-time-shifted-2-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-time-shifted-3-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-time-shifted-3-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-time-shifted-3-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-time-shifted-3-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-time-shifted-4-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-time-shifted-4-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-time-shifted-4-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-time-shifted-4-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-time-shifted-5-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-time-shifted-5-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen-time-shifted-5-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen-time-shifted-5-2.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen_remod-1-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen_remod-1-1.osr
--------------------------------------------------------------------------------
/tests/resources/stealing/stolen_remod-1-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stealing/stolen_remod-1-2.osr
--------------------------------------------------------------------------------
/tests/resources/stolen_replay1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stolen_replay1.osr
--------------------------------------------------------------------------------
/tests/resources/stolen_replay2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/stolen_replay2.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/replay-osu_1617643_3616134026.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/replay-osu_1617643_3616134026.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/replay-osu_1619564_3542160594.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/replay-osu_1619564_3542160594.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/replay-osu_1627149_3504526013.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/replay-osu_1627149_3504526013.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/replay-osu_1627149_3568354130.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/replay-osu_1627149_3568354130.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/replay-osu_1627149_3569654267.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/replay-osu_1627149_3569654267.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/replay-osu_1627149_3604376654.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/replay-osu_1627149_3604376654.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/replay-osu_1627149_3616523285.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/replay-osu_1627149_3616523285.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/replay-osu_1627149_3620632389.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/replay-osu_1627149_3620632389.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/replay-osu_1627149_3628388697.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/replay-osu_1627149_3628388697.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/replay-osu_1627149_3630701927.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/replay-osu_1627149_3630701927.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/replay-osu_1627149_3633640709.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/replay-osu_1627149_3633640709.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/replay-osu_1827412_3633264590.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/replay-osu_1827412_3633264590.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/replay-osu_1936782_3597057114.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/replay-osu_1936782_3597057114.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/replay-osu_2156323_3124536556.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/replay-osu_2156323_3124536556.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/replay-osu_2204925_3620893121.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/replay-osu_2204925_3620893121.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/replay-osu_2421268_3503295355.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/replay-osu_2421268_3503295355.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/replay-osu_2580525_3625505463.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/replay-osu_2580525_3625505463.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/replay-osu_655468_3606599780.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/replay-osu_655468_3606599780.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/replay-osu_848233_3606931282.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/replay-osu_848233_3606931282.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/replay-osu_848235_3599791477.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/replay-osu_848235_3599791477.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/timewarped-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/timewarped-1.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/timewarped-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/timewarped-2.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/timewarped-3.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/timewarped-3.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/timewarped-4.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/timewarped-4.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/timewarped_144fps_90%_dt.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/timewarped_144fps_90%_dt.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/timewarped_144fps_90%_nm.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/timewarped_144fps_90%_nm.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/timewarped_144fps_90%_nmrx.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/timewarped_144fps_90%_nmrx.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/timewarped_144fps_95%_dt.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/timewarped_144fps_95%_dt.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/timewarped_144fps_95%_nm.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/timewarped_144fps_95%_nm.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/timewarped_unlimitedfps_90%_dt-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/timewarped_unlimitedfps_90%_dt-1.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/timewarped_unlimitedfps_90%_dt-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/timewarped_unlimitedfps_90%_dt-2.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/timewarped_unlimitedfps_90%_nm-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/timewarped_unlimitedfps_90%_nm-1.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/timewarped_unlimitedfps_90%_nm-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/timewarped_unlimitedfps_90%_nm-2.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/timewarped_unlimitedfps_90%_nm-3.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/timewarped_unlimitedfps_90%_nm-3.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/timewarped_unlimitedfps_95%_dt-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/timewarped_unlimitedfps_95%_dt-1.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/timewarped_unlimitedfps_95%_dt-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/timewarped_unlimitedfps_95%_dt-2.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/timewarped_unlimitedfps_95%_nm-1.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/timewarped_unlimitedfps_95%_nm-1.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/timewarped_unlimitedfps_95%_nm-2.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/timewarped_unlimitedfps_95%_nm-2.osr
--------------------------------------------------------------------------------
/tests/resources/timewarped/timewarped_unlimitedfps_95%_nm-3.osr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/circleguard/circlecore/7087e8862895c115d769f5fdf15d9b187832e57e/tests/resources/timewarped/timewarped_unlimitedfps_95%_nm-3.osr
--------------------------------------------------------------------------------
/tests/test_keyless_circleguard.py:
--------------------------------------------------------------------------------
1 | import pytest
2 | from circleguard import (
3 | KeylessCircleguard,
4 | Map,
5 | MapUser,
6 | Mod,
7 | ReplayMap,
8 | ReplayPath,
9 | User,
10 | )
11 | from tests.utils import RES
12 |
13 | kcg = KeylessCircleguard()
14 |
15 |
16 | def test_loading_replaypath():
17 | r = ReplayPath(RES / "example_replay.osr")
18 | kcg.load(r)
19 | with pytest.raises(ValueError):
20 | r.map_id
21 | with pytest.raises(ValueError):
22 | r.user_id
23 | assert r.mods == Mod.HD + Mod.DT
24 | assert r.replay_id == 2029801532
25 | assert r.username == "MarthXT"
26 | assert r.loaded
27 |
28 |
29 | def test_loading_other_loadables():
30 | r = ReplayMap(221777, 2757689)
31 | m = Map(221777, "1")
32 | u = User(12092800, "1")
33 | mu = MapUser(221777, 12092800, "1")
34 | with pytest.raises(ValueError):
35 | kcg.load(r)
36 | with pytest.raises(ValueError):
37 | kcg.load(m)
38 | with pytest.raises(ValueError):
39 | kcg.load_info(m)
40 | with pytest.raises(ValueError):
41 | kcg.load(u)
42 | with pytest.raises(ValueError):
43 | kcg.load_info(u)
44 | with pytest.raises(ValueError):
45 | kcg.load(mu)
46 | with pytest.raises(ValueError):
47 | kcg.load_info(mu)
48 |
--------------------------------------------------------------------------------
/tests/test_loader.py:
--------------------------------------------------------------------------------
1 | import pytest
2 | from circleguard import InvalidKeyException, Loader
3 | from tests.utils import loader
4 |
5 |
6 | def test_loading_map_id():
7 | result = loader.map_id("E")
8 | assert result == 0
9 |
10 | result = loader.map_id("9d0a8fec2fe3f778334df6bdc60b113c")
11 | assert result == 221777
12 |
13 |
14 | def test_loading_user_id():
15 | result = loader.user_id("E")
16 | assert result == 0
17 |
18 | result = loader.user_id("] [")
19 | assert result == 13506780
20 |
21 | result = loader.user_id("727")
22 | assert result == 10750899
23 |
24 |
25 | def test_loading_username():
26 | result = loader.username(0)
27 | assert result == ""
28 |
29 | result = loader.username(13506780)
30 | assert result == "] ["
31 |
32 |
33 | def test_incorrect_key():
34 | loader = Loader("incorrect key")
35 | with pytest.raises(InvalidKeyException):
36 | loader.username(13506780)
37 | with pytest.raises(InvalidKeyException):
38 | loader.user_id("] [")
39 | with pytest.raises(InvalidKeyException):
40 | loader.map_id("9d0a8fec2fe3f778334df6bdc60b113c")
41 |
--------------------------------------------------------------------------------
/tests/test_mod.py:
--------------------------------------------------------------------------------
1 | import pytest
2 | from circleguard import Mod, fuzzy_mods
3 |
4 |
5 | def test_mod_string_parsing():
6 | # one normal, one "special" (nc and pf), and one multimod mod
7 | assert Mod("HD") == Mod.HD
8 | assert Mod("NC") == Mod.NC
9 | assert Mod("SOHDDT") == Mod.HD + Mod.DT + Mod.SO
10 |
11 | with pytest.raises(ValueError):
12 | Mod("DTH")
13 | with pytest.raises(ValueError):
14 | Mod("DH")
15 |
16 |
17 | def test_mod_str_list_parsing():
18 | assert Mod(["HD"]) == Mod.HD
19 | assert Mod(["NC"]) == Mod.NC
20 | assert Mod(["SO", "HD", "DT"]) == Mod.HD + Mod.DT + Mod.SO
21 | assert Mod(["SOHD", "DT"]) == Mod.HD + Mod.DT + Mod.SO
22 | assert Mod(["SOHDDT"]) == Mod.HD + Mod.DT + Mod.SO
23 | assert Mod(["HD", "SODT"]) == Mod.HD + Mod.DT + Mod.SO
24 |
25 | with pytest.raises(ValueError):
26 | Mod(["DTH"])
27 | with pytest.raises(ValueError):
28 | Mod(["DH"])
29 | with pytest.raises(ValueError):
30 | Mod(["DH", 0])
31 |
32 |
33 | def test_equality_reflexivity():
34 | assert Mod("NC") == Mod("NC")
35 |
36 |
37 | def test_mod_ordering():
38 | assert Mod("DTHDSO") == Mod("SOHDDT")
39 | assert Mod("DTHR").long_name() == Mod("HRDT").long_name()
40 | assert Mod("SOAPFLEZ").short_name() == Mod("EZSOFLAP").short_name()
41 |
42 | assert Mod("HD").short_name() == "HD"
43 | assert Mod("HR").long_name() == "HardRock"
44 | assert Mod("DTHR").long_name() == "DoubleTime HardRock"
45 | assert Mod("HRDT").long_name() == "DoubleTime HardRock"
46 |
47 |
48 | def test_fuzzy_mod():
49 | mods = fuzzy_mods(Mod.HD, [Mod.DT, Mod.EZ])
50 | assert mods == [Mod.HD, Mod.HDDT, Mod.HD + Mod.EZ, Mod.HD + Mod.EZ + Mod.DT]
51 |
52 | mods = fuzzy_mods(Mod.HD, [Mod.DT])
53 | assert mods == [Mod.HD, Mod.HD + Mod.DT]
54 |
55 | mods = fuzzy_mods(Mod.NM, [Mod.DT, Mod.EZ])
56 | assert mods == [Mod.NM, Mod.DT, Mod.EZ, Mod.DT + Mod.EZ]
57 |
--------------------------------------------------------------------------------
/tests/utils.py:
--------------------------------------------------------------------------------
1 | import os
2 | from pathlib import Path
3 |
4 | from circleguard import Circleguard, Loader
5 |
6 | KEY = os.environ.get("OSU_API_KEY")
7 | if not KEY:
8 | KEY = input("Enter your api key: ")
9 |
10 | RES = Path(__file__).parent / "resources"
11 | # disabled for now
12 | # set_options(loglevel=20)
13 |
14 | # what precision we want to guarantee for our tests
15 | DELTA = 0.00001
16 | # osu! only shows ur to two decimals, so we only guarantee precision to there
17 | UR_DELTA = 0.01
18 | # threshold for frametime
19 | FRAMETIME_LIMIT = 13
20 |
21 |
22 | cg = Circleguard(KEY, db_path=Path(__file__).parent / "cache.db")
23 | cg_no_cache = Circleguard(KEY)
24 | loader = Loader(KEY)
25 |
--------------------------------------------------------------------------------