[HN Gopher] I recreated Shazam's algorithm with Go
___________________________________________________________________
I recreated Shazam's algorithm with Go
Author : ccgzirim
Score : 294 points
Date : 2024-08-01 10:29 UTC (12 hours ago)
(HTM) web link (github.com)
(TXT) w3m dump (github.com)
| KomoD wrote:
| If you insert Spotify songs, wouldn't it make more sense to
| output Spotify songs too?
| ccgzirim wrote:
| It would actually. But Spotify doesn't allow direct downloads
| so I had to find the songs on YouTube and download them from
| there.
| written-beyond wrote:
| You're a G
| crtasm wrote:
| Note that YouTube's ToS doesn't allow this either, be aware
| what you're potentially getting into by releasing a tool that
| rips music from there.
| lucb1e wrote:
| Uploaders can choose a video license. Since there is no
| download button for those videos, I've always wondered if
| that is a creative commons' violation and therefore Youtube
| should run into the same legal issue that StackOverflow
| currently is (ctrl+f "violat" https://meta.stackexchange.co
| m/questions/401324/announcing-a...), namely that this
| terminated google's (but nobody else's) license to use the
| video under creative commons
| vegabook wrote:
| Recently found Shazam is less accurate - somehow soundhound is
| giving me better results. On Shazam I'm getting a lot of results
| from Asian musical traditions which is great, if it wasn't the
| wrong song. Maybe they need to improve the algo if they've
| increased the range of music they will select from? Seems now
| there's a lot more hash table collision[1]. [1]
| https://github.com/cgzirim/not-shazam?tab=readme-ov-
| file#resources--card_file_box
| cglan wrote:
| Soundhound has always been better than Shazam. It can even pick
| up people singing and extremely quiet songs
| jedberg wrote:
| In my sample of one song, I have to disagree. I played
| Watermelon by Mezerg, which is admittedly not very popular,
| and Soundhound couldn't get it with two tries, but Shazam
| picked it up in less than two seconds.
| robbomacrae wrote:
| I work at SoundHound. If it didn't get it in two tries it's
| likely we didn't have that song in the database. Both
| Shazam and SH have knowledge gaps.
| IndySun wrote:
| I've championed Soundhound but it has literally stopped
| working (finding any tune) on my iphone. I've
| reinstalled, still nothing. It does not appear to 'hear'
| anything.
| bsder wrote:
| Shazam seems to have a _way_ bigger database than Soundhound.
|
| For a while, it seems like Soundhound was about to shut down.
| It wouldn't match anything released in the last 12-18 months,
| but that seems to be fixed.
| lucgommans wrote:
| I compared Shazam's, SoundHound's, and BeatFind's recognition
| library in August 2021. (And tried MusixMatch but it crashed on
| startup apparently.) Don't think I published it anywhere, these
| are my raw notes I found among saved chat messages. The format
| is starting to make more sense now that I'm putting it into a
| wider window than a chat screen, so I can recommend using a
| wide browser (94 characters per line should do it). Eyeing the
| song choices, it looks like I tried to find different genres
| and artist types (ccMixer/youtube celebrities, to indie, to
| established) but a larger sample size would obviously have been
| even better. Still, I hope it's one step up from adding another
| random opinion!
|
| The conclusion appears to be that BeatFind and Shazam know the
| most songs, but are also somewhat complementary and all of the
| services had at least one song they uniquely recognised.
|
| --- Fun facts: * Night Driver (W)
| said "1 Shazams". I think I was the first person to ever Shazam
| that. Some of the most obscure things had hundreds, often
| thousands of shazams! * You know where they are taking
| the hobbits but none of the services do! ========
| - ABC = found the song - # = number of attempts
| - f = exceptionally fast matching (when it did match, might not
| be first attempt) - ~ = knew one of the songs
| BeatFind: 2B C 1E 2G 2H 1I 2Jf 2Lf 4M 2Nf 2Of 1Pf
| 1Rf ~S 2T 1Uf 1Vf 1W 1Xf Y Z SoundHound: A 1B
| 1E 2F 1G 2H 2If 1L 2O 3P 2R 1Tf 2U
| Shazam: 1Bf 1D 1E 1F 1G 1Hf 1I 2J 1L 1M 4N 1O 1Pf
| 1Rf 1Tf 1Uf 1V 2W 1X Y Z MusixMatch: crashes on
| startup, presumably it realizes it won't be able to show me ads
| missingno Shazam: A C K Q S SoundHound: C D
| F J K M/N Q S V W X Y Z BeatFind: A D F K Q
| non-universal finds (repeated letter = unique = counts double;
| slash means same artist so should be counted as one)
| Shazam: DD F J M/N V X Y Z SoundHound: AA F
| BeatFind: CC J M/N S V X Y Z A: Levan Polkka
| Epic Orchestral Cover version B: Pokemon red/blue
| soundtrack C: Mayhem (various songs, it seems either
| they have all or they have none) D: Art Now ft.
| Snowflake E: Hero's Choice F: Three Days Grace
| - Scared G: Syrian - Supernova H: The Explosion
| - Here I Am I: The Von Bondies - C'mon C'mon J:
| Frank Klepacki - Scouting (C&C TibSun) K: Conspiracy -
| Chaos Theory (demoscene) L: Cheshyre - Madness6 (remix)
| (Newgrounds ID 77998) M: Dimrain47 - Twilight Techno
| N: Dimrain47 - Cloud Control O: DragonForce - My Spirit
| Will Go On P: Yuki Kajiura - The First Town (SAO)
| Q: THEY'RE TAKING THE HOBBITS TO ISENGARD! THE HOBBITS- THE
| HOBBITS- TO ISENGARD! TO ISENGARD! R: Faithless -
| Insomnia S: Age of Empires 1 soundtrack T:
| Moulin Rouge - El Tango De Roxanne U: Van Canto -
| Master of Puppets V: Slack Bird - Jouni W:
| Floppytronic - Night Driver X: EgoSalad / Kitboga -
| Breathe in Y: Floppy Drive music: top 4 hits on yt:
| sweet dreams, imperial march, ghostbusters, beat it. Only
| ghostbusters was known to any Z: Obsidian Shell -
| Orphanage
|
| ---
|
| Note that what I did not test/review introducing noise (like
| people talking through it) or filtering (like when you hear the
| music through a wall)
| hactually wrote:
| really decent and nicely done Golang! I'll pull and play with it
| tomorrow!
| ccgzirim wrote:
| Thanks! I appreciate the compliment on my Golang; This is
| actually my first full-fledged project with the language, haha.
| Feel free to reach out if you have any issues running it.
| halfmatthalfcat wrote:
| FYI - If this is a true reproduction of Shazam, it's under patent
| by Apple through at least March 2025[1].
|
| [1] https://patents.google.com/patent/US7627477
| amelius wrote:
| Figure 1 looks interesting since it has both a time and
| frequency axis, when usually signals have either a time __or__
| frequency axis.
|
| Now I'm curious how the Fourier (?) transform of a signal at a
| __single__ given timepoint is even defined ...
| jamessb wrote:
| The concepts you are looking for are the short-time Fourier
| transform and spectrogram:
|
| https://en.wikipedia.org/wiki/Short-time_Fourier_transform
|
| https://en.wikipedia.org/wiki/Spectrogram
| earthnail wrote:
| Jamessb already linked to the right terms. One thing to add
| is that there is always a tradeoff between time and frequency
| resolution on short time Fourier transforms. You just can't
| have both. It's always a somewhat unsatisfying tradeoff that
| still works well in practice.
| 01HNNWZ0MV43FF wrote:
| I found this out when I was trying to turn an ordinary 5
| dollar thrifted musical keyboard into a midi controller by
| plugging it into my PC, putting it on "sine wave" and using
| a Goertzel detector
|
| The latency for detecting audio-frequency waves is quite
| bad
|
| This also stymied my desire to put digital audio onto a
| vinyl record :( literally not enough bandwidth
| VierScar wrote:
| I dunno how software patents work but I was under the
| impression that unless you basically copy paste their code, the
| courts wouldn't consider it patent infringement as you can't
| patent the function, but rather the specific thing itself which
| for software is the exact code itself. But if I'm not
| understanding something please correct me.
| amelius wrote:
| This cannot be true because if you copied a physical design
| and made a few irrelevant modifications then it's still
| infringement.
| wlesieutre wrote:
| You're thinking of copyright, which covers a specific
| creative expression. Patents are more general on how
| something is done and would cover different code that works
| the same way.
| dawnerd wrote:
| Overly simplistic: patents is the process not strictly
| design.
|
| Edit: just to be clear there are design patents too, but I
| don't think they'd be granted for software.
| mcfedr wrote:
| Software patents are magic, you just start your process with
| 'on a computer do X' and because computers are a piece of
| hardware you can patent anything you like
| maeln wrote:
| So not enforceable anywhere else than in the U.S.
| colejohnson66 wrote:
| There are other patents for their implementation, and all are
| filed in multiple countries. Look at the blue sidebar under
| "Worldwide applications".
|
| The linked one is just for the US version of a singular
| patent. It had applications in 14 other countries and WIPO, 6
| of which are still active (plus US).
| concerndc1tizen wrote:
| Any seller of software would be liable for selling software
| to US customers without a patent license.
|
| I'm curious about the legal consequences of freely
| distributed software (e.g. open source). I wonder if the
| author/provider could be held liable if they: - knowingly
| (passively) or actively market to US customers (e.g. provide
| support) - are aware that US users are using it, and take no
| actions to prevent its distribution etc.
|
| Can someone share their knowledge on this?
|
| If European software incidentally infringes a US patent, and
| it is distributed freely, is the provider then liable? E.g.
| is Github basically liable for restricting US users from
| access to (distributing) patent infringing software?
| kube-system wrote:
| As I understand, you can violate a patent just by importing
| something infringing. Selling it isn't necessarily a
| requirement for infringement.
|
| https://blog.shp.law/index.php/2021/03/28/open-source-
| softwa...
|
| I'm sure there's tons of patent violations in FOSS, but
| patents are usually just used to go after companies with
| big pockets.
| throwaway2562 wrote:
| Soon!
| shoggouth wrote:
| I was under the impression that patents aren't enforceable on
| open source projects. I assume I am wrong?
| colejohnson66 wrote:
| Yes. Just because something is open source doesn't mean it's
| unbound by IP laws.
| ndriscoll wrote:
| It's not whether "IP" laws apply; it's whether source code
| itself is in scope for patents. Source code is a
| description of an algorithm, which in principle is what the
| software patent is supposed to be providing anyway. Patents
| shouldn't be relevant here for the same reason they aren't
| relevant to what you write in e.g. a textbook on signal
| processing where you might find an exact description of how
| Shazam works.
|
| Compiling and running that source code on your computer/as
| part of a wider system may violate a patent, but my
| impression was that patents are not relevant to the actual
| code. Are there test cases in the US around pure source
| distribution of a patented algorithm? Particularly post-
| Alice?
| concerndc1tizen wrote:
| I wonder if the massive amount of open source software
| can now be used as elaborate 'prior art' in a way that
| basically invalidates any software patent that is awarded
| after the source had been made available?
|
| I.e. if any algorithm was already implemented, in some
| variation, then the patent is not valid?
|
| For example, for the infamous Amazon 'one click
| purchase', if a similar pattern was used, maybe a 'one
| click start vacuum cleaner robot', would it that patent
| then be invalid?
| rvnx wrote:
| Depends how much money you have.
|
| For example, Tesla just patented the Robotaxi one year
| ago, despite having open-source solutions like Apollo
| Self-Driving platform.
|
| Patents are really an obsolete system that favors the
| super-rich and the lawyers.
| lights0123 wrote:
| Patents are enforceable in the US for even personal use
| without distribution.
| Thaxll wrote:
| I remember a popular HN post from 10 years ago, that was pulled
| or the source was pulled because Shazam legally threatened the
| disclosure of the algorithm. I think it's actually the Google
| drive file pdf capture from OP's article.
| refibrillator wrote:
| Here is a link to that HN thread from 2013:
|
| https://news.ycombinator.com/item?id=5723863
| dang wrote:
| Related. Others?
|
| _How Shazam Works (2003) [pdf]_ -
| https://news.ycombinator.com/item?id=40029036 - April 2024
| (29 comments)
|
| _How does Shazam work? (2022)_ -
| https://news.ycombinator.com/item?id=38531428 - Dec 2023
| (154 comments)
|
| _An Industrial-Strength Audio Search Algorithm (2003)
| [pdf]_ - https://news.ycombinator.com/item?id=33299853 -
| Oct 2022 (1 comment)
|
| _Creating Shazam in Java (2010)_ -
| https://news.ycombinator.com/item?id=32530056 - Aug 2022
| (36 comments)
|
| _Shazam turns 20_ -
| https://news.ycombinator.com/item?id=32520593 - Aug 2022
| (227 comments)
|
| _How Shazam Works (2015)_ -
| https://news.ycombinator.com/item?id=23806142 - July 2020
| (7 comments)
|
| _Designing an audio adblocker_ -
| https://news.ycombinator.com/item?id=18855029 - Jan 2019
| (186 comments)
|
| _Show HN: A radio /podcast adblocker featuring ML and
| Shazam-like fingerprinting_ -
| https://news.ycombinator.com/item?id=18459058 - Nov 2018 (2
| comments)
|
| _Apple has completed its acquisition of Shazam_ -
| https://news.ycombinator.com/item?id=18066724 - Sept 2018
| (316 comments)
|
| _Apple Buys Shazam to Boost Apple Music_ -
| https://news.ycombinator.com/item?id=15899065 - Dec 2017
| (156 comments)
|
| _Apple is close to acquiring Shazam, sources say_ -
| https://news.ycombinator.com/item?id=15881896 - Dec 2017
| (292 comments)
|
| _Show HN: Shazam-like acoustic fingerprinting of
| continuous audio streams_ -
| https://news.ycombinator.com/item?id=15809291 - Nov 2017
| (76 comments)
|
| _How Shazam Works (2015)_ -
| https://news.ycombinator.com/item?id=15350729 - Sept 2017
| (13 comments)
|
| _Tell HN: Shazam picks up song from my kitchen light_ -
| https://news.ycombinator.com/item?id=11593305 - April 2016
| (2 comments)
|
| _How Shazam works_ -
| https://news.ycombinator.com/item?id=9870408 - July 2015
| (48 comments)
|
| _Patent infringement claim re: "Creating Shazam in Java"
| blogpost (2010)_ -
| https://news.ycombinator.com/item?id=9594480 - May 2015 (18
| comments)
|
| _The Shazam Effect (2014)_ -
| https://news.ycombinator.com/item?id=9593429 - May 2015 (37
| comments)
|
| _The Shazam Effect_ -
| https://news.ycombinator.com/item?id=8634357 - Nov 2014 (34
| comments)
|
| _Ask HN: Is there an audio search technology that finds
| exact and similar audio?_ -
| https://news.ycombinator.com/item?id=8420141 - Oct 2014 (3
| comments)
|
| _Source code example of the Shazam algorithm_ -
| https://news.ycombinator.com/item?id=5724442 - May 2013 (16
| comments)
|
| _Creating Shazam in Java_ -
| https://news.ycombinator.com/item?id=5723863 - May 2013 (43
| comments)
|
| _An Industrial-Strength Audio Search Algorithm (Shazam)_ -
| https://news.ycombinator.com/item?id=2621103 - June 2011 (4
| comments)
|
| _Shazam 's Search for Songs Creates New Music Jobs_ -
| https://news.ycombinator.com/item?id=2215295 - Feb 2011 (1
| comment)
|
| _How does the music-identifying app Shazam work its
| magic?_ - https://news.ycombinator.com/item?id=2214992 -
| Feb 2011 (2 comments)
|
| _How Shazam Works To Identify (Nearly) Every Song You
| Throw At It_ - https://news.ycombinator.com/item?id=1727891
| - Sept 2010 (1 comment)
|
| _Implementing Shazam with Java in a weekend_ -
| https://news.ycombinator.com/item?id=1702975 - Sept 2010
| (23 comments)
|
| _Shazam: not magic after all_ -
| https://news.ycombinator.com/item?id=909263 - Oct 2009 (28
| comments)
|
| _How does the music-identifying app Shazam work its
| magic?_ - https://news.ycombinator.com/item?id=893353 - Oct
| 2009 (16 comments)
|
| _Shazam Has 50 Million Users and Secures Investment From
| KPCB_ - https://news.ycombinator.com/item?id=882537 - Oct
| 2009 (13 comments)
| dang wrote:
| Thanks! Macroexpanded:
|
| _Creating Shazam in Java (2010)_ -
| https://news.ycombinator.com/item?id=32530056 - Aug 2022
| (36 comments)
|
| _Patent infringement claim re: "Creating Shazam in Java"
| blogpost (2010)_ -
| https://news.ycombinator.com/item?id=9594480 - May 2015 (18
| comments)
|
| _Creating Shazam in Java_ -
| https://news.ycombinator.com/item?id=5723863 - May 2013 (43
| comments)
|
| _Implementing Shazam with Java in a weekend_ -
| https://news.ycombinator.com/item?id=1702975 - Sept 2010
| (23 comments)
|
| Longer list of relateds here:
| https://news.ycombinator.com/item?id=41132462.
| Someone wrote:
| "An Industrial-Strength Audio Search Algorithm", the paper
| where Shazam describes their algorithm
| (https://www.ee.columbia.edu/~dpwe/papers/Wang03-shazam.pdf)
| doesn't have a clear publication date, but
| https://www.researchgate.net/publication/220723446_An_Indust...
| indicates it is from 2003.
|
| That patent was filed in the US on 2004-10-21.
|
| IANAL, but to me, that's a point against that patent in the
| USA.
| kajecounterhack wrote:
| How is it a point against the patent if the paper was written
| by someone under the employment of Shazam? Isn't the point of
| the patent to award the innovator with the right to profit
| from the innovation?
| mgillett54 wrote:
| You only get a one year grace period after first public
| discloser to file for a patent in the US. So if the dates
| in this scenario are: - paper in 2003 - patent 2004-10-21
|
| Only if the paper was released between 2003-10-22 and
| 2003-12-31 would it meet the one year grace period
| requirement.
|
| Looks like it's not relevant in this case since they got a
| provisional patent in 2002, but that's likely what the
| above was referring to as "a point against that patent".
| Someone wrote:
| That it was written by someone under the employment of
| Shazam makes it likely that it describes their algorithm,
| but for patent protection, what matters is that you can't
| apply for a patent for an invention that has been
| published.
|
| https://www.science.org/content/article/patent-first-
| publish...: _"According to U.S. law, a patent cannot be
| obtained if an invention was previously known or used by
| other people in the U.S., or was already patented or
| published anywhere in the world. Furthermore, publicly
| using or selling an invention more than 1 year prior to
| filing a patent application completely bars you from ever
| winning a patent on that invention.
|
| [...]
|
| In Europe, for instance, there is no 1-year grace period--
| the chances of winning patent protection is lost the
| instant an invention becomes public"_
| refibrillator wrote:
| Actually the provisional patent # 60/376,055 was filed on
| April 25 2002.
|
| So if the paper was indeed published in Oct 2003 then all is
| well.
| tkuraku wrote:
| As long as you have submitted the patent before publication
| you are good to go.
| acedTrex wrote:
| So you are saying to clone the repo now
| csmpltn wrote:
| It's:
|
| (1) deriving a simple fingerprint from the FFT of the audio
| signal
|
| (2) simple indexing
|
| (3) simple similarity search
|
| You need the signatures of all music on earth for this to work
| though ;)
| DandyDev wrote:
| Isn't the whole point of Shazam that you don't know the song and
| want to find it? If you don't know the song, hoeven you provide a
| Spotify link?
| zild3d wrote:
| this is a demo of the algorithm, not a full app / hosted
| service using it with a pre-populated database. The spotify
| link would be to fingerprint the song and add it to the
| database
| ccgzirim wrote:
| You're right. The Spotify link is used solely to get details
| about the song. These details are then used to search for and
| download the song from YouTube. Afterward, the fingerprint
| for the song is created and added to the database.
| paxys wrote:
| The idea is that you add _every_ Spotify song in the database,
| and then run your match against them.
| yazmeya wrote:
| I enjoyed this talk at the DAFx17 conference by Avery Wang, co-
| founder of Shazam. It goes a little into the theory behind the
| algorithm, and looks at some of the more practical issues
| (background noise, etc.):
| https://www.youtube.com/watch?v=YVTnj3OIhwI
| DevX101 wrote:
| Adding this to the watch list. Reading this paper was one of
| the first times I got a 'wow' moment around computing
| algorthms.
| anticristi wrote:
| I wonder how long until someone will simply smoosh a billion
| songs into a "large song model" and make all signal processing
| knowledge irrelevant.
| immibis wrote:
| You mean Suno?
| Cieric wrote:
| While the project does look nice to use and modify. I'm not sure
| I personally would have posted it yet.
|
| - The instructions seem not to be the best to get it up and
| running (e.g. "cd not-shazam" and just a few lines later "cd not-
| shazam/client")
|
| - MongoDB is needed but information on how to hook it up/use it
| are absent (I would make the DB swapable and provide something
| less intrusive like sqlite)
|
| - If replacing MongoDB is not possible, I would provide a
| dockerfile and a docker compose to allow easy startup and
| testing.
|
| - The client npm install has 8 critical vulnerabilities, these
| might not actually matter but it makes me hesitant to continue
| testing
|
| - You might not care about the patent or the copyright, but I
| would still change the name at the very least. Github itself is
| located in the US and will remove the project if they receives a
| DMCA.
|
| - Last, this might not be as important, I would add a way to add
| songs from wav files. Not everything I'd want to test this with
| is on spotify or youtube.
|
| I'm not saying this to discourage you or anything, I just think
| the project needs that little extra bit of polish. Minor things
| will cause people to discredit or ignore a project. If I get
| around to it I might make a PR for the project. I want to
| experiment with audio matching outside of the music space, and
| your project seems like it'll be the easiest to modify.
|
| Edit: Formatting
| ccgzirim wrote:
| Thank you for the time you took to provide such detailed
| feedback. I really appreciate your honest input. You've raised
| some valid points that I hadn't really considered.
|
| I agree that the project could definitely use some polishing.
| I'll prioritize improving the setup instructions and look into
| adding a file-based DB for flexibility, as well as resolving
| the npm vulnerabilities. Adding support for directly
| fingerprinting wav files is a great idea and something I'll
| prioritize, too.
|
| Regarding the project name, I understand the potential legal
| implications and will definitely change it. I'd appreciate any
| suggestions you might have.
|
| I'm excited about the possibility of your contributions.
| Please, feel free to open a PR whenever you're ready.
|
| Thanks again for your feedback!
| Philip-J-Fry wrote:
| I think you've leaked your developer key here...
| https://github.com/cgzirim/not-shazam/blob/main/spotify/yout...
| zadokshi wrote:
| Does this mean he could accidentally get a $1 million credit
| card bill from google from someone using his key without his
| permission? (I don't know how it works with google.)
| ccgzirim wrote:
| Oops... Thank you. I've disabled it.
| strongly-typed wrote:
| This is really cool. I've been itching to try building this exact
| kind of thing as part of my bucket list.
| ccgzirim wrote:
| Thanks. I'm glad it inspires you! It'd be awesome to see you
| take it on. You can clone it and develop it further.
| wmichelin wrote:
| Hardcoded sleeps for some reason, nice /s
|
| https://github.com/cgzirim/not-shazam/blob/888070f3434acbc0a...
| rvnx wrote:
| It's to go around the ban of the IP / account by Spotify and to
| be softer with them, you have to wait between two requests to
| download songs.
| euroderf wrote:
| Run it as a daemon that displays every song in a UI notification
| ?
| theabhinavdas wrote:
| You deserve reddit gold for this idea
| nwsm wrote:
| I love spyware!
| euroderf wrote:
| B-b-but... source code included !
| jokoon wrote:
| This is useless unless you have all the songs on earth
|
| Algorithm don't matter, only data matters
| nwsm wrote:
| Here we have an open-source algorithm that is useful to anyone
| with data. It doesn't have to be music
| 0cf8612b2e1e wrote:
| Although, would be curious how good you could get to isolating
| to a single artist. If you had say one exemplar fingerprint per
| artist, could an out of dataset fingerprint from their
| discography cluster to that artist? Obviously not for artists
| who transitioned musical styles.
|
| Or is the algorithm more feature hash than a clusterable
| feature vector?
| lucb1e wrote:
| That's like saying the Hutter prize is useless for anyone who
| doesn't want highly compressed versions of Wikipedia. The
| underlying code or algorithm is still interesting to study,
| use, and remix.
| msie wrote:
| I enjoyed reading the Go source. As opposed to the time I had to
| read some Ruby code.
| blackeyeblitzar wrote:
| I've heard that the Google phones have a built in music
| recognition feature that is the best implementation of this
| stuff. Anyone know what their approach was? Apart from that I
| always have felt Soundhound was better than Shazam
___________________________________________________________________
(page generated 2024-08-01 23:00 UTC)