diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..da68b1a --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +*.png filter=lfs diff=lfs merge=lfs -text +*.svg filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2f71f5d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +_site +_cache diff --git a/404.html b/404.html new file mode 100644 index 0000000..760a0d2 --- /dev/null +++ b/404.html @@ -0,0 +1,21 @@ + + + + + + + 404 - Not Found + + + + + + 404 Icon +

404 - Not Found

+

The page you're looking for doesn't exist.

+

+ Return to home or explore the site map. +

+ + + diff --git a/_cms.ts b/_cms.ts new file mode 100644 index 0000000..94f6dde --- /dev/null +++ b/_cms.ts @@ -0,0 +1,5 @@ +import lumeCMS from "lume/cms/mod.ts"; + +const cms = lumeCMS(); + +export default cms; diff --git a/_config.ts b/_config.ts new file mode 100644 index 0000000..55ac984 --- /dev/null +++ b/_config.ts @@ -0,0 +1,32 @@ +import lume from "lume/mod.ts"; +import code_highlight from "lume/plugins/code_highlight.ts"; +import feed from "lume/plugins/feed.ts"; +import date from "lume/plugins/date.ts"; +import toc from "lume_markdown_plugins/toc.ts"; +import relativeUrls from "lume/plugins/relative_urls.ts"; + +const site = lume({ + prettyUrls: false, +}).use(toc({ + slugify: { + separator: "_", + lowercase: true, + }, +})).use(relativeUrls()); + +site.use(date()); + +site.copy("/index.html"); + +site.copy("css/"); +site.copy("icons/"); +site.copy("fonts/"); +site.copy("img/"); +site.copy("js/"); +site.copy("lib/"); +site.copy("favicon.ico"); + +site.use(code_highlight()); +site.use(feed()); + +export default site; diff --git a/_includes/calendar.vto b/_includes/calendar.vto new file mode 100644 index 0000000..53eabd7 --- /dev/null +++ b/_includes/calendar.vto @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
<Month 2024>
MoTuWeThFrSaSu
1234567
1234567
891011121314
15161718192122
23242526272829
31123456
+ + + + + + + +
Today Events
Nothing special today.
\ No newline at end of file diff --git a/_includes/clock.vto b/_includes/clock.vto new file mode 100644 index 0000000..5718fb4 --- /dev/null +++ b/_includes/clock.vto @@ -0,0 +1,15 @@ +
+ +
+
+ ~~ ~~ ~~ +
+
+ +
+
\ No newline at end of file diff --git a/_includes/faq.vto b/_includes/faq.vto new file mode 100644 index 0000000..658ccb5 --- /dev/null +++ b/_includes/faq.vto @@ -0,0 +1,32 @@ + + + + + + + 1159 + + + + + + + +
+
+

mario's cave at 1159st

+ +
+
+ {{ include "navbar.vto" }} + +
+ {{ content }} +
+
+ + + \ No newline at end of file diff --git a/_includes/footer.vto b/_includes/footer.vto new file mode 100644 index 0000000..0c9db47 --- /dev/null +++ b/_includes/footer.vto @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/_includes/header.vto b/_includes/header.vto new file mode 100644 index 0000000..2ee2fde --- /dev/null +++ b/_includes/header.vto @@ -0,0 +1,10 @@ +
+
+

{{ title }}

+ +
+ {{ description }} +
\ No newline at end of file diff --git a/_includes/index.vto b/_includes/index.vto new file mode 100644 index 0000000..902d25e --- /dev/null +++ b/_includes/index.vto @@ -0,0 +1,85 @@ + + + + + + 1159 + + + + + + + + + + + + + + + + {{ include "header.vto" }} + {{ include "navbar.vto" }} + +
+

about/

+

+ + {{ content }} +

+
+
+

blog/

+

Latest posts:

+ + {{ for page of search.pages("category=post", "date=desc") }} +
+ + {{ page.title }} +
+ {{ /for }} +
+ More... +
+
+

projects/

+ +
+
+ + + + +
+

*~verse/

+

- {{ search.page("title=tildeverse").description }}

+
+ {{ search.page("title=tildeverse").content }} +
+
+

{{ search.page("title=fediverse").description }} -

+
+ {{ search.page("title=fediverse").content }} +
+
+ {{ include "footer.vto" }} + + \ No newline at end of file diff --git a/_includes/navbar.vto b/_includes/navbar.vto new file mode 100644 index 0000000..60a9e88 --- /dev/null +++ b/_includes/navbar.vto @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/_includes/post.vto b/_includes/post.vto new file mode 100644 index 0000000..b0ea5f3 --- /dev/null +++ b/_includes/post.vto @@ -0,0 +1,72 @@ + + + + + + 1159 + + + + + + +
+ + +
+
+

{{ title }}

+
+

+ Posted: + Updated: +

+

By: {{ author }}

+
+
+ + {{ content }} + + {{ include "footer.vto" }} +
+ +
+
+ Tags: +
    + {{ for tag of tags }} +
  • {{ tag }}
  • + {{ /for }} +
+
+ +
+ Table of Contents: + {{ if toc.length }} + + {{ /if }} +
+
+
+ + + \ No newline at end of file diff --git a/_includes/radio.vto b/_includes/radio.vto new file mode 100644 index 0000000..ce7b47d --- /dev/null +++ b/_includes/radio.vto @@ -0,0 +1,24 @@ +

Let's get some bits flippin' with your favorites open broadcasts.

+
+
+ +
+ ~~~~~~~~ +
+
+
+ +
+ +
+ +
+
+
\ No newline at end of file diff --git a/_includes/status.vto b/_includes/status.vto new file mode 100644 index 0000000..fb66bb2 --- /dev/null +++ b/_includes/status.vto @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + +
servicehealth
git gitdown down
media mediadown down
mail maildown down
\ No newline at end of file diff --git a/cal/anonradio.ics b/cal/anonradio.ics new file mode 100644 index 0000000..f83f520 --- /dev/null +++ b/cal/anonradio.ics @@ -0,0 +1,7403 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//aNONradio +CALSCALE:GREGORIAN +BEGIN:VEVENT +DTSTAMP:20240801T000000Z +CREATED:20240801T000000Z +DTSTART:20240801T000000Z +UID:USERFXNET31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240801T005959Z +SUMMARY:Lit Up On Linux +DESCRIPTION:Lit Up On Linux with userfxnet +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240801T000000Z +CREATED:20240801T000000Z +DTSTART:20240801T010000Z +UID:AE31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240801T015959Z +SUMMARY:Special Education +Hacker Worlds +DESCRIPTION:Special Education +Hacker Worlds with ae +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240801T000000Z +CREATED:20240801T000000Z +DTSTART:20240801T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240801T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240801T000000Z +CREATED:20240801T000000Z +DTSTART:20240801T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240801T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240801T000000Z +CREATED:20240801T000000Z +DTSTART:20240801T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240801T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240801T000000Z +CREATED:20240801T000000Z +DTSTART:20240801T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240801T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240801T000000Z +CREATED:20240801T000000Z +DTSTART:20240801T080000Z +UID:GAOLIANGCAI31080000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240801T095959Z +SUMMARY:Chinese Pop Music w/ qingfeng +DESCRIPTION:Chinese Pop Music w/ qingfeng with gaoliangcai +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240801T000000Z +CREATED:20240801T000000Z +DTSTART:20240801T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240801T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240801T000000Z +CREATED:20240801T000000Z +DTSTART:20240801T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240801T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240801T000000Z +CREATED:20240801T000000Z +DTSTART:20240801T133000Z +UID:GREGF31133000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240801T152959Z +SUMMARY:perinde ac cadaver +DESCRIPTION:perinde ac cadaver with gregf +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240801T000000Z +CREATED:20240801T000000Z +DTSTART:20240801T160000Z +UID:OAK331160000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240801T165959Z +SUMMARY:Shake Yer Booty w/ DJ Mak +DESCRIPTION:Shake Yer Booty w/ DJ Mak with oak3 +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240801T000000Z +CREATED:20240801T000000Z +DTSTART:20240801T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240801T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240801T000000Z +CREATED:20240801T000000Z +DTSTART:20240801T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240801T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240801T000000Z +CREATED:20240801T000000Z +DTSTART:20240801T190000Z +UID:MNW31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240801T192959Z +SUMMARY:News to Me +DESCRIPTION:News to Me with mnw +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240801T000000Z +CREATED:20240801T000000Z +DTSTART:20240801T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240801T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240801T000000Z +CREATED:20240801T000000Z +DTSTART:20240801T200000Z +UID:STUG31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240801T205959Z +SUMMARY:Flux +DESCRIPTION:Flux with stug +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240801T000000Z +CREATED:20240801T000000Z +DTSTART:20240801T210000Z +UID:HANDYC31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240801T215959Z +SUMMARY:Language Soup w/ DJ Supersalad +DESCRIPTION:Language Soup w/ DJ Supersalad with handyc +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240801T000000Z +CREATED:20240801T000000Z +DTSTART:20240801T220000Z +UID:RODERSB31220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240801T225959Z +SUMMARY:Pumpkin Pie w/ Mr.Brugue +DESCRIPTION:Pumpkin Pie w/ Mr.Brugue with rodersb +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240801T000000Z +CREATED:20240801T000000Z +DTSTART:20240801T230000Z +UID:THENEWS31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240801T232959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240802T000000Z +CREATED:20240802T000000Z +DTSTART:20240802T000000Z +UID:MCORNICK31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240802T005959Z +SUMMARY:Objects In Mirrors +DESCRIPTION:Objects In Mirrors with mcornick +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240802T000000Z +CREATED:20240802T000000Z +DTSTART:20240802T010000Z +UID:FFOG31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240802T015959Z +SUMMARY:myocyte +The Margin +DESCRIPTION:myocyte +The Margin with ffog +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240802T000000Z +CREATED:20240802T000000Z +DTSTART:20240802T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240802T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240802T000000Z +CREATED:20240802T000000Z +DTSTART:20240802T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240802T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240802T000000Z +CREATED:20240802T000000Z +DTSTART:20240802T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240802T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240802T000000Z +CREATED:20240802T000000Z +DTSTART:20240802T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240802T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240802T000000Z +CREATED:20240802T000000Z +DTSTART:20240802T080000Z +UID:LIQUIDDREAMZ31080000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240802T085959Z +SUMMARY:dj aTRoPiNe / dJ PoLyBiuS +DESCRIPTION:dj aTRoPiNe / dJ PoLyBiuS with liquiddreamz +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240802T000000Z +CREATED:20240802T000000Z +DTSTART:20240802T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240802T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240802T000000Z +CREATED:20240802T000000Z +DTSTART:20240802T140000Z +UID:SCREWTAPE31140000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240802T145959Z +SUMMARY:lispy gopher show w/ screwtape +Zhen House set inside LambdaMOO +DESCRIPTION:lispy gopher show w/ screwtape +Zhen House set inside LambdaMOO with screwtape +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240802T000000Z +CREATED:20240802T000000Z +DTSTART:20240802T150000Z +UID:PUBLIUS31150000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240802T155959Z +SUMMARY:A Step Further Out +Hear Now the Words / A Step Further Out +DESCRIPTION:A Step Further Out +Hear Now the Words / A Step Further Out with publius +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240802T000000Z +CREATED:20240802T000000Z +DTSTART:20240802T160000Z +UID:KOYU31160000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240802T165959Z +SUMMARY:derealization station +DESCRIPTION:derealization station with koyu +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240802T000000Z +CREATED:20240802T000000Z +DTSTART:20240802T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240802T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240802T000000Z +CREATED:20240802T000000Z +DTSTART:20240802T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240802T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240802T000000Z +CREATED:20240802T000000Z +DTSTART:20240802T190000Z +UID:MNW31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240802T192959Z +SUMMARY:News to Me +DESCRIPTION:News to Me with mnw +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240802T000000Z +CREATED:20240802T000000Z +DTSTART:20240802T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240802T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240802T000000Z +CREATED:20240802T000000Z +DTSTART:20240802T200000Z +UID:HAIRYLARRY31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240802T205959Z +SUMMARY:Mix Remix +Something Blue +DESCRIPTION:Mix Remix +Something Blue with hairylarry +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240802T000000Z +CREATED:20240802T000000Z +DTSTART:20240802T210000Z +UID:DJVOLE31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240802T215959Z +SUMMARY:DJ Voles Week-End +DESCRIPTION:DJ Voles Week-End with djvole +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240802T000000Z +CREATED:20240802T000000Z +DTSTART:20240802T220000Z +UID:TYN31220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240802T225959Z +SUMMARY:The Third Ear +DESCRIPTION:The Third Ear with tyn +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240802T000000Z +CREATED:20240802T000000Z +DTSTART:20240802T230000Z +UID:THENEWS31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240802T232959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240803T000000Z +CREATED:20240803T000000Z +DTSTART:20240803T000000Z +UID:SCM31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240803T005959Z +SUMMARY:IWTHNS +DESCRIPTION:IWTHNS with scm +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240803T000000Z +CREATED:20240803T000000Z +DTSTART:20240803T010000Z +UID:ZDRMONSTER31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240803T020000Z +SUMMARY:The DJ Zdrmonster Show +DESCRIPTION:The DJ Zdrmonster Show with zdrmonster +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240803T000000Z +CREATED:20240803T000000Z +DTSTART:20240803T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240803T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240803T000000Z +CREATED:20240803T000000Z +DTSTART:20240803T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240803T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240803T000000Z +CREATED:20240803T000000Z +DTSTART:20240803T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240803T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240803T000000Z +CREATED:20240803T000000Z +DTSTART:20240803T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240803T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240803T000000Z +CREATED:20240803T000000Z +DTSTART:20240803T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240803T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240803T000000Z +CREATED:20240803T000000Z +DTSTART:20240803T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240803T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240803T000000Z +CREATED:20240803T000000Z +DTSTART:20240803T160000Z +UID:MJT31160000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240803T165959Z +SUMMARY:THE SOUND SHOW +DESCRIPTION:THE SOUND SHOW with mjt +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240803T000000Z +CREATED:20240803T000000Z +DTSTART:20240803T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240803T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240803T000000Z +CREATED:20240803T000000Z +DTSTART:20240803T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240803T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240803T000000Z +CREATED:20240803T000000Z +DTSTART:20240803T190000Z +UID:PUBLIUS31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240803T192959Z +SUMMARY:A Step Further Out +Hear Now the Words / A Step Further Out +DESCRIPTION:A Step Further Out +Hear Now the Words / A Step Further Out with publius +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240803T000000Z +CREATED:20240803T000000Z +DTSTART:20240803T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240803T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240803T000000Z +CREATED:20240803T000000Z +DTSTART:20240803T200000Z +UID:FFOG31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240803T202959Z +SUMMARY:myocyte +The Margin +DESCRIPTION:myocyte +The Margin with ffog +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240803T000000Z +CREATED:20240803T000000Z +DTSTART:20240803T203000Z +UID:ROLY31203000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240803T205959Z +SUMMARY:Banana Republic +DESCRIPTION:Banana Republic with roly +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240803T000000Z +CREATED:20240803T000000Z +DTSTART:20240803T210000Z +UID:TANAKIAN31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240803T215959Z +SUMMARY:underground deep dark inky sets +DESCRIPTION:underground deep dark inky sets with tanakian +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240803T000000Z +CREATED:20240803T000000Z +DTSTART:20240803T220000Z +UID:ROLLTIME31220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240803T225959Z +SUMMARY:Plane of the Eclectic w/ DJ rolltime +DESCRIPTION:Plane of the Eclectic w/ DJ rolltime with rolltime +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240803T000000Z +CREATED:20240803T000000Z +DTSTART:20240803T230000Z +UID:SNOWDUSK31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240803T235959Z +SUMMARY:Intergalactic Wasabi Mix +DESCRIPTION:Intergalactic Wasabi Mix with snowdusk +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240804T000000Z +CREATED:20240804T000000Z +DTSTART:20240804T000000Z +UID:FROGGYME31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240804T005959Z +SUMMARY:Funkaliciously Jazztastic Hour +DESCRIPTION:Funkaliciously Jazztastic Hour with froggyme +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240804T000000Z +CREATED:20240804T000000Z +DTSTART:20240804T010000Z +UID:AROCHOD31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240804T015959Z +SUMMARY:The Arocho Show +DESCRIPTION:The Arocho Show with arochod +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240804T000000Z +CREATED:20240804T000000Z +DTSTART:20240804T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240804T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240804T000000Z +CREATED:20240804T000000Z +DTSTART:20240804T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240804T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240804T000000Z +CREATED:20240804T000000Z +DTSTART:20240804T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240804T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240804T000000Z +CREATED:20240804T000000Z +DTSTART:20240804T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240804T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240804T000000Z +CREATED:20240804T000000Z +DTSTART:20240804T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240804T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240804T000000Z +CREATED:20240804T000000Z +DTSTART:20240804T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240804T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240804T000000Z +CREATED:20240804T000000Z +DTSTART:20240804T140000Z +UID:ONEOFVALTS31140000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240804T145959Z +SUMMARY:ferahfeza chronicles +DESCRIPTION:ferahfeza chronicles with oneofvalts +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240804T000000Z +CREATED:20240804T000000Z +DTSTART:20240804T170000Z +UID:DJROBYN31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240804T192959Z +SUMMARY:Shut Up You Freak +DESCRIPTION:Shut Up You Freak with djrobyn +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240804T000000Z +CREATED:20240804T000000Z +DTSTART:20240804T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240804T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240804T000000Z +CREATED:20240804T000000Z +DTSTART:20240804T210000Z +UID:TYN31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240804T215959Z +SUMMARY:The Third Ear +DESCRIPTION:The Third Ear with tyn +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240804T000000Z +CREATED:20240804T000000Z +DTSTART:20240804T230000Z +UID:SNOWDUSK31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240804T235959Z +SUMMARY:Intergalactic Wasabi Mix +DESCRIPTION:Intergalactic Wasabi Mix with snowdusk +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240805T000000Z +CREATED:20240805T000000Z +DTSTART:20240805T000000Z +UID:SDFARC31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240805T005959Z +SUMMARY:SDF Amateur Radio Club +DESCRIPTION:SDF Amateur Radio Club with sdfarc +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240805T000000Z +CREATED:20240805T000000Z +DTSTART:20240805T010000Z +UID:M3G531010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240805T015959Z +SUMMARY:Organized Chaos +DESCRIPTION:Organized Chaos with m3g5 +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240805T000000Z +CREATED:20240805T000000Z +DTSTART:20240805T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240805T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240805T000000Z +CREATED:20240805T000000Z +DTSTART:20240805T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240805T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240805T000000Z +CREATED:20240805T000000Z +DTSTART:20240805T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240805T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240805T000000Z +CREATED:20240805T000000Z +DTSTART:20240805T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240805T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240805T000000Z +CREATED:20240805T000000Z +DTSTART:20240805T080000Z +UID:GAOLIANGCAI31080000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240805T095959Z +SUMMARY:Chinese Pop Music w/ qingfeng +DESCRIPTION:Chinese Pop Music w/ qingfeng with gaoliangcai +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240805T000000Z +CREATED:20240805T000000Z +DTSTART:20240805T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240805T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240805T000000Z +CREATED:20240805T000000Z +DTSTART:20240805T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240805T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240805T000000Z +CREATED:20240805T000000Z +DTSTART:20240805T130000Z +UID:GRIZZLY31130000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240805T132959Z +SUMMARY:Elektro Grizzly Show +DESCRIPTION:Elektro Grizzly Show with grizzly +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240805T000000Z +CREATED:20240805T000000Z +DTSTART:20240805T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240805T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240805T000000Z +CREATED:20240805T000000Z +DTSTART:20240805T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240805T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240805T000000Z +CREATED:20240805T000000Z +DTSTART:20240805T190000Z +UID:MNW31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240805T192959Z +SUMMARY:News to Me +DESCRIPTION:News to Me with mnw +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240805T000000Z +CREATED:20240805T000000Z +DTSTART:20240805T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240805T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240805T000000Z +CREATED:20240805T000000Z +DTSTART:20240805T200000Z +UID:HAIRYLARRY31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240805T215959Z +SUMMARY:Mix Remix +Something Blue +DESCRIPTION:Mix Remix +Something Blue with hairylarry +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240805T000000Z +CREATED:20240805T000000Z +DTSTART:20240805T220000Z +UID:M3G531220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240805T225959Z +SUMMARY:Organized Chaos +DESCRIPTION:Organized Chaos with m3g5 +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240805T000000Z +CREATED:20240805T000000Z +DTSTART:20240805T230000Z +UID:THENEWS31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240805T232959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240806T000000Z +CREATED:20240806T000000Z +DTSTART:20240806T000000Z +UID:STOKESAUCE31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240806T005959Z +SUMMARY:Stokesauce Radio Show +DESCRIPTION:Stokesauce Radio Show with stokesauce +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240806T000000Z +CREATED:20240806T000000Z +DTSTART:20240806T010000Z +UID:FREEFLOW31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240806T012959Z +SUMMARY:We are... Free Flow - noZomi and Masawo +DESCRIPTION:We are... Free Flow - noZomi and Masawo with freeflow +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240806T000000Z +CREATED:20240806T000000Z +DTSTART:20240806T010000Z +UID:VALRAVN31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240806T015959Z +SUMMARY: +DESCRIPTION: with valravn +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240806T000000Z +CREATED:20240806T000000Z +DTSTART:20240806T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240806T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240806T000000Z +CREATED:20240806T000000Z +DTSTART:20240806T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240806T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240806T000000Z +CREATED:20240806T000000Z +DTSTART:20240806T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240806T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240806T000000Z +CREATED:20240806T000000Z +DTSTART:20240806T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240806T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240806T000000Z +CREATED:20240806T000000Z +DTSTART:20240806T080000Z +UID:GAOLIANGCAI31080000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240806T095959Z +SUMMARY:Chinese Pop Music w/ qingfeng +DESCRIPTION:Chinese Pop Music w/ qingfeng with gaoliangcai +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240806T000000Z +CREATED:20240806T000000Z +DTSTART:20240806T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240806T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240806T000000Z +CREATED:20240806T000000Z +DTSTART:20240806T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240806T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240806T000000Z +CREATED:20240806T000000Z +DTSTART:20240806T150000Z +UID:PUBLIUS31150000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240806T155959Z +SUMMARY:A Step Further Out +Hear Now the Words / A Step Further Out +DESCRIPTION:A Step Further Out +Hear Now the Words / A Step Further Out with publius +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240806T000000Z +CREATED:20240806T000000Z +DTSTART:20240806T160000Z +UID:GEF31160000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240806T165959Z +SUMMARY:evolution revolution w/ djDamaru +Guided Meditation w/ djDamaru +DESCRIPTION:evolution revolution w/ djDamaru +Guided Meditation w/ djDamaru with gef +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240806T000000Z +CREATED:20240806T000000Z +DTSTART:20240806T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240806T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240806T000000Z +CREATED:20240806T000000Z +DTSTART:20240806T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240806T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240806T000000Z +CREATED:20240806T000000Z +DTSTART:20240806T190000Z +UID:MNW31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240806T192959Z +SUMMARY:News to Me +DESCRIPTION:News to Me with mnw +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240806T000000Z +CREATED:20240806T000000Z +DTSTART:20240806T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240806T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240806T000000Z +CREATED:20240806T000000Z +DTSTART:20240806T200000Z +UID:LEONG31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240806T205959Z +SUMMARY:internet noises w/ DJ leong +DESCRIPTION:internet noises w/ DJ leong with leong +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240806T000000Z +CREATED:20240806T000000Z +DTSTART:20240806T210000Z +UID:KASHIFSHAH31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240806T215959Z +SUMMARY:SloFI Show w/ DJ SloMo +DESCRIPTION:SloFI Show w/ DJ SloMo with kashifshah +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240806T000000Z +CREATED:20240806T000000Z +DTSTART:20240806T220000Z +UID:M3G531220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240806T225959Z +SUMMARY:Organized Chaos +DESCRIPTION:Organized Chaos with m3g5 +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240806T000000Z +CREATED:20240806T000000Z +DTSTART:20240806T230000Z +UID:NORTHERNLIGHTS31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240806T235959Z +SUMMARY:Praise Then Darkness +DESCRIPTION:Praise Then Darkness with northernlights +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240807T000000Z +CREATED:20240807T000000Z +DTSTART:20240807T000000Z +UID:SCREWTAPE31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240807T005959Z +SUMMARY:lispy gopher show w/ screwtape +Zhen House set inside LambdaMOO +DESCRIPTION:lispy gopher show w/ screwtape +Zhen House set inside LambdaMOO with screwtape +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240807T000000Z +CREATED:20240807T000000Z +DTSTART:20240807T010000Z +UID:AE31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240807T015959Z +SUMMARY:Special Education +Hacker Worlds +DESCRIPTION:Special Education +Hacker Worlds with ae +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240807T000000Z +CREATED:20240807T000000Z +DTSTART:20240807T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240807T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240807T000000Z +CREATED:20240807T000000Z +DTSTART:20240807T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240807T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240807T000000Z +CREATED:20240807T000000Z +DTSTART:20240807T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240807T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240807T000000Z +CREATED:20240807T000000Z +DTSTART:20240807T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240807T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240807T000000Z +CREATED:20240807T000000Z +DTSTART:20240807T080000Z +UID:GAOLIANGCAI31080000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240807T095959Z +SUMMARY:Chinese Pop Music w/ qingfeng +DESCRIPTION:Chinese Pop Music w/ qingfeng with gaoliangcai +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240807T000000Z +CREATED:20240807T000000Z +DTSTART:20240807T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240807T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240807T000000Z +CREATED:20240807T000000Z +DTSTART:20240807T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240807T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240807T000000Z +CREATED:20240807T000000Z +DTSTART:20240807T130000Z +UID:NICKG31130000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240807T145959Z +SUMMARY:Nick's Cave +DESCRIPTION:Nick's Cave with nickg +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240807T000000Z +CREATED:20240807T000000Z +DTSTART:20240807T150000Z +UID:GEF31150000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240807T155959Z +SUMMARY:evolution revolution w/ djDamaru +Guided Meditation w/ djDamaru +DESCRIPTION:evolution revolution w/ djDamaru +Guided Meditation w/ djDamaru with gef +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240807T000000Z +CREATED:20240807T000000Z +DTSTART:20240807T160000Z +UID:OVERLAND31160000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240807T165959Z +SUMMARY:Music For Nitrogen Narcosis +DESCRIPTION:Music For Nitrogen Narcosis with overland +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240807T000000Z +CREATED:20240807T000000Z +DTSTART:20240807T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240807T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240807T000000Z +CREATED:20240807T000000Z +DTSTART:20240807T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240807T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240807T000000Z +CREATED:20240807T000000Z +DTSTART:20240807T190000Z +UID:MNW31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240807T192959Z +SUMMARY:News to Me +DESCRIPTION:News to Me with mnw +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240807T000000Z +CREATED:20240807T000000Z +DTSTART:20240807T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240807T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240807T000000Z +CREATED:20240807T000000Z +DTSTART:20240807T200000Z +UID:CODYSSEUS31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240807T205959Z +SUMMARY:DJ Ewezer +DESCRIPTION:DJ Ewezer with codysseus +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240807T000000Z +CREATED:20240807T000000Z +DTSTART:20240807T210000Z +UID:CYNOSPHERE31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240807T215959Z +SUMMARY:Sounds of Synergy +DESCRIPTION:Sounds of Synergy with cynosphere +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240807T000000Z +CREATED:20240807T000000Z +DTSTART:20240807T220000Z +UID:LYKAINA31220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240807T225959Z +SUMMARY:softer rock +DESCRIPTION:softer rock with lykaina +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240807T000000Z +CREATED:20240807T000000Z +DTSTART:20240807T230000Z +UID:THENEWS31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240807T232959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240808T000000Z +CREATED:20240808T000000Z +DTSTART:20240808T000000Z +UID:USERFXNET31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240808T005959Z +SUMMARY:Lit Up On Linux +DESCRIPTION:Lit Up On Linux with userfxnet +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240808T000000Z +CREATED:20240808T000000Z +DTSTART:20240808T010000Z +UID:AE31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240808T015959Z +SUMMARY:Special Education +Hacker Worlds +DESCRIPTION:Special Education +Hacker Worlds with ae +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240808T000000Z +CREATED:20240808T000000Z +DTSTART:20240808T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240808T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240808T000000Z +CREATED:20240808T000000Z +DTSTART:20240808T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240808T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240808T000000Z +CREATED:20240808T000000Z +DTSTART:20240808T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240808T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240808T000000Z +CREATED:20240808T000000Z +DTSTART:20240808T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240808T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240808T000000Z +CREATED:20240808T000000Z +DTSTART:20240808T080000Z +UID:GAOLIANGCAI31080000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240808T095959Z +SUMMARY:Chinese Pop Music w/ qingfeng +DESCRIPTION:Chinese Pop Music w/ qingfeng with gaoliangcai +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240808T000000Z +CREATED:20240808T000000Z +DTSTART:20240808T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240808T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240808T000000Z +CREATED:20240808T000000Z +DTSTART:20240808T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240808T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240808T000000Z +CREATED:20240808T000000Z +DTSTART:20240808T133000Z +UID:GREGF31133000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240808T152959Z +SUMMARY:perinde ac cadaver +DESCRIPTION:perinde ac cadaver with gregf +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240808T000000Z +CREATED:20240808T000000Z +DTSTART:20240808T160000Z +UID:OAK331160000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240808T165959Z +SUMMARY:Shake Yer Booty w/ DJ Mak +DESCRIPTION:Shake Yer Booty w/ DJ Mak with oak3 +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240808T000000Z +CREATED:20240808T000000Z +DTSTART:20240808T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240808T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240808T000000Z +CREATED:20240808T000000Z +DTSTART:20240808T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240808T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240808T000000Z +CREATED:20240808T000000Z +DTSTART:20240808T190000Z +UID:MNW31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240808T192959Z +SUMMARY:News to Me +DESCRIPTION:News to Me with mnw +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240808T000000Z +CREATED:20240808T000000Z +DTSTART:20240808T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240808T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240808T000000Z +CREATED:20240808T000000Z +DTSTART:20240808T200000Z +UID:STUG31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240808T205959Z +SUMMARY:Flux +DESCRIPTION:Flux with stug +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240808T000000Z +CREATED:20240808T000000Z +DTSTART:20240808T210000Z +UID:HANDYC31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240808T215959Z +SUMMARY:Language Soup w/ DJ Supersalad +DESCRIPTION:Language Soup w/ DJ Supersalad with handyc +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240808T000000Z +CREATED:20240808T000000Z +DTSTART:20240808T220000Z +UID:RODERSB31220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240808T225959Z +SUMMARY:Pumpkin Pie w/ Mr.Brugue +DESCRIPTION:Pumpkin Pie w/ Mr.Brugue with rodersb +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240808T000000Z +CREATED:20240808T000000Z +DTSTART:20240808T230000Z +UID:THENEWS31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240808T232959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240809T000000Z +CREATED:20240809T000000Z +DTSTART:20240809T000000Z +UID:MCORNICK31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240809T005959Z +SUMMARY:Objects In Mirrors +DESCRIPTION:Objects In Mirrors with mcornick +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240809T000000Z +CREATED:20240809T000000Z +DTSTART:20240809T010000Z +UID:FFOG31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240809T015959Z +SUMMARY:myocyte +The Margin +DESCRIPTION:myocyte +The Margin with ffog +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240809T000000Z +CREATED:20240809T000000Z +DTSTART:20240809T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240809T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240809T000000Z +CREATED:20240809T000000Z +DTSTART:20240809T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240809T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240809T000000Z +CREATED:20240809T000000Z +DTSTART:20240809T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240809T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240809T000000Z +CREATED:20240809T000000Z +DTSTART:20240809T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240809T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240809T000000Z +CREATED:20240809T000000Z +DTSTART:20240809T080000Z +UID:LIQUIDDREAMZ31080000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240809T085959Z +SUMMARY:dj aTRoPiNe / dJ PoLyBiuS +DESCRIPTION:dj aTRoPiNe / dJ PoLyBiuS with liquiddreamz +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240809T000000Z +CREATED:20240809T000000Z +DTSTART:20240809T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240809T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240809T000000Z +CREATED:20240809T000000Z +DTSTART:20240809T140000Z +UID:SCREWTAPE31140000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240809T145959Z +SUMMARY:lispy gopher show w/ screwtape +Zhen House set inside LambdaMOO +DESCRIPTION:lispy gopher show w/ screwtape +Zhen House set inside LambdaMOO with screwtape +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240809T000000Z +CREATED:20240809T000000Z +DTSTART:20240809T150000Z +UID:PUBLIUS31150000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240809T155959Z +SUMMARY:A Step Further Out +Hear Now the Words / A Step Further Out +DESCRIPTION:A Step Further Out +Hear Now the Words / A Step Further Out with publius +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240809T000000Z +CREATED:20240809T000000Z +DTSTART:20240809T160000Z +UID:KOYU31160000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240809T165959Z +SUMMARY:derealization station +DESCRIPTION:derealization station with koyu +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240809T000000Z +CREATED:20240809T000000Z +DTSTART:20240809T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240809T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240809T000000Z +CREATED:20240809T000000Z +DTSTART:20240809T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240809T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240809T000000Z +CREATED:20240809T000000Z +DTSTART:20240809T190000Z +UID:MNW31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240809T192959Z +SUMMARY:News to Me +DESCRIPTION:News to Me with mnw +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240809T000000Z +CREATED:20240809T000000Z +DTSTART:20240809T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240809T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240809T000000Z +CREATED:20240809T000000Z +DTSTART:20240809T200000Z +UID:HAIRYLARRY31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240809T205959Z +SUMMARY:Mix Remix +Something Blue +DESCRIPTION:Mix Remix +Something Blue with hairylarry +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240809T000000Z +CREATED:20240809T000000Z +DTSTART:20240809T210000Z +UID:DJVOLE31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240809T215959Z +SUMMARY:DJ Voles Week-End +DESCRIPTION:DJ Voles Week-End with djvole +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240809T000000Z +CREATED:20240809T000000Z +DTSTART:20240809T220000Z +UID:TYN31220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240809T225959Z +SUMMARY:The Third Ear +DESCRIPTION:The Third Ear with tyn +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240809T000000Z +CREATED:20240809T000000Z +DTSTART:20240809T230000Z +UID:THENEWS31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240809T232959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240810T000000Z +CREATED:20240810T000000Z +DTSTART:20240810T000000Z +UID:SCM31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240810T005959Z +SUMMARY:IWTHNS +DESCRIPTION:IWTHNS with scm +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240810T000000Z +CREATED:20240810T000000Z +DTSTART:20240810T010000Z +UID:ZDRMONSTER31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240810T020000Z +SUMMARY:The DJ Zdrmonster Show +DESCRIPTION:The DJ Zdrmonster Show with zdrmonster +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240810T000000Z +CREATED:20240810T000000Z +DTSTART:20240810T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240810T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240810T000000Z +CREATED:20240810T000000Z +DTSTART:20240810T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240810T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240810T000000Z +CREATED:20240810T000000Z +DTSTART:20240810T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240810T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240810T000000Z +CREATED:20240810T000000Z +DTSTART:20240810T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240810T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240810T000000Z +CREATED:20240810T000000Z +DTSTART:20240810T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240810T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240810T000000Z +CREATED:20240810T000000Z +DTSTART:20240810T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240810T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240810T000000Z +CREATED:20240810T000000Z +DTSTART:20240810T160000Z +UID:MJT31160000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240810T165959Z +SUMMARY:THE SOUND SHOW +DESCRIPTION:THE SOUND SHOW with mjt +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240810T000000Z +CREATED:20240810T000000Z +DTSTART:20240810T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240810T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240810T000000Z +CREATED:20240810T000000Z +DTSTART:20240810T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240810T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240810T000000Z +CREATED:20240810T000000Z +DTSTART:20240810T190000Z +UID:PUBLIUS31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240810T192959Z +SUMMARY:A Step Further Out +Hear Now the Words / A Step Further Out +DESCRIPTION:A Step Further Out +Hear Now the Words / A Step Further Out with publius +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240810T000000Z +CREATED:20240810T000000Z +DTSTART:20240810T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240810T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240810T000000Z +CREATED:20240810T000000Z +DTSTART:20240810T200000Z +UID:FFOG31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240810T202959Z +SUMMARY:myocyte +The Margin +DESCRIPTION:myocyte +The Margin with ffog +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240810T000000Z +CREATED:20240810T000000Z +DTSTART:20240810T203000Z +UID:ROLY31203000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240810T205959Z +SUMMARY:Banana Republic +DESCRIPTION:Banana Republic with roly +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240810T000000Z +CREATED:20240810T000000Z +DTSTART:20240810T210000Z +UID:TANAKIAN31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240810T215959Z +SUMMARY:underground deep dark inky sets +DESCRIPTION:underground deep dark inky sets with tanakian +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240810T000000Z +CREATED:20240810T000000Z +DTSTART:20240810T220000Z +UID:ROLLTIME31220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240810T225959Z +SUMMARY:Plane of the Eclectic w/ DJ rolltime +DESCRIPTION:Plane of the Eclectic w/ DJ rolltime with rolltime +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240810T000000Z +CREATED:20240810T000000Z +DTSTART:20240810T230000Z +UID:SNOWDUSK31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240810T235959Z +SUMMARY:Intergalactic Wasabi Mix +DESCRIPTION:Intergalactic Wasabi Mix with snowdusk +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240811T000000Z +CREATED:20240811T000000Z +DTSTART:20240811T000000Z +UID:FROGGYME31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240811T005959Z +SUMMARY:Funkaliciously Jazztastic Hour +DESCRIPTION:Funkaliciously Jazztastic Hour with froggyme +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240811T000000Z +CREATED:20240811T000000Z +DTSTART:20240811T010000Z +UID:AROCHOD31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240811T015959Z +SUMMARY:The Arocho Show +DESCRIPTION:The Arocho Show with arochod +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240811T000000Z +CREATED:20240811T000000Z +DTSTART:20240811T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240811T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240811T000000Z +CREATED:20240811T000000Z +DTSTART:20240811T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240811T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240811T000000Z +CREATED:20240811T000000Z +DTSTART:20240811T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240811T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240811T000000Z +CREATED:20240811T000000Z +DTSTART:20240811T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240811T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240811T000000Z +CREATED:20240811T000000Z +DTSTART:20240811T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240811T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240811T000000Z +CREATED:20240811T000000Z +DTSTART:20240811T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240811T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240811T000000Z +CREATED:20240811T000000Z +DTSTART:20240811T140000Z +UID:ONEOFVALTS31140000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240811T145959Z +SUMMARY:ferahfeza chronicles +DESCRIPTION:ferahfeza chronicles with oneofvalts +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240811T000000Z +CREATED:20240811T000000Z +DTSTART:20240811T170000Z +UID:DJROBYN31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240811T192959Z +SUMMARY:Shut Up You Freak +DESCRIPTION:Shut Up You Freak with djrobyn +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240811T000000Z +CREATED:20240811T000000Z +DTSTART:20240811T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240811T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240811T000000Z +CREATED:20240811T000000Z +DTSTART:20240811T210000Z +UID:TYN31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240811T215959Z +SUMMARY:The Third Ear +DESCRIPTION:The Third Ear with tyn +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240811T000000Z +CREATED:20240811T000000Z +DTSTART:20240811T230000Z +UID:SNOWDUSK31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240811T235959Z +SUMMARY:Intergalactic Wasabi Mix +DESCRIPTION:Intergalactic Wasabi Mix with snowdusk +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240812T000000Z +CREATED:20240812T000000Z +DTSTART:20240812T000000Z +UID:SDFARC31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240812T005959Z +SUMMARY:SDF Amateur Radio Club +DESCRIPTION:SDF Amateur Radio Club with sdfarc +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240812T000000Z +CREATED:20240812T000000Z +DTSTART:20240812T010000Z +UID:M3G531010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240812T015959Z +SUMMARY:Organized Chaos +DESCRIPTION:Organized Chaos with m3g5 +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240812T000000Z +CREATED:20240812T000000Z +DTSTART:20240812T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240812T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240812T000000Z +CREATED:20240812T000000Z +DTSTART:20240812T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240812T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240812T000000Z +CREATED:20240812T000000Z +DTSTART:20240812T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240812T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240812T000000Z +CREATED:20240812T000000Z +DTSTART:20240812T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240812T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240812T000000Z +CREATED:20240812T000000Z +DTSTART:20240812T080000Z +UID:GAOLIANGCAI31080000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240812T095959Z +SUMMARY:Chinese Pop Music w/ qingfeng +DESCRIPTION:Chinese Pop Music w/ qingfeng with gaoliangcai +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240812T000000Z +CREATED:20240812T000000Z +DTSTART:20240812T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240812T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240812T000000Z +CREATED:20240812T000000Z +DTSTART:20240812T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240812T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240812T000000Z +CREATED:20240812T000000Z +DTSTART:20240812T130000Z +UID:GRIZZLY31130000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240812T132959Z +SUMMARY:Elektro Grizzly Show +DESCRIPTION:Elektro Grizzly Show with grizzly +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240812T000000Z +CREATED:20240812T000000Z +DTSTART:20240812T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240812T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240812T000000Z +CREATED:20240812T000000Z +DTSTART:20240812T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240812T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240812T000000Z +CREATED:20240812T000000Z +DTSTART:20240812T190000Z +UID:MNW31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240812T192959Z +SUMMARY:News to Me +DESCRIPTION:News to Me with mnw +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240812T000000Z +CREATED:20240812T000000Z +DTSTART:20240812T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240812T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240812T000000Z +CREATED:20240812T000000Z +DTSTART:20240812T200000Z +UID:HAIRYLARRY31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240812T215959Z +SUMMARY:Mix Remix +Something Blue +DESCRIPTION:Mix Remix +Something Blue with hairylarry +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240812T000000Z +CREATED:20240812T000000Z +DTSTART:20240812T220000Z +UID:M3G531220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240812T225959Z +SUMMARY:Organized Chaos +DESCRIPTION:Organized Chaos with m3g5 +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240812T000000Z +CREATED:20240812T000000Z +DTSTART:20240812T230000Z +UID:THENEWS31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240812T232959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240813T000000Z +CREATED:20240813T000000Z +DTSTART:20240813T000000Z +UID:STOKESAUCE31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240813T005959Z +SUMMARY:Stokesauce Radio Show +DESCRIPTION:Stokesauce Radio Show with stokesauce +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240813T000000Z +CREATED:20240813T000000Z +DTSTART:20240813T010000Z +UID:FREEFLOW31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240813T012959Z +SUMMARY:We are... Free Flow - noZomi and Masawo +DESCRIPTION:We are... Free Flow - noZomi and Masawo with freeflow +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240813T000000Z +CREATED:20240813T000000Z +DTSTART:20240813T010000Z +UID:VALRAVN31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240813T015959Z +SUMMARY: +DESCRIPTION: with valravn +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240813T000000Z +CREATED:20240813T000000Z +DTSTART:20240813T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240813T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240813T000000Z +CREATED:20240813T000000Z +DTSTART:20240813T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240813T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240813T000000Z +CREATED:20240813T000000Z +DTSTART:20240813T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240813T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240813T000000Z +CREATED:20240813T000000Z +DTSTART:20240813T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240813T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240813T000000Z +CREATED:20240813T000000Z +DTSTART:20240813T080000Z +UID:GAOLIANGCAI31080000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240813T095959Z +SUMMARY:Chinese Pop Music w/ qingfeng +DESCRIPTION:Chinese Pop Music w/ qingfeng with gaoliangcai +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240813T000000Z +CREATED:20240813T000000Z +DTSTART:20240813T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240813T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240813T000000Z +CREATED:20240813T000000Z +DTSTART:20240813T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240813T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240813T000000Z +CREATED:20240813T000000Z +DTSTART:20240813T150000Z +UID:PUBLIUS31150000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240813T155959Z +SUMMARY:A Step Further Out +Hear Now the Words / A Step Further Out +DESCRIPTION:A Step Further Out +Hear Now the Words / A Step Further Out with publius +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240813T000000Z +CREATED:20240813T000000Z +DTSTART:20240813T160000Z +UID:GEF31160000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240813T165959Z +SUMMARY:evolution revolution w/ djDamaru +Guided Meditation w/ djDamaru +DESCRIPTION:evolution revolution w/ djDamaru +Guided Meditation w/ djDamaru with gef +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240813T000000Z +CREATED:20240813T000000Z +DTSTART:20240813T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240813T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240813T000000Z +CREATED:20240813T000000Z +DTSTART:20240813T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240813T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240813T000000Z +CREATED:20240813T000000Z +DTSTART:20240813T190000Z +UID:MNW31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240813T192959Z +SUMMARY:News to Me +DESCRIPTION:News to Me with mnw +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240813T000000Z +CREATED:20240813T000000Z +DTSTART:20240813T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240813T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240813T000000Z +CREATED:20240813T000000Z +DTSTART:20240813T200000Z +UID:LEONG31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240813T205959Z +SUMMARY:internet noises w/ DJ leong +DESCRIPTION:internet noises w/ DJ leong with leong +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240813T000000Z +CREATED:20240813T000000Z +DTSTART:20240813T210000Z +UID:KASHIFSHAH31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240813T215959Z +SUMMARY:SloFI Show w/ DJ SloMo +DESCRIPTION:SloFI Show w/ DJ SloMo with kashifshah +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240813T000000Z +CREATED:20240813T000000Z +DTSTART:20240813T220000Z +UID:M3G531220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240813T225959Z +SUMMARY:Organized Chaos +DESCRIPTION:Organized Chaos with m3g5 +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240813T000000Z +CREATED:20240813T000000Z +DTSTART:20240813T230000Z +UID:NORTHERNLIGHTS31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240813T235959Z +SUMMARY:Praise Then Darkness +DESCRIPTION:Praise Then Darkness with northernlights +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240814T000000Z +CREATED:20240814T000000Z +DTSTART:20240814T000000Z +UID:SCREWTAPE31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240814T005959Z +SUMMARY:lispy gopher show w/ screwtape +Zhen House set inside LambdaMOO +DESCRIPTION:lispy gopher show w/ screwtape +Zhen House set inside LambdaMOO with screwtape +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240814T000000Z +CREATED:20240814T000000Z +DTSTART:20240814T010000Z +UID:AE31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240814T015959Z +SUMMARY:Special Education +Hacker Worlds +DESCRIPTION:Special Education +Hacker Worlds with ae +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240814T000000Z +CREATED:20240814T000000Z +DTSTART:20240814T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240814T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240814T000000Z +CREATED:20240814T000000Z +DTSTART:20240814T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240814T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240814T000000Z +CREATED:20240814T000000Z +DTSTART:20240814T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240814T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240814T000000Z +CREATED:20240814T000000Z +DTSTART:20240814T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240814T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240814T000000Z +CREATED:20240814T000000Z +DTSTART:20240814T080000Z +UID:GAOLIANGCAI31080000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240814T095959Z +SUMMARY:Chinese Pop Music w/ qingfeng +DESCRIPTION:Chinese Pop Music w/ qingfeng with gaoliangcai +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240814T000000Z +CREATED:20240814T000000Z +DTSTART:20240814T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240814T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240814T000000Z +CREATED:20240814T000000Z +DTSTART:20240814T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240814T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240814T000000Z +CREATED:20240814T000000Z +DTSTART:20240814T130000Z +UID:NICKG31130000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240814T145959Z +SUMMARY:Nick's Cave +DESCRIPTION:Nick's Cave with nickg +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240814T000000Z +CREATED:20240814T000000Z +DTSTART:20240814T150000Z +UID:GEF31150000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240814T155959Z +SUMMARY:evolution revolution w/ djDamaru +Guided Meditation w/ djDamaru +DESCRIPTION:evolution revolution w/ djDamaru +Guided Meditation w/ djDamaru with gef +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240814T000000Z +CREATED:20240814T000000Z +DTSTART:20240814T160000Z +UID:OVERLAND31160000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240814T165959Z +SUMMARY:Music For Nitrogen Narcosis +DESCRIPTION:Music For Nitrogen Narcosis with overland +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240814T000000Z +CREATED:20240814T000000Z +DTSTART:20240814T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240814T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240814T000000Z +CREATED:20240814T000000Z +DTSTART:20240814T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240814T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240814T000000Z +CREATED:20240814T000000Z +DTSTART:20240814T190000Z +UID:MNW31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240814T192959Z +SUMMARY:News to Me +DESCRIPTION:News to Me with mnw +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240814T000000Z +CREATED:20240814T000000Z +DTSTART:20240814T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240814T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240814T000000Z +CREATED:20240814T000000Z +DTSTART:20240814T200000Z +UID:CODYSSEUS31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240814T205959Z +SUMMARY:DJ Ewezer +DESCRIPTION:DJ Ewezer with codysseus +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240814T000000Z +CREATED:20240814T000000Z +DTSTART:20240814T210000Z +UID:CYNOSPHERE31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240814T215959Z +SUMMARY:Sounds of Synergy +DESCRIPTION:Sounds of Synergy with cynosphere +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240814T000000Z +CREATED:20240814T000000Z +DTSTART:20240814T220000Z +UID:LYKAINA31220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240814T225959Z +SUMMARY:softer rock +DESCRIPTION:softer rock with lykaina +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240814T000000Z +CREATED:20240814T000000Z +DTSTART:20240814T230000Z +UID:THENEWS31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240814T232959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240815T000000Z +CREATED:20240815T000000Z +DTSTART:20240815T000000Z +UID:USERFXNET31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240815T005959Z +SUMMARY:Lit Up On Linux +DESCRIPTION:Lit Up On Linux with userfxnet +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240815T000000Z +CREATED:20240815T000000Z +DTSTART:20240815T010000Z +UID:AE31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240815T015959Z +SUMMARY:Special Education +Hacker Worlds +DESCRIPTION:Special Education +Hacker Worlds with ae +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240815T000000Z +CREATED:20240815T000000Z +DTSTART:20240815T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240815T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240815T000000Z +CREATED:20240815T000000Z +DTSTART:20240815T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240815T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240815T000000Z +CREATED:20240815T000000Z +DTSTART:20240815T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240815T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240815T000000Z +CREATED:20240815T000000Z +DTSTART:20240815T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240815T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240815T000000Z +CREATED:20240815T000000Z +DTSTART:20240815T080000Z +UID:GAOLIANGCAI31080000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240815T095959Z +SUMMARY:Chinese Pop Music w/ qingfeng +DESCRIPTION:Chinese Pop Music w/ qingfeng with gaoliangcai +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240815T000000Z +CREATED:20240815T000000Z +DTSTART:20240815T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240815T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240815T000000Z +CREATED:20240815T000000Z +DTSTART:20240815T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240815T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240815T000000Z +CREATED:20240815T000000Z +DTSTART:20240815T133000Z +UID:GREGF31133000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240815T152959Z +SUMMARY:perinde ac cadaver +DESCRIPTION:perinde ac cadaver with gregf +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240815T000000Z +CREATED:20240815T000000Z +DTSTART:20240815T160000Z +UID:OAK331160000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240815T165959Z +SUMMARY:Shake Yer Booty w/ DJ Mak +DESCRIPTION:Shake Yer Booty w/ DJ Mak with oak3 +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240815T000000Z +CREATED:20240815T000000Z +DTSTART:20240815T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240815T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240815T000000Z +CREATED:20240815T000000Z +DTSTART:20240815T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240815T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240815T000000Z +CREATED:20240815T000000Z +DTSTART:20240815T190000Z +UID:MNW31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240815T192959Z +SUMMARY:News to Me +DESCRIPTION:News to Me with mnw +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240815T000000Z +CREATED:20240815T000000Z +DTSTART:20240815T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240815T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240815T000000Z +CREATED:20240815T000000Z +DTSTART:20240815T200000Z +UID:STUG31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240815T205959Z +SUMMARY:Flux +DESCRIPTION:Flux with stug +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240815T000000Z +CREATED:20240815T000000Z +DTSTART:20240815T210000Z +UID:HANDYC31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240815T215959Z +SUMMARY:Language Soup w/ DJ Supersalad +DESCRIPTION:Language Soup w/ DJ Supersalad with handyc +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240815T000000Z +CREATED:20240815T000000Z +DTSTART:20240815T220000Z +UID:RODERSB31220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240815T225959Z +SUMMARY:Pumpkin Pie w/ Mr.Brugue +DESCRIPTION:Pumpkin Pie w/ Mr.Brugue with rodersb +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240815T000000Z +CREATED:20240815T000000Z +DTSTART:20240815T230000Z +UID:THENEWS31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240815T232959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240816T000000Z +CREATED:20240816T000000Z +DTSTART:20240816T000000Z +UID:MCORNICK31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240816T005959Z +SUMMARY:Objects In Mirrors +DESCRIPTION:Objects In Mirrors with mcornick +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240816T000000Z +CREATED:20240816T000000Z +DTSTART:20240816T010000Z +UID:FFOG31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240816T015959Z +SUMMARY:myocyte +The Margin +DESCRIPTION:myocyte +The Margin with ffog +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240816T000000Z +CREATED:20240816T000000Z +DTSTART:20240816T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240816T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240816T000000Z +CREATED:20240816T000000Z +DTSTART:20240816T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240816T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240816T000000Z +CREATED:20240816T000000Z +DTSTART:20240816T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240816T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240816T000000Z +CREATED:20240816T000000Z +DTSTART:20240816T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240816T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240816T000000Z +CREATED:20240816T000000Z +DTSTART:20240816T080000Z +UID:LIQUIDDREAMZ31080000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240816T085959Z +SUMMARY:dj aTRoPiNe / dJ PoLyBiuS +DESCRIPTION:dj aTRoPiNe / dJ PoLyBiuS with liquiddreamz +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240816T000000Z +CREATED:20240816T000000Z +DTSTART:20240816T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240816T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240816T000000Z +CREATED:20240816T000000Z +DTSTART:20240816T140000Z +UID:SCREWTAPE31140000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240816T145959Z +SUMMARY:lispy gopher show w/ screwtape +Zhen House set inside LambdaMOO +DESCRIPTION:lispy gopher show w/ screwtape +Zhen House set inside LambdaMOO with screwtape +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240816T000000Z +CREATED:20240816T000000Z +DTSTART:20240816T150000Z +UID:PUBLIUS31150000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240816T155959Z +SUMMARY:A Step Further Out +Hear Now the Words / A Step Further Out +DESCRIPTION:A Step Further Out +Hear Now the Words / A Step Further Out with publius +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240816T000000Z +CREATED:20240816T000000Z +DTSTART:20240816T160000Z +UID:KOYU31160000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240816T165959Z +SUMMARY:derealization station +DESCRIPTION:derealization station with koyu +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240816T000000Z +CREATED:20240816T000000Z +DTSTART:20240816T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240816T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240816T000000Z +CREATED:20240816T000000Z +DTSTART:20240816T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240816T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240816T000000Z +CREATED:20240816T000000Z +DTSTART:20240816T190000Z +UID:MNW31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240816T192959Z +SUMMARY:News to Me +DESCRIPTION:News to Me with mnw +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240816T000000Z +CREATED:20240816T000000Z +DTSTART:20240816T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240816T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240816T000000Z +CREATED:20240816T000000Z +DTSTART:20240816T200000Z +UID:HAIRYLARRY31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240816T205959Z +SUMMARY:Mix Remix +Something Blue +DESCRIPTION:Mix Remix +Something Blue with hairylarry +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240816T000000Z +CREATED:20240816T000000Z +DTSTART:20240816T210000Z +UID:DJVOLE31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240816T215959Z +SUMMARY:DJ Voles Week-End +DESCRIPTION:DJ Voles Week-End with djvole +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240816T000000Z +CREATED:20240816T000000Z +DTSTART:20240816T220000Z +UID:TYN31220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240816T225959Z +SUMMARY:The Third Ear +DESCRIPTION:The Third Ear with tyn +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240816T000000Z +CREATED:20240816T000000Z +DTSTART:20240816T230000Z +UID:THENEWS31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240816T232959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240817T000000Z +CREATED:20240817T000000Z +DTSTART:20240817T000000Z +UID:SCM31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240817T005959Z +SUMMARY:IWTHNS +DESCRIPTION:IWTHNS with scm +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240817T000000Z +CREATED:20240817T000000Z +DTSTART:20240817T010000Z +UID:ZDRMONSTER31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240817T020000Z +SUMMARY:The DJ Zdrmonster Show +DESCRIPTION:The DJ Zdrmonster Show with zdrmonster +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240817T000000Z +CREATED:20240817T000000Z +DTSTART:20240817T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240817T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240817T000000Z +CREATED:20240817T000000Z +DTSTART:20240817T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240817T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240817T000000Z +CREATED:20240817T000000Z +DTSTART:20240817T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240817T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240817T000000Z +CREATED:20240817T000000Z +DTSTART:20240817T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240817T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240817T000000Z +CREATED:20240817T000000Z +DTSTART:20240817T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240817T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240817T000000Z +CREATED:20240817T000000Z +DTSTART:20240817T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240817T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240817T000000Z +CREATED:20240817T000000Z +DTSTART:20240817T160000Z +UID:MJT31160000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240817T165959Z +SUMMARY:THE SOUND SHOW +DESCRIPTION:THE SOUND SHOW with mjt +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240817T000000Z +CREATED:20240817T000000Z +DTSTART:20240817T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240817T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240817T000000Z +CREATED:20240817T000000Z +DTSTART:20240817T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240817T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240817T000000Z +CREATED:20240817T000000Z +DTSTART:20240817T190000Z +UID:PUBLIUS31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240817T192959Z +SUMMARY:A Step Further Out +Hear Now the Words / A Step Further Out +DESCRIPTION:A Step Further Out +Hear Now the Words / A Step Further Out with publius +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240817T000000Z +CREATED:20240817T000000Z +DTSTART:20240817T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240817T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240817T000000Z +CREATED:20240817T000000Z +DTSTART:20240817T200000Z +UID:FFOG31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240817T202959Z +SUMMARY:myocyte +The Margin +DESCRIPTION:myocyte +The Margin with ffog +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240817T000000Z +CREATED:20240817T000000Z +DTSTART:20240817T203000Z +UID:ROLY31203000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240817T205959Z +SUMMARY:Banana Republic +DESCRIPTION:Banana Republic with roly +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240817T000000Z +CREATED:20240817T000000Z +DTSTART:20240817T210000Z +UID:TANAKIAN31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240817T215959Z +SUMMARY:underground deep dark inky sets +DESCRIPTION:underground deep dark inky sets with tanakian +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240817T000000Z +CREATED:20240817T000000Z +DTSTART:20240817T220000Z +UID:ROLLTIME31220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240817T225959Z +SUMMARY:Plane of the Eclectic w/ DJ rolltime +DESCRIPTION:Plane of the Eclectic w/ DJ rolltime with rolltime +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240817T000000Z +CREATED:20240817T000000Z +DTSTART:20240817T230000Z +UID:SNOWDUSK31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240817T235959Z +SUMMARY:Intergalactic Wasabi Mix +DESCRIPTION:Intergalactic Wasabi Mix with snowdusk +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240818T000000Z +CREATED:20240818T000000Z +DTSTART:20240818T000000Z +UID:FROGGYME31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240818T005959Z +SUMMARY:Funkaliciously Jazztastic Hour +DESCRIPTION:Funkaliciously Jazztastic Hour with froggyme +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240818T000000Z +CREATED:20240818T000000Z +DTSTART:20240818T010000Z +UID:AROCHOD31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240818T015959Z +SUMMARY:The Arocho Show +DESCRIPTION:The Arocho Show with arochod +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240818T000000Z +CREATED:20240818T000000Z +DTSTART:20240818T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240818T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240818T000000Z +CREATED:20240818T000000Z +DTSTART:20240818T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240818T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240818T000000Z +CREATED:20240818T000000Z +DTSTART:20240818T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240818T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240818T000000Z +CREATED:20240818T000000Z +DTSTART:20240818T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240818T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240818T000000Z +CREATED:20240818T000000Z +DTSTART:20240818T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240818T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240818T000000Z +CREATED:20240818T000000Z +DTSTART:20240818T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240818T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240818T000000Z +CREATED:20240818T000000Z +DTSTART:20240818T140000Z +UID:ONEOFVALTS31140000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240818T145959Z +SUMMARY:ferahfeza chronicles +DESCRIPTION:ferahfeza chronicles with oneofvalts +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240818T000000Z +CREATED:20240818T000000Z +DTSTART:20240818T170000Z +UID:DJROBYN31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240818T192959Z +SUMMARY:Shut Up You Freak +DESCRIPTION:Shut Up You Freak with djrobyn +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240818T000000Z +CREATED:20240818T000000Z +DTSTART:20240818T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240818T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240818T000000Z +CREATED:20240818T000000Z +DTSTART:20240818T210000Z +UID:TYN31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240818T215959Z +SUMMARY:The Third Ear +DESCRIPTION:The Third Ear with tyn +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240818T000000Z +CREATED:20240818T000000Z +DTSTART:20240818T230000Z +UID:SNOWDUSK31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240818T235959Z +SUMMARY:Intergalactic Wasabi Mix +DESCRIPTION:Intergalactic Wasabi Mix with snowdusk +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240819T000000Z +CREATED:20240819T000000Z +DTSTART:20240819T000000Z +UID:SDFARC31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240819T005959Z +SUMMARY:SDF Amateur Radio Club +DESCRIPTION:SDF Amateur Radio Club with sdfarc +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240819T000000Z +CREATED:20240819T000000Z +DTSTART:20240819T010000Z +UID:M3G531010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240819T015959Z +SUMMARY:Organized Chaos +DESCRIPTION:Organized Chaos with m3g5 +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240819T000000Z +CREATED:20240819T000000Z +DTSTART:20240819T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240819T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240819T000000Z +CREATED:20240819T000000Z +DTSTART:20240819T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240819T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240819T000000Z +CREATED:20240819T000000Z +DTSTART:20240819T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240819T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240819T000000Z +CREATED:20240819T000000Z +DTSTART:20240819T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240819T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240819T000000Z +CREATED:20240819T000000Z +DTSTART:20240819T080000Z +UID:GAOLIANGCAI31080000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240819T095959Z +SUMMARY:Chinese Pop Music w/ qingfeng +DESCRIPTION:Chinese Pop Music w/ qingfeng with gaoliangcai +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240819T000000Z +CREATED:20240819T000000Z +DTSTART:20240819T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240819T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240819T000000Z +CREATED:20240819T000000Z +DTSTART:20240819T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240819T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240819T000000Z +CREATED:20240819T000000Z +DTSTART:20240819T130000Z +UID:GRIZZLY31130000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240819T132959Z +SUMMARY:Elektro Grizzly Show +DESCRIPTION:Elektro Grizzly Show with grizzly +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240819T000000Z +CREATED:20240819T000000Z +DTSTART:20240819T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240819T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240819T000000Z +CREATED:20240819T000000Z +DTSTART:20240819T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240819T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240819T000000Z +CREATED:20240819T000000Z +DTSTART:20240819T190000Z +UID:MNW31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240819T192959Z +SUMMARY:News to Me +DESCRIPTION:News to Me with mnw +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240819T000000Z +CREATED:20240819T000000Z +DTSTART:20240819T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240819T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240819T000000Z +CREATED:20240819T000000Z +DTSTART:20240819T200000Z +UID:HAIRYLARRY31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240819T215959Z +SUMMARY:Mix Remix +Something Blue +DESCRIPTION:Mix Remix +Something Blue with hairylarry +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240819T000000Z +CREATED:20240819T000000Z +DTSTART:20240819T220000Z +UID:M3G531220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240819T225959Z +SUMMARY:Organized Chaos +DESCRIPTION:Organized Chaos with m3g5 +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240819T000000Z +CREATED:20240819T000000Z +DTSTART:20240819T230000Z +UID:THENEWS31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240819T232959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240820T000000Z +CREATED:20240820T000000Z +DTSTART:20240820T000000Z +UID:STOKESAUCE31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240820T005959Z +SUMMARY:Stokesauce Radio Show +DESCRIPTION:Stokesauce Radio Show with stokesauce +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240820T000000Z +CREATED:20240820T000000Z +DTSTART:20240820T010000Z +UID:FREEFLOW31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240820T012959Z +SUMMARY:We are... Free Flow - noZomi and Masawo +DESCRIPTION:We are... Free Flow - noZomi and Masawo with freeflow +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240820T000000Z +CREATED:20240820T000000Z +DTSTART:20240820T010000Z +UID:VALRAVN31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240820T015959Z +SUMMARY: +DESCRIPTION: with valravn +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240820T000000Z +CREATED:20240820T000000Z +DTSTART:20240820T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240820T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240820T000000Z +CREATED:20240820T000000Z +DTSTART:20240820T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240820T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240820T000000Z +CREATED:20240820T000000Z +DTSTART:20240820T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240820T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240820T000000Z +CREATED:20240820T000000Z +DTSTART:20240820T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240820T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240820T000000Z +CREATED:20240820T000000Z +DTSTART:20240820T080000Z +UID:GAOLIANGCAI31080000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240820T095959Z +SUMMARY:Chinese Pop Music w/ qingfeng +DESCRIPTION:Chinese Pop Music w/ qingfeng with gaoliangcai +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240820T000000Z +CREATED:20240820T000000Z +DTSTART:20240820T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240820T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240820T000000Z +CREATED:20240820T000000Z +DTSTART:20240820T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240820T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240820T000000Z +CREATED:20240820T000000Z +DTSTART:20240820T150000Z +UID:PUBLIUS31150000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240820T155959Z +SUMMARY:A Step Further Out +Hear Now the Words / A Step Further Out +DESCRIPTION:A Step Further Out +Hear Now the Words / A Step Further Out with publius +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240820T000000Z +CREATED:20240820T000000Z +DTSTART:20240820T160000Z +UID:GEF31160000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240820T165959Z +SUMMARY:evolution revolution w/ djDamaru +Guided Meditation w/ djDamaru +DESCRIPTION:evolution revolution w/ djDamaru +Guided Meditation w/ djDamaru with gef +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240820T000000Z +CREATED:20240820T000000Z +DTSTART:20240820T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240820T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240820T000000Z +CREATED:20240820T000000Z +DTSTART:20240820T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240820T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240820T000000Z +CREATED:20240820T000000Z +DTSTART:20240820T190000Z +UID:MNW31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240820T192959Z +SUMMARY:News to Me +DESCRIPTION:News to Me with mnw +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240820T000000Z +CREATED:20240820T000000Z +DTSTART:20240820T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240820T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240820T000000Z +CREATED:20240820T000000Z +DTSTART:20240820T200000Z +UID:LEONG31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240820T205959Z +SUMMARY:internet noises w/ DJ leong +DESCRIPTION:internet noises w/ DJ leong with leong +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240820T000000Z +CREATED:20240820T000000Z +DTSTART:20240820T210000Z +UID:KASHIFSHAH31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240820T215959Z +SUMMARY:SloFI Show w/ DJ SloMo +DESCRIPTION:SloFI Show w/ DJ SloMo with kashifshah +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240820T000000Z +CREATED:20240820T000000Z +DTSTART:20240820T220000Z +UID:M3G531220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240820T225959Z +SUMMARY:Organized Chaos +DESCRIPTION:Organized Chaos with m3g5 +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240820T000000Z +CREATED:20240820T000000Z +DTSTART:20240820T230000Z +UID:NORTHERNLIGHTS31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240820T235959Z +SUMMARY:Praise Then Darkness +DESCRIPTION:Praise Then Darkness with northernlights +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240821T000000Z +CREATED:20240821T000000Z +DTSTART:20240821T000000Z +UID:SCREWTAPE31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240821T005959Z +SUMMARY:lispy gopher show w/ screwtape +Zhen House set inside LambdaMOO +DESCRIPTION:lispy gopher show w/ screwtape +Zhen House set inside LambdaMOO with screwtape +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240821T000000Z +CREATED:20240821T000000Z +DTSTART:20240821T010000Z +UID:AE31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240821T015959Z +SUMMARY:Special Education +Hacker Worlds +DESCRIPTION:Special Education +Hacker Worlds with ae +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240821T000000Z +CREATED:20240821T000000Z +DTSTART:20240821T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240821T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240821T000000Z +CREATED:20240821T000000Z +DTSTART:20240821T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240821T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240821T000000Z +CREATED:20240821T000000Z +DTSTART:20240821T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240821T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240821T000000Z +CREATED:20240821T000000Z +DTSTART:20240821T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240821T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240821T000000Z +CREATED:20240821T000000Z +DTSTART:20240821T080000Z +UID:GAOLIANGCAI31080000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240821T095959Z +SUMMARY:Chinese Pop Music w/ qingfeng +DESCRIPTION:Chinese Pop Music w/ qingfeng with gaoliangcai +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240821T000000Z +CREATED:20240821T000000Z +DTSTART:20240821T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240821T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240821T000000Z +CREATED:20240821T000000Z +DTSTART:20240821T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240821T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240821T000000Z +CREATED:20240821T000000Z +DTSTART:20240821T130000Z +UID:NICKG31130000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240821T145959Z +SUMMARY:Nick's Cave +DESCRIPTION:Nick's Cave with nickg +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240821T000000Z +CREATED:20240821T000000Z +DTSTART:20240821T150000Z +UID:GEF31150000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240821T155959Z +SUMMARY:evolution revolution w/ djDamaru +Guided Meditation w/ djDamaru +DESCRIPTION:evolution revolution w/ djDamaru +Guided Meditation w/ djDamaru with gef +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240821T000000Z +CREATED:20240821T000000Z +DTSTART:20240821T160000Z +UID:OVERLAND31160000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240821T165959Z +SUMMARY:Music For Nitrogen Narcosis +DESCRIPTION:Music For Nitrogen Narcosis with overland +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240821T000000Z +CREATED:20240821T000000Z +DTSTART:20240821T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240821T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240821T000000Z +CREATED:20240821T000000Z +DTSTART:20240821T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240821T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240821T000000Z +CREATED:20240821T000000Z +DTSTART:20240821T190000Z +UID:MNW31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240821T192959Z +SUMMARY:News to Me +DESCRIPTION:News to Me with mnw +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240821T000000Z +CREATED:20240821T000000Z +DTSTART:20240821T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240821T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240821T000000Z +CREATED:20240821T000000Z +DTSTART:20240821T200000Z +UID:CODYSSEUS31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240821T205959Z +SUMMARY:DJ Ewezer +DESCRIPTION:DJ Ewezer with codysseus +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240821T000000Z +CREATED:20240821T000000Z +DTSTART:20240821T210000Z +UID:CYNOSPHERE31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240821T215959Z +SUMMARY:Sounds of Synergy +DESCRIPTION:Sounds of Synergy with cynosphere +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240821T000000Z +CREATED:20240821T000000Z +DTSTART:20240821T220000Z +UID:LYKAINA31220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240821T225959Z +SUMMARY:softer rock +DESCRIPTION:softer rock with lykaina +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240821T000000Z +CREATED:20240821T000000Z +DTSTART:20240821T230000Z +UID:THENEWS31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240821T232959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240822T000000Z +CREATED:20240822T000000Z +DTSTART:20240822T000000Z +UID:USERFXNET31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240822T005959Z +SUMMARY:Lit Up On Linux +DESCRIPTION:Lit Up On Linux with userfxnet +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240822T000000Z +CREATED:20240822T000000Z +DTSTART:20240822T010000Z +UID:AE31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240822T015959Z +SUMMARY:Special Education +Hacker Worlds +DESCRIPTION:Special Education +Hacker Worlds with ae +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240822T000000Z +CREATED:20240822T000000Z +DTSTART:20240822T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240822T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240822T000000Z +CREATED:20240822T000000Z +DTSTART:20240822T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240822T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240822T000000Z +CREATED:20240822T000000Z +DTSTART:20240822T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240822T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240822T000000Z +CREATED:20240822T000000Z +DTSTART:20240822T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240822T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240822T000000Z +CREATED:20240822T000000Z +DTSTART:20240822T080000Z +UID:GAOLIANGCAI31080000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240822T095959Z +SUMMARY:Chinese Pop Music w/ qingfeng +DESCRIPTION:Chinese Pop Music w/ qingfeng with gaoliangcai +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240822T000000Z +CREATED:20240822T000000Z +DTSTART:20240822T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240822T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240822T000000Z +CREATED:20240822T000000Z +DTSTART:20240822T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240822T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240822T000000Z +CREATED:20240822T000000Z +DTSTART:20240822T133000Z +UID:GREGF31133000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240822T152959Z +SUMMARY:perinde ac cadaver +DESCRIPTION:perinde ac cadaver with gregf +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240822T000000Z +CREATED:20240822T000000Z +DTSTART:20240822T160000Z +UID:OAK331160000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240822T165959Z +SUMMARY:Shake Yer Booty w/ DJ Mak +DESCRIPTION:Shake Yer Booty w/ DJ Mak with oak3 +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240822T000000Z +CREATED:20240822T000000Z +DTSTART:20240822T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240822T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240822T000000Z +CREATED:20240822T000000Z +DTSTART:20240822T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240822T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240822T000000Z +CREATED:20240822T000000Z +DTSTART:20240822T190000Z +UID:MNW31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240822T192959Z +SUMMARY:News to Me +DESCRIPTION:News to Me with mnw +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240822T000000Z +CREATED:20240822T000000Z +DTSTART:20240822T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240822T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240822T000000Z +CREATED:20240822T000000Z +DTSTART:20240822T200000Z +UID:STUG31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240822T205959Z +SUMMARY:Flux +DESCRIPTION:Flux with stug +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240822T000000Z +CREATED:20240822T000000Z +DTSTART:20240822T210000Z +UID:HANDYC31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240822T215959Z +SUMMARY:Language Soup w/ DJ Supersalad +DESCRIPTION:Language Soup w/ DJ Supersalad with handyc +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240822T000000Z +CREATED:20240822T000000Z +DTSTART:20240822T220000Z +UID:RODERSB31220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240822T225959Z +SUMMARY:Pumpkin Pie w/ Mr.Brugue +DESCRIPTION:Pumpkin Pie w/ Mr.Brugue with rodersb +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240822T000000Z +CREATED:20240822T000000Z +DTSTART:20240822T230000Z +UID:THENEWS31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240822T232959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240823T000000Z +CREATED:20240823T000000Z +DTSTART:20240823T000000Z +UID:MCORNICK31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240823T005959Z +SUMMARY:Objects In Mirrors +DESCRIPTION:Objects In Mirrors with mcornick +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240823T000000Z +CREATED:20240823T000000Z +DTSTART:20240823T010000Z +UID:FFOG31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240823T015959Z +SUMMARY:myocyte +The Margin +DESCRIPTION:myocyte +The Margin with ffog +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240823T000000Z +CREATED:20240823T000000Z +DTSTART:20240823T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240823T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240823T000000Z +CREATED:20240823T000000Z +DTSTART:20240823T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240823T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240823T000000Z +CREATED:20240823T000000Z +DTSTART:20240823T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240823T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240823T000000Z +CREATED:20240823T000000Z +DTSTART:20240823T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240823T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240823T000000Z +CREATED:20240823T000000Z +DTSTART:20240823T080000Z +UID:LIQUIDDREAMZ31080000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240823T085959Z +SUMMARY:dj aTRoPiNe / dJ PoLyBiuS +DESCRIPTION:dj aTRoPiNe / dJ PoLyBiuS with liquiddreamz +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240823T000000Z +CREATED:20240823T000000Z +DTSTART:20240823T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240823T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240823T000000Z +CREATED:20240823T000000Z +DTSTART:20240823T140000Z +UID:SCREWTAPE31140000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240823T145959Z +SUMMARY:lispy gopher show w/ screwtape +Zhen House set inside LambdaMOO +DESCRIPTION:lispy gopher show w/ screwtape +Zhen House set inside LambdaMOO with screwtape +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240823T000000Z +CREATED:20240823T000000Z +DTSTART:20240823T150000Z +UID:PUBLIUS31150000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240823T155959Z +SUMMARY:A Step Further Out +Hear Now the Words / A Step Further Out +DESCRIPTION:A Step Further Out +Hear Now the Words / A Step Further Out with publius +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240823T000000Z +CREATED:20240823T000000Z +DTSTART:20240823T160000Z +UID:KOYU31160000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240823T165959Z +SUMMARY:derealization station +DESCRIPTION:derealization station with koyu +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240823T000000Z +CREATED:20240823T000000Z +DTSTART:20240823T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240823T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240823T000000Z +CREATED:20240823T000000Z +DTSTART:20240823T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240823T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240823T000000Z +CREATED:20240823T000000Z +DTSTART:20240823T190000Z +UID:MNW31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240823T192959Z +SUMMARY:News to Me +DESCRIPTION:News to Me with mnw +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240823T000000Z +CREATED:20240823T000000Z +DTSTART:20240823T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240823T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240823T000000Z +CREATED:20240823T000000Z +DTSTART:20240823T200000Z +UID:HAIRYLARRY31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240823T205959Z +SUMMARY:Mix Remix +Something Blue +DESCRIPTION:Mix Remix +Something Blue with hairylarry +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240823T000000Z +CREATED:20240823T000000Z +DTSTART:20240823T210000Z +UID:DJVOLE31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240823T215959Z +SUMMARY:DJ Voles Week-End +DESCRIPTION:DJ Voles Week-End with djvole +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240823T000000Z +CREATED:20240823T000000Z +DTSTART:20240823T220000Z +UID:TYN31220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240823T225959Z +SUMMARY:The Third Ear +DESCRIPTION:The Third Ear with tyn +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240823T000000Z +CREATED:20240823T000000Z +DTSTART:20240823T230000Z +UID:THENEWS31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240823T232959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240824T000000Z +CREATED:20240824T000000Z +DTSTART:20240824T000000Z +UID:SCM31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240824T005959Z +SUMMARY:IWTHNS +DESCRIPTION:IWTHNS with scm +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240824T000000Z +CREATED:20240824T000000Z +DTSTART:20240824T010000Z +UID:ZDRMONSTER31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240824T020000Z +SUMMARY:The DJ Zdrmonster Show +DESCRIPTION:The DJ Zdrmonster Show with zdrmonster +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240824T000000Z +CREATED:20240824T000000Z +DTSTART:20240824T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240824T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240824T000000Z +CREATED:20240824T000000Z +DTSTART:20240824T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240824T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240824T000000Z +CREATED:20240824T000000Z +DTSTART:20240824T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240824T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240824T000000Z +CREATED:20240824T000000Z +DTSTART:20240824T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240824T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240824T000000Z +CREATED:20240824T000000Z +DTSTART:20240824T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240824T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240824T000000Z +CREATED:20240824T000000Z +DTSTART:20240824T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240824T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240824T000000Z +CREATED:20240824T000000Z +DTSTART:20240824T160000Z +UID:MJT31160000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240824T165959Z +SUMMARY:THE SOUND SHOW +DESCRIPTION:THE SOUND SHOW with mjt +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240824T000000Z +CREATED:20240824T000000Z +DTSTART:20240824T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240824T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240824T000000Z +CREATED:20240824T000000Z +DTSTART:20240824T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240824T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240824T000000Z +CREATED:20240824T000000Z +DTSTART:20240824T190000Z +UID:PUBLIUS31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240824T192959Z +SUMMARY:A Step Further Out +Hear Now the Words / A Step Further Out +DESCRIPTION:A Step Further Out +Hear Now the Words / A Step Further Out with publius +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240824T000000Z +CREATED:20240824T000000Z +DTSTART:20240824T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240824T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240824T000000Z +CREATED:20240824T000000Z +DTSTART:20240824T200000Z +UID:FFOG31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240824T202959Z +SUMMARY:myocyte +The Margin +DESCRIPTION:myocyte +The Margin with ffog +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240824T000000Z +CREATED:20240824T000000Z +DTSTART:20240824T203000Z +UID:ROLY31203000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240824T205959Z +SUMMARY:Banana Republic +DESCRIPTION:Banana Republic with roly +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240824T000000Z +CREATED:20240824T000000Z +DTSTART:20240824T210000Z +UID:TANAKIAN31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240824T215959Z +SUMMARY:underground deep dark inky sets +DESCRIPTION:underground deep dark inky sets with tanakian +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240824T000000Z +CREATED:20240824T000000Z +DTSTART:20240824T220000Z +UID:ROLLTIME31220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240824T225959Z +SUMMARY:Plane of the Eclectic w/ DJ rolltime +DESCRIPTION:Plane of the Eclectic w/ DJ rolltime with rolltime +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240824T000000Z +CREATED:20240824T000000Z +DTSTART:20240824T230000Z +UID:SNOWDUSK31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240824T235959Z +SUMMARY:Intergalactic Wasabi Mix +DESCRIPTION:Intergalactic Wasabi Mix with snowdusk +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240825T000000Z +CREATED:20240825T000000Z +DTSTART:20240825T000000Z +UID:FROGGYME31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240825T005959Z +SUMMARY:Funkaliciously Jazztastic Hour +DESCRIPTION:Funkaliciously Jazztastic Hour with froggyme +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240825T000000Z +CREATED:20240825T000000Z +DTSTART:20240825T010000Z +UID:AROCHOD31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240825T015959Z +SUMMARY:The Arocho Show +DESCRIPTION:The Arocho Show with arochod +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240825T000000Z +CREATED:20240825T000000Z +DTSTART:20240825T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240825T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240825T000000Z +CREATED:20240825T000000Z +DTSTART:20240825T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240825T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240825T000000Z +CREATED:20240825T000000Z +DTSTART:20240825T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240825T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240825T000000Z +CREATED:20240825T000000Z +DTSTART:20240825T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240825T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240825T000000Z +CREATED:20240825T000000Z +DTSTART:20240825T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240825T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240825T000000Z +CREATED:20240825T000000Z +DTSTART:20240825T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240825T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240825T000000Z +CREATED:20240825T000000Z +DTSTART:20240825T140000Z +UID:ONEOFVALTS31140000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240825T145959Z +SUMMARY:ferahfeza chronicles +DESCRIPTION:ferahfeza chronicles with oneofvalts +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240825T000000Z +CREATED:20240825T000000Z +DTSTART:20240825T170000Z +UID:DJROBYN31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240825T192959Z +SUMMARY:Shut Up You Freak +DESCRIPTION:Shut Up You Freak with djrobyn +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240825T000000Z +CREATED:20240825T000000Z +DTSTART:20240825T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240825T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240825T000000Z +CREATED:20240825T000000Z +DTSTART:20240825T210000Z +UID:TYN31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240825T215959Z +SUMMARY:The Third Ear +DESCRIPTION:The Third Ear with tyn +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240825T000000Z +CREATED:20240825T000000Z +DTSTART:20240825T230000Z +UID:SNOWDUSK31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240825T235959Z +SUMMARY:Intergalactic Wasabi Mix +DESCRIPTION:Intergalactic Wasabi Mix with snowdusk +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240826T000000Z +CREATED:20240826T000000Z +DTSTART:20240826T000000Z +UID:SDFARC31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240826T005959Z +SUMMARY:SDF Amateur Radio Club +DESCRIPTION:SDF Amateur Radio Club with sdfarc +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240826T000000Z +CREATED:20240826T000000Z +DTSTART:20240826T010000Z +UID:M3G531010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240826T015959Z +SUMMARY:Organized Chaos +DESCRIPTION:Organized Chaos with m3g5 +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240826T000000Z +CREATED:20240826T000000Z +DTSTART:20240826T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240826T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240826T000000Z +CREATED:20240826T000000Z +DTSTART:20240826T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240826T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240826T000000Z +CREATED:20240826T000000Z +DTSTART:20240826T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240826T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240826T000000Z +CREATED:20240826T000000Z +DTSTART:20240826T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240826T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240826T000000Z +CREATED:20240826T000000Z +DTSTART:20240826T080000Z +UID:GAOLIANGCAI31080000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240826T095959Z +SUMMARY:Chinese Pop Music w/ qingfeng +DESCRIPTION:Chinese Pop Music w/ qingfeng with gaoliangcai +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240826T000000Z +CREATED:20240826T000000Z +DTSTART:20240826T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240826T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240826T000000Z +CREATED:20240826T000000Z +DTSTART:20240826T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240826T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240826T000000Z +CREATED:20240826T000000Z +DTSTART:20240826T130000Z +UID:GRIZZLY31130000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240826T132959Z +SUMMARY:Elektro Grizzly Show +DESCRIPTION:Elektro Grizzly Show with grizzly +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240826T000000Z +CREATED:20240826T000000Z +DTSTART:20240826T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240826T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240826T000000Z +CREATED:20240826T000000Z +DTSTART:20240826T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240826T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240826T000000Z +CREATED:20240826T000000Z +DTSTART:20240826T190000Z +UID:MNW31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240826T192959Z +SUMMARY:News to Me +DESCRIPTION:News to Me with mnw +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240826T000000Z +CREATED:20240826T000000Z +DTSTART:20240826T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240826T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240826T000000Z +CREATED:20240826T000000Z +DTSTART:20240826T200000Z +UID:HAIRYLARRY31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240826T215959Z +SUMMARY:Mix Remix +Something Blue +DESCRIPTION:Mix Remix +Something Blue with hairylarry +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240826T000000Z +CREATED:20240826T000000Z +DTSTART:20240826T220000Z +UID:M3G531220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240826T225959Z +SUMMARY:Organized Chaos +DESCRIPTION:Organized Chaos with m3g5 +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240826T000000Z +CREATED:20240826T000000Z +DTSTART:20240826T230000Z +UID:THENEWS31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240826T232959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240827T000000Z +CREATED:20240827T000000Z +DTSTART:20240827T000000Z +UID:STOKESAUCE31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240827T005959Z +SUMMARY:Stokesauce Radio Show +DESCRIPTION:Stokesauce Radio Show with stokesauce +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240827T000000Z +CREATED:20240827T000000Z +DTSTART:20240827T010000Z +UID:FREEFLOW31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240827T012959Z +SUMMARY:We are... Free Flow - noZomi and Masawo +DESCRIPTION:We are... Free Flow - noZomi and Masawo with freeflow +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240827T000000Z +CREATED:20240827T000000Z +DTSTART:20240827T010000Z +UID:VALRAVN31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240827T015959Z +SUMMARY: +DESCRIPTION: with valravn +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240827T000000Z +CREATED:20240827T000000Z +DTSTART:20240827T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240827T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240827T000000Z +CREATED:20240827T000000Z +DTSTART:20240827T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240827T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240827T000000Z +CREATED:20240827T000000Z +DTSTART:20240827T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240827T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240827T000000Z +CREATED:20240827T000000Z +DTSTART:20240827T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240827T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240827T000000Z +CREATED:20240827T000000Z +DTSTART:20240827T080000Z +UID:GAOLIANGCAI31080000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240827T095959Z +SUMMARY:Chinese Pop Music w/ qingfeng +DESCRIPTION:Chinese Pop Music w/ qingfeng with gaoliangcai +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240827T000000Z +CREATED:20240827T000000Z +DTSTART:20240827T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240827T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240827T000000Z +CREATED:20240827T000000Z +DTSTART:20240827T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240827T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240827T000000Z +CREATED:20240827T000000Z +DTSTART:20240827T150000Z +UID:PUBLIUS31150000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240827T155959Z +SUMMARY:A Step Further Out +Hear Now the Words / A Step Further Out +DESCRIPTION:A Step Further Out +Hear Now the Words / A Step Further Out with publius +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240827T000000Z +CREATED:20240827T000000Z +DTSTART:20240827T160000Z +UID:GEF31160000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240827T165959Z +SUMMARY:evolution revolution w/ djDamaru +Guided Meditation w/ djDamaru +DESCRIPTION:evolution revolution w/ djDamaru +Guided Meditation w/ djDamaru with gef +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240827T000000Z +CREATED:20240827T000000Z +DTSTART:20240827T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240827T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240827T000000Z +CREATED:20240827T000000Z +DTSTART:20240827T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240827T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240827T000000Z +CREATED:20240827T000000Z +DTSTART:20240827T190000Z +UID:MNW31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240827T192959Z +SUMMARY:News to Me +DESCRIPTION:News to Me with mnw +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240827T000000Z +CREATED:20240827T000000Z +DTSTART:20240827T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240827T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240827T000000Z +CREATED:20240827T000000Z +DTSTART:20240827T200000Z +UID:LEONG31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240827T205959Z +SUMMARY:internet noises w/ DJ leong +DESCRIPTION:internet noises w/ DJ leong with leong +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240827T000000Z +CREATED:20240827T000000Z +DTSTART:20240827T210000Z +UID:KASHIFSHAH31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240827T215959Z +SUMMARY:SloFI Show w/ DJ SloMo +DESCRIPTION:SloFI Show w/ DJ SloMo with kashifshah +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240827T000000Z +CREATED:20240827T000000Z +DTSTART:20240827T220000Z +UID:M3G531220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240827T225959Z +SUMMARY:Organized Chaos +DESCRIPTION:Organized Chaos with m3g5 +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240827T000000Z +CREATED:20240827T000000Z +DTSTART:20240827T230000Z +UID:NORTHERNLIGHTS31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240827T235959Z +SUMMARY:Praise Then Darkness +DESCRIPTION:Praise Then Darkness with northernlights +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240828T000000Z +CREATED:20240828T000000Z +DTSTART:20240828T000000Z +UID:SCREWTAPE31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240828T005959Z +SUMMARY:lispy gopher show w/ screwtape +Zhen House set inside LambdaMOO +DESCRIPTION:lispy gopher show w/ screwtape +Zhen House set inside LambdaMOO with screwtape +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240828T000000Z +CREATED:20240828T000000Z +DTSTART:20240828T010000Z +UID:AE31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240828T015959Z +SUMMARY:Special Education +Hacker Worlds +DESCRIPTION:Special Education +Hacker Worlds with ae +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240828T000000Z +CREATED:20240828T000000Z +DTSTART:20240828T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240828T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240828T000000Z +CREATED:20240828T000000Z +DTSTART:20240828T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240828T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240828T000000Z +CREATED:20240828T000000Z +DTSTART:20240828T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240828T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240828T000000Z +CREATED:20240828T000000Z +DTSTART:20240828T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240828T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240828T000000Z +CREATED:20240828T000000Z +DTSTART:20240828T080000Z +UID:GAOLIANGCAI31080000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240828T095959Z +SUMMARY:Chinese Pop Music w/ qingfeng +DESCRIPTION:Chinese Pop Music w/ qingfeng with gaoliangcai +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240828T000000Z +CREATED:20240828T000000Z +DTSTART:20240828T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240828T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240828T000000Z +CREATED:20240828T000000Z +DTSTART:20240828T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240828T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240828T000000Z +CREATED:20240828T000000Z +DTSTART:20240828T130000Z +UID:NICKG31130000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240828T145959Z +SUMMARY:Nick's Cave +DESCRIPTION:Nick's Cave with nickg +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240828T000000Z +CREATED:20240828T000000Z +DTSTART:20240828T150000Z +UID:GEF31150000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240828T155959Z +SUMMARY:evolution revolution w/ djDamaru +Guided Meditation w/ djDamaru +DESCRIPTION:evolution revolution w/ djDamaru +Guided Meditation w/ djDamaru with gef +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240828T000000Z +CREATED:20240828T000000Z +DTSTART:20240828T160000Z +UID:OVERLAND31160000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240828T165959Z +SUMMARY:Music For Nitrogen Narcosis +DESCRIPTION:Music For Nitrogen Narcosis with overland +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240828T000000Z +CREATED:20240828T000000Z +DTSTART:20240828T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240828T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240828T000000Z +CREATED:20240828T000000Z +DTSTART:20240828T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240828T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240828T000000Z +CREATED:20240828T000000Z +DTSTART:20240828T190000Z +UID:MNW31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240828T192959Z +SUMMARY:News to Me +DESCRIPTION:News to Me with mnw +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240828T000000Z +CREATED:20240828T000000Z +DTSTART:20240828T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240828T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240828T000000Z +CREATED:20240828T000000Z +DTSTART:20240828T200000Z +UID:CODYSSEUS31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240828T205959Z +SUMMARY:DJ Ewezer +DESCRIPTION:DJ Ewezer with codysseus +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240828T000000Z +CREATED:20240828T000000Z +DTSTART:20240828T210000Z +UID:CYNOSPHERE31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240828T215959Z +SUMMARY:Sounds of Synergy +DESCRIPTION:Sounds of Synergy with cynosphere +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240828T000000Z +CREATED:20240828T000000Z +DTSTART:20240828T220000Z +UID:LYKAINA31220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240828T225959Z +SUMMARY:softer rock +DESCRIPTION:softer rock with lykaina +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240828T000000Z +CREATED:20240828T000000Z +DTSTART:20240828T230000Z +UID:THENEWS31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240828T232959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240829T000000Z +CREATED:20240829T000000Z +DTSTART:20240829T000000Z +UID:USERFXNET31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240829T005959Z +SUMMARY:Lit Up On Linux +DESCRIPTION:Lit Up On Linux with userfxnet +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240829T000000Z +CREATED:20240829T000000Z +DTSTART:20240829T010000Z +UID:AE31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240829T015959Z +SUMMARY:Special Education +Hacker Worlds +DESCRIPTION:Special Education +Hacker Worlds with ae +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240829T000000Z +CREATED:20240829T000000Z +DTSTART:20240829T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240829T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240829T000000Z +CREATED:20240829T000000Z +DTSTART:20240829T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240829T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240829T000000Z +CREATED:20240829T000000Z +DTSTART:20240829T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240829T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240829T000000Z +CREATED:20240829T000000Z +DTSTART:20240829T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240829T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240829T000000Z +CREATED:20240829T000000Z +DTSTART:20240829T080000Z +UID:GAOLIANGCAI31080000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240829T095959Z +SUMMARY:Chinese Pop Music w/ qingfeng +DESCRIPTION:Chinese Pop Music w/ qingfeng with gaoliangcai +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240829T000000Z +CREATED:20240829T000000Z +DTSTART:20240829T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240829T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240829T000000Z +CREATED:20240829T000000Z +DTSTART:20240829T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240829T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240829T000000Z +CREATED:20240829T000000Z +DTSTART:20240829T133000Z +UID:GREGF31133000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240829T152959Z +SUMMARY:perinde ac cadaver +DESCRIPTION:perinde ac cadaver with gregf +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240829T000000Z +CREATED:20240829T000000Z +DTSTART:20240829T160000Z +UID:OAK331160000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240829T165959Z +SUMMARY:Shake Yer Booty w/ DJ Mak +DESCRIPTION:Shake Yer Booty w/ DJ Mak with oak3 +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240829T000000Z +CREATED:20240829T000000Z +DTSTART:20240829T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240829T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240829T000000Z +CREATED:20240829T000000Z +DTSTART:20240829T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240829T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240829T000000Z +CREATED:20240829T000000Z +DTSTART:20240829T190000Z +UID:MNW31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240829T192959Z +SUMMARY:News to Me +DESCRIPTION:News to Me with mnw +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240829T000000Z +CREATED:20240829T000000Z +DTSTART:20240829T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240829T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240829T000000Z +CREATED:20240829T000000Z +DTSTART:20240829T200000Z +UID:STUG31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240829T205959Z +SUMMARY:Flux +DESCRIPTION:Flux with stug +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240829T000000Z +CREATED:20240829T000000Z +DTSTART:20240829T210000Z +UID:HANDYC31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240829T215959Z +SUMMARY:Language Soup w/ DJ Supersalad +DESCRIPTION:Language Soup w/ DJ Supersalad with handyc +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240829T000000Z +CREATED:20240829T000000Z +DTSTART:20240829T220000Z +UID:RODERSB31220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240829T225959Z +SUMMARY:Pumpkin Pie w/ Mr.Brugue +DESCRIPTION:Pumpkin Pie w/ Mr.Brugue with rodersb +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240829T000000Z +CREATED:20240829T000000Z +DTSTART:20240829T230000Z +UID:THENEWS31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240829T232959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240830T000000Z +CREATED:20240830T000000Z +DTSTART:20240830T000000Z +UID:MCORNICK31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240830T005959Z +SUMMARY:Objects In Mirrors +DESCRIPTION:Objects In Mirrors with mcornick +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240830T000000Z +CREATED:20240830T000000Z +DTSTART:20240830T010000Z +UID:FFOG31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240830T015959Z +SUMMARY:myocyte +The Margin +DESCRIPTION:myocyte +The Margin with ffog +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240830T000000Z +CREATED:20240830T000000Z +DTSTART:20240830T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240830T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240830T000000Z +CREATED:20240830T000000Z +DTSTART:20240830T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240830T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240830T000000Z +CREATED:20240830T000000Z +DTSTART:20240830T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240830T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240830T000000Z +CREATED:20240830T000000Z +DTSTART:20240830T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240830T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240830T000000Z +CREATED:20240830T000000Z +DTSTART:20240830T080000Z +UID:LIQUIDDREAMZ31080000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240830T085959Z +SUMMARY:dj aTRoPiNe / dJ PoLyBiuS +DESCRIPTION:dj aTRoPiNe / dJ PoLyBiuS with liquiddreamz +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240830T000000Z +CREATED:20240830T000000Z +DTSTART:20240830T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240830T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240830T000000Z +CREATED:20240830T000000Z +DTSTART:20240830T140000Z +UID:SCREWTAPE31140000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240830T145959Z +SUMMARY:lispy gopher show w/ screwtape +Zhen House set inside LambdaMOO +DESCRIPTION:lispy gopher show w/ screwtape +Zhen House set inside LambdaMOO with screwtape +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240830T000000Z +CREATED:20240830T000000Z +DTSTART:20240830T150000Z +UID:PUBLIUS31150000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240830T155959Z +SUMMARY:A Step Further Out +Hear Now the Words / A Step Further Out +DESCRIPTION:A Step Further Out +Hear Now the Words / A Step Further Out with publius +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240830T000000Z +CREATED:20240830T000000Z +DTSTART:20240830T160000Z +UID:KOYU31160000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240830T165959Z +SUMMARY:derealization station +DESCRIPTION:derealization station with koyu +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240830T000000Z +CREATED:20240830T000000Z +DTSTART:20240830T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240830T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240830T000000Z +CREATED:20240830T000000Z +DTSTART:20240830T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240830T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240830T000000Z +CREATED:20240830T000000Z +DTSTART:20240830T190000Z +UID:MNW31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240830T192959Z +SUMMARY:News to Me +DESCRIPTION:News to Me with mnw +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240830T000000Z +CREATED:20240830T000000Z +DTSTART:20240830T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240830T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240830T000000Z +CREATED:20240830T000000Z +DTSTART:20240830T200000Z +UID:HAIRYLARRY31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240830T205959Z +SUMMARY:Mix Remix +Something Blue +DESCRIPTION:Mix Remix +Something Blue with hairylarry +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240830T000000Z +CREATED:20240830T000000Z +DTSTART:20240830T210000Z +UID:DJVOLE31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240830T215959Z +SUMMARY:DJ Voles Week-End +DESCRIPTION:DJ Voles Week-End with djvole +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240830T000000Z +CREATED:20240830T000000Z +DTSTART:20240830T220000Z +UID:TYN31220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240830T225959Z +SUMMARY:The Third Ear +DESCRIPTION:The Third Ear with tyn +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240830T000000Z +CREATED:20240830T000000Z +DTSTART:20240830T230000Z +UID:THENEWS31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240830T232959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240831T000000Z +CREATED:20240831T000000Z +DTSTART:20240831T000000Z +UID:SCM31000000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240831T005959Z +SUMMARY:IWTHNS +DESCRIPTION:IWTHNS with scm +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240831T000000Z +CREATED:20240831T000000Z +DTSTART:20240831T010000Z +UID:ZDRMONSTER31010000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240831T020000Z +SUMMARY:The DJ Zdrmonster Show +DESCRIPTION:The DJ Zdrmonster Show with zdrmonster +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240831T000000Z +CREATED:20240831T000000Z +DTSTART:20240831T020000Z +UID:OPENVOIP31020000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240831T025959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240831T000000Z +CREATED:20240831T000000Z +DTSTART:20240831T030000Z +UID:OPENMIC31030000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240831T055959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240831T000000Z +CREATED:20240831T000000Z +DTSTART:20240831T060000Z +UID:HARMONICAPLAYER31060000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240831T072959Z +SUMMARY:Audio Theater +DESCRIPTION:Audio Theater with HarmonicaPlayer +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240831T000000Z +CREATED:20240831T000000Z +DTSTART:20240831T073000Z +UID:TOB31073000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240831T075959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240831T000000Z +CREATED:20240831T000000Z +DTSTART:20240831T100000Z +UID:THENEWS31100000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240831T102959Z +SUMMARY:World News Report +DESCRIPTION:World News Report with thenews +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240831T000000Z +CREATED:20240831T000000Z +DTSTART:20240831T110000Z +UID:SBR31110000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240831T125959Z +SUMMARY:Synth Battle Royale Reveue +DESCRIPTION:Synth Battle Royale Reveue with sbr +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240831T000000Z +CREATED:20240831T000000Z +DTSTART:20240831T160000Z +UID:MJT31160000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240831T165959Z +SUMMARY:THE SOUND SHOW +DESCRIPTION:THE SOUND SHOW with mjt +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240831T000000Z +CREATED:20240831T000000Z +DTSTART:20240831T170000Z +UID:OPENMIC31170000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240831T175959Z +SUMMARY:Open Mic - Anyone can stream +DESCRIPTION:Open Mic - Anyone can stream with openmic +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240831T000000Z +CREATED:20240831T000000Z +DTSTART:20240831T180000Z +UID:OPENVOIP31180000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240831T185959Z +SUMMARY:Open VoIP on 1088 +DESCRIPTION:Open VoIP on 1088 with openvoip +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240831T000000Z +CREATED:20240831T000000Z +DTSTART:20240831T190000Z +UID:PUBLIUS31190000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240831T192959Z +SUMMARY:A Step Further Out +Hear Now the Words / A Step Further Out +DESCRIPTION:A Step Further Out +Hear Now the Words / A Step Further Out with publius +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240831T000000Z +CREATED:20240831T000000Z +DTSTART:20240831T193000Z +UID:TOB31193000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240831T195959Z +SUMMARY:Dubious Goals Committee +DESCRIPTION:Dubious Goals Committee with tob +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240831T000000Z +CREATED:20240831T000000Z +DTSTART:20240831T200000Z +UID:FFOG31200000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240831T202959Z +SUMMARY:myocyte +The Margin +DESCRIPTION:myocyte +The Margin with ffog +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240831T000000Z +CREATED:20240831T000000Z +DTSTART:20240831T203000Z +UID:ROLY31203000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240831T205959Z +SUMMARY:Banana Republic +DESCRIPTION:Banana Republic with roly +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240831T000000Z +CREATED:20240831T000000Z +DTSTART:20240831T210000Z +UID:TANAKIAN31210000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240831T215959Z +SUMMARY:underground deep dark inky sets +DESCRIPTION:underground deep dark inky sets with tanakian +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240831T000000Z +CREATED:20240831T000000Z +DTSTART:20240831T220000Z +UID:ROLLTIME31220000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240831T225959Z +SUMMARY:Plane of the Eclectic w/ DJ rolltime +DESCRIPTION:Plane of the Eclectic w/ DJ rolltime with rolltime +LOCATION:aNONradio.net +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240831T000000Z +CREATED:20240831T000000Z +DTSTART:20240831T230000Z +UID:SNOWDUSK31230000 +TRANSP:OPAQUE +SEQUENCE:58 +RRULE:FREQ=WEEKLY +DTEND:20240831T235959Z +SUMMARY:Intergalactic Wasabi Mix +DESCRIPTION:Intergalactic Wasabi Mix with snowdusk +LOCATION:aNONradio.net +END:VEVENT +END:VCALENDAR diff --git a/cal/tilderadio.ics b/cal/tilderadio.ics new file mode 100644 index 0000000..4d180e0 --- /dev/null +++ b/cal/tilderadio.ics @@ -0,0 +1,707 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:tilderadio schedule +DTSTAMP:20240910T065124Z +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240910T043000Z +DTSTART:20240910T040000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:f891c0c8bed9336ecba8d153cb569a242de835ca6f27cfe447bec12dedf39429 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240910T053000Z +DTSTART:20240910T050000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:28bf4904cccaf06a13d89b76c65fbd6f72a4d3b551c6403e532378dbd5159066 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240910T103000Z +DTSTART:20240910T100000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:6dd0129eb2f711ab090be4e010ec6059547a18a6b981d7686e073e81a1916c53 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240910T113000Z +DTSTART:20240910T110000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:a45bb01369146bf3977840770e428be156f396686e4161b536af5f439139c118 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240910T163000Z +DTSTART:20240910T160000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:b04c3a1f3256687de305fa60ff258252f89cda6f9ab2a3532cc2ba18acc960b3 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240910T173000Z +DTSTART:20240910T170000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:23a972cee33fb22c4ae62b37fa1a89d0517534a497be7cd000b20abd4b9066be + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240910T223000Z +DTSTART:20240910T220000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ tomasino +UID:00454ccb57ecafa6e1d2ca7bfc7576b5abbe0ecf8a705a638e85e9d21ccbf2b6 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240910T223000Z +DTSTART:20240910T220000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:1f1dbc6f4a8e86820ac87c0e08fdd452f7107ce6c497fd9bb1ac04b696a06be4 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240911T000000Z +DTSTART:20240910T230000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ amr +UID:1002d7ea02ae6eae788b3b659f73b7b914362a8e742d9e74dc08a56cf7da553f + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240910T233000Z +DTSTART:20240910T230000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:30fbca740e7eaf6678c4e5c958a538666124a7cfbc781605a7d2106408d9d719 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240911T030000Z +DTSTART:20240911T020000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ controlfreak +UID:49d36e2bcfa70f1b55453b828e2d5699d5b8aff62c8751884373cf970ca4a2e7 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240911T043000Z +DTSTART:20240911T040000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:656e7fa9d2858174762fe425a821c333b835fb8455c693d47b017b1d74977394 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240911T053000Z +DTSTART:20240911T050000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:e90a755444ef718ea0db9b57ce99095afdb6bee259101fcc9110dfaa618e6cc1 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240911T103000Z +DTSTART:20240911T100000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:8fd8ad85e6300d12858f4669866a64b3bf5738b85c7d3b6843a3d0d98306a79f + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240911T113000Z +DTSTART:20240911T110000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:2ead7e40cc1c96582d876d31c44a523374133453e13ff8e4a3a138562ac622dc + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240911T163000Z +DTSTART:20240911T160000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:cd6a5524178fd68050fb9adb7beb68466afdaed02f5d0942d69965a927e35c9f + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240911T173000Z +DTSTART:20240911T170000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:6f2aff94354cbc796874c5f4a3581f3769012ecbd2de2735a8ced8886236b0c7 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240911T200000Z +DTSTART:20240911T190000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ zane +UID:bc30f1e01c4e17cab0c5599f3ef73d532e23a34dccbd03fe7490379c519c6565 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240911T223000Z +DTSTART:20240911T220000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:0dad19bd373ab7fb55a137f16a229342be7939c1720c7c5725adf2689aa5286b + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240911T233000Z +DTSTART:20240911T230000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:9e1e1a5f45f7ee85c373247ff8efc818c05dcc7c68b4f3e98cd6a59032f910ee + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240912T010000Z +DTSTART:20240912T000000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ hardmous +UID:1e9968c16de4c9fa09caa6fb6b6efbba3fec08218da551be004821e9a780aaa2 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240912T043000Z +DTSTART:20240912T040000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:932e2f58ae67d047f597bfe87b93988a3943492d4e14276b13286c38b72bcb3e + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240912T053000Z +DTSTART:20240912T050000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:71f7c49366cb4953345fdb98abcb426d5da49203b272e2935a6b02cf0cc11da0 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240912T103000Z +DTSTART:20240912T100000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:bfa6bf2261887931de2ff3cb0252d745920e18c5bd313b967872cc896e0147dd + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240912T113000Z +DTSTART:20240912T110000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:03a1d0adf2b902548a9d177f4821adf6292d2f9f96a0f674e93021c319fcc61b + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240912T163000Z +DTSTART:20240912T160000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:00b5c74b786dfa96e5085a841d4d4f4035bb8c35940e46950db0e5a6006cd7ce + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240912T173000Z +DTSTART:20240912T170000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:19c10e9b9d8be38376b5a6290a34e491a832619b34c702c51f7230bbedecfccd + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240912T210000Z +DTSTART:20240912T200000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ satchlj +UID:b315ceb4b855f4d4d3987d729bd5346db348aa82099908684be75689b3dc718e + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240912T223000Z +DTSTART:20240912T220000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ tomasino +UID:6d9f42d158f29c99a0f7af6a4ff46efb3dea0a4bca52d8982a4493fc9447b00b + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240912T233000Z +DTSTART:20240912T230000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:2ac7df4d1c474f5ca8661c7a5269a3ddf2add801a15df73ba3084f089400463a + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240913T020000Z +DTSTART:20240913T010000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ ffog +UID:f6663a7ff9b9bb342aa39370464490307aa3fcfca3aa906babe295ca4bf2e613 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240913T043000Z +DTSTART:20240913T040000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:c3cc04430fb368e04424fc99239c8435c79b7e724d897f1492ad972a9e51209f + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240913T053000Z +DTSTART:20240913T050000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:2432769ddd3c0fc5df8b4c453b2286b2bee7bde3a6887171da195b22d39bc27f + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240913T103000Z +DTSTART:20240913T100000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:83a7c823cfe6703c974af428519a7410fd4be7ed6776d4cb7e3cba9c1862a54a + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240913T113000Z +DTSTART:20240913T110000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:fef229aa72b6570133eb41f6170b666865a4173fa43b3f6827a1a8b5a5d649e4 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240913T150000Z +DTSTART:20240913T140000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ emptyadam +UID:1b9e8c042307f5ca642ca3bbd3e3557611ca68ae1106de91c5a4a575ed533119 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240913T163000Z +DTSTART:20240913T160000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:cfeedf09e990b7ebf07a73f3f0685b2ef4fd341a0abec07343231113fc1c4938 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240913T173000Z +DTSTART:20240913T170000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:3b4fba1ca99ed43fe46430c8b9cc7422ffa90a02f203087174bdb6d43ab7e8d4 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240913T200000Z +DTSTART:20240913T190000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ zane +UID:508e169ccb554b4e61fca286e56cc3e9e1fc70bb014e898170a2aadd33e9fd9a + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240913T210000Z +DTSTART:20240913T200000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ mounderfod +UID:7c89ac7d5641719261f27b509413e94523e94fc29d4fb0ff53ba6bc7f9d97cfc + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240913T223000Z +DTSTART:20240913T220000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:a01cbbc516adfc9a06dbf10a86d2fd046488f075e9f62a3bf923812e77d0e182 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240913T233000Z +DTSTART:20240913T230000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:3df4d3c2ad5249b3d93e7522a0dc70ccbb6cd601339f082b3efd761c9f813a61 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240914T010000Z +DTSTART:20240914T000000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ G_Love +UID:50ca879b23044c251b159d5d4e09935b07478e0248cf5f363e5da2eed4378330 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240914T030000Z +DTSTART:20240914T020000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ guofu +UID:8a74a31ebae39723fdc3b5e62420d28105c235b93982c984543f76b3c318ab2e + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240914T043000Z +DTSTART:20240914T040000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:bdfcbae08fe84a0b81fdbea2e85c9a7e3bf963124cbd95284b5c7d8c1ce3cb73 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240914T053000Z +DTSTART:20240914T050000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:2cd24bfbf6074bfe612df8366526b9a29e9dc2ae166b185cb335a5efd1629f03 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240914T103000Z +DTSTART:20240914T100000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:7e024557639dc6541198cdec6b709704cd7dd2a4baaf9641000e650d156bfbb4 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240914T113000Z +DTSTART:20240914T110000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:edbddf9b7efe8e3286c3f6937148274bb16894c3a6638fd61ccefa662667ab46 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240914T163000Z +DTSTART:20240914T160000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:38b5f07453e34a5b7fe8e0705648fda7a5c8878a3a749c315ff8370e75544578 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240914T173000Z +DTSTART:20240914T170000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:38f461e8ffb9a3cb45959be4c0a22b2cd2ca2b94642f324cec442f5e22d678ef + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240914T190000Z +DTSTART:20240914T180000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ _BrainDamage +UID:bb757f6297eda5e6b8472a6532a8a3a60d7a38118c0f13fc3940ed6f5692e4c3 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240914T210000Z +DTSTART:20240914T200000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ mewt +UID:a639b04c92e7b86b6a98b43118d7219fb7be6c0cec4ffd5e584d38e000ea9c5c + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240914T223000Z +DTSTART:20240914T220000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:f9192562a8d088234f8fca782315b103fc4750ef588963e50911071ee590bff8 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240914T233000Z +DTSTART:20240914T230000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:1701f2e5ae866cbe78e867a1fa7bb46269e4600a21404a8aa0be0b232d6e3ae6 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240915T010000Z +DTSTART:20240915T000000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ guofu +UID:852a4592f36974c0d9a964ad60bcdb94fd71348f5e48ec1d0de9076835136f9c + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240915T030000Z +DTSTART:20240915T020000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ controlfreak +UID:be168250d9a2df7306065ffd734639181b801fc096d88fc0d8547494d420351d + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240915T043000Z +DTSTART:20240915T040000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:15006bcb5d6b84b9549d3d65e89b471efde5ee10c4c660d2bdb8bb5b768a5c33 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240915T053000Z +DTSTART:20240915T050000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:3ce0fdc45b95f740083d27c92567b1b0978a57a8bea3a8095f7e13b64feaf7a6 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240915T103000Z +DTSTART:20240915T100000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:df28fd4dd9df9f2a8fc57f42613d9ceb2835f5a89d6b4698ca2114e4a4c0d372 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240915T120000Z +DTSTART:20240915T110000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ rawktucc +UID:7eaebd5c166f4bdcc1a0a003e7ece14cca7409f0f44b441fbcae35981cfb58a2 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240915T113000Z +DTSTART:20240915T110000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:73b987e20c7c9c01d8985c796a2d52527bff0f1100ad3fc845b72001cd837985 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240915T163000Z +DTSTART:20240915T160000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:35c518303fbb180f5bc034a8a62e155a8e4b843bff9b5b9b8ac50019302eae17 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240915T173000Z +DTSTART:20240915T170000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:782d783252554e992a2bc5a34b41c743b3eaea9c40a041e52d19e98d5055ec00 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240915T223000Z +DTSTART:20240915T220000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:c5e127081b22b033ce869377929e4b7e6bb9a2632d1da25233c5da64d30b3c4f + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240915T233000Z +DTSTART:20240915T230000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:48593f97e94bbfac988165baf8089c9903d9791ac13c7f05d669c8b9a404f7e6 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240916T010000Z +DTSTART:20240915T233000Z +RRULE:FREQ=MONTHLY;WKST=SU;BYDAY=SU;BYSETPOS=-1 +SUMMARY:DJ tomasino +UID:90b2abd8a4bfc14957abd6adaa45603f741f76e6eafee74e1a3e97d53f332643 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240916T030000Z +DTSTART:20240916T020000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ G_Love +UID:fa0d045c0d2a9668d8564497219dc5ec5a3ad72bcff3807ddc739591cc15e41a + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240916T043000Z +DTSTART:20240916T040000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:9b0cbc2fe0fe1609d59954e710b45a32f834b413399159ec3c740f68d7b488b1 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240916T053000Z +DTSTART:20240916T050000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:b99e89f373c8c5e8ae65b7c1fabfe8fa1fb68efbdc6841019ce382b7a34d1e54 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240916T070000Z +DTSTART:20240916T060000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ dokuja +UID:1746bec9fca81dd7b124d85ec277982e87cc840ce14475ba6ea617b48e8c7d82 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240916T103000Z +DTSTART:20240916T100000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:4c6fedf45eab15c2e42f5a34f03417d0a1a84dbd8d54c7f41a05f4cfe8773de2 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240916T113000Z +DTSTART:20240916T110000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:7f3c1c9fcad1e766844e145f07a793d70806850ffef3a66c0971f440ac27fe4a + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240916T140000Z +DTSTART:20240916T130000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ ten_forward +UID:17d1c98177ecec6d1e492c61da4be2823ad3d043e4d685c7eca66ba9a6af7d3b + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240916T163000Z +DTSTART:20240916T160000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:fd0396452813bf7756835cf256819834f2f78f21328dcc35c6480f6b738dd0ef + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240916T173000Z +DTSTART:20240916T170000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:66f022310eb2f1a38667dc6c521a1109cf245641fac7fb0263d3d6d8423b067b + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240916T200000Z +DTSTART:20240916T190000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ zane +UID:2cafc65b52d883d84cdf2000d1e4b9feac454537f6bb2155d3611ef936329c01 + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240916T223000Z +DTSTART:20240916T220000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kate +UID:6b7f7b9eacc9258b187305581f129cb439a3f68aa7a69955103c70e8634ad2fa + @tilderadio.org +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20240910T065124Z +DTEND:20240916T233000Z +DTSTART:20240916T230000Z +RRULE:FREQ=WEEKLY +SUMMARY:DJ Kyoko +UID:2a57eef6c8359eb7af4aff0431328689dba12eccdbd880974a2a0f4d8c9a0421 + @tilderadio.org +END:VEVENT +END:VCALENDAR diff --git a/content/blog/2024-08-27_cat-photos.md b/content/blog/2024-08-27_cat-photos.md new file mode 100644 index 0000000..674430d --- /dev/null +++ b/content/blog/2024-08-27_cat-photos.md @@ -0,0 +1,6 @@ +--- +layout: post.vto +title: cat photos +category: post +--- + diff --git a/content/blog/2024-08-28_how-your-cpu-works.md b/content/blog/2024-08-28_how-your-cpu-works.md new file mode 100644 index 0000000..99f1a0d --- /dev/null +++ b/content/blog/2024-08-28_how-your-cpu-works.md @@ -0,0 +1,6 @@ +--- +layout: post.vto +title: how your cpu works +category: post +--- + diff --git a/content/blog/2024-09-03_latte-art-is-hard.md b/content/blog/2024-09-03_latte-art-is-hard.md new file mode 100644 index 0000000..65dccc4 --- /dev/null +++ b/content/blog/2024-09-03_latte-art-is-hard.md @@ -0,0 +1,6 @@ +--- +layout: post.vto +title: latte art is hard +category: post +--- + diff --git a/content/blog/2024-09-10_my-coffee-daily-driver.md b/content/blog/2024-09-10_my-coffee-daily-driver.md new file mode 100644 index 0000000..1867259 --- /dev/null +++ b/content/blog/2024-09-10_my-coffee-daily-driver.md @@ -0,0 +1,39 @@ +--- +layout: post.vto +title: my coffee daily driver +category: post +author: Mario Romero. +tags: + - coffee + - brewing + - recipe +--- + +## Style + +For my daily coffee routine, I love using the V60 switch due to its control and simplicity. The hybrid between immersion and drip brewing offers the best of both worlds: full-bodied coffee with the clarity of a pour-over. + +## The Method + +The V60 switch allows you to bloom the coffee and let it steep for a while before flipping the switch to finish the brew. This method emphasizes sweetness and balances flavors. + +![v60_switch](/img/v60_switch.avif) + +## Recipe + +- Coffee: 18g of medium-ground beans +- Water: 300ml at 94°C +- Brew time: 3-4 minutes +- Ratio: 1:16 + +## Step-By-Step + +1. Preheat the V60 switch and your cup. +2. Add 18g of coffee, ground slightly coarser than table salt. +3. Pour 50ml of water to bloom, stir gently, and wait for 45 seconds. +4. Slowly pour the remaining 250ml of water over 2 minutes. +5. Flip the switch after 2-3 minutes to let the coffee flow into the cup. + +## Tuning + +You can adjust the grind size to control the strength and clarity of your brew. A finer grind will intensify flavors, while a coarser grind will give you a cleaner cup. Experiment with brew times for different coffee profiles. diff --git a/content/blog/2024-09-10_the-scale-of-a-chip.md b/content/blog/2024-09-10_the-scale-of-a-chip.md new file mode 100644 index 0000000..523695c --- /dev/null +++ b/content/blog/2024-09-10_the-scale-of-a-chip.md @@ -0,0 +1,44 @@ +--- +layout: post.vto +title: the scale of a chip +category: post +--- + +## The Scale of a Chip + +Over the years, chip technology has evolved at an incredible rate. Let’s take a journey through time, exploring how the size of chips has changed, and compare their scale to everyday objects. + +### 1. **Intel 4004 (1971)** +The Intel 4004 was the world's first microprocessor. Measuring around **12 mm²**, it housed 2,300 transistors. Back then, it was a revolution, even though its size was comparable to a postage stamp. +![Intel 4004](/img/die_shot_intel_4004.png) + +### 2. **Pentium (1993)** +Jumping forward to the Intel Pentium, this chip had a size of around **294 mm²** and featured more than 3 million transistors. If the 4004 was the size of a postage stamp, the Pentium was more akin to a quarter. +![Pentium](/img/die_shot_pentium_orig.jpg) + +### 3. **Core i7 (2010)** +With the Intel Core i7 (Nehalem), chips took a quantum leap forward. This processor had a die size of **263 mm²** but boasted billions of transistors, allowing for enormous computational power. In comparison, the size was more like a large coin or poker chip. +![Intel Core i7](/img/die_shot_intel_i7_nehalem.jpg) + +### 4. **Apple M1 (2020)** +Fast-forward to the Apple M1 chip, which boasts a die size of around **120 mm²** and incorporates 16 billion transistors. Despite being smaller in physical size, its processing power dwarfs older chips. The M1 is about the size of a fingertip. +![Apple M1](/img/die_shot_apple_m1.avif) + +### 5. **NVIDIA A100 (2020)** +The NVIDIA A100 GPU, targeted at AI and machine learning, has an astonishing die size of **826 mm²** with over 54 billion transistors. The size of the die is comparable to a matchbox. + +### 6. **Modern Chips (2023)** +Chips today, like the **AMD Zen 4** or the **Intel 14th Gen**, have shrunk in size but grown in performance. These chips are often smaller than a dime, but they pack incredible processing power, utilizing cutting-edge 5nm and 3nm manufacturing processes. + +### Comparison Summary + +| Chip | Year | Size (mm²) | Transistors | Size Comparison | +| --- | --- | --- | --- | --- | +| Intel 4004 | 1971 | 12 | 2,300 | Postage Stamp | +| Intel Pentium | 1993 | 294 | 3 Million | Quarter | +| Intel Core i7 | 2010 | 263 | Billions | Poker Chip | +| Apple M1 | 2020 | 120 | 16 Billion | Fingertip | +| NVIDIA A100 | 2020 | 826 | 54 Billion | Matchbox | + +As technology progresses, chip sizes shrink while transistor count grows, leading to more powerful and efficient processors. The journey of microchips is a testament to human ingenuity in miniaturization. + diff --git a/content/faq.md b/content/faq.md new file mode 100644 index 0000000..9a11431 --- /dev/null +++ b/content/faq.md @@ -0,0 +1,60 @@ +--- +layout: post.vto +title: faq +url: /faq.html +--- +

What is 1159?

+

+If someone can claim the property of the moon 1, I can claim my own number, 1159. +I have made this number part of my internet identify stamping it in my usernames as Mario1159. Also i'm the owner of 1159.cl which is the address of my humble local server. +

+

Why 1159?

+

+ Well, as everybody knows, having just a simple username like

mario
is not always possible in the overpopulated land of the internet. + So eventually I choose the original idea of appending a number to my name, but this number couldn't be just
mario2
, It had to be something unique and easy to remember. + So I went to the numpad and typed the diagonal numbers but with the 1 repeated, without much reasoning. I found that the number 1159 paired well with mario, so thats how I kept it. +

+

+ And that is my simple history, but as a mini game, can you guess in what game I choose for the first time the number 1159? + If are out of ideas, you can treat this like a mini ctf ;) +

+
+
+ + + +

The answer should be in lowercase

+
+
+ +
+
+

+ Too easy?, well, now let's make this spicier. + In [REDACTED] game it was the first time I used the number 1159, but my moniker wasn't Mario1159. + I was too young and ended up choosing a silly named i thought it looked cool. + Can you guess the name before 1159? +

+
+
+ + + +

The answer should be in lowercase

+
+
+ +
+
\ No newline at end of file diff --git a/content/fediverse.md b/content/fediverse.md new file mode 100644 index 0000000..40872b2 --- /dev/null +++ b/content/fediverse.md @@ -0,0 +1,10 @@ +--- +title: fediverse +description: Fediverse (*) +--- + + + +

+The Fediverse is a decentralized network of interconnected servers used for social media, blogging, file hosting, and other content-sharing purposes. These servers, often called "instances," run various open-source software platforms like Mastodon, PeerTube, and Friendica. Each instance can communicate with others using standard protocols, such as ActivityPub, allowing users to interact across different servers. Unlike traditional social media platforms, the Fediverse is not owned by a single company, enabling greater user autonomy and control over data, while fostering diverse and independent online communities​. +

\ No newline at end of file diff --git a/content/projects/cjktoolkit.md b/content/projects/cjktoolkit.md new file mode 100644 index 0000000..cdb7c1a --- /dev/null +++ b/content/projects/cjktoolkit.md @@ -0,0 +1,5 @@ +--- +title: CJKToolkit: Digital toolkit for chinese language learners +category: projects +--- +A collection of tools for learning asian languages, learn characters though flashcards and videos, all hosted in your own computer. \ No newline at end of file diff --git a/content/projects/nanote.md b/content/projects/nanote.md new file mode 100644 index 0000000..df54f93 --- /dev/null +++ b/content/projects/nanote.md @@ -0,0 +1,5 @@ +--- +title: Nanote: The drawing canvas for hackers +category: projects +--- +Like vim but for sketches. Make vector drawings, in a lightweight canvas, with minimal UI and powerful commands and shortcuts. \ No newline at end of file diff --git a/content/projects/octobox.md b/content/projects/octobox.md new file mode 100644 index 0000000..a186762 --- /dev/null +++ b/content/projects/octobox.md @@ -0,0 +1,5 @@ +--- +title: Octobox: VDI platform based on docker webtops +category: projects +--- +Make a fleet of fast containers accesible though the web in seconds. Perfect for workshops and training. \ No newline at end of file diff --git a/content/projects/pmicgen.md b/content/projects/pmicgen.md new file mode 100644 index 0000000..16a272f --- /dev/null +++ b/content/projects/pmicgen.md @@ -0,0 +1,5 @@ +--- +title: PMICGen: Assisted PMIC core generator +category: projects +--- +Automation of a DC-DC converter power stage and a series low dropout (LDO) linear voltage regulator targeting the highly efficient generation of a parametrized regulated supply voltage from a given power source (e.g. 5V to 3V DC-DC conversion) in the SkyWater130 technology. \ No newline at end of file diff --git a/content/projects/rvscc.md b/content/projects/rvscc.md new file mode 100644 index 0000000..9a3d052 --- /dev/null +++ b/content/projects/rvscc.md @@ -0,0 +1,6 @@ +--- +title: RVSCC: RISC-V 5-Stage Pipelined Processor +category: projects +--- +Pametrizable design of a processor implementing the RV32I ISA in SystemVerilog with an N-Way memory +cache using CMake integration for instruction loading in C or RISC-V Assembly. \ No newline at end of file diff --git a/content/projects/weasel.md b/content/projects/weasel.md new file mode 100644 index 0000000..1631317 --- /dev/null +++ b/content/projects/weasel.md @@ -0,0 +1,6 @@ +--- +title: Weasel: Multimedia framework for small applications +category: projects +--- +Multiplatform library focused in game development and simple physics simulations using C++20 with an +entity-component architecture using libraries for the graphics management and OS abstraction. diff --git a/content/tildeverse.md b/content/tildeverse.md new file mode 100644 index 0000000..0772a24 --- /dev/null +++ b/content/tildeverse.md @@ -0,0 +1,10 @@ +--- +title: tildeverse +description: Tildeverse (~) +--- + +

+The Tildeverse is a group of communities that gathers around public access Unix-inspired servers. The name comes from the use of tildes to refer to home directories. The Tildeverse offers an environment reminiscent of the early Internet, where creativity, experimentation, and learning are emphasized over modern-day commercialization and optimization for virality. +

+ + \ No newline at end of file diff --git a/css/calendar.css b/css/calendar.css new file mode 100644 index 0000000..8ce1bcf --- /dev/null +++ b/css/calendar.css @@ -0,0 +1,50 @@ +ul {list-style-type: none;} + +.month { + width: 100%; + text-align: center; +} + +.month .prev { + padding-left: .1em; + padding-right: .1em; + padding-top: .2em; +} + +.month .next { + padding-left: .1em; + padding-right: .1em; + padding-top: .2em; +} + +.weekdays { + margin: 0; + padding: 0.1em 0; +} + +.weekdays li { + text-align: center; +} + +.days { + padding: 0; + margin: 0; +} + +.calendar { + width: 100%; + margin: 1em 0; +} + +.days li .active { + padding: 5px; +} + +.events { + width: 100%; + margin: 1em 0; +} + +.events td { + padding: .5em; +} \ No newline at end of file diff --git a/css/clock.css b/css/clock.css new file mode 100644 index 0000000..7ac7fbb --- /dev/null +++ b/css/clock.css @@ -0,0 +1,64 @@ +@import url(palette.css); + +.clock { + display: flex; + justify-content: space-around; + align-content: center; + align-items: center; + height: 5rem; +} + +.clock .analog-clock { + width: 4rem; + height: 4rem; +} + +.clock .digital-clock { + height: 75%; + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; +} + +.clock .digital-clock .time { + margin: 0; +} + +.clock .led-off, +.clock .led-on { + font-family: "dseg14-regular"; + font-size: 1rem; + overflow: hidden; + white-space: nowrap; + text-align: left; +} + +.clock .led-off { + position: relative; + margin: 0 auto; + color: var(--background-100); + background-color: var(--background-50); + border: .2em solid var(--background-50); +} + +.clock .led-on { + position: absolute; + top: 0; + width: 100%; + color: var(--primary-500); +} + +.clock .slider .text-spacing { + padding: 0 0.5em; +} + +.clock .slider { + display: flex; + justify-content: space-evenly; + align-items: center; +} + +.slider .option { + width: 3em; +} \ No newline at end of file diff --git a/css/colors.css b/css/colors.css new file mode 100644 index 0000000..dacb50b --- /dev/null +++ b/css/colors.css @@ -0,0 +1,296 @@ +:root[data-theme="light"] { + --text-50: #edf7f5; + --text-100: #dbf0eb; + --text-200: #b8e0d6; + --text-300: #94d1c2; + --text-400: #70c2ad; + --text-500: #4db399; + --text-600: #3d8f7a; + --text-700: #2e6b5c; + --text-800: #1f473d; + --text-900: #0f241f; + --text-950: #08120f; + + --background-50: #f0f5f4; + --background-100: #e0ebe8; + --background-200: #c2d6d1; + --background-300: #a3c2ba; + --background-400: #85ada3; + --background-500: #66998c; + --background-600: #527a70; + --background-700: #3d5c54; + --background-800: #293d38; + --background-900: #141f1c; + --background-950: #0a0f0e; + + --primary-50: #e8fdf3; + --primary-100: #d0fbe8; + --primary-200: #a1f7d0; + --primary-300: #72f3b9; + --primary-400: #43efa2; + --primary-500: #14eb8a; + --primary-600: #10bc6f; + --primary-700: #0c8d53; + --primary-800: #085e37; + --primary-900: #042f1c; + --primary-950: #02170e; + + --secondary-50: #edeff7; + --secondary-100: #dce0ef; + --secondary-200: #b8c1e0; + --secondary-300: #95a2d0; + --secondary-400: #7182c1; + --secondary-500: #4e63b1; + --secondary-600: #3e4f8e; + --secondary-700: #2f3c6a; + --secondary-800: #1f2847; + --secondary-900: #101423; + --secondary-950: #080a12; + + --accent-50: #eeedf7; + --accent-100: #dddbf0; + --accent-200: #bcb8e0; + --accent-300: #9a94d1; + --accent-400: #7870c2; + --accent-500: #574db3; + --accent-600: #453d8f; + --accent-700: #342e6b; + --accent-800: #231f47; + --accent-900: #110f24; + --accent-950: #090812; + +} + +:root[data-theme="dark"] { + --text-50: #08120f; + --text-100: #0f241f; + --text-200: #1f473d; + --text-300: #2e6b5c; + --text-400: #3d8f7a; + --text-500: #4db399; + --text-600: #70c2ad; + --text-700: #94d1c2; + --text-800: #b8e0d6; + --text-900: #dbf0eb; + --text-950: #edf7f5; + + --background-50: #0a0f0e; + --background-100: #141f1c; + --background-200: #293d38; + --background-300: #3d5c54; + --background-400: #527a70; + --background-500: #66998c; + --background-600: #85ada3; + --background-700: #a3c2ba; + --background-800: #c2d6d1; + --background-900: #e0ebe8; + --background-950: #f0f5f4; + + --primary-50: #02170e; + --primary-100: #042f1c; + --primary-200: #085e37; + --primary-300: #0c8d53; + --primary-400: #10bc6f; + --primary-500: #14eb8a; + --primary-600: #43efa2; + --primary-700: #72f3b9; + --primary-800: #a1f7d0; + --primary-900: #d0fbe8; + --primary-950: #e8fdf3; + + --secondary-50: #080a12; + --secondary-100: #101423; + --secondary-200: #1f2847; + --secondary-300: #2f3c6a; + --secondary-400: #3e4f8e; + --secondary-500: #4e63b1; + --secondary-600: #7182c1; + --secondary-700: #95a2d0; + --secondary-800: #b8c1e0; + --secondary-900: #dce0ef; + --secondary-950: #edeff7; + + --accent-50: #090812; + --accent-100: #110f24; + --accent-200: #231f47; + --accent-300: #342e6b; + --accent-400: #453d8f; + --accent-500: #574db3; + --accent-600: #7870c2; + --accent-700: #9a94d1; + --accent-800: #bcb8e0; + --accent-900: #dddbf0; + --accent-950: #eeedf7; +} + + +@media (prefers-color-scheme: light) { + + :root .icon, + :root[data-theme="dark"] .icon-dark, + :root[data-theme="light"] .icon { + -webkit-filter: invert(0); + filter: invert(0); + } + + :root .icon-dark, + :root[data-theme="light"] .icon-dark, + :root[data-theme="dark"] .icon { + -webkit-filter: invert(1); + filter: invert(1); + } +} + +@media (prefers-color-scheme: dark) { + + :root .icon, + :root[data-theme="light"] .icon-dark, + :root[data-theme="dark"] .icon { + -webkit-filter: invert(1); + filter: invert(1); + } + + :root .icon-dark, + :root[data-theme="dark"] .icon-dark, + :root[data-theme="light"] .icon { + -webkit-filter: invert(0); + filter: invert(0); + } +} + +body { + background-color: var(--background-50); + color: var(--text-950) +} + +p { + color: var(--text-800); +} + +#about p { + color: var(--text-950); +} + +header q { + color: var(--text-800) +} + +footer { + background-color: var(--secondary-500); + color: var(--secondary-900); +} + +h1 { + background-color: var(--primary-700); + text-shadow: 1.5px 1.5px var(--background-50); +} + +h2 { + background-color: var(--accent-500); +} + +a { + color: var(--primary-700); +} + +footer a { + color: var(--secondary-800); +} + +footer .button:hover { + -webkit-filter: invert(0.2); + filter: invert(0.2); +} + +footer .button:active { + -webkit-filter: invert(0.8); + filter: invert(0.8); +} + +select { + background-color: var(--accent-600); + color: var(--text-950); +} + +select option { + background-color: var(--accent-600); + color: var(--accent-800); +} + +/* doesnt work +select option:hover { + background-color: var(--accent-700); +}*/ + +a:hover { + color: var(--text-950); +} + +th { + background-color: var(--secondary-500); +} + +td { + background-color: var(--secondary-200); +} + +button { + border: none; +} + +button .icon { + width: 100%; +} + +#audio-player button { + background-color: var(--accent-700); +} + +#status th { + background-color: var(--secondary-500); +} + +#calendar .month { + background-color: var(--secondary-500); +} + +#calendar .weekdays { + background-color: var(--secondary-500); +} + +#calendar .days td { + background-color: var(--background-200); + color: var(--background-800); +} + +#calendar .days .event { + background-color: var(--background-400); + color: var(--background-950); +} + +#calendar .days .cal-preview-prev, +#calendar .days .cal-preview-next { + background-color: var(--secondary-300); + color: var(--secondary-700); +} + +#calendar .days td:hover, +#calendar .days .cal-preview-prev:hover, +#calendar .days .cal-preview-next:hover { + background-color: var(--secondary-500); + color: var(--background-900); +} + +#theme-toggle-label { + background-color: var(--secondary-300); + filter: drop-shadow(2px 2px var(--background-950)); +} + +#calendar .days .active { + background-color: var(--primary-600); + color: var(--background-50); +} + +.clock { + background-color: var(--secondary-200); +} diff --git a/css/home-extra.css b/css/home-extra.css new file mode 100644 index 0000000..2635bce --- /dev/null +++ b/css/home-extra.css @@ -0,0 +1,39 @@ +#status table { + width: 100%; + text-align: center; +} + +#profile-photo { + float: left; + width: 128px; + margin: 2%; +} + +#fediverse-content, #tildeverse-content { + display: flex; +} + +#tildeverse-content img, #fediverse-content img { + margin: 0 1em; + height: 100%; +} + +#tildeverse-content img { + margin-right: 10%; +} + +#fediverse-content img { + margin-left: 10%; +} + +#netverse p { + margin: 0; +} + +#netverse h3 { + margin: .5em 2em; +} + +#fediverse-title { + text-align: right; +} \ No newline at end of file diff --git a/css/home-layout.css b/css/home-layout.css new file mode 100644 index 0000000..3c5a2f1 --- /dev/null +++ b/css/home-layout.css @@ -0,0 +1,112 @@ +body { + font-size: 12px; + display: grid; + grid-template-areas: + "header header" + "content calendar" + "content clock" + "content nav" + "content status" + "content radio" + "netverse netverse" + "footer footer"; + grid-template-columns: minmax(15em, 35em) minmax(10em, 15em); + margin: 1em 5em; + column-gap: 1em; + row-gap: 1em; + grid-template-rows: auto; + justify-content: center; +} + +header { + grid-area: header; + text-align: center; +} + +header #title { + display: flex; + align-items: center; +} + +header h1 { + flex-grow: 1; +} + +header label { + flex-grow: 0; +} + +content { + grid-area: content; +} + +#projects ul { + padding: 0; +} + +#calendar { + grid-area: calendar; +} + +#clock { + grid-area: clock; +} + +#nav { + grid-area: nav; +} + +nav ul { + display: flex; + flex-direction: column; + padding: 0; + gap: 0; +} + +#status { + grid-area: status; +} + +#radio { + grid-area: radio; +} + +#netverse { + grid-area: netverse; +} + +footer { + grid-area: footer; + text-align: center; +} + +@media (max-width: 768px) { + body { + font-size: 10px; + grid-template-areas: + "header" + "content" + "calendar" + "nav" + "status" + "radio" + "netverse" + "footer"; + grid-template-columns: minmax(15em, 35em); + margin: 1em 2em; + column-gap: 0.5em; + row-gap: 1em; + } + #calendar { display: none; } + #status { display: none; } + #radio { display: none; } + + nav ul { + flex-direction: row; + justify-content: center; + flex-wrap: wrap; + } + nav li { + padding: 0 .2em; + } +} diff --git a/css/layout-blog.css b/css/layout-blog.css new file mode 100644 index 0000000..2be23ba --- /dev/null +++ b/css/layout-blog.css @@ -0,0 +1,49 @@ +body { + font-size: calc(.5em + .5vw); + margin: 1em 5em; +} + +.container { + display: flex; + justify-content: space-between; + gap: 1em; +} + +main { + flex: 0 0 40em; /* Set a fixed width of 40em for the main container */ + max-width: 40em; /* Ensure main doesn't exceed this width */ +} + +main img { + display: block; + margin-left: auto; + margin-right: auto; + width: 50%; +} + +.sidebar { + flex: 1; /* Take up the remaining space on the left */ + position: sticky; + align-self: flex-start; + top: 0; + max-width: 15em; +} + +.right-column { + flex: 1; /* Take up the remaining space on the right */ + display: flex; + flex-direction: column; + gap: 1em; + overflow: visible; /* Make sure overflow is set to visible */ + max-width: 15em; +} + +.tags { + /* Default styling */ +} + +.contents-list { + position: sticky; + align-self: flex-start; + top: 1em; +} diff --git a/css/palette.css b/css/palette.css new file mode 100644 index 0000000..c87bde8 --- /dev/null +++ b/css/palette.css @@ -0,0 +1,124 @@ +:root[data-theme="light"] { + --text-50: #edf7f5; + --text-100: #dbf0eb; + --text-200: #b8e0d6; + --text-300: #94d1c2; + --text-400: #70c2ad; + --text-500: #4db399; + --text-600: #3d8f7a; + --text-700: #2e6b5c; + --text-800: #1f473d; + --text-900: #0f241f; + --text-950: #08120f; + + --background-50: #f0f5f4; + --background-100: #e0ebe8; + --background-200: #c2d6d1; + --background-300: #a3c2ba; + --background-400: #85ada3; + --background-500: #66998c; + --background-600: #527a70; + --background-700: #3d5c54; + --background-800: #293d38; + --background-900: #141f1c; + --background-950: #0a0f0e; + + --primary-50: #e8fdf3; + --primary-100: #d0fbe8; + --primary-200: #a1f7d0; + --primary-300: #72f3b9; + --primary-400: #43efa2; + --primary-500: #14eb8a; + --primary-600: #10bc6f; + --primary-700: #000100; + --primary-800: #085e37; + --primary-900: #042f1c; + --primary-950: #02170e; + + --secondary-50: #edeff7; + --secondary-100: #dce0ef; + --secondary-200: #b8c1e0; + --secondary-300: #95a2d0; + --secondary-400: #7182c1; + --secondary-500: #4e63b1; + --secondary-600: #3e4f8e; + --secondary-700: #2f3c6a; + --secondary-800: #1f2847; + --secondary-900: #101423; + --secondary-950: #080a12; + + --accent-50: #eeedf7; + --accent-100: #dddbf0; + --accent-200: #bcb8e0; + --accent-300: #9a94d1; + --accent-400: #7870c2; + --accent-500: #574db3; + --accent-600: #453d8f; + --accent-700: #342e6b; + --accent-800: #231f47; + --accent-900: #110f24; + --accent-950: #090812; + +} + +:root[data-theme="dark"] { + --text-50: #08120f; + --text-100: #0f241f; + --text-200: #1f473d; + --text-300: #2e6b5c; + --text-400: #3d8f7a; + --text-500: #4db399; + --text-600: #70c2ad; + --text-700: #94d1c2; + --text-800: #b8e0d6; + --text-900: #dbf0eb; + --text-950: #edf7f5; + + --background-50: #0a0f0e; + --background-100: #141f1c; + --background-200: #293d38; + --background-300: #3d5c54; + --background-400: #527a70; + --background-500: #66998c; + --background-600: #85ada3; + --background-700: #a3c2ba; + --background-800: #c2d6d1; + --background-900: #e0ebe8; + --background-950: #f0f5f4; + + --primary-50: #02170e; + --primary-100: #042f1c; + --primary-200: #085e37; + --primary-300: #0c8d53; + --primary-400: #10bc6f; + --primary-500: #14eb8a; + --primary-600: #43efa2; + --primary-700: #72f3b9; + --primary-800: #a1f7d0; + --primary-900: #d0fbe8; + --primary-950: #e8fdf3; + + --secondary-50: #080a12; + --secondary-100: #101423; + --secondary-200: #1f2847; + --secondary-300: #2f3c6a; + --secondary-400: #3e4f8e; + --secondary-500: #4e63b1; + --secondary-600: #7182c1; + --secondary-700: #95a2d0; + --secondary-800: #b8c1e0; + --secondary-900: #dce0ef; + --secondary-950: #edeff7; + + --accent-50: #090812; + --accent-100: #110f24; + --accent-200: #231f47; + --accent-300: #342e6b; + --accent-400: #453d8f; + --accent-500: #574db3; + --accent-600: #7870c2; + --accent-700: #9a94d1; + --accent-800: #bcb8e0; + --accent-900: #dddbf0; + --accent-950: #eeedf7; +} diff --git a/css/radio.css b/css/radio.css new file mode 100644 index 0000000..1732046 --- /dev/null +++ b/css/radio.css @@ -0,0 +1,157 @@ +@import url(palette.css); + +.audio-player-head, +.audio-player-bottom { + display: flex; + align-items: center; + justify-items: center; +} + +.audio-player .led-off, +.audio-player .led-on { + font-family: "dseg14-regular"; + font-size: 1.5rem; + overflow: hidden; + white-space: nowrap; +} + +.audio-player .led-off { + position: relative; + margin: 0 auto; + color: var(--background-100); +} + +.audio-player .led-on { + position: absolute; + top: 0; + width: 100%; + color: var(--primary-500); +} + +.audio-spectrum { + margin: .5em 0; +} + +.play-button { + width: 1.5rem; + height: 1.5rem; + padding: 0; + margin-right: 2px; + background-color: var(--accent-600); +} + +.audio-spectrum { + width: 100%; + height: 5em; +} + +.switch { + position: relative; + display: inline-block; + width: 3rem; + height: 1.5rem; +} + +.switch input { + opacity: 0; + width: 0; + height: 0; +} + +.slider:before { + position: absolute; + content: ""; + height: 0.8rem; + width: 1rem; + left: 0.2em; + bottom: 0.15em; + background: url("/img/slider-thumb-overlay.avif") var(--accent-600); + background-size: cover; + border: 0.2em solid var(--accent-500); + -webkit-transition: .4s; + transition: .4s; +} + +input:focus+.slider { + box-shadow: 0 0 1px var(--secondary-200); +} + +input:checked+.slider:before { + -webkit-transform: translateX(1.25rem); + -ms-transform: translateX(1.25rem); + transform: translateX(1.25rem); +} + +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: var(--secondary-100); + border: 0.2em solid var(--secondary-200); + -webkit-transition: .4s; + transition: .4s; + font-family: "cozette"; + color: var(--secondary-400); +} + +.slider { + text-align: center; + align-content: center; +} + +.slider .text-spacing { + display: inline-block; +} + +.audio-player .slider .text-spacing { + width: 0.75em; +} + +.audio-player-bottom { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; +} + +.volume-slider { + -webkit-appearance: none; + appearance: none; + width: 7rem; + height: .5rem; + outline: none; + opacity: 0.7; + -webkit-transition: .2s; + transition: opacity .2s; + background: var(--secondary-100); + border: 0.15em solid var(--secondary-200); +} + +.volume-slider { + display: flex; + align-items: center; +} + +.volume-slider::-webkit-slider-thumb { + -webkit-appearance: none; + appearance: none; + width: 1rem; + height: 1.5rem; + border-radius: 0%; + cursor: pointer; + background: var(--accent-600); + border: none; +} + +.volume-slider::-moz-range-thumb { + width: 1rem; + height: 1.5rem; + border-radius: 0%; + cursor: pointer; + background: url("/img/slider-thumb-overlay.avif") var(--accent-600); + background-size: cover; + border: 0.15em solid var(--accent-500); +} \ No newline at end of file diff --git a/css/style.css b/css/style.css new file mode 100644 index 0000000..215d442 --- /dev/null +++ b/css/style.css @@ -0,0 +1,118 @@ +@font-face { + font-family: "cozette"; + src: url(../fonts/cozette.woff2); +} + +@font-face { + font-family: "vt323"; + src: url(../fonts/vt323.ttf); +} + +@font-face { + font-family: "dseg14-regular"; + src: url(../fonts/dseg14_modern_regular.woff2); +} + + +body { + font-family: "vt323"; +} + +header { + margin-top: 1em; +} + +img { + image-rendering: optimizeSpeed; + image-rendering: -moz-crisp-edges; + image-rendering: -o-crisp-edges; + image-rendering: -webkit-optimize-contrast; + image-rendering: pixelated; + image-rendering: optimize-contrast; + -ms-interpolation-mode: nearest-neighbor; +} + +footer { + margin: 1em 0; + text-align: center; +} + +section p { + text-align: justify; + /*text-wrap: pretty;*/ +} + +h1 { + padding: .5em .3em; + font-family: "cozette"; +} + +h2 { + padding: .1em .3em; + font-family: "cozette"; +} + +h3 { + padding: .1em .3em; + font-family: "cozette"; +} + +a { + font-family: "cozette"; + text-decoration: underline; + cursor: pointer; +} + +button { + background: none; +} + +select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border: none; + text-align: center; +} + +.icon { + width: 1em; + height: 1em; + line-height: 1; + vertical-align: bottom; +} + + +.button:hover { + cursor: pointer; +} + +h2 .icon, h3 .icon { + vertical-align: middle; +} + +.clock { + text-align: center; +} + +#theme-toggle-label { + display: inline-block; + cursor: pointer; + padding: .5em; + margin: 1.5em; +} + +#theme-icon { + width: 24px; + height: 24px; + transition: transform 0.2s ease-in-out; +} + +#theme-toggle:checked + #theme-icon { + transform: rotate(360deg); +} + +.button img { + width: 100%; + height: 100%; +} \ No newline at end of file diff --git a/deno.json b/deno.json new file mode 100644 index 0000000..7e3985e --- /dev/null +++ b/deno.json @@ -0,0 +1,18 @@ +{ + "imports": { + "lume/": "https://deno.land/x/lume@v2.3.2/", + "lume/cms/": "https://cdn.jsdelivr.net/gh/lumeland/cms@v0.6.1/", + "lume_markdown_plugins/": "https://deno.land/x/lume_markdown_plugins@v0.7.1/" + }, + "tasks": { + "lume": "echo \"import 'lume/cli.ts'\" | deno run -A -", + "build": "deno task lume", + "serve": "deno task lume -s", + "cms": "deno task lume cms" + }, + "compilerOptions": { + "types": [ + "lume/types.ts" + ] + } +} diff --git a/deno.lock b/deno.lock new file mode 100644 index 0000000..942bfa9 --- /dev/null +++ b/deno.lock @@ -0,0 +1,473 @@ +{ + "version": "3", + "packages": { + "specifiers": { + "jsr:@davidbonnet/astring@1.8.6": "jsr:@davidbonnet/astring@1.8.6", + "jsr:@libs/typing@2": "jsr:@libs/typing@2.9.0", + "jsr:@std/cli@1.0.5": "jsr:@std/cli@1.0.5", + "jsr:@std/cli@^1.0.5": "jsr:@std/cli@1.0.5", + "jsr:@std/collections@^1.0.5": "jsr:@std/collections@1.0.6", + "jsr:@std/crypto@1.0.3": "jsr:@std/crypto@1.0.3", + "jsr:@std/encoding@1.0.4": "jsr:@std/encoding@1.0.4", + "jsr:@std/encoding@^1.0.4": "jsr:@std/encoding@1.0.4", + "jsr:@std/fmt@1.0.2": "jsr:@std/fmt@1.0.2", + "jsr:@std/fmt@^1.0.2": "jsr:@std/fmt@1.0.2", + "jsr:@std/front-matter@1.0.4": "jsr:@std/front-matter@1.0.4", + "jsr:@std/fs@1.0.3": "jsr:@std/fs@1.0.3", + "jsr:@std/fs@^1.0.3": "jsr:@std/fs@1.0.3", + "jsr:@std/html@1.0.0": "jsr:@std/html@1.0.0", + "jsr:@std/http@1.0.5": "jsr:@std/http@1.0.5", + "jsr:@std/io@^0.224.7": "jsr:@std/io@0.224.8", + "jsr:@std/json@^1.0.0": "jsr:@std/json@1.0.0", + "jsr:@std/jsonc@1.0.1": "jsr:@std/jsonc@1.0.1", + "jsr:@std/log@0.224.7": "jsr:@std/log@0.224.7", + "jsr:@std/media-types@^1.0.3": "jsr:@std/media-types@1.0.3", + "jsr:@std/net@^1.0.2": "jsr:@std/net@1.0.4", + "jsr:@std/path@1.0.0": "jsr:@std/path@1.0.0", + "jsr:@std/path@1.0.4": "jsr:@std/path@1.0.4", + "jsr:@std/path@^1.0.4": "jsr:@std/path@1.0.4", + "jsr:@std/streams@^1.0.4": "jsr:@std/streams@1.0.5", + "jsr:@std/toml@1.0.1": "jsr:@std/toml@1.0.1", + "jsr:@std/toml@^1.0.1": "jsr:@std/toml@1.0.1", + "jsr:@std/yaml@1.0.5": "jsr:@std/yaml@1.0.5", + "jsr:@std/yaml@^1.0.5": "jsr:@std/yaml@1.0.5", + "npm:@js-temporal/polyfill@0.4.4": "npm:@js-temporal/polyfill@0.4.4", + "npm:@types/estree@1.0.5": "npm:@types/estree@1.0.5", + "npm:date-fns@3.6.0": "npm:date-fns@3.6.0", + "npm:estree-walker@3.0.3": "npm:estree-walker@3.0.3", + "npm:highlight.js@11.10.0": "npm:highlight.js@11.10.0", + "npm:markdown-it-attrs@4.2.0": "npm:markdown-it-attrs@4.2.0_markdown-it@14.1.0", + "npm:markdown-it-deflist@3.0.0": "npm:markdown-it-deflist@3.0.0", + "npm:markdown-it@14.1.0": "npm:markdown-it@14.1.0", + "npm:meriyah@4.5.0": "npm:meriyah@4.5.0", + "npm:unidecode@1.1.0": "npm:unidecode@1.1.0" + }, + "jsr": { + "@davidbonnet/astring@1.8.6": { + "integrity": "98b4914c8863cdf8c0ff83bb5c528caa67a8dca6020ad6234113499f00583e3a" + }, + "@libs/typing@2.9.0": { + "integrity": "ddf35ea652b807cd9b19b4f3f163fb5d76d57299053753fbd01ba8b02d9306ad" + }, + "@std/cli@1.0.5": { + "integrity": "c93cce26ffd26f617c15a12874e1bfeabc90b1eee86017c9639093734c2bf587" + }, + "@std/collections@1.0.6": { + "integrity": "60ad252af7df0594e6455f697920a37cd523ad66469fefcc9735e362826ac01d" + }, + "@std/crypto@1.0.3": { + "integrity": "a2a32f51ddef632d299e3879cd027c630dcd4d1d9a5285d6e6788072f4e51e7f" + }, + "@std/encoding@1.0.4": { + "integrity": "2266cd516b32369e3dc5695717c96bf88343a1f761d6e6187a02a2bbe2af86ae" + }, + "@std/fmt@1.0.2": { + "integrity": "87e9dfcdd3ca7c066e0c3c657c1f987c82888eb8103a3a3baa62684ffeb0f7a7" + }, + "@std/front-matter@1.0.4": { + "integrity": "ce4f4263bc0b023eae1e814195a116f711fc9b6800d419435ff1e2519795a17a", + "dependencies": [ + "jsr:@std/toml@^1.0.1", + "jsr:@std/yaml@^1.0.5" + ] + }, + "@std/fs@1.0.3": { + "integrity": "3cb839b1360b0a42d8b367c3093bfe4071798e6694fa44cf1963e04a8edba4fe", + "dependencies": [ + "jsr:@std/path@^1.0.4" + ] + }, + "@std/html@1.0.0": { + "integrity": "389f2b8b0021ee75966003b307b849813a300d1c554cef8d69aec2d5d3922ff9" + }, + "@std/http@1.0.5": { + "integrity": "afa1cf4f0c19e224534df3288a84de4fdfffe8a26308dfe3794166e4fafe0f3d", + "dependencies": [ + "jsr:@std/cli@^1.0.5", + "jsr:@std/encoding@^1.0.4", + "jsr:@std/fmt@^1.0.2", + "jsr:@std/media-types@^1.0.3", + "jsr:@std/net@^1.0.2", + "jsr:@std/path@^1.0.4", + "jsr:@std/streams@^1.0.4" + ] + }, + "@std/io@0.224.8": { + "integrity": "f525d05d51fd873de6352b9afcf35cab9ab5dc448bf3c20e0c8b521ded9be392" + }, + "@std/json@1.0.0": { + "integrity": "985c1e544918d42e4e84072fc739ac4a19c3a5093292c99742ffcdd03fb6a268" + }, + "@std/jsonc@1.0.1": { + "integrity": "6b36956e2a7cbb08ca5ad7fbec72e661e6217c202f348496ea88747636710dda", + "dependencies": [ + "jsr:@std/json@^1.0.0" + ] + }, + "@std/log@0.224.7": { + "integrity": "021941e5cd16de60cb11599c9b36f892aea95987fe66c753922808da27909e18", + "dependencies": [ + "jsr:@std/fmt@^1.0.2", + "jsr:@std/fs@^1.0.3", + "jsr:@std/io@^0.224.7" + ] + }, + "@std/media-types@1.0.3": { + "integrity": "b12d30a7852f7578f4d210622df713bbfd1cbdd9b4ec2eaf5c1845ab70bab159" + }, + "@std/net@1.0.4": { + "integrity": "2f403b455ebbccf83d8a027d29c5a9e3a2452fea39bb2da7f2c04af09c8bc852" + }, + "@std/path@1.0.0": { + "integrity": "77fcb858b6e38777d1154df0f02245ba0b07e2c40ca3c0eec57c9233188c2d21" + }, + "@std/path@1.0.4": { + "integrity": "48dd5d8389bcfcd619338a01bdf862cb7799933390146a54ae59356a0acc7105" + }, + "@std/streams@1.0.5": { + "integrity": "74e5c73d7d68eeab0d7fba3b05cbee3ba4ac5ae37c5f4e675f67e62f8f53edc4" + }, + "@std/toml@1.0.1": { + "integrity": "b55b407159930f338d384b1f8fd317c8e8a35e27ebb8946155f49e3a158d16c4", + "dependencies": [ + "jsr:@std/collections@^1.0.5" + ] + }, + "@std/yaml@1.0.5": { + "integrity": "71ba3d334305ee2149391931508b2c293a8490f94a337eef3a09cade1a2a2742" + } + }, + "npm": { + "@js-temporal/polyfill@0.4.4": { + "integrity": "sha512-2X6bvghJ/JAoZO52lbgyAPFj8uCflhTo2g7nkFzEQdXd/D8rEeD4HtmTEpmtGCva260fcd66YNXBOYdnmHqSOg==", + "dependencies": { + "jsbi": "jsbi@4.3.0", + "tslib": "tslib@2.7.0" + } + }, + "@types/estree@1.0.5": { + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dependencies": {} + }, + "argparse@2.0.1": { + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dependencies": {} + }, + "date-fns@3.6.0": { + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "dependencies": {} + }, + "entities@4.5.0": { + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dependencies": {} + }, + "estree-walker@3.0.3": { + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "@types/estree@1.0.5" + } + }, + "highlight.js@11.10.0": { + "integrity": "sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==", + "dependencies": {} + }, + "jsbi@4.3.0": { + "integrity": "sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==", + "dependencies": {} + }, + "linkify-it@5.0.0": { + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dependencies": { + "uc.micro": "uc.micro@2.1.0" + } + }, + "markdown-it-attrs@4.2.0_markdown-it@14.1.0": { + "integrity": "sha512-m7svtUBythvcGFFZAv9VjMEvs8UbHri2sojJ3juJumoOzv8sdkx9a7W3KxiHbXxAbvL3Xauak8TMwCnvigVPKw==", + "dependencies": { + "markdown-it": "markdown-it@14.1.0" + } + }, + "markdown-it-deflist@3.0.0": { + "integrity": "sha512-OxPmQ/keJZwbubjiQWOvKLHwpV2wZ5I3Smc81OjhwbfJsjdRrvD5aLTQxmZzzePeO0kbGzAo3Krk4QLgA8PWLg==", + "dependencies": {} + }, + "markdown-it@14.1.0": { + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dependencies": { + "argparse": "argparse@2.0.1", + "entities": "entities@4.5.0", + "linkify-it": "linkify-it@5.0.0", + "mdurl": "mdurl@2.0.0", + "punycode.js": "punycode.js@2.3.1", + "uc.micro": "uc.micro@2.1.0" + } + }, + "mdurl@2.0.0": { + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dependencies": {} + }, + "meriyah@4.5.0": { + "integrity": "sha512-Rbiu0QPIxTXgOXwiIpRVJfZRQ2FWyfzYrOGBs9SN5RbaXg1CN5ELn/plodwWwluX93yzc4qO/bNIen1ThGFCxw==", + "dependencies": {} + }, + "punycode.js@2.3.1": { + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dependencies": {} + }, + "tslib@2.7.0": { + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "dependencies": {} + }, + "uc.micro@2.1.0": { + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dependencies": {} + }, + "unidecode@1.1.0": { + "integrity": "sha512-GIp57N6DVVJi8dpeIU6/leJGdv7W65ZSXFLFiNmxvexXkc0nXdqUvhA/qL9KqBKsILxMwg5MnmYNOIDJLb5JVA==", + "dependencies": {} + } + } + }, + "remote": { + "https://deno.land/std@0.170.0/_util/asserts.ts": "d0844e9b62510f89ce1f9878b046f6a57bf88f208a10304aab50efcb48365272", + "https://deno.land/std@0.170.0/_util/os.ts": "8a33345f74990e627b9dfe2de9b040004b08ea5146c7c9e8fe9a29070d193934", + "https://deno.land/std@0.170.0/encoding/base64.ts": "8605e018e49211efc767686f6f687827d7f5fd5217163e981d8d693105640d7a", + "https://deno.land/std@0.170.0/fmt/colors.ts": "03ad95e543d2808bc43c17a3dd29d25b43d0f16287fe562a0be89bf632454a12", + "https://deno.land/std@0.170.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3", + "https://deno.land/std@0.170.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09", + "https://deno.land/std@0.170.0/path/_util.ts": "d16be2a16e1204b65f9d0dfc54a9bc472cafe5f4a190b3c8471ec2016ccd1677", + "https://deno.land/std@0.170.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633", + "https://deno.land/std@0.170.0/path/glob.ts": "81cc6c72be002cd546c7a22d1f263f82f63f37fe0035d9726aa96fc8f6e4afa1", + "https://deno.land/std@0.170.0/path/mod.ts": "cf7cec7ac11b7048bb66af8ae03513e66595c279c65cfa12bfc07d9599608b78", + "https://deno.land/std@0.170.0/path/posix.ts": "b859684bc4d80edfd4cad0a82371b50c716330bed51143d6dcdbe59e6278b30c", + "https://deno.land/std@0.170.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9", + "https://deno.land/std@0.170.0/path/win32.ts": "7cebd2bda6657371adc00061a1d23fdd87bcdf64b4843bb148b0b24c11b40f69", + "https://deno.land/x/cliffy@v0.25.7/_utils/distance.ts": "02af166952c7c358ac83beae397aa2fbca4ad630aecfcd38d92edb1ea429f004", + "https://deno.land/x/cliffy@v0.25.7/ansi/ansi.ts": "7f43d07d31dd7c24b721bb434c39cbb5132029fa4be3dd8938873065f65e5810", + "https://deno.land/x/cliffy@v0.25.7/ansi/ansi_escapes.ts": "885f61f343223f27b8ec69cc138a54bea30542924eacd0f290cd84edcf691387", + "https://deno.land/x/cliffy@v0.25.7/ansi/chain.ts": "31fb9fcbf72fed9f3eb9b9487270d2042ccd46a612d07dd5271b1a80ae2140a0", + "https://deno.land/x/cliffy@v0.25.7/ansi/colors.ts": "5f71993af5bd1aa0a795b15f41692d556d7c89584a601fed75997df844b832c9", + "https://deno.land/x/cliffy@v0.25.7/ansi/cursor_position.ts": "d537491e31d9c254b208277448eff92ff7f55978c4928dea363df92c0df0813f", + "https://deno.land/x/cliffy@v0.25.7/ansi/deps.ts": "0f35cb7e91868ce81561f6a77426ea8bc55dc15e13f84c7352f211023af79053", + "https://deno.land/x/cliffy@v0.25.7/ansi/mod.ts": "bb4e6588e6704949766205709463c8c33b30fec66c0b1846bc84a3db04a4e075", + "https://deno.land/x/cliffy@v0.25.7/ansi/tty.ts": "8fb064c17ead6cdf00c2d3bc87a9fd17b1167f2daa575c42b516f38bdb604673", + "https://deno.land/x/cliffy@v0.25.7/command/_errors.ts": "a9bd23dc816b32ec96c9b8f3057218241778d8c40333b43341138191450965e5", + "https://deno.land/x/cliffy@v0.25.7/command/_utils.ts": "9ab3d69fabab6c335b881b8a5229cbd5db0c68f630a1c307aff988b6396d9baf", + "https://deno.land/x/cliffy@v0.25.7/command/command.ts": "a2b83c612acd65c69116f70dec872f6da383699b83874b70fcf38cddf790443f", + "https://deno.land/x/cliffy@v0.25.7/command/completions/_bash_completions_generator.ts": "43b4abb543d4dc60233620d51e69d82d3b7c44e274e723681e0dce2a124f69f9", + "https://deno.land/x/cliffy@v0.25.7/command/completions/_fish_completions_generator.ts": "d0289985f5cf0bd288c05273bfa286b24c27feb40822eb7fd9d7fee64e6580e8", + "https://deno.land/x/cliffy@v0.25.7/command/completions/_zsh_completions_generator.ts": "14461eb274954fea4953ee75938821f721da7da607dc49bcc7db1e3f33a207bd", + "https://deno.land/x/cliffy@v0.25.7/command/completions/bash.ts": "053aa2006ec327ccecacb00ba28e5eb836300e5c1bec1b3cfaee9ddcf8189756", + "https://deno.land/x/cliffy@v0.25.7/command/completions/complete.ts": "58df61caa5e6220ff2768636a69337923ad9d4b8c1932aeb27165081c4d07d8b", + "https://deno.land/x/cliffy@v0.25.7/command/completions/fish.ts": "9938beaa6458c6cf9e2eeda46a09e8cd362d4f8c6c9efe87d3cd8ca7477402a5", + "https://deno.land/x/cliffy@v0.25.7/command/completions/mod.ts": "aeef7ec8e319bb157c39a4bab8030c9fe8fa327b4c1e94c9c1025077b45b40c0", + "https://deno.land/x/cliffy@v0.25.7/command/completions/zsh.ts": "8b04ab244a0b582f7927d405e17b38602428eeb347a9968a657e7ea9f40e721a", + "https://deno.land/x/cliffy@v0.25.7/command/deprecated.ts": "bbe6670f1d645b773d04b725b8b8e7814c862c9f1afba460c4d599ffe9d4983c", + "https://deno.land/x/cliffy@v0.25.7/command/deps.ts": "275b964ce173770bae65f6b8ebe9d2fd557dc10292cdd1ed3db1735f0d77fa1d", + "https://deno.land/x/cliffy@v0.25.7/command/help/_help_generator.ts": "f7c349cb2ddb737e70dc1f89bcb1943ca9017a53506be0d4138e0aadb9970a49", + "https://deno.land/x/cliffy@v0.25.7/command/help/mod.ts": "09d74d3eb42d21285407cda688074c29595d9c927b69aedf9d05ff3f215820d3", + "https://deno.land/x/cliffy@v0.25.7/command/mod.ts": "d0a32df6b14028e43bb2d41fa87d24bc00f9662a44e5a177b3db02f93e473209", + "https://deno.land/x/cliffy@v0.25.7/command/type.ts": "24e88e3085e1574662b856ccce70d589959648817135d4469fab67b9cce1b364", + "https://deno.land/x/cliffy@v0.25.7/command/types.ts": "ae02eec0ed7a769f7dba2dd5d3a931a61724b3021271b1b565cf189d9adfd4a0", + "https://deno.land/x/cliffy@v0.25.7/command/types/action_list.ts": "33c98d449617c7a563a535c9ceb3741bde9f6363353fd492f90a74570c611c27", + "https://deno.land/x/cliffy@v0.25.7/command/types/boolean.ts": "3879ec16092b4b5b1a0acb8675f8c9250c0b8a972e1e4c7adfba8335bd2263ed", + "https://deno.land/x/cliffy@v0.25.7/command/types/child_command.ts": "f1fca390c7fbfa7a713ca15ef55c2c7656bcbb394d50e8ef54085bdf6dc22559", + "https://deno.land/x/cliffy@v0.25.7/command/types/command.ts": "325d0382e383b725fd8d0ef34ebaeae082c5b76a1f6f2e843fee5dbb1a4fe3ac", + "https://deno.land/x/cliffy@v0.25.7/command/types/enum.ts": "2178345972adf7129a47e5f02856ca3e6852a91442a1c78307dffb8a6a3c6c9f", + "https://deno.land/x/cliffy@v0.25.7/command/types/file.ts": "8618f16ac9015c8589cbd946b3de1988cc4899b90ea251f3325c93c46745140e", + "https://deno.land/x/cliffy@v0.25.7/command/types/integer.ts": "29864725fd48738579d18123d7ee78fed37515e6dc62146c7544c98a82f1778d", + "https://deno.land/x/cliffy@v0.25.7/command/types/number.ts": "aeba96e6f470309317a16b308c82e0e4138a830ec79c9877e4622c682012bc1f", + "https://deno.land/x/cliffy@v0.25.7/command/types/string.ts": "e4dadb08a11795474871c7967beab954593813bb53d9f69ea5f9b734e43dc0e0", + "https://deno.land/x/cliffy@v0.25.7/command/upgrade/mod.ts": "17e2df3b620905583256684415e6c4a31e8de5c59066eb6d6c9c133919292dc4", + "https://deno.land/x/cliffy@v0.25.7/command/upgrade/provider.ts": "d6fb846043232cbd23c57d257100c7fc92274984d75a5fead0f3e4266dc76ab8", + "https://deno.land/x/cliffy@v0.25.7/command/upgrade/provider/deno_land.ts": "24f8d82e38c51e09be989f30f8ad21f9dd41ac1bb1973b443a13883e8ba06d6d", + "https://deno.land/x/cliffy@v0.25.7/command/upgrade/provider/github.ts": "99e1b133dd446c6aa79f69e69c46eb8bc1c968dd331c2a7d4064514a317c7b59", + "https://deno.land/x/cliffy@v0.25.7/command/upgrade/provider/nest_land.ts": "0e07936cea04fa41ac9297f32d87f39152ea873970c54cb5b4934b12fee1885e", + "https://deno.land/x/cliffy@v0.25.7/command/upgrade/upgrade_command.ts": "3640a287d914190241ea1e636774b1b4b0e1828fa75119971dd5304784061e05", + "https://deno.land/x/cliffy@v0.25.7/flags/_errors.ts": "f1fbb6bfa009e7950508c9d491cfb4a5551027d9f453389606adb3f2327d048f", + "https://deno.land/x/cliffy@v0.25.7/flags/_utils.ts": "340d3ecab43cde9489187e1f176504d2c58485df6652d1cdd907c0e9c3ce4cc2", + "https://deno.land/x/cliffy@v0.25.7/flags/_validate_flags.ts": "16eb5837986c6f6f7620817820161a78d66ce92d690e3697068726bbef067452", + "https://deno.land/x/cliffy@v0.25.7/flags/deprecated.ts": "a72a35de3cc7314e5ebea605ca23d08385b218ef171c32a3f135fb4318b08126", + "https://deno.land/x/cliffy@v0.25.7/flags/flags.ts": "68a9dfcacc4983a84c07ba19b66e5e9fccd04389fad215210c60fb414cc62576", + "https://deno.land/x/cliffy@v0.25.7/flags/mod.ts": "b21c2c135cd2437cc16245c5f168a626091631d6d4907ad10db61c96c93bdb25", + "https://deno.land/x/cliffy@v0.25.7/flags/types.ts": "7452ea5296758fb7af89930349ce40d8eb9a43b24b3f5759283e1cb5113075fd", + "https://deno.land/x/cliffy@v0.25.7/flags/types/boolean.ts": "4c026dd66ec9c5436860dc6d0241427bdb8d8e07337ad71b33c08193428a2236", + "https://deno.land/x/cliffy@v0.25.7/flags/types/integer.ts": "b60d4d590f309ddddf066782d43e4dc3799f0e7d08e5ede7dc62a5ee94b9a6d9", + "https://deno.land/x/cliffy@v0.25.7/flags/types/number.ts": "610936e2d29de7c8c304b65489a75ebae17b005c6122c24e791fbed12444d51e", + "https://deno.land/x/cliffy@v0.25.7/flags/types/string.ts": "e89b6a5ce322f65a894edecdc48b44956ec246a1d881f03e97bbda90dd8638c5", + "https://deno.land/x/cliffy@v0.25.7/keycode/key_code.ts": "c4ab0ffd102c2534962b765ded6d8d254631821bf568143d9352c1cdcf7a24be", + "https://deno.land/x/cliffy@v0.25.7/keycode/key_codes.ts": "917f0a2da0dbace08cf29bcfdaaa2257da9fe7e705fff8867d86ed69dfb08cfe", + "https://deno.land/x/cliffy@v0.25.7/keycode/mod.ts": "292d2f295316c6e0da6955042a7b31ab2968ff09f2300541d00f05ed6c2aa2d4", + "https://deno.land/x/cliffy@v0.25.7/mod.ts": "e3515ccf6bd4e4ac89322034e07e2332ed71901e4467ee5bc9d72851893e167b", + "https://deno.land/x/cliffy@v0.25.7/prompt/_generic_input.ts": "737cff2de02c8ce35250f5dd79c67b5fc176423191a2abd1f471a90dd725659e", + "https://deno.land/x/cliffy@v0.25.7/prompt/_generic_list.ts": "79b301bf09eb19f0d070d897f613f78d4e9f93100d7e9a26349ef0bfaa7408d2", + "https://deno.land/x/cliffy@v0.25.7/prompt/_generic_prompt.ts": "8630ce89a66d83e695922df41721cada52900b515385d86def597dea35971bb2", + "https://deno.land/x/cliffy@v0.25.7/prompt/_generic_suggestions.ts": "2a8b619f91e8f9a270811eff557f10f1343a444a527b5fc22c94de832939920c", + "https://deno.land/x/cliffy@v0.25.7/prompt/_utils.ts": "676cca30762656ed1a9bcb21a7254244278a23ffc591750e98a501644b6d2df3", + "https://deno.land/x/cliffy@v0.25.7/prompt/checkbox.ts": "e5a5a9adbb86835dffa2afbd23c6f7a8fe25a9d166485388ef25aba5dc3fbf9e", + "https://deno.land/x/cliffy@v0.25.7/prompt/confirm.ts": "94c8e55de3bbcd53732804420935c432eab29945497d1c47c357d236a89cb5f6", + "https://deno.land/x/cliffy@v0.25.7/prompt/deps.ts": "4c38ab18e55a792c9a136c1c29b2b6e21ea4820c45de7ef4cf517ce94012c57d", + "https://deno.land/x/cliffy@v0.25.7/prompt/figures.ts": "26af0fbfe21497220e4b887bb550fab997498cde14703b98e78faf370fbb4b94", + "https://deno.land/x/cliffy@v0.25.7/prompt/input.ts": "ee45532e0a30c2463e436e08ae291d79d1c2c40872e17364c96d2b97c279bf4d", + "https://deno.land/x/cliffy@v0.25.7/prompt/list.ts": "6780427ff2a932a48c9b882d173c64802081d6cdce9ff618d66ba6504b6abc50", + "https://deno.land/x/cliffy@v0.25.7/prompt/mod.ts": "195aed14d10d279914eaa28c696dec404d576ca424c097a5bc2b4a7a13b66c89", + "https://deno.land/x/cliffy@v0.25.7/prompt/number.ts": "015305a76b50138234dde4fd50eb886c6c7c0baa1b314caf811484644acdc2cf", + "https://deno.land/x/cliffy@v0.25.7/prompt/prompt.ts": "0e7f6a1d43475ee33fb25f7d50749b2f07fc0bcddd9579f3f9af12d05b4a4412", + "https://deno.land/x/cliffy@v0.25.7/prompt/secret.ts": "58745f5231fb2c44294c4acf2511f8c5bfddfa1e12f259580ff90dedea2703d6", + "https://deno.land/x/cliffy@v0.25.7/prompt/select.ts": "1e982eae85718e4e15a3ee10a5ae2233e532d7977d55888f3a309e8e3982b784", + "https://deno.land/x/cliffy@v0.25.7/prompt/toggle.ts": "842c3754a40732f2e80bcd4670098713e402e64bd930e6cab2b787f7ad4d931a", + "https://deno.land/x/cliffy@v0.25.7/table/border.ts": "2514abae4e4f51eda60a5f8c927ba24efd464a590027e900926b38f68e01253c", + "https://deno.land/x/cliffy@v0.25.7/table/cell.ts": "1d787d8006ac8302020d18ec39f8d7f1113612c20801b973e3839de9c3f8b7b3", + "https://deno.land/x/cliffy@v0.25.7/table/deps.ts": "5b05fa56c1a5e2af34f2103fd199e5f87f0507549963019563eae519271819d2", + "https://deno.land/x/cliffy@v0.25.7/table/layout.ts": "46bf10ae5430cf4fbb92f23d588230e9c6336edbdb154e5c9581290562b169f4", + "https://deno.land/x/cliffy@v0.25.7/table/mod.ts": "e74f69f38810ee6139a71132783765feb94436a6619c07474ada45b465189834", + "https://deno.land/x/cliffy@v0.25.7/table/row.ts": "5f519ba7488d2ef76cbbf50527f10f7957bfd668ce5b9169abbc44ec88302645", + "https://deno.land/x/cliffy@v0.25.7/table/table.ts": "ec204c9d08bb3ff1939c5ac7412a4c9ed7d00925d4fc92aff9bfe07bd269258d", + "https://deno.land/x/cliffy@v0.25.7/table/utils.ts": "187bb7dcbcfb16199a5d906113f584740901dfca1007400cba0df7dcd341bc29", + "https://deno.land/x/deno_dom@v0.1.48/build/deno-wasm/deno-wasm.js": "d6841a06342eb6a2798ef28de79ad69c0f2fa349fa04d3ca45e5fcfbf50a9340", + "https://deno.land/x/deno_dom@v0.1.48/deno-dom-wasm.ts": "0669396686fb207f1354af33df6aabe2189b4eceafdb1bf7f3d6bbb2637b6b03", + "https://deno.land/x/deno_dom@v0.1.48/src/api.ts": "0ff5790f0a3eeecb4e00b7d8fbfa319b165962cf6d0182a65ba90f158d74f7d7", + "https://deno.land/x/deno_dom@v0.1.48/src/constructor-lock.ts": "0e7b297e8b9cf921a3b0d3a692ec5fb462c5afc47ec554292e20090b9e16b40a", + "https://deno.land/x/deno_dom@v0.1.48/src/deserialize.ts": "1cf4096678d8afed8ed28dbad690504c4d2c28149ba768b26eacd1416873425b", + "https://deno.land/x/deno_dom@v0.1.48/src/dom/document-fragment.ts": "1c7352a3c816587ed7fad574b42636198f680f17abc3836fcfe7799b31e7718f", + "https://deno.land/x/deno_dom@v0.1.48/src/dom/document.ts": "f8503c0ffe0d703535e84d174f1c30aa31eff15e1450777d7f2e8da81546c002", + "https://deno.land/x/deno_dom@v0.1.48/src/dom/dom-parser.ts": "784ee0e766d4a01e14420f328053fd3a0016c6b40ee442edc3ae80f5d9777927", + "https://deno.land/x/deno_dom@v0.1.48/src/dom/element.ts": "f662dbf28d2ac873ebbbe2d4ae53121d13879c2061416f6eae4e8cca58922e8b", + "https://deno.land/x/deno_dom@v0.1.48/src/dom/elements/html-template-element.ts": "740b97a5378c9a14cccf3429299846eda240b613013e2d2d7f20b393897453c2", + "https://deno.land/x/deno_dom@v0.1.48/src/dom/html-collection.ts": "eedc0b097612ef420d975df6924850a36a4829b35aafa4c92078609a15a52f08", + "https://deno.land/x/deno_dom@v0.1.48/src/dom/node-list.ts": "d19fec8ed4979f43c8e117f9937b3da22acc2c8514cb1ef0074f54793cdfc8c9", + "https://deno.land/x/deno_dom@v0.1.48/src/dom/node.ts": "c93e5f6b6c011cbad6f8728d65459782b911e097f9d0c8c99a51591f7c936449", + "https://deno.land/x/deno_dom@v0.1.48/src/dom/selectors/custom-api.ts": "852696bd58e534bc41bd3be9e2250b60b67cd95fd28ed16b1deff1d548531a71", + "https://deno.land/x/deno_dom@v0.1.48/src/dom/selectors/nwsapi-types.ts": "c43b36c36acc5d32caabaa54fda8c9d239b2b0fcbce9a28efb93c84aa1021698", + "https://deno.land/x/deno_dom@v0.1.48/src/dom/selectors/nwsapi.js": "985d7d8fc1eabbb88946b47a1c44c1b2d4aa79ff23c21424219f1528fa27a2ff", + "https://deno.land/x/deno_dom@v0.1.48/src/dom/selectors/selectors.ts": "83eab57be2290fb48e3130533448c93c6c61239f2a2f3b85f1917f80ca0fdc75", + "https://deno.land/x/deno_dom@v0.1.48/src/dom/selectors/sizzle-types.ts": "78149e2502409989ce861ed636b813b059e16bc267bb543e7c2b26ef43e4798b", + "https://deno.land/x/deno_dom@v0.1.48/src/dom/selectors/sizzle.js": "c3aed60c1045a106d8e546ac2f85cc82e65f62d9af2f8f515210b9212286682a", + "https://deno.land/x/deno_dom@v0.1.48/src/dom/utils-types.ts": "96db30e3e4a75b194201bb9fa30988215da7f91b380fca6a5143e51ece2a8436", + "https://deno.land/x/deno_dom@v0.1.48/src/dom/utils.ts": "4c6206516fb8f61f37a209c829e812c4f5a183e46d082934dd14c91bde939263", + "https://deno.land/x/deno_dom@v0.1.48/src/parser.ts": "e06b2300d693e6ae7564e53dfa5c9a9e97fdb8c044c39c52c8b93b5d60860be3", + "https://deno.land/x/lume@v2.3.2/cli.ts": "71f6e24caf5eb661fb1b903ed6a914718a08ee6711daa689dc61fa5e5a37c54c", + "https://deno.land/x/lume@v2.3.2/cli/build.ts": "122f3e3bc431f952b8139199f588441efcf8ecfe844d9ab454f46f3b1c3fc15d", + "https://deno.land/x/lume@v2.3.2/cli/build_worker.ts": "2c49d9ae651d7da036f313c7dc02ee15774052b0cb295d03fff39a6f9b3a1f0e", + "https://deno.land/x/lume@v2.3.2/cli/cms.ts": "6721718782ca1215756a88c0ed40075a03d4faf12a89a44592dcc1d0a466bd8b", + "https://deno.land/x/lume@v2.3.2/cli/create.ts": "f340056e3b01a61007f82b47a174ede55df2d80d343e492a3853d44007bb8fc6", + "https://deno.land/x/lume@v2.3.2/cli/run.ts": "27e7c84c2bcadc3aa4ca4fbad02330f33000dca9a2ef41780bad3676606bc029", + "https://deno.land/x/lume@v2.3.2/cli/upgrade.ts": "a11e7c9024f78c2e7376c57b4a99e389dbf490769779d2d37a4a3ccd6ef27d9e", + "https://deno.land/x/lume@v2.3.2/cli/utils.ts": "4697e4280ff62b537507ed707ec84ea707b0519f8de32e2e762f498104a8d1ae", + "https://deno.land/x/lume@v2.3.2/core/component_loader.ts": "da80bf80a168d0b91b59eb3449fbf62627d8bf67879df34e71970616d47ce2ec", + "https://deno.land/x/lume@v2.3.2/core/data_loader.ts": "8698a9e9b1aac27147dc835ba89a0e30828c81338eceae86630607d78f146215", + "https://deno.land/x/lume@v2.3.2/core/events.ts": "e4fd1786eb7dd4a041d7d922779b9edf1ee89e51fd17ba5e756f380879ccb557", + "https://deno.land/x/lume@v2.3.2/core/file.ts": "27c04304793dec9972a24575ade217ace1eb204dd342d03930fd51fa5b8c2fbb", + "https://deno.land/x/lume@v2.3.2/core/formats.ts": "24d9f5ccf384b2474f457cc0d3855e6ad411ded0d6acf4afe36547ba93fc706f", + "https://deno.land/x/lume@v2.3.2/core/fs.ts": "6e22f7c88ef594d527a9efff6e00ec9491f695e39694d7ac355c4de90dbf0952", + "https://deno.land/x/lume@v2.3.2/core/loaders/binary.ts": "bb1e1cf3faac49f6007dc6814168dc0f633da17356db18e68862e4b2a87a3f33", + "https://deno.land/x/lume@v2.3.2/core/loaders/json.ts": "632e840340edf7d79091fb37474a1cbf86dd2d218090fb6f6c0420f5f5e9c2ce", + "https://deno.land/x/lume@v2.3.2/core/loaders/mod.ts": "f33af1a2fa0913cf393cd9ef6bf5aea2d03d1058e8966ad7f1483efbcc7df118", + "https://deno.land/x/lume@v2.3.2/core/loaders/module.ts": "abcb210fa6724b83407407cd0f7ef90462b35a2017bc135a3d124dd7f38843f6", + "https://deno.land/x/lume@v2.3.2/core/loaders/text.ts": "42860fc3482651fa6cfba18a734bb548d6e6e1163bf1015c2abc447ab150acbd", + "https://deno.land/x/lume@v2.3.2/core/loaders/toml.ts": "72ddfef2deea62815c28e27faa2c5356e09b3109e9547e47a6defea3d3332452", + "https://deno.land/x/lume@v2.3.2/core/loaders/yaml.ts": "241dc41fbe51b92e38dc748eda614c35d80fb8c63a6d40253453c6bb78c9c47e", + "https://deno.land/x/lume@v2.3.2/core/processors.ts": "ce9b97307740723afd86d1773e946981a96769189ba6acd649b412e48552045d", + "https://deno.land/x/lume@v2.3.2/core/renderer.ts": "b1879895f7544326e61e95a6413689975e79eabae0c48ca5912f06d2b4afde43", + "https://deno.land/x/lume@v2.3.2/core/scopes.ts": "dbdf93d7a9cead84833779e974f190b1379356ec7c0ccd34aa92f917c2cdd2f9", + "https://deno.land/x/lume@v2.3.2/core/scripts.ts": "286969b120d2290ba57a7fdd9b37e587aacf4e4162d92f51f1f1e9e18c864f30", + "https://deno.land/x/lume@v2.3.2/core/searcher.ts": "9093c2c64d1190b55a886b2905a224e0cbf86532bea4883e065e391851a8f14c", + "https://deno.land/x/lume@v2.3.2/core/server.ts": "aa8f7bf3dd89bfc3ff648c191950df0f4d5115efd73fdd07f9ceecaff7c89bf1", + "https://deno.land/x/lume@v2.3.2/core/site.ts": "c57fecc015fc2af5ed1b4644ba09719591bd5b1a167bb7e0657eca881c175d86", + "https://deno.land/x/lume@v2.3.2/core/slugifier.ts": "70427c98d32533171933304d34867c15d6b7bcfd48c7d1e0347184b8c4fb8b8e", + "https://deno.land/x/lume@v2.3.2/core/source.ts": "2a8a108e39501cfab89862888eee38528b55321242ea22b6d98fe12155056e1b", + "https://deno.land/x/lume@v2.3.2/core/utils/cli_options.ts": "0e48094ef8b89502c53fa597e01238c2ca972f65d2b9b219cca42a3988cba3c6", + "https://deno.land/x/lume@v2.3.2/core/utils/concurrent.ts": "cb0775b3d95f3faa356aa3a3e489dccef8807ed93cc4f84fcf5bc81e87c29504", + "https://deno.land/x/lume@v2.3.2/core/utils/data_values.ts": "40cc18575c35d64797b06fb8638920f54d22c650c50e8760756a7ccbaa37da75", + "https://deno.land/x/lume@v2.3.2/core/utils/date.ts": "4972e6e43d9756a3858494004e1b45df3b947033abe68db02acfc0bbb7847ce1", + "https://deno.land/x/lume@v2.3.2/core/utils/digest.ts": "445b387983391af73269686292a65bb677119a25a327776885ff1242a9397ad8", + "https://deno.land/x/lume@v2.3.2/core/utils/dom.ts": "d406fb5c48ceb012286d0aff66ef635261eda666de2ce07538c0cf9366b8fecd", + "https://deno.land/x/lume@v2.3.2/core/utils/env.ts": "d2440f14ad27e65b0a42b35a52f59ccce0430dd52950bd5df103bb1c9ba1a4a7", + "https://deno.land/x/lume@v2.3.2/core/utils/generator.ts": "1e664e9fd4c469e38a0acf5c94fd49dac4f38cb6334563ea4b7fc498b5958877", + "https://deno.land/x/lume@v2.3.2/core/utils/log.ts": "9b229e345d85ce8bd2d108bff99c8c57fcbded62e65776af294f94f349b48641", + "https://deno.land/x/lume@v2.3.2/core/utils/lume_config.ts": "4f81ecbdd699191f74e7c7fc29f8e348d7cf2bd182c01ae400ca29dc9d0af79b", + "https://deno.land/x/lume@v2.3.2/core/utils/lume_version.ts": "96ce8c0144b5adbc170f388b60be706244d1bd100413e748e9cf23878838c87c", + "https://deno.land/x/lume@v2.3.2/core/utils/merge_data.ts": "f4771c4f027b17487bf9a33bc2b04701a97f0578fd4a7feb31809cc119e5ee63", + "https://deno.land/x/lume@v2.3.2/core/utils/net.ts": "7827473a96b28950ab8083582a1f810e56ab265c28196494d9d714f1e0c17e8a", + "https://deno.land/x/lume@v2.3.2/core/utils/object.ts": "e00ee6e91264064772c87e69e128a09ba0e30c2c41be4a5302881f59f456fc31", + "https://deno.land/x/lume@v2.3.2/core/utils/page_date.ts": "096b21d1832c74bc338c8d8d8762f1f5106259b73e6b2caa72fb50986d4f1f5b", + "https://deno.land/x/lume@v2.3.2/core/utils/page_url.ts": "99da7e9e2b8ba0aebb4412ef7d4e1c89bc47ac4c59e34db4a9a4f4108812f4ca", + "https://deno.land/x/lume@v2.3.2/core/utils/path.ts": "109b9a6c450929db4f7b133859f5eebbe92999d3cc523a19988a058abec582b5", + "https://deno.land/x/lume@v2.3.2/core/utils/read.ts": "e096b1f37f8f0a6820e6ee00af1832d133598d55c961b226d057a5467207c5cd", + "https://deno.land/x/lume@v2.3.2/core/watcher.ts": "6c6c4b5feb540958bfd3ca78f420f4278d39eb317e9476aeec85d0ca69368873", + "https://deno.land/x/lume@v2.3.2/core/writer.ts": "7c56cdae2fcbaebe3c4d66d6c75bc056906d82517d880ba8e02acbb464e6c6b6", + "https://deno.land/x/lume@v2.3.2/deps/cli.ts": "9a49ff9eae5622194cd725a63990442a3f4438aba44639c0fec87bd6655a8a17", + "https://deno.land/x/lume@v2.3.2/deps/cliffy.ts": "faff0c2ca187ec9fd1ad8660141f85b9d05b5c36bab25b40eb5038c02590a310", + "https://deno.land/x/lume@v2.3.2/deps/colors.ts": "a9d3e7e31422b2e8690514bd2de5902424893c458b618142eff901fcba7175ef", + "https://deno.land/x/lume@v2.3.2/deps/crypto.ts": "020df39e6ba16ec8f3936b0ceff03a3d64bde8900a976ba3a519b5cc09d337d2", + "https://deno.land/x/lume@v2.3.2/deps/date.ts": "fdd2d83d96ff02b486aca730e6fef1c687422c950ecc537c17775c758bd1851a", + "https://deno.land/x/lume@v2.3.2/deps/dom.ts": "5670c225863738487fb03d19524dfcdd6d08c8851ffc9435d7142806cea6a458", + "https://deno.land/x/lume@v2.3.2/deps/front_matter.ts": "32bad6a3548a813c6da6292a579300dfefc4435252f90c5b3ec565325b1d3000", + "https://deno.land/x/lume@v2.3.2/deps/fs.ts": "59c333197f04f6e473164ac55631331eda7e680e7a24c42557a49f7fbd8d5fd0", + "https://deno.land/x/lume@v2.3.2/deps/hex.ts": "432c6203dfc5b13132ce242261d3d80cabe0c09bfdac9ba0060cc8cfaff7d44b", + "https://deno.land/x/lume@v2.3.2/deps/highlight.ts": "e9a13912eb5884fce7711457a1529206cbc0a9b6ddc5db4ecabc219af6a9a910", + "https://deno.land/x/lume@v2.3.2/deps/http.ts": "439b1e215932cdec8552c5b478b9ddbd552cca960d4b59bb1e90c0221c32e710", + "https://deno.land/x/lume@v2.3.2/deps/init.ts": "05d45af66ebdfe63e43540618f51ece8f99d98dc49de890f10eeb43abe9ed0f3", + "https://deno.land/x/lume@v2.3.2/deps/jsonc.ts": "e359eb0ef9f5f15518e6afe9bafb5b48bd5798dc000c8e210953c29cb319e607", + "https://deno.land/x/lume@v2.3.2/deps/log.ts": "b7c9fbc562f1b7ab951d77198094edeb41efb95095a9fa89c9ed9dc93600b14a", + "https://deno.land/x/lume@v2.3.2/deps/markdown_it.ts": "f68bb28890f77347ac7bc980026ea52e3cf0940278a3930428f5900be9e6491f", + "https://deno.land/x/lume@v2.3.2/deps/path.ts": "c51f6dcd53694ac7337bc69bb00237551541b062e3136fe8c3729f9d536da72e", + "https://deno.land/x/lume@v2.3.2/deps/temporal.ts": "1958b134c4186b0ab39316fa33ba19d1a4203e2ea445080429d60d296b91a552", + "https://deno.land/x/lume@v2.3.2/deps/toml.ts": "8d103f6379d09750299ea91d71293a851f69b4cf011bdb7a1323409206eca59f", + "https://deno.land/x/lume@v2.3.2/deps/unidecode.ts": "e476000bf9278edd64eb79a426ec68ac45e1c691a114ee07f9b89b4d30ffca1c", + "https://deno.land/x/lume@v2.3.2/deps/vento.ts": "18e72865672eb5e7203e31e6f5df61ef411a13c468ecf59029e4c459869ef091", + "https://deno.land/x/lume@v2.3.2/deps/xml.ts": "3545e8f41aba074180e1b3b9d220e7e665140d4f045cb0e0e6a209aefa9febfa", + "https://deno.land/x/lume@v2.3.2/deps/yaml.ts": "cbcf4d295ed88066e12a718750f09cebbf30fefa32e186844b597bce74b35557", + "https://deno.land/x/lume@v2.3.2/middlewares/logger.ts": "c96f1a9f9d5757555b6f141865ce8551ac176f90c8ee3e9ad797b2b400a9a567", + "https://deno.land/x/lume@v2.3.2/middlewares/no_cache.ts": "0119e3ae3a596ab12c42df693b93e5b03dd9608e289d862242751a9739438f35", + "https://deno.land/x/lume@v2.3.2/middlewares/no_cors.ts": "4d24619b5373c98bcc3baf404db47ba088c87ac8538ea1784e58d197b81d4d02", + "https://deno.land/x/lume@v2.3.2/middlewares/not_found.ts": "4507842d422267062c34662dceab17affcaad01858a5890fda163a8ddeb31487", + "https://deno.land/x/lume@v2.3.2/middlewares/reload.ts": "ec723e917bd12c83f65fc39a66592add9ec2ab56a1ad17f429ba749d32c218f9", + "https://deno.land/x/lume@v2.3.2/middlewares/reload_client.js": "992ac4a2f4a9fb4a1ab5f23f674ef202a43d73652cdebcf7b1552b482a7410ef", + "https://deno.land/x/lume@v2.3.2/mod.ts": "f93dcbc0ccb7a9e6cab93d0e8f1f0643b112f3084bedc603379dc1b47d7d380d", + "https://deno.land/x/lume@v2.3.2/plugins/code_highlight.ts": "1d70a1d136ea35c987687ef19f9f3058bbc319cbd359bfe6cc6013f3292efdaf", + "https://deno.land/x/lume@v2.3.2/plugins/date.ts": "d92823f67326e4f5d73d8cda2e357d36c07a30f4824d95b9402ae4202b336e0c", + "https://deno.land/x/lume@v2.3.2/plugins/feed.ts": "4bfb12172b270e40b7ae11beacbe8baa6ca680f0eb65dd732a25c78e9ab89ae5", + "https://deno.land/x/lume@v2.3.2/plugins/json.ts": "67e5e2e00f8e8640f33c1f97a2bf82a7c97a67a838804637b87b16b72f9042e1", + "https://deno.land/x/lume@v2.3.2/plugins/markdown.ts": "c7027605edee274762edb20f7040ccba6415c5fe656cc6e25ce91c448f467fd8", + "https://deno.land/x/lume@v2.3.2/plugins/modify_urls.ts": "144ace1daa032e28b21fd6cd8c35ac76cba6a5ddb143c607ad94f9a9176da482", + "https://deno.land/x/lume@v2.3.2/plugins/modules.ts": "e64197315d930e462aca24e444d0cfcefb37bfea168b2306122b892a1e1c5b8e", + "https://deno.land/x/lume@v2.3.2/plugins/paginate.ts": "7dfee977a205dfe0af33a3e406f73017badd2d4593cf27e5bd897da7ab12ba8a", + "https://deno.land/x/lume@v2.3.2/plugins/relative_urls.ts": "4b9ff5b2fdc5cd3e8a7766b5c8c288f5cdfbb2fa03fe99e110663082218da188", + "https://deno.land/x/lume@v2.3.2/plugins/search.ts": "ff570560c6ca95598a1cbfb3a77611477ee7dbb53300bcc3ba14d18c9e5eba79", + "https://deno.land/x/lume@v2.3.2/plugins/toml.ts": "72c75546056e503a59752e33dc25542f2aa21d743bd47f498d722b97958212f5", + "https://deno.land/x/lume@v2.3.2/plugins/url.ts": "3718185697778f3b4dd17924d9d282d0a5a74030301e7fcae8a7f1b21f0ef9a9", + "https://deno.land/x/lume@v2.3.2/plugins/vento.ts": "c6e147e15cade62f162f07b94067f43a240bd9c5d814286d8f77a5bceae3ae19", + "https://deno.land/x/lume@v2.3.2/plugins/yaml.ts": "8cb20b4bf3a265be0d975235b537c9807db2f34d357fc27546c05d628d3fda9f", + "https://deno.land/x/lume@v2.3.2/types.ts": "516bec311f10083c5b1d8109e8afd17f02b49cc62c45dca53706f286cb855dba", + "https://deno.land/x/lume_markdown_plugins@v0.7.1/toc.ts": "1fe2769056a022303b3871fc4b7be26b7738d44a31e5fd08debd527e9dc49ecc", + "https://deno.land/x/lume_markdown_plugins@v0.7.1/toc/anchors.ts": "8a4a1c6b2c63156622695ceba57fa7100a6e5f109c9a383a1dcaf755233c8184", + "https://deno.land/x/lume_markdown_plugins@v0.7.1/toc/mod.ts": "8c7aa6e1dcfabda4264503495a3875388108cd9a5a94b54853b45a8e8cba9f78", + "https://deno.land/x/lume_markdown_plugins@v0.7.1/utils.ts": "6e6c3c394709eff39080562732c2dafe404f225253aaded937133ea694c4b735", + "https://deno.land/x/vento@v1.12.10/deps.ts": "65b1f0943c280aa0f1e35b2d52be64e699550d933f17d192cd7db8af4163835a", + "https://deno.land/x/vento@v1.12.10/mod.ts": "296c9cc4253c1b88a94fc630a05d9a12947a908966f2db43968141f1c282a7d6", + "https://deno.land/x/vento@v1.12.10/plugins/echo.ts": "0c9de6b508ebf79908ecdaf406757bf0a86ab960bf527a51c6523445fc2d66d2", + "https://deno.land/x/vento@v1.12.10/plugins/escape.ts": "22754819f9a8437ecb4de0df1d3513c5b92fd6be74274d344d9750811030b181", + "https://deno.land/x/vento@v1.12.10/plugins/export.ts": "4cda1bd2d7e28e6d23382a64a6d72e7340bef07fcbc32f604a4705c148b914f1", + "https://deno.land/x/vento@v1.12.10/plugins/for.ts": "d79b7ed3414bc0a70430c95ed2795eb16d898dd2ccf6b40792f2333f1f272fcd", + "https://deno.land/x/vento@v1.12.10/plugins/function.ts": "24c33bf586844ff8940daac2535dcae7f5ce39b443e795ebf16a2c23694850bf", + "https://deno.land/x/vento@v1.12.10/plugins/if.ts": "f992b1f599be11eafaa15bf607eee467ffd4276dec145d7b73cd24c0c6920631", + "https://deno.land/x/vento@v1.12.10/plugins/import.ts": "c36710067e1ea4074097b139c95d001fc1a2e759e05f1346da068405657924b4", + "https://deno.land/x/vento@v1.12.10/plugins/include.ts": "d93d330d3df25a5cfcc34e85c3e6685214280792f3242064e50c94748acfb1f4", + "https://deno.land/x/vento@v1.12.10/plugins/js.ts": "68d78ef2fc7a981d1f124f2f91830135ad46fcbd4dde7d5464cb5103c9293a5e", + "https://deno.land/x/vento@v1.12.10/plugins/layout.ts": "da84978f0639e95e472edddc2f9837757c28113a04dbe67399087c3a4d14780e", + "https://deno.land/x/vento@v1.12.10/plugins/set.ts": "8e0868ef63cbb005f1dc6541cfb2f7b905426237aad1e509f5b724d58975de4a", + "https://deno.land/x/vento@v1.12.10/plugins/trim.ts": "93bce5e32aac9fd1dc4e7acf0278438d710cd1f61f80ce3af719a06cca7f2e3d", + "https://deno.land/x/vento@v1.12.10/plugins/unescape.ts": "dd2d9dbd116b68004f11ab17c9daaf9378ee14300c2d0ec8f422df09d41462ba", + "https://deno.land/x/vento@v1.12.10/src/environment.ts": "22cf5742cbc968a4be5982bb38eabbf61bcd818b9bf971bd8eabb2e904d0162a", + "https://deno.land/x/vento@v1.12.10/src/js.ts": "c4ac5e2b2cd2995523d3167c5708c424686fd30d2d3951ff965a76dbdfb74e37", + "https://deno.land/x/vento@v1.12.10/src/loader.ts": "c05add67f582e937ee611852075ce2cc038b5e80e3e609eef96fa5ed74a5086c", + "https://deno.land/x/vento@v1.12.10/src/tokenizer.ts": "e7830fbc644a3b30cf852d0685f9797e4826ad399a3e0277beebce577b54934c", + "https://deno.land/x/vento@v1.12.10/src/transformer.ts": "587a0b107a2bd1437a3093c4c44c07e4fdf3abfaaf8e845767b69bd34a039154", + "https://deno.land/x/xml@5.4.16/_types.ts": "493c293e61bd2be051c377d4e6389d9f4e17403e70e4f0de25599b86265efc80", + "https://deno.land/x/xml@5.4.16/mod.ts": "b59e5c0dd9fe7ed597c21c39aacf089aa82fe5c5eaad3f411a43a9c104359f4e", + "https://deno.land/x/xml@5.4.16/parse.ts": "af704c72d42607d5b3f364972c413e05b6d2921d164806ec47aee348cf6ce49c", + "https://deno.land/x/xml@5.4.16/stringify.ts": "a00881a1e563902538cfea8ce31464c81e98e61dddcf718039d7118b46464687", + "https://deno.land/x/xml@5.4.16/wasm_xml_parser/wasm_xml_parser.js": "7ec301b1db7d11671f4f8785505c6f617ea05fcb3d558686c67efad263ea0c8e" + } +} diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..17b39bc Binary files /dev/null and b/favicon.ico differ diff --git a/fonts/cozette.woff2 b/fonts/cozette.woff2 new file mode 100644 index 0000000..ca90d0d Binary files /dev/null and b/fonts/cozette.woff2 differ diff --git a/fonts/dseg14_modern_regular.woff2 b/fonts/dseg14_modern_regular.woff2 new file mode 100644 index 0000000..2240b81 Binary files /dev/null and b/fonts/dseg14_modern_regular.woff2 differ diff --git a/fonts/vt323.ttf b/fonts/vt323.ttf new file mode 100644 index 0000000..6aec599 Binary files /dev/null and b/fonts/vt323.ttf differ diff --git a/icons/pixelarticons/svg/4g.svg b/icons/pixelarticons/svg/4g.svg new file mode 100644 index 0000000..bf67c18 --- /dev/null +++ b/icons/pixelarticons/svg/4g.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cbb781883db90a78f437efd6f4fb049cc90615430775cd76eef81c6bb8ec580c +size 177 diff --git a/icons/pixelarticons/svg/4k-box.svg b/icons/pixelarticons/svg/4k-box.svg new file mode 100644 index 0000000..b23a3e3 --- /dev/null +++ b/icons/pixelarticons/svg/4k-box.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e46752f64d5a577f51955bf7a95d9bf88abb3f312daaac0d452bf5030218adb +size 219 diff --git a/icons/pixelarticons/svg/4k.svg b/icons/pixelarticons/svg/4k.svg new file mode 100644 index 0000000..511fcdf --- /dev/null +++ b/icons/pixelarticons/svg/4k.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a2e79c8b0e978e99e42cdfd12d655f76a5182de8446c06ba1fa381e28e804ca1 +size 226 diff --git a/icons/pixelarticons/svg/5g.svg b/icons/pixelarticons/svg/5g.svg new file mode 100644 index 0000000..0181da7 --- /dev/null +++ b/icons/pixelarticons/svg/5g.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e87884e3a23625d68393905191657c44a501d71cbc55fe0ff1b6b19dcc7a2a7c +size 183 diff --git a/icons/pixelarticons/svg/ab-testing.svg b/icons/pixelarticons/svg/ab-testing.svg new file mode 100644 index 0000000..41475df --- /dev/null +++ b/icons/pixelarticons/svg/ab-testing.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af048a8783e078a1bd41e2fe54e380be13a62dbc9c9c7168ffc33fca52c8e4b2 +size 241 diff --git a/icons/pixelarticons/svg/ac.svg b/icons/pixelarticons/svg/ac.svg new file mode 100644 index 0000000..1c242ca --- /dev/null +++ b/icons/pixelarticons/svg/ac.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:15fa1c551a51398e4da61a54d3001199ae82a60386d1d13e34647a40e5737729 +size 295 diff --git a/icons/pixelarticons/svg/add-box-multiple.svg b/icons/pixelarticons/svg/add-box-multiple.svg new file mode 100644 index 0000000..89ff50f --- /dev/null +++ b/icons/pixelarticons/svg/add-box-multiple.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bfface4f49f2b805ec289030263564e96aee50597193f2a57e8e362f270c9754 +size 202 diff --git a/icons/pixelarticons/svg/add-box.svg b/icons/pixelarticons/svg/add-box.svg new file mode 100644 index 0000000..194323c --- /dev/null +++ b/icons/pixelarticons/svg/add-box.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e7bf43818e339c669f5421176559f7bba390b2419f7d839f4ffbe348e75c1d2 +size 183 diff --git a/icons/pixelarticons/svg/add-col.svg b/icons/pixelarticons/svg/add-col.svg new file mode 100644 index 0000000..c868da8 --- /dev/null +++ b/icons/pixelarticons/svg/add-col.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad387c3247dee82eddde2f77e331aba8fea437aad3041f4dad6e596db0cfcbee +size 195 diff --git a/icons/pixelarticons/svg/add-grid.svg b/icons/pixelarticons/svg/add-grid.svg new file mode 100644 index 0000000..8e61d05 --- /dev/null +++ b/icons/pixelarticons/svg/add-grid.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1eabed7c327a356d5a5154dd04a08ea7a475b7a0436e2a06d12e4535e798516 +size 240 diff --git a/icons/pixelarticons/svg/add-row.svg b/icons/pixelarticons/svg/add-row.svg new file mode 100644 index 0000000..e7942e7 --- /dev/null +++ b/icons/pixelarticons/svg/add-row.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7164d5d8fa6849012da7b55f8ce241466056d2bf0a79f8332fb473e0e3729f17 +size 195 diff --git a/icons/pixelarticons/svg/alert.svg b/icons/pixelarticons/svg/alert.svg new file mode 100644 index 0000000..3b0ecd8 --- /dev/null +++ b/icons/pixelarticons/svg/alert.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8d235844d8a67f89a601ec2bdb6deb53b54080ec25ebe8700e697385cf1ea85 +size 339 diff --git a/icons/pixelarticons/svg/align-center.svg b/icons/pixelarticons/svg/align-center.svg new file mode 100644 index 0000000..44bb898 --- /dev/null +++ b/icons/pixelarticons/svg/align-center.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6907b74d79aa433a41397c3ab324110f10450cb94d9b843cdade13961a74a84c +size 177 diff --git a/icons/pixelarticons/svg/align-justify.svg b/icons/pixelarticons/svg/align-justify.svg new file mode 100644 index 0000000..f22073a --- /dev/null +++ b/icons/pixelarticons/svg/align-justify.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:face55bf1af4efdddff1d3bf7e0256186d14163cf7aff5cb5a0f73b402d225fb +size 178 diff --git a/icons/pixelarticons/svg/align-left.svg b/icons/pixelarticons/svg/align-left.svg new file mode 100644 index 0000000..c8486ce --- /dev/null +++ b/icons/pixelarticons/svg/align-left.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8063efdd62a8c0bd787702a1f50b1b3bbe91b903b4b07e2ad77d905e8c0c9062 +size 176 diff --git a/icons/pixelarticons/svg/align-right.svg b/icons/pixelarticons/svg/align-right.svg new file mode 100644 index 0000000..46b8cb7 --- /dev/null +++ b/icons/pixelarticons/svg/align-right.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a653d7cb90aa9bc771f282f4c0bd41c6cb2cfda6ec5467f6091a68c28777df1a +size 176 diff --git a/icons/pixelarticons/svg/analytics.svg b/icons/pixelarticons/svg/analytics.svg new file mode 100644 index 0000000..a835c94 --- /dev/null +++ b/icons/pixelarticons/svg/analytics.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72f8ab1b85c232a7819aad41c24d18dec93081055d25b196a57452cfdd4a8cce +size 210 diff --git a/icons/pixelarticons/svg/anchor.svg b/icons/pixelarticons/svg/anchor.svg new file mode 100644 index 0000000..65bb57a --- /dev/null +++ b/icons/pixelarticons/svg/anchor.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d1288e39ab0e16c843d9c2bbdac5d061ae8efec9fd95f475b38cee190f24726 +size 211 diff --git a/icons/pixelarticons/svg/android.svg b/icons/pixelarticons/svg/android.svg new file mode 100644 index 0000000..8e37940 --- /dev/null +++ b/icons/pixelarticons/svg/android.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7cad0c1c0486c646505ea9b1eb4e85a836033f59edfb7975c284a09ea39111de +size 264 diff --git a/icons/pixelarticons/svg/animation.svg b/icons/pixelarticons/svg/animation.svg new file mode 100644 index 0000000..9abf586 --- /dev/null +++ b/icons/pixelarticons/svg/animation.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c03280a449e0f3b26582fbe77197bf0dad5f12c1de530c930353a513f102f8f0 +size 191 diff --git a/icons/pixelarticons/svg/archive.svg b/icons/pixelarticons/svg/archive.svg new file mode 100644 index 0000000..dd8343d --- /dev/null +++ b/icons/pixelarticons/svg/archive.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca59c58ba3394b9993b13dfedc0be689eeea90d097b0976a83df53e481710edb +size 188 diff --git a/icons/pixelarticons/svg/arrow-bar-down.svg b/icons/pixelarticons/svg/arrow-bar-down.svg new file mode 100644 index 0000000..69885bf --- /dev/null +++ b/icons/pixelarticons/svg/arrow-bar-down.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69b4698ad82c86997801b7e7a5038c7230d43bebbed7927a38118d3b3cb351c0 +size 197 diff --git a/icons/pixelarticons/svg/arrow-bar-left.svg b/icons/pixelarticons/svg/arrow-bar-left.svg new file mode 100644 index 0000000..0908cd1 --- /dev/null +++ b/icons/pixelarticons/svg/arrow-bar-left.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b71f88569828509a479a31cbc0ced1309c33c36b4d3791ab84b394a9ee97608 +size 195 diff --git a/icons/pixelarticons/svg/arrow-bar-right.svg b/icons/pixelarticons/svg/arrow-bar-right.svg new file mode 100644 index 0000000..87fedcc --- /dev/null +++ b/icons/pixelarticons/svg/arrow-bar-right.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c520da32b915bea888dbd37979a96a6012b40a3e465a3a4d2d700b7a2ddadda8 +size 186 diff --git a/icons/pixelarticons/svg/arrow-bar-up.svg b/icons/pixelarticons/svg/arrow-bar-up.svg new file mode 100644 index 0000000..acc3346 --- /dev/null +++ b/icons/pixelarticons/svg/arrow-bar-up.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:867dfe651b5774a1db432bf9e5f714270059ab54926706739a69ff778d1fa3cd +size 184 diff --git a/icons/pixelarticons/svg/arrow-down-box.svg b/icons/pixelarticons/svg/arrow-down-box.svg new file mode 100644 index 0000000..860c66c --- /dev/null +++ b/icons/pixelarticons/svg/arrow-down-box.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fffa711632c89e35af2f8df6463633aa9a5aefc136f0131302b9547715589cf8 +size 213 diff --git a/icons/pixelarticons/svg/arrow-down.svg b/icons/pixelarticons/svg/arrow-down.svg new file mode 100644 index 0000000..4f98022 --- /dev/null +++ b/icons/pixelarticons/svg/arrow-down.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e92280eba67a99920dcb9a94339e1972b776cb153fe532c8adc109f2dd2f80e +size 212 diff --git a/icons/pixelarticons/svg/arrow-left-box.svg b/icons/pixelarticons/svg/arrow-left-box.svg new file mode 100644 index 0000000..3678dee --- /dev/null +++ b/icons/pixelarticons/svg/arrow-left-box.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b41d295987a6b71137bc70c7baf0f54ee59f308d4cd5ce96d4c3544267cd0b4 +size 212 diff --git a/icons/pixelarticons/svg/arrow-left.svg b/icons/pixelarticons/svg/arrow-left.svg new file mode 100644 index 0000000..2273601 --- /dev/null +++ b/icons/pixelarticons/svg/arrow-left.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2ba24fd753a34a6888c1b902c9e649009166ac654dd5effca21728e2eed8fae +size 209 diff --git a/icons/pixelarticons/svg/arrow-right-box.svg b/icons/pixelarticons/svg/arrow-right-box.svg new file mode 100644 index 0000000..5d33539 --- /dev/null +++ b/icons/pixelarticons/svg/arrow-right-box.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e07f656c36aef9ddabf6182a92f63da21cbb05764c965a429129f52d73b4a0a1 +size 212 diff --git a/icons/pixelarticons/svg/arrow-right.svg b/icons/pixelarticons/svg/arrow-right.svg new file mode 100644 index 0000000..8a6e7ef --- /dev/null +++ b/icons/pixelarticons/svg/arrow-right.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd0fb3b7bd2f5d57cb91943d42b1354b5c7d1d167a1625e9ae3704dd86bbff4a +size 212 diff --git a/icons/pixelarticons/svg/arrow-up-box.svg b/icons/pixelarticons/svg/arrow-up-box.svg new file mode 100644 index 0000000..1b571c6 --- /dev/null +++ b/icons/pixelarticons/svg/arrow-up-box.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b60a56148b8252d15fdcee8638682e22906669e50f6ea9df3d62c84de677331 +size 213 diff --git a/icons/pixelarticons/svg/arrow-up.svg b/icons/pixelarticons/svg/arrow-up.svg new file mode 100644 index 0000000..61a588a --- /dev/null +++ b/icons/pixelarticons/svg/arrow-up.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:08771282260fe949213f1d8f8097775358659abc40bc3ca8a99b60920da0ed23 +size 209 diff --git a/icons/pixelarticons/svg/arrows-horizontal.svg b/icons/pixelarticons/svg/arrows-horizontal.svg new file mode 100644 index 0000000..0ef768d --- /dev/null +++ b/icons/pixelarticons/svg/arrows-horizontal.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:207510a03c2b2ef41d5aadc8b20b3e272f990b1983e23551d6016f779a89cabf +size 241 diff --git a/icons/pixelarticons/svg/arrows-vertical.svg b/icons/pixelarticons/svg/arrows-vertical.svg new file mode 100644 index 0000000..7831b17 --- /dev/null +++ b/icons/pixelarticons/svg/arrows-vertical.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec7a9f635d3bc72e4993072069e04b6164712dca44e5f804ee9784c025c56146 +size 231 diff --git a/icons/pixelarticons/svg/art-text.svg b/icons/pixelarticons/svg/art-text.svg new file mode 100644 index 0000000..8abf1c6 --- /dev/null +++ b/icons/pixelarticons/svg/art-text.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:698837f71c273f61a6f33135960916ba515012545396c13fd4c4380fa758b85d +size 191 diff --git a/icons/pixelarticons/svg/article-multiple.svg b/icons/pixelarticons/svg/article-multiple.svg new file mode 100644 index 0000000..7074c92 --- /dev/null +++ b/icons/pixelarticons/svg/article-multiple.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be6c6242186bd46bbe6ffb6b497507534aaf79ecaca8e51b2548dc8286ada7b7 +size 214 diff --git a/icons/pixelarticons/svg/article.svg b/icons/pixelarticons/svg/article.svg new file mode 100644 index 0000000..5d20049 --- /dev/null +++ b/icons/pixelarticons/svg/article.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:57a71b761ed8f33289f7e2cff24427acfe3c56735c522df56295605d4ab3d284 +size 195 diff --git a/icons/pixelarticons/svg/aspect-ratio.svg b/icons/pixelarticons/svg/aspect-ratio.svg new file mode 100644 index 0000000..6ea18be --- /dev/null +++ b/icons/pixelarticons/svg/aspect-ratio.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e58a8a52043a73511cb197921bf6ae09c4a1356c7a392686b9466fcfa0a445a +size 190 diff --git a/icons/pixelarticons/svg/at.svg b/icons/pixelarticons/svg/at.svg new file mode 100644 index 0000000..11fe586 --- /dev/null +++ b/icons/pixelarticons/svg/at.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:125d143e88e60dd4905c6f5a58f8eb3adce4f5a7a2ec7d220ea40d25755e9294 +size 171 diff --git a/icons/pixelarticons/svg/attachment.svg b/icons/pixelarticons/svg/attachment.svg new file mode 100644 index 0000000..e562a9c --- /dev/null +++ b/icons/pixelarticons/svg/attachment.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1adb37118363957560f22a52a7bc4d1c9089e878297b529e518e2e20bba3c69 +size 161 diff --git a/icons/pixelarticons/svg/audio-device.svg b/icons/pixelarticons/svg/audio-device.svg new file mode 100644 index 0000000..46cabc0 --- /dev/null +++ b/icons/pixelarticons/svg/audio-device.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66013d3890b1c68e905f3e8af84473816928bf78223b91ce9860a39747b0cef5 +size 226 diff --git a/icons/pixelarticons/svg/avatar.svg b/icons/pixelarticons/svg/avatar.svg new file mode 100644 index 0000000..d4f81d9 --- /dev/null +++ b/icons/pixelarticons/svg/avatar.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:09023663fe910b37796a5d703491df49310ae32aeef53c1a5f587ecabc8ba3a6 +size 197 diff --git a/icons/pixelarticons/svg/backburger.svg b/icons/pixelarticons/svg/backburger.svg new file mode 100644 index 0000000..ed092de --- /dev/null +++ b/icons/pixelarticons/svg/backburger.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2329189c44227ef53dede6c16acd576e54bd75f59e8d9b3aecf14cef67efdcc6 +size 210 diff --git a/icons/pixelarticons/svg/battery-1.svg b/icons/pixelarticons/svg/battery-1.svg new file mode 100644 index 0000000..b1501bb --- /dev/null +++ b/icons/pixelarticons/svg/battery-1.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8374a025ecd4552ba2a9cfa85bcdecbd7ac4db6d536acaf277183c02a6ab112 +size 173 diff --git a/icons/pixelarticons/svg/battery-2.svg b/icons/pixelarticons/svg/battery-2.svg new file mode 100644 index 0000000..bceaa8e --- /dev/null +++ b/icons/pixelarticons/svg/battery-2.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3ac05cd3cd33ad12850716ab03bdd51a589a10acf086a09c79fafb1b93f4d758 +size 187 diff --git a/icons/pixelarticons/svg/battery-charging.svg b/icons/pixelarticons/svg/battery-charging.svg new file mode 100644 index 0000000..fc7a466 --- /dev/null +++ b/icons/pixelarticons/svg/battery-charging.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7086b6072a28e3c9fa9e4e3d1c8c39d767230f20b62ff962a4c5c1c45a1212b +size 219 diff --git a/icons/pixelarticons/svg/battery-full.svg b/icons/pixelarticons/svg/battery-full.svg new file mode 100644 index 0000000..2f11057 --- /dev/null +++ b/icons/pixelarticons/svg/battery-full.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:70c870fa363a3547dbe595dc0023d3444c003f79c05d99079d446989b8c453ff +size 202 diff --git a/icons/pixelarticons/svg/battery.svg b/icons/pixelarticons/svg/battery.svg new file mode 100644 index 0000000..def2da9 --- /dev/null +++ b/icons/pixelarticons/svg/battery.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:894c477989cafbebff0b1a2f990d97efe6a3d80a5d2758a9b61af9a41349e682 +size 160 diff --git a/icons/pixelarticons/svg/bed.svg b/icons/pixelarticons/svg/bed.svg new file mode 100644 index 0000000..85d2a3e --- /dev/null +++ b/icons/pixelarticons/svg/bed.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:587814454d54f9a52223a797b3b8290da7afb1c9825b24258836cfc919f509bf +size 219 diff --git a/icons/pixelarticons/svg/bitcoin.svg b/icons/pixelarticons/svg/bitcoin.svg new file mode 100644 index 0000000..eeae5f2 --- /dev/null +++ b/icons/pixelarticons/svg/bitcoin.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:890dd5a11d759ac83829c866200c7d03b303577904b46db0b8c60641faa5a7ce +size 233 diff --git a/icons/pixelarticons/svg/bluetooth.svg b/icons/pixelarticons/svg/bluetooth.svg new file mode 100644 index 0000000..a4036cc --- /dev/null +++ b/icons/pixelarticons/svg/bluetooth.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:35a3c3babd27aabe81ef692eb472cd9a908587862d9a37888ac1329d5d5ad29b +size 279 diff --git a/icons/pixelarticons/svg/book-open.svg b/icons/pixelarticons/svg/book-open.svg new file mode 100644 index 0000000..d06c359 --- /dev/null +++ b/icons/pixelarticons/svg/book-open.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:847b66c2f1e9b2c8c2af2ac9da52941bbea6d8f68b17182248a7f66265f43319 +size 218 diff --git a/icons/pixelarticons/svg/book.svg b/icons/pixelarticons/svg/book.svg new file mode 100644 index 0000000..f2b40fe --- /dev/null +++ b/icons/pixelarticons/svg/book.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea3321810db5265021bbd340edc74f7eb72fd0e28436b30717344bf6c614f7fd +size 169 diff --git a/icons/pixelarticons/svg/bookmark.svg b/icons/pixelarticons/svg/bookmark.svg new file mode 100644 index 0000000..b1b00d8 --- /dev/null +++ b/icons/pixelarticons/svg/bookmark.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1f40b2bfe0002e31879f50224bce216b8a9668665c9e3dc65ee4830f6faa125 +size 188 diff --git a/icons/pixelarticons/svg/bookmarks.svg b/icons/pixelarticons/svg/bookmarks.svg new file mode 100644 index 0000000..1bb007c --- /dev/null +++ b/icons/pixelarticons/svg/bookmarks.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f164f398be821ccbac949ef41d0e8b2595b2d41117203da881f59e2ba41322c0 +size 208 diff --git a/icons/pixelarticons/svg/briefcase-account.svg b/icons/pixelarticons/svg/briefcase-account.svg new file mode 100644 index 0000000..c5ce7af --- /dev/null +++ b/icons/pixelarticons/svg/briefcase-account.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb4275bb81656b9296e8dc0ee865605f889838eab3eb042e5cf7a1c340adc07f +size 203 diff --git a/icons/pixelarticons/svg/briefcase-check.svg b/icons/pixelarticons/svg/briefcase-check.svg new file mode 100644 index 0000000..e67b1f1 --- /dev/null +++ b/icons/pixelarticons/svg/briefcase-check.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b42bac8af0271fb6cbc1032845694ff54603bd747f563cef5c1e5cc83af4466b +size 235 diff --git a/icons/pixelarticons/svg/briefcase-delete.svg b/icons/pixelarticons/svg/briefcase-delete.svg new file mode 100644 index 0000000..93c8058 --- /dev/null +++ b/icons/pixelarticons/svg/briefcase-delete.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db535b5c96d7516edb90f1b1865d335179848f2b7d1eaa4dadfe128ffaf6fb9c +size 226 diff --git a/icons/pixelarticons/svg/briefcase-download.svg b/icons/pixelarticons/svg/briefcase-download.svg new file mode 100644 index 0000000..5140eb3 --- /dev/null +++ b/icons/pixelarticons/svg/briefcase-download.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f18422e22a905154d48344a1b76b234c817c12fcbee3c3f20d7b732f4ecf1962 +size 237 diff --git a/icons/pixelarticons/svg/briefcase-minus.svg b/icons/pixelarticons/svg/briefcase-minus.svg new file mode 100644 index 0000000..d41252f --- /dev/null +++ b/icons/pixelarticons/svg/briefcase-minus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:98207a1edcaa76f3d68f82579808e18062249c1a79f105637ad4cdf179281306 +size 183 diff --git a/icons/pixelarticons/svg/briefcase-plus.svg b/icons/pixelarticons/svg/briefcase-plus.svg new file mode 100644 index 0000000..9dc83fe --- /dev/null +++ b/icons/pixelarticons/svg/briefcase-plus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f13bf42245a243e4934159f120577b6946d99e45632cd712ab2b24453b9e3308 +size 202 diff --git a/icons/pixelarticons/svg/briefcase-search-1.svg b/icons/pixelarticons/svg/briefcase-search-1.svg new file mode 100644 index 0000000..0f967c1 --- /dev/null +++ b/icons/pixelarticons/svg/briefcase-search-1.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64c2eafeb7cd7f620e8b3422969576f4d6136270b70fb228bd30d39a3eadc305 +size 247 diff --git a/icons/pixelarticons/svg/briefcase-search.svg b/icons/pixelarticons/svg/briefcase-search.svg new file mode 100644 index 0000000..a50e34b --- /dev/null +++ b/icons/pixelarticons/svg/briefcase-search.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a50e9cf81cc72eacd68f89640732d78ebd6f6587884e7db7c17990ae8ef2c4d +size 212 diff --git a/icons/pixelarticons/svg/briefcase-upload.svg b/icons/pixelarticons/svg/briefcase-upload.svg new file mode 100644 index 0000000..e9d7140 --- /dev/null +++ b/icons/pixelarticons/svg/briefcase-upload.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7824a56ff99afca097c853b830cb7231d748ee416dac990c07ee132fce5a415a +size 227 diff --git a/icons/pixelarticons/svg/briefcase.svg b/icons/pixelarticons/svg/briefcase.svg new file mode 100644 index 0000000..9dbb307 --- /dev/null +++ b/icons/pixelarticons/svg/briefcase.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3884d132f41f76131b742b7bf3a35a220333b6726d2856d569b60b73c51a88e4 +size 168 diff --git a/icons/pixelarticons/svg/bug.svg b/icons/pixelarticons/svg/bug.svg new file mode 100644 index 0000000..2b62f61 --- /dev/null +++ b/icons/pixelarticons/svg/bug.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81b6cfad62aadd4b38fe1d8adf5da68bb806e295c9cdd6ee0f79ba5357f36447 +size 290 diff --git a/icons/pixelarticons/svg/building-community.svg b/icons/pixelarticons/svg/building-community.svg new file mode 100644 index 0000000..89e74d7 --- /dev/null +++ b/icons/pixelarticons/svg/building-community.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b27c344e0f0b0f1e6bc364a0d85992751b633bed509b9f117e54435de5e1cde +size 292 diff --git a/icons/pixelarticons/svg/building-skyscraper.svg b/icons/pixelarticons/svg/building-skyscraper.svg new file mode 100644 index 0000000..21c0969 --- /dev/null +++ b/icons/pixelarticons/svg/building-skyscraper.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:207e0d53cf092a6c58daf1622b69c59b17104d8bcb2a7cc0d83a616d02e2cd11 +size 244 diff --git a/icons/pixelarticons/svg/building.svg b/icons/pixelarticons/svg/building.svg new file mode 100644 index 0000000..4fbec33 --- /dev/null +++ b/icons/pixelarticons/svg/building.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4dd85fce847825bb9d242718ceb1794ab0405377012625dfa21d3642fc3aeda1 +size 288 diff --git a/icons/pixelarticons/svg/buildings.svg b/icons/pixelarticons/svg/buildings.svg new file mode 100644 index 0000000..128b0b7 --- /dev/null +++ b/icons/pixelarticons/svg/buildings.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a58c79e9d5851cbbf40fd2202b8f93c817cf9d995c606287f8f01fe12b20eeb6 +size 284 diff --git a/icons/pixelarticons/svg/bulletlist.svg b/icons/pixelarticons/svg/bulletlist.svg new file mode 100644 index 0000000..78f042a --- /dev/null +++ b/icons/pixelarticons/svg/bulletlist.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73fe43945bd623b2447048ce089f6450c39ccc2fcbe28c249dee33dbe403cef8 +size 239 diff --git a/icons/pixelarticons/svg/bullseye-arrow.svg b/icons/pixelarticons/svg/bullseye-arrow.svg new file mode 100644 index 0000000..6a8311f --- /dev/null +++ b/icons/pixelarticons/svg/bullseye-arrow.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:676ece8029573532c9aa5f2e9049892a67a8eabd642fd297bc091532de335911 +size 307 diff --git a/icons/pixelarticons/svg/bullseye.svg b/icons/pixelarticons/svg/bullseye.svg new file mode 100644 index 0000000..44d19ee --- /dev/null +++ b/icons/pixelarticons/svg/bullseye.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:298e238f8bed690637c7d14fd50731e4f6532ba04f3b5657bb6bd7be253b9dfd +size 273 diff --git a/icons/pixelarticons/svg/bus.svg b/icons/pixelarticons/svg/bus.svg new file mode 100644 index 0000000..2c0df47 --- /dev/null +++ b/icons/pixelarticons/svg/bus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c2c07d749b138e72e91e55e2b561a27804cf238a8be95ad1d15fdc2cb0fed2a +size 220 diff --git a/icons/pixelarticons/svg/cake.svg b/icons/pixelarticons/svg/cake.svg new file mode 100644 index 0000000..2cae386 --- /dev/null +++ b/icons/pixelarticons/svg/cake.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae5221ea3c650b062d552d4b6cb27d016afbac816bb56f044ad7b8f3696f15f8 +size 285 diff --git a/icons/pixelarticons/svg/calculator.svg b/icons/pixelarticons/svg/calculator.svg new file mode 100644 index 0000000..0578496 --- /dev/null +++ b/icons/pixelarticons/svg/calculator.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2655bb7bf209a2993a2aade5635f7d227c123ee5ba67a9f0f90e446bfe5a362e +size 256 diff --git a/icons/pixelarticons/svg/calendar-alert.svg b/icons/pixelarticons/svg/calendar-alert.svg new file mode 100644 index 0000000..31a0e26 --- /dev/null +++ b/icons/pixelarticons/svg/calendar-alert.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b3d0a2ecbc4a36f75b19e67966a3e46ac5b619f69c08cec86bf4a84fcf6e4574 +size 214 diff --git a/icons/pixelarticons/svg/calendar-arrow-left.svg b/icons/pixelarticons/svg/calendar-arrow-left.svg new file mode 100644 index 0000000..f9dc27a --- /dev/null +++ b/icons/pixelarticons/svg/calendar-arrow-left.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aeaeef59792ab25ddf9b8c9314880da8878eed65346cb5af226e91f54f42de5b +size 231 diff --git a/icons/pixelarticons/svg/calendar-arrow-right.svg b/icons/pixelarticons/svg/calendar-arrow-right.svg new file mode 100644 index 0000000..fb18c6a --- /dev/null +++ b/icons/pixelarticons/svg/calendar-arrow-right.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:186010778517b591d51e7b94789e00bc0bd01026717ccb3514fd6a3982417ea6 +size 239 diff --git a/icons/pixelarticons/svg/calendar-check.svg b/icons/pixelarticons/svg/calendar-check.svg new file mode 100644 index 0000000..2fec1e5 --- /dev/null +++ b/icons/pixelarticons/svg/calendar-check.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ccc5fa964459b28623cbceab9c0803755247c9608a2a033f4aef0f92ed75f72d +size 240 diff --git a/icons/pixelarticons/svg/calendar-export.svg b/icons/pixelarticons/svg/calendar-export.svg new file mode 100644 index 0000000..5bad8d6 --- /dev/null +++ b/icons/pixelarticons/svg/calendar-export.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:848faae84789ce899dc871c521f9cbd8555c4133f77db6bdb20b96c11ec3f9ed +size 240 diff --git a/icons/pixelarticons/svg/calendar-grid.svg b/icons/pixelarticons/svg/calendar-grid.svg new file mode 100644 index 0000000..af6f82f --- /dev/null +++ b/icons/pixelarticons/svg/calendar-grid.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00f19654026f7bd396f9673c928d6ba0640d785bf53a842935de7f6d87226721 +size 234 diff --git a/icons/pixelarticons/svg/calendar-import.svg b/icons/pixelarticons/svg/calendar-import.svg new file mode 100644 index 0000000..c42f492 --- /dev/null +++ b/icons/pixelarticons/svg/calendar-import.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb1df8310b9b9ecfd8508b887f4aed5838a3e565bb41a83d56cf7cd473c449ff +size 252 diff --git a/icons/pixelarticons/svg/calendar-minus.svg b/icons/pixelarticons/svg/calendar-minus.svg new file mode 100644 index 0000000..0d1f946 --- /dev/null +++ b/icons/pixelarticons/svg/calendar-minus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7df760c2fed0ef3d89e3164d115fa255ce69eedf329008e3406002d36eeb2e94 +size 199 diff --git a/icons/pixelarticons/svg/calendar-month.svg b/icons/pixelarticons/svg/calendar-month.svg new file mode 100644 index 0000000..8cef05a --- /dev/null +++ b/icons/pixelarticons/svg/calendar-month.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2eb4bd476f87f7723ad4b9db8c2e1b2c595719fd546a346149d4337b0572cd3d +size 270 diff --git a/icons/pixelarticons/svg/calendar-multiple-check.svg b/icons/pixelarticons/svg/calendar-multiple-check.svg new file mode 100644 index 0000000..f1be4b8 --- /dev/null +++ b/icons/pixelarticons/svg/calendar-multiple-check.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be2b994eeeb1a07de6a9171385f6c4001f0a3a15ae1912ef1e7bb60265a6fbdd +size 260 diff --git a/icons/pixelarticons/svg/calendar-multiple.svg b/icons/pixelarticons/svg/calendar-multiple.svg new file mode 100644 index 0000000..a5b2499 --- /dev/null +++ b/icons/pixelarticons/svg/calendar-multiple.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1d5e1a7737ac6a8af487b36943fb3d87301b380142088a6987cc5abbeaf1b33 +size 202 diff --git a/icons/pixelarticons/svg/calendar-plus.svg b/icons/pixelarticons/svg/calendar-plus.svg new file mode 100644 index 0000000..f90b42e --- /dev/null +++ b/icons/pixelarticons/svg/calendar-plus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4522a302028e3bd339079cf858ae8d70c02b9bb94b5b9fa9c5692f716ecb25a7 +size 215 diff --git a/icons/pixelarticons/svg/calendar-range.svg b/icons/pixelarticons/svg/calendar-range.svg new file mode 100644 index 0000000..6791e4e --- /dev/null +++ b/icons/pixelarticons/svg/calendar-range.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ae416c7c72e52e9e40c388c5ad2a0a3b3212cf851af71b6c779d9e94dea8c4f +size 228 diff --git a/icons/pixelarticons/svg/calendar-remove.svg b/icons/pixelarticons/svg/calendar-remove.svg new file mode 100644 index 0000000..ff77c13 --- /dev/null +++ b/icons/pixelarticons/svg/calendar-remove.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f7bb6e10511630747eadc6eacb3979541bdda03da301212cba6ffeff8f2ea8c +size 252 diff --git a/icons/pixelarticons/svg/calendar-search.svg b/icons/pixelarticons/svg/calendar-search.svg new file mode 100644 index 0000000..2e43aa7 --- /dev/null +++ b/icons/pixelarticons/svg/calendar-search.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4cf6d77f15cf600682ffa6bebc86742934cd7b6f15e15f31db2d6afe64265848 +size 239 diff --git a/icons/pixelarticons/svg/calendar-sort-ascending.svg b/icons/pixelarticons/svg/calendar-sort-ascending.svg new file mode 100644 index 0000000..29cdfb7 --- /dev/null +++ b/icons/pixelarticons/svg/calendar-sort-ascending.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e11a3dc9405b417e342aaccebe1fd4de74ca5c44e64b70f3e98d908632d270b +size 232 diff --git a/icons/pixelarticons/svg/calendar-sort-descending.svg b/icons/pixelarticons/svg/calendar-sort-descending.svg new file mode 100644 index 0000000..2377687 --- /dev/null +++ b/icons/pixelarticons/svg/calendar-sort-descending.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37b9d8838537c76fe0ee13120c1acd0aab6f316f241ea04e5da8bcda81e2dfc2 +size 242 diff --git a/icons/pixelarticons/svg/calendar-text.svg b/icons/pixelarticons/svg/calendar-text.svg new file mode 100644 index 0000000..0bb1eb6 --- /dev/null +++ b/icons/pixelarticons/svg/calendar-text.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64950209f83150c87dd6c9e686116cd1f88506b34eddb1b26f7c405b7222a9e8 +size 209 diff --git a/icons/pixelarticons/svg/calendar-today.svg b/icons/pixelarticons/svg/calendar-today.svg new file mode 100644 index 0000000..5fe0f52 --- /dev/null +++ b/icons/pixelarticons/svg/calendar-today.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b9ffb266936d9f53070400b381348f1f422bfe3489e79030de90764e8ca7b44 +size 198 diff --git a/icons/pixelarticons/svg/calendar-tomorrow.svg b/icons/pixelarticons/svg/calendar-tomorrow.svg new file mode 100644 index 0000000..6b39c8f --- /dev/null +++ b/icons/pixelarticons/svg/calendar-tomorrow.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f215ae85c4077b32d7e7a8d18c12fff7242fb6fd98f3a7668df4b77ce06339b2 +size 200 diff --git a/icons/pixelarticons/svg/calendar-week-begin.svg b/icons/pixelarticons/svg/calendar-week-begin.svg new file mode 100644 index 0000000..50ae6f7 --- /dev/null +++ b/icons/pixelarticons/svg/calendar-week-begin.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:600258c8693db259e78f2d6f93dbe635fa894558304bd7f331665e42f3cb7e1b +size 198 diff --git a/icons/pixelarticons/svg/calendar-week.svg b/icons/pixelarticons/svg/calendar-week.svg new file mode 100644 index 0000000..a236ce7 --- /dev/null +++ b/icons/pixelarticons/svg/calendar-week.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a38ed1663a81a74ce684df82da2fc1b62a5e893b52a50f72f024e3e31bc25ef +size 200 diff --git a/icons/pixelarticons/svg/calendar-weekend.svg b/icons/pixelarticons/svg/calendar-weekend.svg new file mode 100644 index 0000000..27ca24b --- /dev/null +++ b/icons/pixelarticons/svg/calendar-weekend.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16e66142626cb7f7132429999748e2b2e143b05c415c03053803ccaefe87e612 +size 200 diff --git a/icons/pixelarticons/svg/calendar.svg b/icons/pixelarticons/svg/calendar.svg new file mode 100644 index 0000000..4da8dad --- /dev/null +++ b/icons/pixelarticons/svg/calendar.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e40433d8aa829ff54781ec6586d6657f35bf278301c445a1f58df54e8018a8e +size 178 diff --git a/icons/pixelarticons/svg/camera-add.svg b/icons/pixelarticons/svg/camera-add.svg new file mode 100644 index 0000000..2d9b9cd --- /dev/null +++ b/icons/pixelarticons/svg/camera-add.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0dbb410db74ccc08a92d73c6902738c244604ddd2343e0509b8a64029822893b +size 235 diff --git a/icons/pixelarticons/svg/camera-alt.svg b/icons/pixelarticons/svg/camera-alt.svg new file mode 100644 index 0000000..ac55399 --- /dev/null +++ b/icons/pixelarticons/svg/camera-alt.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:22d1a868c451cbffeb206754b4cdb3d473d04c6c18eea234d72bef9bce23941f +size 223 diff --git a/icons/pixelarticons/svg/camera-face.svg b/icons/pixelarticons/svg/camera-face.svg new file mode 100644 index 0000000..fe2797a --- /dev/null +++ b/icons/pixelarticons/svg/camera-face.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed7cb7a77063d5156e305098eda14445029e7a7e3de2c8471e790cf55f77ee35 +size 236 diff --git a/icons/pixelarticons/svg/camera.svg b/icons/pixelarticons/svg/camera.svg new file mode 100644 index 0000000..89567ad --- /dev/null +++ b/icons/pixelarticons/svg/camera.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:347d3142fa0081774dca1fc3c35ebbaa655ffc77d1854939d603a7bd010eb2ad +size 222 diff --git a/icons/pixelarticons/svg/car.svg b/icons/pixelarticons/svg/car.svg new file mode 100644 index 0000000..5eb4f18 --- /dev/null +++ b/icons/pixelarticons/svg/car.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:85a920816d9995e7eca056dbcb65fef68a4bac55b569ad0ee76c0096b982bb07 +size 229 diff --git a/icons/pixelarticons/svg/card-id.svg b/icons/pixelarticons/svg/card-id.svg new file mode 100644 index 0000000..cd52a70 --- /dev/null +++ b/icons/pixelarticons/svg/card-id.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee7e24658b6481fefb7ce2c81b9712788ebcdbb985b5723700d9c695f323aa14 +size 209 diff --git a/icons/pixelarticons/svg/card-plus.svg b/icons/pixelarticons/svg/card-plus.svg new file mode 100644 index 0000000..a72c8b8 --- /dev/null +++ b/icons/pixelarticons/svg/card-plus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aff9ce8e02ea441b15d164172732dbf41a13ef2d48262b4693ef506ddf6f2cc7 +size 184 diff --git a/icons/pixelarticons/svg/card-stack.svg b/icons/pixelarticons/svg/card-stack.svg new file mode 100644 index 0000000..54c0ab1 --- /dev/null +++ b/icons/pixelarticons/svg/card-stack.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b4460650ffd3e6eb183ccc2ba001a4160e6254d295563bf43c3c472b51dc24f9 +size 165 diff --git a/icons/pixelarticons/svg/card-text.svg b/icons/pixelarticons/svg/card-text.svg new file mode 100644 index 0000000..dd37f63 --- /dev/null +++ b/icons/pixelarticons/svg/card-text.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d0adc072742b63486d5037f0ebcbea6eec118fd2dceabdb6cdb18ee25e787cc +size 178 diff --git a/icons/pixelarticons/svg/card.svg b/icons/pixelarticons/svg/card.svg new file mode 100644 index 0000000..0e05f58 --- /dev/null +++ b/icons/pixelarticons/svg/card.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c65926394fca1f78e48ee9a381aadd4f8482505379a0f37345a7cdbe45f0da8 +size 149 diff --git a/icons/pixelarticons/svg/cart.svg b/icons/pixelarticons/svg/cart.svg new file mode 100644 index 0000000..8d6478b --- /dev/null +++ b/icons/pixelarticons/svg/cart.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:039d894baa42c64663687d398b7c8edf49580d44d1c4d5cc937bbe81d6f6731b +size 185 diff --git a/icons/pixelarticons/svg/cast.svg b/icons/pixelarticons/svg/cast.svg new file mode 100644 index 0000000..f515974 --- /dev/null +++ b/icons/pixelarticons/svg/cast.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73ff354f851833a1d323d593ae3840ce70aae3c91420d42889cfefc412cc7e50 +size 214 diff --git a/icons/pixelarticons/svg/cellular-signal-0.svg b/icons/pixelarticons/svg/cellular-signal-0.svg new file mode 100644 index 0000000..2f8b862 --- /dev/null +++ b/icons/pixelarticons/svg/cellular-signal-0.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b50cbc7945b0f824c4e8c39e08460c80866eaca8a1150cb5eb2e50a29c66dca1 +size 197 diff --git a/icons/pixelarticons/svg/cellular-signal-1.svg b/icons/pixelarticons/svg/cellular-signal-1.svg new file mode 100644 index 0000000..b535acc --- /dev/null +++ b/icons/pixelarticons/svg/cellular-signal-1.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b73db6c9ca39faa87dea474c24a69b108a4e685f4b5427e0c5a1c2fbed2ef280 +size 180 diff --git a/icons/pixelarticons/svg/cellular-signal-2.svg b/icons/pixelarticons/svg/cellular-signal-2.svg new file mode 100644 index 0000000..62bc533 --- /dev/null +++ b/icons/pixelarticons/svg/cellular-signal-2.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:731868fcc4b1dd186ba04caa1c35666ef4006419f193000e7aae6d9b37b6259d +size 165 diff --git a/icons/pixelarticons/svg/cellular-signal-3.svg b/icons/pixelarticons/svg/cellular-signal-3.svg new file mode 100644 index 0000000..0b82667 --- /dev/null +++ b/icons/pixelarticons/svg/cellular-signal-3.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:57142e8d73307cc38c087db8c816225622616f936d47b9fcb30f7d6cc4add24f +size 150 diff --git a/icons/pixelarticons/svg/cellular-signal-off.svg b/icons/pixelarticons/svg/cellular-signal-off.svg new file mode 100644 index 0000000..9ee7cd5 --- /dev/null +++ b/icons/pixelarticons/svg/cellular-signal-off.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b59d85ed12c12c27383e02b052dce5f14e5346e634fce1fbf30b6940edd45c45 +size 240 diff --git a/icons/pixelarticons/svg/chart-add.svg b/icons/pixelarticons/svg/chart-add.svg new file mode 100644 index 0000000..2f08847 --- /dev/null +++ b/icons/pixelarticons/svg/chart-add.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f13333c4a256f5088d57789a098209bd4244baf27e113be216db107d9b4578e0 +size 224 diff --git a/icons/pixelarticons/svg/chart-bar.svg b/icons/pixelarticons/svg/chart-bar.svg new file mode 100644 index 0000000..f8b46ed --- /dev/null +++ b/icons/pixelarticons/svg/chart-bar.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa300a98d876834733aaf2bcadeafb1cab67c03880f1cec3fded0a145d472213 +size 179 diff --git a/icons/pixelarticons/svg/chart-delete.svg b/icons/pixelarticons/svg/chart-delete.svg new file mode 100644 index 0000000..aca06cb --- /dev/null +++ b/icons/pixelarticons/svg/chart-delete.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e811eadc5045568db59ca69d68ab0db31bfc86c3a2ae7a8747172d40f35c0bc4 +size 257 diff --git a/icons/pixelarticons/svg/chart-minus.svg b/icons/pixelarticons/svg/chart-minus.svg new file mode 100644 index 0000000..8c5180e --- /dev/null +++ b/icons/pixelarticons/svg/chart-minus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d33869416de9cf6ff8185bf5251d6cb16e0d3364479f351b0e49cd6f957d1660 +size 206 diff --git a/icons/pixelarticons/svg/chart-multiple.svg b/icons/pixelarticons/svg/chart-multiple.svg new file mode 100644 index 0000000..a3b8453 --- /dev/null +++ b/icons/pixelarticons/svg/chart-multiple.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:27216c48329e0d53fe7dc296a02d918bc7d198a942263fe054d1f1776106a88f +size 211 diff --git a/icons/pixelarticons/svg/chart.svg b/icons/pixelarticons/svg/chart.svg new file mode 100644 index 0000000..e3b2c59 --- /dev/null +++ b/icons/pixelarticons/svg/chart.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3bd07ab45c15101aef29373a0eae5deebb6e9ed95991520c8c08838084f46952 +size 195 diff --git a/icons/pixelarticons/svg/chat.svg b/icons/pixelarticons/svg/chat.svg new file mode 100644 index 0000000..2fd8c04 --- /dev/null +++ b/icons/pixelarticons/svg/chat.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9817e6f0007ecbef7b9f61fdf6f51d73051000ceb61e7be33f0552b290084cfc +size 159 diff --git a/icons/pixelarticons/svg/check-double.svg b/icons/pixelarticons/svg/check-double.svg new file mode 100644 index 0000000..a6d3248 --- /dev/null +++ b/icons/pixelarticons/svg/check-double.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7917b00a9347dc7500e0d638fcfe71bdf00a21d5dd56e8b6a26c8be324ab9223 +size 325 diff --git a/icons/pixelarticons/svg/check.svg b/icons/pixelarticons/svg/check.svg new file mode 100644 index 0000000..3dc09b4 --- /dev/null +++ b/icons/pixelarticons/svg/check.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3259dfa71c96d70e251d43be895b2c32b1b41d875ebe1b425ce8d26bba668a14 +size 239 diff --git a/icons/pixelarticons/svg/checkbox-on.svg b/icons/pixelarticons/svg/checkbox-on.svg new file mode 100644 index 0000000..2bc75aa --- /dev/null +++ b/icons/pixelarticons/svg/checkbox-on.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cbf7333188d530eb02cef65f16537eb7a8be8f8099de17221a737d867198ee56 +size 149 diff --git a/icons/pixelarticons/svg/checkbox.svg b/icons/pixelarticons/svg/checkbox.svg new file mode 100644 index 0000000..462a201 --- /dev/null +++ b/icons/pixelarticons/svg/checkbox.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e110cb86c4876d99875288c8dc591fd33e37a66ed9f97cfc35fe4f98ed3db76 +size 201 diff --git a/icons/pixelarticons/svg/checklist.svg b/icons/pixelarticons/svg/checklist.svg new file mode 100644 index 0000000..d6ab5aa --- /dev/null +++ b/icons/pixelarticons/svg/checklist.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9293fea8413a7ad038bb48a7734cba9bea702215b62ab90d37b337c22f3fe7ab +size 264 diff --git a/icons/pixelarticons/svg/chess.svg b/icons/pixelarticons/svg/chess.svg new file mode 100644 index 0000000..9084eb1 --- /dev/null +++ b/icons/pixelarticons/svg/chess.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:870a15b821984cdcb51d7d7fd6bb6d830effb49d8f8f6a3b42ae75774168a57f +size 219 diff --git a/icons/pixelarticons/svg/chevron-down.svg b/icons/pixelarticons/svg/chevron-down.svg new file mode 100644 index 0000000..ee61aa4 --- /dev/null +++ b/icons/pixelarticons/svg/chevron-down.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26ff3407a9773042b5446b9ab9fc00be28482ee6c23a9ffbdc09aed076d9e553 +size 187 diff --git a/icons/pixelarticons/svg/chevron-left.svg b/icons/pixelarticons/svg/chevron-left.svg new file mode 100644 index 0000000..2df4c03 --- /dev/null +++ b/icons/pixelarticons/svg/chevron-left.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af11958681f2465c7d061be425c24d446c054f55acd52e5e650dc13be8b8bb45 +size 221 diff --git a/icons/pixelarticons/svg/chevron-right.svg b/icons/pixelarticons/svg/chevron-right.svg new file mode 100644 index 0000000..829efa2 --- /dev/null +++ b/icons/pixelarticons/svg/chevron-right.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:287f623195f99ce5350e11522d24c31a1d3671fe51b8f76622744cf0ae00850c +size 219 diff --git a/icons/pixelarticons/svg/chevron-up.svg b/icons/pixelarticons/svg/chevron-up.svg new file mode 100644 index 0000000..52452f2 --- /dev/null +++ b/icons/pixelarticons/svg/chevron-up.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2666134a19b57416b705eb9c04ce25914d8bb94fbe252758e3534e57a9ceca7c +size 189 diff --git a/icons/pixelarticons/svg/chevrons-horizontal.svg b/icons/pixelarticons/svg/chevrons-horizontal.svg new file mode 100644 index 0000000..54067f5 --- /dev/null +++ b/icons/pixelarticons/svg/chevrons-horizontal.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f8af7c048f20530642b7ca6847629284bc013c358dfaf26829e5dce9b56c357 +size 260 diff --git a/icons/pixelarticons/svg/chevrons-vertical.svg b/icons/pixelarticons/svg/chevrons-vertical.svg new file mode 100644 index 0000000..211d9ef --- /dev/null +++ b/icons/pixelarticons/svg/chevrons-vertical.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3818a239e60d9945a914b4d2a048f58331921df3ac4a0976d307bc7d538e75b +size 260 diff --git a/icons/pixelarticons/svg/circle.svg b/icons/pixelarticons/svg/circle.svg new file mode 100644 index 0000000..fc070ae --- /dev/null +++ b/icons/pixelarticons/svg/circle.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:402aed5dc3744c5607e9acec7f8373f6e3a0279381074e905fc99f58d5bcb841 +size 202 diff --git a/icons/pixelarticons/svg/clipboard.svg b/icons/pixelarticons/svg/clipboard.svg new file mode 100644 index 0000000..ed6b867 --- /dev/null +++ b/icons/pixelarticons/svg/clipboard.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e3a26523fb8585029eca4db007879db68511d117f035837d6b3244cec957e80 +size 181 diff --git a/icons/pixelarticons/svg/clock.svg b/icons/pixelarticons/svg/clock.svg new file mode 100644 index 0000000..81cb3b3 --- /dev/null +++ b/icons/pixelarticons/svg/clock.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a4081c19d2b3605f6249460514b18b0d105bfd9ba46491fc95136870216fe76f +size 185 diff --git a/icons/pixelarticons/svg/close-box.svg b/icons/pixelarticons/svg/close-box.svg new file mode 100644 index 0000000..0fa5a01 --- /dev/null +++ b/icons/pixelarticons/svg/close-box.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ae48c081b6a4f550ab8ea4c9a792bdd83c8c1f5c425c7ad845424756f0a8504 +size 238 diff --git a/icons/pixelarticons/svg/close.svg b/icons/pixelarticons/svg/close.svg new file mode 100644 index 0000000..12aaee9 --- /dev/null +++ b/icons/pixelarticons/svg/close.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d2276a9c8e928f02fe17faca1c1d6b50d01979a5225ff2b3512b380056dc4b9 +size 270 diff --git a/icons/pixelarticons/svg/cloud-done.svg b/icons/pixelarticons/svg/cloud-done.svg new file mode 100644 index 0000000..73fc7f0 --- /dev/null +++ b/icons/pixelarticons/svg/cloud-done.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8559b00d2b3f2508b4b58c45f1217cedb03ededa83b6be2445ecd54ec215f056 +size 260 diff --git a/icons/pixelarticons/svg/cloud-download.svg b/icons/pixelarticons/svg/cloud-download.svg new file mode 100644 index 0000000..f064b0f --- /dev/null +++ b/icons/pixelarticons/svg/cloud-download.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad4ecdddd9fca45f5d92b6f03916f32267a59b56a608d66631587f3e633a5b1a +size 309 diff --git a/icons/pixelarticons/svg/cloud-moon.svg b/icons/pixelarticons/svg/cloud-moon.svg new file mode 100644 index 0000000..ae4061e --- /dev/null +++ b/icons/pixelarticons/svg/cloud-moon.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:acd37d2bfa5ea46e4bea97ca4a5f93fe9ab7c96d5d03e0bfdec2f9895ae3c3ea +size 271 diff --git a/icons/pixelarticons/svg/cloud-sun.svg b/icons/pixelarticons/svg/cloud-sun.svg new file mode 100644 index 0000000..b32ecfd --- /dev/null +++ b/icons/pixelarticons/svg/cloud-sun.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:347179e70c30a7258e67f234ba923522460dd498bd986e556a51a5dec1b8a47f +size 320 diff --git a/icons/pixelarticons/svg/cloud-upload.svg b/icons/pixelarticons/svg/cloud-upload.svg new file mode 100644 index 0000000..5754689 --- /dev/null +++ b/icons/pixelarticons/svg/cloud-upload.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8578d0f2c02efc5657af4a2ed3c0864bb88a3f05968a3b1c833ca095cb00d757 +size 308 diff --git a/icons/pixelarticons/svg/cloud.svg b/icons/pixelarticons/svg/cloud.svg new file mode 100644 index 0000000..1c83c55 --- /dev/null +++ b/icons/pixelarticons/svg/cloud.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1aaa895e2ff6aa7b45e2d3b5598b59377c394af44c63c291820ad914afd4c25 +size 239 diff --git a/icons/pixelarticons/svg/cocktail.svg b/icons/pixelarticons/svg/cocktail.svg new file mode 100644 index 0000000..09a49a9 --- /dev/null +++ b/icons/pixelarticons/svg/cocktail.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c5ae22d623fbf61eedd2439dfbb708417709644638398dced94db88b2962673b +size 193 diff --git a/icons/pixelarticons/svg/code.svg b/icons/pixelarticons/svg/code.svg new file mode 100644 index 0000000..40e7216 --- /dev/null +++ b/icons/pixelarticons/svg/code.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dab8c596980efb7de8913277ab43bc88f5fed2c397485dc1b0d6a2d76548c7a5 +size 319 diff --git a/icons/pixelarticons/svg/coffee-alt.svg b/icons/pixelarticons/svg/coffee-alt.svg new file mode 100644 index 0000000..587ce02 --- /dev/null +++ b/icons/pixelarticons/svg/coffee-alt.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af3aea276c2827b3a0107ab83ab12853a1c80480f5b03c126eb4db98cecfbf60 +size 209 diff --git a/icons/pixelarticons/svg/coffee.svg b/icons/pixelarticons/svg/coffee.svg new file mode 100644 index 0000000..4566b9f --- /dev/null +++ b/icons/pixelarticons/svg/coffee.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:22634601a43610e7c3f4621b39f31ae0c97861a9af53f30f5dcf658979ecb994 +size 182 diff --git a/icons/pixelarticons/svg/coin.svg b/icons/pixelarticons/svg/coin.svg new file mode 100644 index 0000000..2512d59 --- /dev/null +++ b/icons/pixelarticons/svg/coin.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a27ec261baf640b1d7a9c8563264ff6e04d13aa0e38ed4151976822ea6d04af2 +size 286 diff --git a/icons/pixelarticons/svg/collapse.svg b/icons/pixelarticons/svg/collapse.svg new file mode 100644 index 0000000..d6e748f --- /dev/null +++ b/icons/pixelarticons/svg/collapse.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:629d9f15bc5dd1906a331e608d7cd9391da93f01fa4bc075ad242b6d0719c068 +size 256 diff --git a/icons/pixelarticons/svg/colors-swatch.svg b/icons/pixelarticons/svg/colors-swatch.svg new file mode 100644 index 0000000..0765512 --- /dev/null +++ b/icons/pixelarticons/svg/colors-swatch.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:130675efdbd0da066c1cb3a15857e27315157d2a65f746c1156231d00d537ad1 +size 233 diff --git a/icons/pixelarticons/svg/command.svg b/icons/pixelarticons/svg/command.svg new file mode 100644 index 0000000..84e96d6 --- /dev/null +++ b/icons/pixelarticons/svg/command.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:969fda80f1ac6c860420078b273c6333acac6899b608289a91a1fabd3e11ab28 +size 300 diff --git a/icons/pixelarticons/svg/comment.svg b/icons/pixelarticons/svg/comment.svg new file mode 100644 index 0000000..853b25d --- /dev/null +++ b/icons/pixelarticons/svg/comment.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6fdb61127d880384b9b9b2c726f62c410eec795c36b4b4577e397f19f906331 +size 176 diff --git a/icons/pixelarticons/svg/contact-delete.svg b/icons/pixelarticons/svg/contact-delete.svg new file mode 100644 index 0000000..9d22bb5 --- /dev/null +++ b/icons/pixelarticons/svg/contact-delete.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e62ea32bcb34a3284d77df5ab657130ad72c84db7264c06c2fee76731006b29b +size 312 diff --git a/icons/pixelarticons/svg/contact-multiple.svg b/icons/pixelarticons/svg/contact-multiple.svg new file mode 100644 index 0000000..7ea40f9 --- /dev/null +++ b/icons/pixelarticons/svg/contact-multiple.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb51864fe5ce711bc470705dd0ed6c58a7a089648cd79ed0f479782affbf1b4c +size 226 diff --git a/icons/pixelarticons/svg/contact-plus.svg b/icons/pixelarticons/svg/contact-plus.svg new file mode 100644 index 0000000..e01470b --- /dev/null +++ b/icons/pixelarticons/svg/contact-plus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75b445de94a2a9039584473aa6b2a38502fb7b3271eb561317b5f4f1ed9983b1 +size 258 diff --git a/icons/pixelarticons/svg/contact.svg b/icons/pixelarticons/svg/contact.svg new file mode 100644 index 0000000..78888bc --- /dev/null +++ b/icons/pixelarticons/svg/contact.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c3751e8944f91b7b320c1e6774bfe6a2e8738514ed37c899ae3a7a1ac8d3216 +size 225 diff --git a/icons/pixelarticons/svg/copy.svg b/icons/pixelarticons/svg/copy.svg new file mode 100644 index 0000000..66900f1 --- /dev/null +++ b/icons/pixelarticons/svg/copy.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ff7985c00b8508bfb6a4010ccca9fcbdce3b4a00339104a6cf0b0e3497312bdf +size 166 diff --git a/icons/pixelarticons/svg/corner-down-left.svg b/icons/pixelarticons/svg/corner-down-left.svg new file mode 100644 index 0000000..242457c --- /dev/null +++ b/icons/pixelarticons/svg/corner-down-left.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da38f748fd79e2446a1a8ebb5bf275635e6e80480d89bef86f2f6117af3f9715 +size 189 diff --git a/icons/pixelarticons/svg/corner-down-right.svg b/icons/pixelarticons/svg/corner-down-right.svg new file mode 100644 index 0000000..8e62433 --- /dev/null +++ b/icons/pixelarticons/svg/corner-down-right.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae96555ca7a2ae2cf623b23cedf4851f1666ba4bbdc0ef2081f060a020cc53c5 +size 191 diff --git a/icons/pixelarticons/svg/corner-left-down.svg b/icons/pixelarticons/svg/corner-left-down.svg new file mode 100644 index 0000000..194977b --- /dev/null +++ b/icons/pixelarticons/svg/corner-left-down.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:acfd1b8754d7f0aeaa31c55137140363d4a88e99f344c54e440830c3791a02af +size 188 diff --git a/icons/pixelarticons/svg/corner-left-up.svg b/icons/pixelarticons/svg/corner-left-up.svg new file mode 100644 index 0000000..7426e16 --- /dev/null +++ b/icons/pixelarticons/svg/corner-left-up.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4af8e7dc7744ece2bc4bb0946d3e548868b7160dc47a0c10fb35cd70831e1fd8 +size 185 diff --git a/icons/pixelarticons/svg/corner-right-down.svg b/icons/pixelarticons/svg/corner-right-down.svg new file mode 100644 index 0000000..232ea13 --- /dev/null +++ b/icons/pixelarticons/svg/corner-right-down.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ecf69905e45cd2834f69c5f9ad8c77904fac0112aa329e10ab0ca7df02186c86 +size 192 diff --git a/icons/pixelarticons/svg/corner-right-up.svg b/icons/pixelarticons/svg/corner-right-up.svg new file mode 100644 index 0000000..15ec3c9 --- /dev/null +++ b/icons/pixelarticons/svg/corner-right-up.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:887f5031c87485761ee4d2457751e0b0ac02e3de567ac5a13b9f1d3a06a48e3b +size 189 diff --git a/icons/pixelarticons/svg/corner-up-left.svg b/icons/pixelarticons/svg/corner-up-left.svg new file mode 100644 index 0000000..7ae8f83 --- /dev/null +++ b/icons/pixelarticons/svg/corner-up-left.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:067fd8750967ae3eac78e3f14dd6115efcbdf1299100a1c852e2268105acc317 +size 185 diff --git a/icons/pixelarticons/svg/corner-up-right.svg b/icons/pixelarticons/svg/corner-up-right.svg new file mode 100644 index 0000000..181ec42 --- /dev/null +++ b/icons/pixelarticons/svg/corner-up-right.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bdccedda822202e605c68515fc9fab19be09d8cd04249b299c448ed1abb14747 +size 187 diff --git a/icons/pixelarticons/svg/credit-card-delete.svg b/icons/pixelarticons/svg/credit-card-delete.svg new file mode 100644 index 0000000..adc314d --- /dev/null +++ b/icons/pixelarticons/svg/credit-card-delete.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:195f8fac6211e4faa887424318f9142404f1f9fda74a4e5436bbb9eada35d0e2 +size 223 diff --git a/icons/pixelarticons/svg/credit-card-minus.svg b/icons/pixelarticons/svg/credit-card-minus.svg new file mode 100644 index 0000000..b31c834 --- /dev/null +++ b/icons/pixelarticons/svg/credit-card-minus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04e8d59bd39caeec5f856918b95ae228358e61a0c72b10482c00ac34e1ddd5fe +size 183 diff --git a/icons/pixelarticons/svg/credit-card-multiple.svg b/icons/pixelarticons/svg/credit-card-multiple.svg new file mode 100644 index 0000000..f71efea --- /dev/null +++ b/icons/pixelarticons/svg/credit-card-multiple.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:568b82a2d85f1278c3efabb762fadce3533355b5f5a1b95eb45283c061a4b9a1 +size 197 diff --git a/icons/pixelarticons/svg/credit-card-plus.svg b/icons/pixelarticons/svg/credit-card-plus.svg new file mode 100644 index 0000000..e08b9f1 --- /dev/null +++ b/icons/pixelarticons/svg/credit-card-plus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df3cef1007845b6eaf6f962ec493539aa598a14bb2b459a6cc159a3140157cbe +size 201 diff --git a/icons/pixelarticons/svg/credit-card-settings.svg b/icons/pixelarticons/svg/credit-card-settings.svg new file mode 100644 index 0000000..d057cb6 --- /dev/null +++ b/icons/pixelarticons/svg/credit-card-settings.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00fea49bd66403f3081fda3aa4c04054744a0a28903e3b2f45cf2de7203c5661 +size 215 diff --git a/icons/pixelarticons/svg/credit-card-wireless.svg b/icons/pixelarticons/svg/credit-card-wireless.svg new file mode 100644 index 0000000..3d7f30a --- /dev/null +++ b/icons/pixelarticons/svg/credit-card-wireless.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d5b8177e3a394123031e3e0ff12c6762d0ccd33f9b0cb15be950f7525f57f22a +size 238 diff --git a/icons/pixelarticons/svg/credit-card.svg b/icons/pixelarticons/svg/credit-card.svg new file mode 100644 index 0000000..20b483d --- /dev/null +++ b/icons/pixelarticons/svg/credit-card.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:945990de8ce35d4dca07d3c8b3590f42b55d1841eeb6f268bb3a6b1d0c9c6a4a +size 167 diff --git a/icons/pixelarticons/svg/crop.svg b/icons/pixelarticons/svg/crop.svg new file mode 100644 index 0000000..b8715d6 --- /dev/null +++ b/icons/pixelarticons/svg/crop.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ee24925a21cb655036a3efaee61a074cd91cec5ddb50cc06794ba3151d547e4 +size 174 diff --git a/icons/pixelarticons/svg/cut.svg b/icons/pixelarticons/svg/cut.svg new file mode 100644 index 0000000..7507569 --- /dev/null +++ b/icons/pixelarticons/svg/cut.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26ebfad033567b20d847a76c9e762ab3b49c61046c0fcc3441c0d9d41293137d +size 290 diff --git a/icons/pixelarticons/svg/dashboard.svg b/icons/pixelarticons/svg/dashboard.svg new file mode 100644 index 0000000..7219aa1 --- /dev/null +++ b/icons/pixelarticons/svg/dashboard.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f294843ce6c1bff699819796a2bab9000e574b09f17a6235ede54efe3ab12740 +size 233 diff --git a/icons/pixelarticons/svg/debug-check.svg b/icons/pixelarticons/svg/debug-check.svg new file mode 100644 index 0000000..e7ff193 --- /dev/null +++ b/icons/pixelarticons/svg/debug-check.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c7f2d6eda162858a76718c946da897600534e4acdbf1a402ddc060a0f61465f +size 316 diff --git a/icons/pixelarticons/svg/debug-off.svg b/icons/pixelarticons/svg/debug-off.svg new file mode 100644 index 0000000..4d4e563 --- /dev/null +++ b/icons/pixelarticons/svg/debug-off.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb3bab62129b9ffe5a23425a775a92babc99ffa351facbfebc8407af2ebb5e48 +size 374 diff --git a/icons/pixelarticons/svg/debug-pause.svg b/icons/pixelarticons/svg/debug-pause.svg new file mode 100644 index 0000000..001c7c8 --- /dev/null +++ b/icons/pixelarticons/svg/debug-pause.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c637eeff3ac8ac5be879c3ac3d9fea4a49e83bce64d9e7f7379332d025ae2ace +size 286 diff --git a/icons/pixelarticons/svg/debug-play.svg b/icons/pixelarticons/svg/debug-play.svg new file mode 100644 index 0000000..c8ffd55 --- /dev/null +++ b/icons/pixelarticons/svg/debug-play.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df5754e0edd432a3756ab61d4f7dcb567c0c10b009311b254044335d64ec302c +size 300 diff --git a/icons/pixelarticons/svg/debug-stop.svg b/icons/pixelarticons/svg/debug-stop.svg new file mode 100644 index 0000000..106e7e6 --- /dev/null +++ b/icons/pixelarticons/svg/debug-stop.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c2ee787cbc6321a2fc59be7afcb542f636c659fea5ead9be68f256e2a14e36a6 +size 282 diff --git a/icons/pixelarticons/svg/debug.svg b/icons/pixelarticons/svg/debug.svg new file mode 100644 index 0000000..8e59ea5 --- /dev/null +++ b/icons/pixelarticons/svg/debug.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e606609579c16c3cfe908d5f955d5f7eddb3e268fdbe81de4d99ce37d7fabe3c +size 317 diff --git a/icons/pixelarticons/svg/delete.svg b/icons/pixelarticons/svg/delete.svg new file mode 100644 index 0000000..42dc497 --- /dev/null +++ b/icons/pixelarticons/svg/delete.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:000a0d9a1842eb4bf3573d042c8f416fd4e8b47ce5093c77c02cb852448473e8 +size 252 diff --git a/icons/pixelarticons/svg/deskphone.svg b/icons/pixelarticons/svg/deskphone.svg new file mode 100644 index 0000000..8ebcff0 --- /dev/null +++ b/icons/pixelarticons/svg/deskphone.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe61d2543b6a432e79db7371a37b71b4508109b7f31184799923e34211e2cd87 +size 223 diff --git a/icons/pixelarticons/svg/device-laptop.svg b/icons/pixelarticons/svg/device-laptop.svg new file mode 100644 index 0000000..38eff1b --- /dev/null +++ b/icons/pixelarticons/svg/device-laptop.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9057fae45158838f7f5ca9009d4f6a17fcdca8edff31df27b82deac31241125a +size 165 diff --git a/icons/pixelarticons/svg/device-phone.svg b/icons/pixelarticons/svg/device-phone.svg new file mode 100644 index 0000000..63688f7 --- /dev/null +++ b/icons/pixelarticons/svg/device-phone.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bbe2a3ada0b8d9308beb495830377b7f48a345e074580cdb8b0206bc6a9ebe18 +size 174 diff --git a/icons/pixelarticons/svg/device-tablet.svg b/icons/pixelarticons/svg/device-tablet.svg new file mode 100644 index 0000000..13be038 --- /dev/null +++ b/icons/pixelarticons/svg/device-tablet.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2cba2c497b15c6cdb7078e028292bffea0543806318c0d98be41cdae7201c048 +size 167 diff --git a/icons/pixelarticons/svg/device-tv-smart.svg b/icons/pixelarticons/svg/device-tv-smart.svg new file mode 100644 index 0000000..f2263d6 --- /dev/null +++ b/icons/pixelarticons/svg/device-tv-smart.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f6e649f37afacb9e87e3fa54cfc6ff3dbb82483b6b87de66beb2ca4001a418e +size 161 diff --git a/icons/pixelarticons/svg/device-tv.svg b/icons/pixelarticons/svg/device-tv.svg new file mode 100644 index 0000000..9f75932 --- /dev/null +++ b/icons/pixelarticons/svg/device-tv.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a7b25dd55019f4fae6e4b871a2fc1fd0d925ab533e5b21872429a521276251a7 +size 194 diff --git a/icons/pixelarticons/svg/device-vibrate.svg b/icons/pixelarticons/svg/device-vibrate.svg new file mode 100644 index 0000000..67867ad --- /dev/null +++ b/icons/pixelarticons/svg/device-vibrate.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72f3879275df2cb8db8a77dceea0dc3e6d732772f1fbfdc4fa27f8fe16d9d344 +size 287 diff --git a/icons/pixelarticons/svg/device-watch.svg b/icons/pixelarticons/svg/device-watch.svg new file mode 100644 index 0000000..f10bde0 --- /dev/null +++ b/icons/pixelarticons/svg/device-watch.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c2013c5d0fd98ef57fd639855cb1bdf66ed6d88905b2bebb7e25b28e893f073b +size 183 diff --git a/icons/pixelarticons/svg/devices.svg b/icons/pixelarticons/svg/devices.svg new file mode 100644 index 0000000..95003f7 --- /dev/null +++ b/icons/pixelarticons/svg/devices.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d48cdc6ca78b7a5b178ca7b296d714e965d0645b77cc06ce4f41ff9e1977cedc +size 224 diff --git a/icons/pixelarticons/svg/dice.svg b/icons/pixelarticons/svg/dice.svg new file mode 100644 index 0000000..483a4fc --- /dev/null +++ b/icons/pixelarticons/svg/dice.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:064c13f620d23fe70c0f5128ab32e0f78aa51e787756925a014499f23db8e91e +size 223 diff --git a/icons/pixelarticons/svg/dollar.svg b/icons/pixelarticons/svg/dollar.svg new file mode 100644 index 0000000..0f23e64 --- /dev/null +++ b/icons/pixelarticons/svg/dollar.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f944e9f119559cd5f394b9ac1a909d67c20041c638edd670ed4df9a9bd49f5a7 +size 187 diff --git a/icons/pixelarticons/svg/downasaur.svg b/icons/pixelarticons/svg/downasaur.svg new file mode 100644 index 0000000..3faedb7 --- /dev/null +++ b/icons/pixelarticons/svg/downasaur.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7d0b565a9a613660a1cbbd55239686e33cbc89895112e2f4977f325814172ba +size 175 diff --git a/icons/pixelarticons/svg/download.svg b/icons/pixelarticons/svg/download.svg new file mode 100644 index 0000000..ca17de9 --- /dev/null +++ b/icons/pixelarticons/svg/download.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b2c0624495c9a07fbac5d47db0384803c4698389f50af19fd6b6a16a0570c45 +size 205 diff --git a/icons/pixelarticons/svg/draft.svg b/icons/pixelarticons/svg/draft.svg new file mode 100644 index 0000000..69f9698 --- /dev/null +++ b/icons/pixelarticons/svg/draft.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc17de429108f27d5cdefee892e78bf6f13d3af64aea333be7f43579b00605ab +size 263 diff --git a/icons/pixelarticons/svg/drag-and-drop.svg b/icons/pixelarticons/svg/drag-and-drop.svg new file mode 100644 index 0000000..2916e30 --- /dev/null +++ b/icons/pixelarticons/svg/drag-and-drop.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:083a8f0a1720adf112fe133ae86dd9a71e35a07049cd93da815693ae57b92ba4 +size 290 diff --git a/icons/pixelarticons/svg/drop-area.svg b/icons/pixelarticons/svg/drop-area.svg new file mode 100644 index 0000000..b1ba0cf --- /dev/null +++ b/icons/pixelarticons/svg/drop-area.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5311fea42e457d6b8b78e7abdf04c0800ad4e386f7297deb7a9ab7427e2c203b +size 344 diff --git a/icons/pixelarticons/svg/drop-full.svg b/icons/pixelarticons/svg/drop-full.svg new file mode 100644 index 0000000..7e02a50 --- /dev/null +++ b/icons/pixelarticons/svg/drop-full.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6af23c719c23d911559994c08a8727acf9136d6a226febaff733c21d0f92a2a1 +size 176 diff --git a/icons/pixelarticons/svg/drop-half.svg b/icons/pixelarticons/svg/drop-half.svg new file mode 100644 index 0000000..1cea83f --- /dev/null +++ b/icons/pixelarticons/svg/drop-half.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5fab87cbffae4c819a03b5549225f34c727fac6bcb2869385f58da8ef3729b6e +size 208 diff --git a/icons/pixelarticons/svg/drop.svg b/icons/pixelarticons/svg/drop.svg new file mode 100644 index 0000000..d2aaf22 --- /dev/null +++ b/icons/pixelarticons/svg/drop.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56d66faa1bcc3c36288382eee76148d265cfec49f2512683b1adc6169c6587be +size 218 diff --git a/icons/pixelarticons/svg/duplicate-alt.svg b/icons/pixelarticons/svg/duplicate-alt.svg new file mode 100644 index 0000000..64bedf5 --- /dev/null +++ b/icons/pixelarticons/svg/duplicate-alt.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c24d439fed48c7b4b42d447d2293bfd1ae77f9c6f688ddfa5797010333d331d +size 218 diff --git a/icons/pixelarticons/svg/duplicate.svg b/icons/pixelarticons/svg/duplicate.svg new file mode 100644 index 0000000..c4d58c4 --- /dev/null +++ b/icons/pixelarticons/svg/duplicate.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4963433433cbd8329d89789bb5dcea6a3cb68add832ec92293cb8556828e5c9f +size 179 diff --git a/icons/pixelarticons/svg/edit-box.svg b/icons/pixelarticons/svg/edit-box.svg new file mode 100644 index 0000000..57b7779 --- /dev/null +++ b/icons/pixelarticons/svg/edit-box.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d3a400be7c16e06706897dfb009040648f90655e1a554d732a10ad5aad541dd1 +size 295 diff --git a/icons/pixelarticons/svg/edit.svg b/icons/pixelarticons/svg/edit.svg new file mode 100644 index 0000000..9e215a4 --- /dev/null +++ b/icons/pixelarticons/svg/edit.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1796071c8f3df6bfc01495b2e8213512b0ccd1caeca5108620183d39022eb1ea +size 288 diff --git a/icons/pixelarticons/svg/euro.svg b/icons/pixelarticons/svg/euro.svg new file mode 100644 index 0000000..a3d75aa --- /dev/null +++ b/icons/pixelarticons/svg/euro.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c8bbd7b75a73a9e32e4614c91798d0c6e5db8170c32b43b9171f3eb0e0fd7e68 +size 177 diff --git a/icons/pixelarticons/svg/expand.svg b/icons/pixelarticons/svg/expand.svg new file mode 100644 index 0000000..eb45b1a --- /dev/null +++ b/icons/pixelarticons/svg/expand.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24fe6cc457ff545fda28e0dbd2366fb579b61837fb24431707a12d76fdb3f4cf +size 255 diff --git a/icons/pixelarticons/svg/external-link.svg b/icons/pixelarticons/svg/external-link.svg new file mode 100644 index 0000000..019657e --- /dev/null +++ b/icons/pixelarticons/svg/external-link.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ddbd26853b67c9d82a93cd5c020f4d8f00baa0d5c8bf012a3d294963f308c36e +size 208 diff --git a/icons/pixelarticons/svg/eye-closed.svg b/icons/pixelarticons/svg/eye-closed.svg new file mode 100644 index 0000000..30b3e81 --- /dev/null +++ b/icons/pixelarticons/svg/eye-closed.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec6a9641514e7750489ffaa625b52f71674ef5f0633f0d68439354493b1e1e2b +size 252 diff --git a/icons/pixelarticons/svg/eye.svg b/icons/pixelarticons/svg/eye.svg new file mode 100644 index 0000000..a14c360 --- /dev/null +++ b/icons/pixelarticons/svg/eye.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d33f5f99b68d6cf2c42fc75b63ff5571b783d75fd3e0a6a474839fb3066cad8f +size 307 diff --git a/icons/pixelarticons/svg/file-alt.svg b/icons/pixelarticons/svg/file-alt.svg new file mode 100644 index 0000000..6256162 --- /dev/null +++ b/icons/pixelarticons/svg/file-alt.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:125147e7f024c5714a16427dd631bcf300c9d3feb156b1a388045b68d736fc6a +size 226 diff --git a/icons/pixelarticons/svg/file-delete.svg b/icons/pixelarticons/svg/file-delete.svg new file mode 100644 index 0000000..a1fa107 --- /dev/null +++ b/icons/pixelarticons/svg/file-delete.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f59846059ab72607c85d2e99776efd25731111928e3ec1985ae934270e24841 +size 232 diff --git a/icons/pixelarticons/svg/file-flash.svg b/icons/pixelarticons/svg/file-flash.svg new file mode 100644 index 0000000..997541f --- /dev/null +++ b/icons/pixelarticons/svg/file-flash.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3712132d78587b73c7678a3d4ba920ef58792ebe4b2de87b06754fbdc3e97c6f +size 227 diff --git a/icons/pixelarticons/svg/file-minus.svg b/icons/pixelarticons/svg/file-minus.svg new file mode 100644 index 0000000..107af60 --- /dev/null +++ b/icons/pixelarticons/svg/file-minus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62c63ba7e15e459f6e0f3836a130f8b8003d73883cbb4071f580b45dad1766a4 +size 190 diff --git a/icons/pixelarticons/svg/file-multiple.svg b/icons/pixelarticons/svg/file-multiple.svg new file mode 100644 index 0000000..d3e2bc3 --- /dev/null +++ b/icons/pixelarticons/svg/file-multiple.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e9a7ae05d45376207fa0e2043a9a956dffc27085c0602f71da524208d8fc6c51 +size 194 diff --git a/icons/pixelarticons/svg/file-off.svg b/icons/pixelarticons/svg/file-off.svg new file mode 100644 index 0000000..7bed57e --- /dev/null +++ b/icons/pixelarticons/svg/file-off.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:35700fbb2bc6703a6700c3cd4df6780f5f01e1835ae73baa0153aa37a65940b3 +size 267 diff --git a/icons/pixelarticons/svg/file-plus.svg b/icons/pixelarticons/svg/file-plus.svg new file mode 100644 index 0000000..8d8f7bf --- /dev/null +++ b/icons/pixelarticons/svg/file-plus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bffd206b1f447a5f751210271b5b59be5ed389f4bf0c3cb7a2c2135c50489f2d +size 217 diff --git a/icons/pixelarticons/svg/file.svg b/icons/pixelarticons/svg/file.svg new file mode 100644 index 0000000..e596900 --- /dev/null +++ b/icons/pixelarticons/svg/file.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ae429ec640747bb79a4387dd3684ccd0918c783f000b7bbf6a18ea44de62380 +size 175 diff --git a/icons/pixelarticons/svg/fill-half.svg b/icons/pixelarticons/svg/fill-half.svg new file mode 100644 index 0000000..beaaebb --- /dev/null +++ b/icons/pixelarticons/svg/fill-half.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7926d60a9620da0154449283e873b08e3b0c02b0ca8a5afdcf3298a020c62924 +size 256 diff --git a/icons/pixelarticons/svg/fill.svg b/icons/pixelarticons/svg/fill.svg new file mode 100644 index 0000000..80b00f9 --- /dev/null +++ b/icons/pixelarticons/svg/fill.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e3bded9caed86e52c2d479918b3783362ced4f21c30084481a34e979aa41e3da +size 287 diff --git a/icons/pixelarticons/svg/flag.svg b/icons/pixelarticons/svg/flag.svg new file mode 100644 index 0000000..f9d250f --- /dev/null +++ b/icons/pixelarticons/svg/flag.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1ba18139d5ecc810625f0e9b077d51d436f7d6400e92944cad6fce385f09978 +size 170 diff --git a/icons/pixelarticons/svg/flatten.svg b/icons/pixelarticons/svg/flatten.svg new file mode 100644 index 0000000..8c8e64e --- /dev/null +++ b/icons/pixelarticons/svg/flatten.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd027984b440e1c240ac0820af20e5dff83c2dbc4cdd2576f5304d7dcf8244e9 +size 209 diff --git a/icons/pixelarticons/svg/flip-to-back.svg b/icons/pixelarticons/svg/flip-to-back.svg new file mode 100644 index 0000000..aa2892a --- /dev/null +++ b/icons/pixelarticons/svg/flip-to-back.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb90fecdd8a507914d8b6113bd0ffe1c80dd0087b22c1744701f1196e717457c +size 315 diff --git a/icons/pixelarticons/svg/flip-to-front.svg b/icons/pixelarticons/svg/flip-to-front.svg new file mode 100644 index 0000000..cbeb1bc --- /dev/null +++ b/icons/pixelarticons/svg/flip-to-front.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9c94337e58213a76f21596dbc77b4693b20a6caa3be11d510ff13777a43261b +size 251 diff --git a/icons/pixelarticons/svg/float-center.svg b/icons/pixelarticons/svg/float-center.svg new file mode 100644 index 0000000..8c3cec9 --- /dev/null +++ b/icons/pixelarticons/svg/float-center.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5deef9a890161aef1786fa0846df6fd42efce907cea31b4aebda18c51e0c990 +size 237 diff --git a/icons/pixelarticons/svg/float-left.svg b/icons/pixelarticons/svg/float-left.svg new file mode 100644 index 0000000..addd5e1 --- /dev/null +++ b/icons/pixelarticons/svg/float-left.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d41708a2e325695ae9fbbe45c8f4f49c1d9dd77a8c32622d6c6fb7a764e0d9b +size 207 diff --git a/icons/pixelarticons/svg/float-right.svg b/icons/pixelarticons/svg/float-right.svg new file mode 100644 index 0000000..090b0fa --- /dev/null +++ b/icons/pixelarticons/svg/float-right.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:478ad8a71bfcdefce026616b8ca32461b6280618941cb11c361d0c781d521dcf +size 209 diff --git a/icons/pixelarticons/svg/folder-minus.svg b/icons/pixelarticons/svg/folder-minus.svg new file mode 100644 index 0000000..1be135f --- /dev/null +++ b/icons/pixelarticons/svg/folder-minus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c28cd8e1cc8f113bedac1309539715baea8034bb688418e123bbb6427fb8eba7 +size 173 diff --git a/icons/pixelarticons/svg/folder-plus.svg b/icons/pixelarticons/svg/folder-plus.svg new file mode 100644 index 0000000..0a75708 --- /dev/null +++ b/icons/pixelarticons/svg/folder-plus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ce9654b9ea3014473cb7e1081811899cd95da11c7c24964866fa422c51bff797 +size 195 diff --git a/icons/pixelarticons/svg/folder-x.svg b/icons/pixelarticons/svg/folder-x.svg new file mode 100644 index 0000000..6446cc5 --- /dev/null +++ b/icons/pixelarticons/svg/folder-x.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8ca29d74766a480ad05db8856378c8cf0af46c5291efb16884e502d16a95b7e +size 218 diff --git a/icons/pixelarticons/svg/folder.svg b/icons/pixelarticons/svg/folder.svg new file mode 100644 index 0000000..4f3998f --- /dev/null +++ b/icons/pixelarticons/svg/folder.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c687eac92c9673aa62ac6c9c5ba13b7cde1627a4eab84a6680c777257f79f113 +size 159 diff --git a/icons/pixelarticons/svg/forward.svg b/icons/pixelarticons/svg/forward.svg new file mode 100644 index 0000000..0fafc7c --- /dev/null +++ b/icons/pixelarticons/svg/forward.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:418570ddee721db039cf61d287f868f9b9d0c3e8a998bf9060527d51be131920 +size 180 diff --git a/icons/pixelarticons/svg/forwardburger.svg b/icons/pixelarticons/svg/forwardburger.svg new file mode 100644 index 0000000..c56e594 --- /dev/null +++ b/icons/pixelarticons/svg/forwardburger.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a79e60dc7d1f07a3aae3ae4e125e24f6dcb1fa585ec43fac946e94df4f2b581a +size 201 diff --git a/icons/pixelarticons/svg/frame-add.svg b/icons/pixelarticons/svg/frame-add.svg new file mode 100644 index 0000000..321c965 --- /dev/null +++ b/icons/pixelarticons/svg/frame-add.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d4fc80d9ef5cf3ca96d496bc55c8af0ed73b82c54feb2320116740f3fa4df8b2 +size 183 diff --git a/icons/pixelarticons/svg/frame-check.svg b/icons/pixelarticons/svg/frame-check.svg new file mode 100644 index 0000000..6729e6f --- /dev/null +++ b/icons/pixelarticons/svg/frame-check.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a7ec70f3bc93036dedb3beecd4d2ad0dc3a22bc453f8e70a76eaa9c323b7ca30 +size 194 diff --git a/icons/pixelarticons/svg/frame-delete.svg b/icons/pixelarticons/svg/frame-delete.svg new file mode 100644 index 0000000..6f58766 --- /dev/null +++ b/icons/pixelarticons/svg/frame-delete.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d420b0b17bea18ee8054bf27d779bc4e1dc4afea945915d8c63f4a9b5f7ca000 +size 213 diff --git a/icons/pixelarticons/svg/frame-minus.svg b/icons/pixelarticons/svg/frame-minus.svg new file mode 100644 index 0000000..097c116 --- /dev/null +++ b/icons/pixelarticons/svg/frame-minus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:860166c3e8a1554b7c6df8c1d14ec49481eb4c4d7044908025f3c9d5cdd11896 +size 164 diff --git a/icons/pixelarticons/svg/frame.svg b/icons/pixelarticons/svg/frame.svg new file mode 100644 index 0000000..88a8fa3 --- /dev/null +++ b/icons/pixelarticons/svg/frame.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0aab0d1a24002defb51a39f34f5043181cdfdcb5d32b676202aefa27f1a66bbc +size 149 diff --git a/icons/pixelarticons/svg/gamepad.svg b/icons/pixelarticons/svg/gamepad.svg new file mode 100644 index 0000000..0c36e3d --- /dev/null +++ b/icons/pixelarticons/svg/gamepad.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d5b3cd9c79c848ffc21956fa3c69b9a74739c3f404c6a5ed64873355bdb29295 +size 210 diff --git a/icons/pixelarticons/svg/gif.svg b/icons/pixelarticons/svg/gif.svg new file mode 100644 index 0000000..3f5ba86 --- /dev/null +++ b/icons/pixelarticons/svg/gif.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efd3d31e6881b9e590e27b1d72ff90d04a5bebc07dbda451ac7e34d67c8b1426 +size 197 diff --git a/icons/pixelarticons/svg/gift.svg b/icons/pixelarticons/svg/gift.svg new file mode 100644 index 0000000..3535e09 --- /dev/null +++ b/icons/pixelarticons/svg/gift.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8019999280bec269ea70dd8b81fd1a877072a261f3adb4c25e3efa879012873c +size 212 diff --git a/icons/pixelarticons/svg/git-branch.svg b/icons/pixelarticons/svg/git-branch.svg new file mode 100644 index 0000000..28de1d8 --- /dev/null +++ b/icons/pixelarticons/svg/git-branch.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d15f019a76592a2a291ca867239b5df849433cf96e16e59584de88f1b5405f4 +size 197 diff --git a/icons/pixelarticons/svg/git-commit.svg b/icons/pixelarticons/svg/git-commit.svg new file mode 100644 index 0000000..cabbda5 --- /dev/null +++ b/icons/pixelarticons/svg/git-commit.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6e7c3293a81915c21e8d9c98c38f09ab15a967147b332a532f86a409b43feb2 +size 163 diff --git a/icons/pixelarticons/svg/git-merge.svg b/icons/pixelarticons/svg/git-merge.svg new file mode 100644 index 0000000..e7ad1cd --- /dev/null +++ b/icons/pixelarticons/svg/git-merge.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d847637da4c1b70be3460e7eb4355a2537a7e7822283b82dfb382dd46e65f661 +size 201 diff --git a/icons/pixelarticons/svg/git-pull-request.svg b/icons/pixelarticons/svg/git-pull-request.svg new file mode 100644 index 0000000..0d3191c --- /dev/null +++ b/icons/pixelarticons/svg/git-pull-request.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6cfaa60ab05aac0b2693e56c93593169e0df70f980bda0b828a4490b8984992c +size 204 diff --git a/icons/pixelarticons/svg/github-2.svg b/icons/pixelarticons/svg/github-2.svg new file mode 100644 index 0000000..bdcf071 --- /dev/null +++ b/icons/pixelarticons/svg/github-2.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f37b285f70b0e3dcf69c172ae0b5475f093f0b51c7ebe2cf1e298bb419cf88f2 +size 333 diff --git a/icons/pixelarticons/svg/github.svg b/icons/pixelarticons/svg/github.svg new file mode 100644 index 0000000..2956747 --- /dev/null +++ b/icons/pixelarticons/svg/github.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d353bce007e923e6061e0df25ddb65aa5d30eb6d79a8f95f85b63a48d21b27d7 +size 312 diff --git a/icons/pixelarticons/svg/gps.svg b/icons/pixelarticons/svg/gps.svg new file mode 100644 index 0000000..329ab5f --- /dev/null +++ b/icons/pixelarticons/svg/gps.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca9a6c77353de263348a3cc9798caf580123c81a62875dc0f4bb7b8a2cbc4d7a +size 197 diff --git a/icons/pixelarticons/svg/grid.svg b/icons/pixelarticons/svg/grid.svg new file mode 100644 index 0000000..d8efc19 --- /dev/null +++ b/icons/pixelarticons/svg/grid.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f1a63b69cfb7f2bda32980603dd5efa1821f658eb249f497d5cda7fa245f71a +size 264 diff --git a/icons/pixelarticons/svg/group.svg b/icons/pixelarticons/svg/group.svg new file mode 100644 index 0000000..6c40f1a --- /dev/null +++ b/icons/pixelarticons/svg/group.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ca4283dc1f9b23a91955173df2d686066a1fc526775a67961ac9a373cd629f0 +size 204 diff --git a/icons/pixelarticons/svg/hd.svg b/icons/pixelarticons/svg/hd.svg new file mode 100644 index 0000000..86a2585 --- /dev/null +++ b/icons/pixelarticons/svg/hd.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:406ea97bc5ecfd475de762d07eb944d2ffc5ff66d5dfd543135d3c2f2ea4d870 +size 189 diff --git a/icons/pixelarticons/svg/headphone.svg b/icons/pixelarticons/svg/headphone.svg new file mode 100644 index 0000000..f1c8b1d --- /dev/null +++ b/icons/pixelarticons/svg/headphone.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e6348231e2ab1e68a0b983e19d6f0b5a0292480cec517de522d9638b42629e0 +size 192 diff --git a/icons/pixelarticons/svg/headset.svg b/icons/pixelarticons/svg/headset.svg new file mode 100644 index 0000000..0b03032 --- /dev/null +++ b/icons/pixelarticons/svg/headset.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:38881aeb35fb2785928b0053420b01d4a6285e75af3c5add022229c8bd347491 +size 206 diff --git a/icons/pixelarticons/svg/heart.svg b/icons/pixelarticons/svg/heart.svg new file mode 100644 index 0000000..fc1230f --- /dev/null +++ b/icons/pixelarticons/svg/heart.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb6f390133364ee4c971b83f085bcf13972d9aa5c3556e134c03c09a27d5cd49 +size 290 diff --git a/icons/pixelarticons/svg/hidden.svg b/icons/pixelarticons/svg/hidden.svg new file mode 100644 index 0000000..e1ad698 --- /dev/null +++ b/icons/pixelarticons/svg/hidden.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:44b61db0b27ab2fff6ad3b5e38a967f28cea5bb060c56b9e88ae8888c392baeb +size 354 diff --git a/icons/pixelarticons/svg/home.svg b/icons/pixelarticons/svg/home.svg new file mode 100644 index 0000000..6b350bb --- /dev/null +++ b/icons/pixelarticons/svg/home.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b3c8785ca299225c8ead5b238e0e5ddfb630a9f8d03c1ca51748f75a6d0f9727 +size 246 diff --git a/icons/pixelarticons/svg/hourglass.svg b/icons/pixelarticons/svg/hourglass.svg new file mode 100644 index 0000000..69dbb05 --- /dev/null +++ b/icons/pixelarticons/svg/hourglass.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1061b4ab7087f4ee519b0ffc3d065a83955f1ff3ce9f3ab8b1149dc8aef80bd7 +size 217 diff --git a/icons/pixelarticons/svg/hq.svg b/icons/pixelarticons/svg/hq.svg new file mode 100644 index 0000000..9b561fa --- /dev/null +++ b/icons/pixelarticons/svg/hq.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3d1a8cc67eb98e0ece9f7fa509ee625e0842592e4f7781d8dbadd3c92cb5f6f +size 197 diff --git a/icons/pixelarticons/svg/human-handsdown.svg b/icons/pixelarticons/svg/human-handsdown.svg new file mode 100644 index 0000000..1192ead --- /dev/null +++ b/icons/pixelarticons/svg/human-handsdown.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de60f54bb91b4205b77865aeb34d6d9fb87ea91a83c22d912321f5d924d1afd8 +size 225 diff --git a/icons/pixelarticons/svg/human-handsup.svg b/icons/pixelarticons/svg/human-handsup.svg new file mode 100644 index 0000000..09cbf57 --- /dev/null +++ b/icons/pixelarticons/svg/human-handsup.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6b8c6ca845cc032d4bb28538fc101f2a55f10c2822f46d8a3ce60d77b3f29eb9 +size 222 diff --git a/icons/pixelarticons/svg/human-height-alt.svg b/icons/pixelarticons/svg/human-height-alt.svg new file mode 100644 index 0000000..7c2ed5b --- /dev/null +++ b/icons/pixelarticons/svg/human-height-alt.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f061bdc263f5c635c6b1bb32de547d71be90a192eefef17ca97721503bfb0480 +size 254 diff --git a/icons/pixelarticons/svg/human-height.svg b/icons/pixelarticons/svg/human-height.svg new file mode 100644 index 0000000..6456dc2 --- /dev/null +++ b/icons/pixelarticons/svg/human-height.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cfd18c2de88f6256162ff659badb9922a34510ceab7c84d8b4f2d9e5d1c0a3f3 +size 239 diff --git a/icons/pixelarticons/svg/human-run.svg b/icons/pixelarticons/svg/human-run.svg new file mode 100644 index 0000000..fb0d7c6 --- /dev/null +++ b/icons/pixelarticons/svg/human-run.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a59f6ecf48770d7e1d2136c867d4d9664e51970e1296e18605005f3a182d50d +size 261 diff --git a/icons/pixelarticons/svg/human.svg b/icons/pixelarticons/svg/human.svg new file mode 100644 index 0000000..12278d3 --- /dev/null +++ b/icons/pixelarticons/svg/human.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4df0f5da5927d90712591fe8f82f1d3ecc02c1cbacc722cbf0c856eccee7748e +size 167 diff --git a/icons/pixelarticons/svg/image-arrow-right.svg b/icons/pixelarticons/svg/image-arrow-right.svg new file mode 100644 index 0000000..a12bc33 --- /dev/null +++ b/icons/pixelarticons/svg/image-arrow-right.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:02884505a5690536a44a64f05b6238eea1ef9dedef8566813e0fd7e22dfb78c1 +size 300 diff --git a/icons/pixelarticons/svg/image-broken.svg b/icons/pixelarticons/svg/image-broken.svg new file mode 100644 index 0000000..2866ed5 --- /dev/null +++ b/icons/pixelarticons/svg/image-broken.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80c1df13a806092444f1e4f631e4a221ad0707d8ac0aca163f5d13f4ff085b4b +size 282 diff --git a/icons/pixelarticons/svg/image-delete.svg b/icons/pixelarticons/svg/image-delete.svg new file mode 100644 index 0000000..7b29dbb --- /dev/null +++ b/icons/pixelarticons/svg/image-delete.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef6e1485a8603dac9ef6cff3841d20d728ca641b546805e4b238f4123a857bac +size 307 diff --git a/icons/pixelarticons/svg/image-flash.svg b/icons/pixelarticons/svg/image-flash.svg new file mode 100644 index 0000000..596bdd8 --- /dev/null +++ b/icons/pixelarticons/svg/image-flash.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0da28c882b0b495ab8d31ee707882f86ae138cccdcb38281591aa9494863a6ff +size 265 diff --git a/icons/pixelarticons/svg/image-frame.svg b/icons/pixelarticons/svg/image-frame.svg new file mode 100644 index 0000000..dc4203a --- /dev/null +++ b/icons/pixelarticons/svg/image-frame.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3140a18fedabbfc30a3470434cc9c7dbc1dc52b3cb2f300b3cd5680ffcf2f031 +size 277 diff --git a/icons/pixelarticons/svg/image-gallery.svg b/icons/pixelarticons/svg/image-gallery.svg new file mode 100644 index 0000000..0086253 --- /dev/null +++ b/icons/pixelarticons/svg/image-gallery.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:25536ddb2dd47bb3cc92151250f372a699cb09ca1191fc55033ff49f92204954 +size 287 diff --git a/icons/pixelarticons/svg/image-multiple.svg b/icons/pixelarticons/svg/image-multiple.svg new file mode 100644 index 0000000..8470d68 --- /dev/null +++ b/icons/pixelarticons/svg/image-multiple.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d3f97253137975ba4623d0276b1bdf6649d3e6cbb2413d39160f6d8340b409ec +size 271 diff --git a/icons/pixelarticons/svg/image-new.svg b/icons/pixelarticons/svg/image-new.svg new file mode 100644 index 0000000..7c6c1db --- /dev/null +++ b/icons/pixelarticons/svg/image-new.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:413247b35c1b6119e031b366e590d2b5cdae0af3428dc30cf11290b397a13fdb +size 257 diff --git a/icons/pixelarticons/svg/image-plus.svg b/icons/pixelarticons/svg/image-plus.svg new file mode 100644 index 0000000..1486e83 --- /dev/null +++ b/icons/pixelarticons/svg/image-plus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8bf9af2b8d8b780750fb6e79a5c0c660b352c4fdc2a30a0147c0393becc4bad +size 258 diff --git a/icons/pixelarticons/svg/image.svg b/icons/pixelarticons/svg/image.svg new file mode 100644 index 0000000..10b67dc --- /dev/null +++ b/icons/pixelarticons/svg/image.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f30d2669c9aac997a187778fc31d8e53ef8c81d11db10b97a2545cca8f93e70 +size 226 diff --git a/icons/pixelarticons/svg/inbox-all.svg b/icons/pixelarticons/svg/inbox-all.svg new file mode 100644 index 0000000..54b1f9a --- /dev/null +++ b/icons/pixelarticons/svg/inbox-all.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ebf4211e0a003d1e43064a1b2a30b27977ab529924b1ae1091d4a486e143e852 +size 204 diff --git a/icons/pixelarticons/svg/inbox-full.svg b/icons/pixelarticons/svg/inbox-full.svg new file mode 100644 index 0000000..ce6522b --- /dev/null +++ b/icons/pixelarticons/svg/inbox-full.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5f50ac00c0d9c817c8ba757ddbd90cf58ef1cd60797613bb56404c10b4668e1d +size 211 diff --git a/icons/pixelarticons/svg/inbox.svg b/icons/pixelarticons/svg/inbox.svg new file mode 100644 index 0000000..00a6028 --- /dev/null +++ b/icons/pixelarticons/svg/inbox.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cbebfdec78dc578ca5be2f38caa3145c1de7974f4bc1bb1f9ee09f711dc9757d +size 182 diff --git a/icons/pixelarticons/svg/info-box.svg b/icons/pixelarticons/svg/info-box.svg new file mode 100644 index 0000000..434bb7a --- /dev/null +++ b/icons/pixelarticons/svg/info-box.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efd42ed210aef657a39621d840f32721db23d8511d035d879dbb36420089fc28 +size 189 diff --git a/icons/pixelarticons/svg/invert.svg b/icons/pixelarticons/svg/invert.svg new file mode 100644 index 0000000..8544789 --- /dev/null +++ b/icons/pixelarticons/svg/invert.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:20226ae4dc1fcb3ee76eaf17e64c7599b5f4231eb473be43d0234b37230ff96c +size 171 diff --git a/icons/pixelarticons/svg/iso.svg b/icons/pixelarticons/svg/iso.svg new file mode 100644 index 0000000..dc3f7e1 --- /dev/null +++ b/icons/pixelarticons/svg/iso.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba8fd75c2c7e78920acf495160aaa559c27ca2f2fb16998520f01f0aed5dee60 +size 233 diff --git a/icons/pixelarticons/svg/kanban.svg b/icons/pixelarticons/svg/kanban.svg new file mode 100644 index 0000000..54579aa --- /dev/null +++ b/icons/pixelarticons/svg/kanban.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d19616e80cd541c24b9bf711ec4d51af21aa22f4cadaf28451f08715fb44762 +size 191 diff --git a/icons/pixelarticons/svg/keyboard.svg b/icons/pixelarticons/svg/keyboard.svg new file mode 100644 index 0000000..dfa3a57 --- /dev/null +++ b/icons/pixelarticons/svg/keyboard.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04c69d966cc8181f32c9a489c34c4693413f1f88f28966fbe608ad709b36642d +size 254 diff --git a/icons/pixelarticons/svg/label-alt-multiple.svg b/icons/pixelarticons/svg/label-alt-multiple.svg new file mode 100644 index 0000000..abb4552 --- /dev/null +++ b/icons/pixelarticons/svg/label-alt-multiple.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c89a506099c831a4910eb8b63289452c962d0cf99b9862634115e5d471226cc3 +size 198 diff --git a/icons/pixelarticons/svg/label-alt.svg b/icons/pixelarticons/svg/label-alt.svg new file mode 100644 index 0000000..fe0b9be --- /dev/null +++ b/icons/pixelarticons/svg/label-alt.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:22f980c547300e422a6cbe249f18e337ca5420d1589467781bc4883edf9198bf +size 196 diff --git a/icons/pixelarticons/svg/label-sharp.svg b/icons/pixelarticons/svg/label-sharp.svg new file mode 100644 index 0000000..42b0d35 --- /dev/null +++ b/icons/pixelarticons/svg/label-sharp.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab9ab750e8108089436f7e79edca5ea1ecc6b3734232ad64c068c49cd17eddb5 +size 230 diff --git a/icons/pixelarticons/svg/label.svg b/icons/pixelarticons/svg/label.svg new file mode 100644 index 0000000..0636b90 --- /dev/null +++ b/icons/pixelarticons/svg/label.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0729ed9f0c88cbd2e0d002949931b0a3353e0c391d4ed4b378a3111d81e188e7 +size 278 diff --git a/icons/pixelarticons/svg/layout-align-bottom.svg b/icons/pixelarticons/svg/layout-align-bottom.svg new file mode 100644 index 0000000..d0804ed --- /dev/null +++ b/icons/pixelarticons/svg/layout-align-bottom.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a232c3b3e5480c2b89a27fb319f9ee83b6226ae82136e0164a8f1a2a2163a36 +size 164 diff --git a/icons/pixelarticons/svg/layout-align-left.svg b/icons/pixelarticons/svg/layout-align-left.svg new file mode 100644 index 0000000..4d58927 --- /dev/null +++ b/icons/pixelarticons/svg/layout-align-left.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b20f58ce2fe60c70b75a3f81dcc1753912cc96ffd38d39fab86940c48f509f1c +size 165 diff --git a/icons/pixelarticons/svg/layout-align-right.svg b/icons/pixelarticons/svg/layout-align-right.svg new file mode 100644 index 0000000..9faaffb --- /dev/null +++ b/icons/pixelarticons/svg/layout-align-right.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e552ec72acd81bff6c66a0ed9faac198df9a04e495679e5f442951ae7c6bfed9 +size 162 diff --git a/icons/pixelarticons/svg/layout-align-top.svg b/icons/pixelarticons/svg/layout-align-top.svg new file mode 100644 index 0000000..7410d79 --- /dev/null +++ b/icons/pixelarticons/svg/layout-align-top.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6507b8c6599c401ed575b9b5eaab9392324cf05da3413bf95525b8c15bee9935 +size 165 diff --git a/icons/pixelarticons/svg/layout-columns.svg b/icons/pixelarticons/svg/layout-columns.svg new file mode 100644 index 0000000..a2a4835 --- /dev/null +++ b/icons/pixelarticons/svg/layout-columns.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f562fdcfd9c473cf54100ddba68504765684942fbc6d459b16edfde95e5333e6 +size 161 diff --git a/icons/pixelarticons/svg/layout-distribute-horizontal.svg b/icons/pixelarticons/svg/layout-distribute-horizontal.svg new file mode 100644 index 0000000..c2ae5c5 --- /dev/null +++ b/icons/pixelarticons/svg/layout-distribute-horizontal.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60ae6bfaca5db2b6c8f40e96fa66e32b1f6c4eabf02b709f21b2e2b32bb45fe1 +size 178 diff --git a/icons/pixelarticons/svg/layout-distribute-vertical.svg b/icons/pixelarticons/svg/layout-distribute-vertical.svg new file mode 100644 index 0000000..7948955 --- /dev/null +++ b/icons/pixelarticons/svg/layout-distribute-vertical.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01e8c3dcd51bf2b243733d93c5f9ec83fcb1c7c53687ed1bd13682d419f20a5c +size 187 diff --git a/icons/pixelarticons/svg/layout-footer.svg b/icons/pixelarticons/svg/layout-footer.svg new file mode 100644 index 0000000..af4e3be --- /dev/null +++ b/icons/pixelarticons/svg/layout-footer.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:83d36441a97a332e3ea9d90189bab5fb7d181883831d9e940d9c84e671dcb7e8 +size 162 diff --git a/icons/pixelarticons/svg/layout-header.svg b/icons/pixelarticons/svg/layout-header.svg new file mode 100644 index 0000000..8160189 --- /dev/null +++ b/icons/pixelarticons/svg/layout-header.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d8de53cd29149104d511045799f2cfc32fa51057bac3999c820a7bd651bef5a +size 163 diff --git a/icons/pixelarticons/svg/layout-rows.svg b/icons/pixelarticons/svg/layout-rows.svg new file mode 100644 index 0000000..27f557a --- /dev/null +++ b/icons/pixelarticons/svg/layout-rows.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d0be49a80420f3c9764a78fff1a7d241fc81119a1fbb7aeefc79b073d9004ea +size 162 diff --git a/icons/pixelarticons/svg/layout-sidebar-left.svg b/icons/pixelarticons/svg/layout-sidebar-left.svg new file mode 100644 index 0000000..26d8088 --- /dev/null +++ b/icons/pixelarticons/svg/layout-sidebar-left.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f28b9acf4d220d9f6fb3244ff1044ae28d7dd056258fd60deaa31c224e04242 +size 161 diff --git a/icons/pixelarticons/svg/layout-sidebar-right.svg b/icons/pixelarticons/svg/layout-sidebar-right.svg new file mode 100644 index 0000000..2fd5a65 --- /dev/null +++ b/icons/pixelarticons/svg/layout-sidebar-right.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e03886042207ba46428f73ad475b0297d6ada322a5a7cb87b6f594538d2efd5c +size 165 diff --git a/icons/pixelarticons/svg/layout.svg b/icons/pixelarticons/svg/layout.svg new file mode 100644 index 0000000..18d7b17 --- /dev/null +++ b/icons/pixelarticons/svg/layout.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d01581281c7fa556bf38e847fb6335f299fb347350affb775f132c991e70a740 +size 178 diff --git a/icons/pixelarticons/svg/lightbulb-2.svg b/icons/pixelarticons/svg/lightbulb-2.svg new file mode 100644 index 0000000..8cab54b --- /dev/null +++ b/icons/pixelarticons/svg/lightbulb-2.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5974d9eddf2b5dbf111ec4d9b358c5e686c78224d632ea15cf89c47ab63198ae +size 284 diff --git a/icons/pixelarticons/svg/lightbulb-on.svg b/icons/pixelarticons/svg/lightbulb-on.svg new file mode 100644 index 0000000..582e037 --- /dev/null +++ b/icons/pixelarticons/svg/lightbulb-on.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66e83ef42e779635ca616ee2b2364704db77e997c1b5f8c70b868eab9bb9352d +size 277 diff --git a/icons/pixelarticons/svg/lightbulb.svg b/icons/pixelarticons/svg/lightbulb.svg new file mode 100644 index 0000000..d55054d --- /dev/null +++ b/icons/pixelarticons/svg/lightbulb.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f9075f119688890a535af0b703bcc56f72c7e972881511d38e31b32de47f7aa +size 239 diff --git a/icons/pixelarticons/svg/link.svg b/icons/pixelarticons/svg/link.svg new file mode 100644 index 0000000..22405cc --- /dev/null +++ b/icons/pixelarticons/svg/link.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:583079d09585f344b72761b695eda59a72e8005cec3b0f018de24257a90c2642 +size 183 diff --git a/icons/pixelarticons/svg/list-box.svg b/icons/pixelarticons/svg/list-box.svg new file mode 100644 index 0000000..397cdcc --- /dev/null +++ b/icons/pixelarticons/svg/list-box.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24dcea69542d86faa73ca2234db24450036461bbd2c19e4fc83f4544083c802b +size 236 diff --git a/icons/pixelarticons/svg/list.svg b/icons/pixelarticons/svg/list.svg new file mode 100644 index 0000000..20edd98 --- /dev/null +++ b/icons/pixelarticons/svg/list.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d80905b5432f814840b65351910a0c21e0de9784ac0ded8ab06d564250e7fb50 +size 207 diff --git a/icons/pixelarticons/svg/loader.svg b/icons/pixelarticons/svg/loader.svg new file mode 100644 index 0000000..c52a954 --- /dev/null +++ b/icons/pixelarticons/svg/loader.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:30ac040617ddc25cbc509a3768aab66a99d63cbefe441b47177b5af9a1512b2d +size 283 diff --git a/icons/pixelarticons/svg/lock-open.svg b/icons/pixelarticons/svg/lock-open.svg new file mode 100644 index 0000000..741c5bd --- /dev/null +++ b/icons/pixelarticons/svg/lock-open.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:626adeb1ea05606b91ba47147b2fdc0241fdfdbdc2740ef4174441a8dc8617ed +size 192 diff --git a/icons/pixelarticons/svg/lock.svg b/icons/pixelarticons/svg/lock.svg new file mode 100644 index 0000000..955cdaf --- /dev/null +++ b/icons/pixelarticons/svg/lock.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24fe68bfef7ec1064a7253ca4d6bacdf7e153380ef8923ba0314df8e656c22be +size 197 diff --git a/icons/pixelarticons/svg/login.svg b/icons/pixelarticons/svg/login.svg new file mode 100644 index 0000000..a079bc1 --- /dev/null +++ b/icons/pixelarticons/svg/login.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d68ba7f585647233c25cff4e0d60ac9c0c3317ac3d6a1e8e48704b59703bbb80 +size 206 diff --git a/icons/pixelarticons/svg/logout.svg b/icons/pixelarticons/svg/logout.svg new file mode 100644 index 0000000..ad1c709 --- /dev/null +++ b/icons/pixelarticons/svg/logout.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea9945f51687e0bf60ffcedb26a7c870961ff4b3f6b5c50b1e717b96044452fa +size 207 diff --git a/icons/pixelarticons/svg/luggage.svg b/icons/pixelarticons/svg/luggage.svg new file mode 100644 index 0000000..edc3e96 --- /dev/null +++ b/icons/pixelarticons/svg/luggage.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f69e7b6e7de1c9dc41c6aaa72078a56466438718e99f37953aede05b5265eb66 +size 218 diff --git a/icons/pixelarticons/svg/mail-arrow-right.svg b/icons/pixelarticons/svg/mail-arrow-right.svg new file mode 100644 index 0000000..c0cf1dd --- /dev/null +++ b/icons/pixelarticons/svg/mail-arrow-right.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26f9d8aad57d5b14ddde488bfe7372448780f82c54e5d3eacc36a69bd2aeda14 +size 276 diff --git a/icons/pixelarticons/svg/mail-check.svg b/icons/pixelarticons/svg/mail-check.svg new file mode 100644 index 0000000..e4154ef --- /dev/null +++ b/icons/pixelarticons/svg/mail-check.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76226977c1c9299811d679acf24207f6085fda5883739d73762d4102594b8154 +size 260 diff --git a/icons/pixelarticons/svg/mail-delete.svg b/icons/pixelarticons/svg/mail-delete.svg new file mode 100644 index 0000000..edeb1c1 --- /dev/null +++ b/icons/pixelarticons/svg/mail-delete.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:211f88cf65157bcf8766688f51fe291b95e7d00e96e2b4703f8cd47651107d4d +size 276 diff --git a/icons/pixelarticons/svg/mail-flash.svg b/icons/pixelarticons/svg/mail-flash.svg new file mode 100644 index 0000000..657e407 --- /dev/null +++ b/icons/pixelarticons/svg/mail-flash.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:52a6a67c4c849b1fe3514be476b8077d7b8844342ce03e131d7b85274c09a9e6 +size 244 diff --git a/icons/pixelarticons/svg/mail-multiple.svg b/icons/pixelarticons/svg/mail-multiple.svg new file mode 100644 index 0000000..7b1bf38 --- /dev/null +++ b/icons/pixelarticons/svg/mail-multiple.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b10147367b61271f8213804f948f3bf092d0c01f63a0924b4a5f9434ae7edd18 +size 219 diff --git a/icons/pixelarticons/svg/mail-off.svg b/icons/pixelarticons/svg/mail-off.svg new file mode 100644 index 0000000..994ed78 --- /dev/null +++ b/icons/pixelarticons/svg/mail-off.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:679f552d07a4fc3288f247a54b3c65937d9d48b23fc760e1ed4af67fa507c91b +size 298 diff --git a/icons/pixelarticons/svg/mail-unread.svg b/icons/pixelarticons/svg/mail-unread.svg new file mode 100644 index 0000000..1ba3650 --- /dev/null +++ b/icons/pixelarticons/svg/mail-unread.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eec17da922f587e1b4feb4921d3caefae4549d49d16a7ce9f8876f66a204de81 +size 206 diff --git a/icons/pixelarticons/svg/mail.svg b/icons/pixelarticons/svg/mail.svg new file mode 100644 index 0000000..741ff6d --- /dev/null +++ b/icons/pixelarticons/svg/mail.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6b22bf32308394cc6da7b6609849d633a0a97c3f8f6aca7010773fd62faa65fd +size 200 diff --git a/icons/pixelarticons/svg/map.svg b/icons/pixelarticons/svg/map.svg new file mode 100644 index 0000000..41a3817 --- /dev/null +++ b/icons/pixelarticons/svg/map.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e8de42e2ce34af5e2d01433af27c50c4ea8322dec69d1523965f25258c0424f +size 306 diff --git a/icons/pixelarticons/svg/mastodon.svg b/icons/pixelarticons/svg/mastodon.svg new file mode 100644 index 0000000..1bd7d4b --- /dev/null +++ b/icons/pixelarticons/svg/mastodon.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48e23c291c4ab6e804ab2b629f4d46d5432ac2fbc7581bfde719931c2f00d4bb +size 316 diff --git a/icons/pixelarticons/svg/membercard.svg b/icons/pixelarticons/svg/membercard.svg new file mode 100644 index 0000000..c04845a --- /dev/null +++ b/icons/pixelarticons/svg/membercard.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:02c11180fe878b69bc1e7e35283812f14b283bfbb8b9e5063200467dea6703e6 +size 183 diff --git a/icons/pixelarticons/svg/menu.svg b/icons/pixelarticons/svg/menu.svg new file mode 100644 index 0000000..c000f6d --- /dev/null +++ b/icons/pixelarticons/svg/menu.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e254d0c56c7696896ec2726a144711724e00eefba3c5b071097776aff198fb2 +size 162 diff --git a/icons/pixelarticons/svg/message-arrow-left.svg b/icons/pixelarticons/svg/message-arrow-left.svg new file mode 100644 index 0000000..e36026c --- /dev/null +++ b/icons/pixelarticons/svg/message-arrow-left.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:433114795a668ca43e8387b6cad4fd7b941e9dada41599c0ed137f41bfe0a736 +size 224 diff --git a/icons/pixelarticons/svg/message-arrow-right.svg b/icons/pixelarticons/svg/message-arrow-right.svg new file mode 100644 index 0000000..967ee36 --- /dev/null +++ b/icons/pixelarticons/svg/message-arrow-right.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1c773bd974da3ddb554aa7c786d2499522e8ba0c5ee016cf10174502ce7477e +size 224 diff --git a/icons/pixelarticons/svg/message-bookmark.svg b/icons/pixelarticons/svg/message-bookmark.svg new file mode 100644 index 0000000..e2562f8 --- /dev/null +++ b/icons/pixelarticons/svg/message-bookmark.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:57c2e3f64120688ca3eca696194c0d1d61a8c28a300114333cc5d2a2248e24ef +size 182 diff --git a/icons/pixelarticons/svg/message-clock.svg b/icons/pixelarticons/svg/message-clock.svg new file mode 100644 index 0000000..9882594 --- /dev/null +++ b/icons/pixelarticons/svg/message-clock.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b039aa0ed63264013d6d0abb5b163b498393aba28d8a981b47fdfc67add6cd86 +size 237 diff --git a/icons/pixelarticons/svg/message-delete.svg b/icons/pixelarticons/svg/message-delete.svg new file mode 100644 index 0000000..7cc1b0c --- /dev/null +++ b/icons/pixelarticons/svg/message-delete.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43195439bc4346ada0fd9dc19a22b16b8d97738a9607da35599a99a502a3db11 +size 213 diff --git a/icons/pixelarticons/svg/message-flash.svg b/icons/pixelarticons/svg/message-flash.svg new file mode 100644 index 0000000..6fc5494 --- /dev/null +++ b/icons/pixelarticons/svg/message-flash.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86c9e0f21fbf0d91ba72f8ea6eff693e1bccfa2198a2cf9b3b7b49cce4e3c1b9 +size 215 diff --git a/icons/pixelarticons/svg/message-image.svg b/icons/pixelarticons/svg/message-image.svg new file mode 100644 index 0000000..04dce77 --- /dev/null +++ b/icons/pixelarticons/svg/message-image.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f73b721aa0ae5e12f1bebe3c7de188b3e5e7e9e75f9bdf628790264f24c6a94a +size 232 diff --git a/icons/pixelarticons/svg/message-minus.svg b/icons/pixelarticons/svg/message-minus.svg new file mode 100644 index 0000000..f86d06e --- /dev/null +++ b/icons/pixelarticons/svg/message-minus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e42d1faa735d01538a7be01cc3284419093a4f72e9e91792ff518e794e6decea +size 172 diff --git a/icons/pixelarticons/svg/message-plus.svg b/icons/pixelarticons/svg/message-plus.svg new file mode 100644 index 0000000..f3ca1dc --- /dev/null +++ b/icons/pixelarticons/svg/message-plus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e46db666aa33fc77e7f791b1d4267cc895396d0b1822b9c16a928b2510cf04a +size 192 diff --git a/icons/pixelarticons/svg/message-processing.svg b/icons/pixelarticons/svg/message-processing.svg new file mode 100644 index 0000000..57cde50 --- /dev/null +++ b/icons/pixelarticons/svg/message-processing.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:373cba5b2a9c7c2533bc69dc1ebd97f0234e75458d1424c6e69ef483d3055461 +size 199 diff --git a/icons/pixelarticons/svg/message-reply.svg b/icons/pixelarticons/svg/message-reply.svg new file mode 100644 index 0000000..e11abbb --- /dev/null +++ b/icons/pixelarticons/svg/message-reply.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f2af04d9d386e03dd0f0c832da245c75cf0e23c1f4c97661b4b7558a901fc50 +size 159 diff --git a/icons/pixelarticons/svg/message-text.svg b/icons/pixelarticons/svg/message-text.svg new file mode 100644 index 0000000..90f500b --- /dev/null +++ b/icons/pixelarticons/svg/message-text.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e388f883e4f7ce753041970b205c0206a4ea7e42cade9408154d66fc70889e3 +size 187 diff --git a/icons/pixelarticons/svg/message.svg b/icons/pixelarticons/svg/message.svg new file mode 100644 index 0000000..2fd8c04 --- /dev/null +++ b/icons/pixelarticons/svg/message.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9817e6f0007ecbef7b9f61fdf6f51d73051000ceb61e7be33f0552b290084cfc +size 159 diff --git a/icons/pixelarticons/svg/minus.svg b/icons/pixelarticons/svg/minus.svg new file mode 100644 index 0000000..fa2b71b --- /dev/null +++ b/icons/pixelarticons/svg/minus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18f6767f2d291c62ea08248ba9f179b0de9e3c6edf0307de4e542183cc9e5aa5 +size 130 diff --git a/icons/pixelarticons/svg/missed-call.svg b/icons/pixelarticons/svg/missed-call.svg new file mode 100644 index 0000000..c46ee6a --- /dev/null +++ b/icons/pixelarticons/svg/missed-call.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:513741294741f3aa308f0e948337e80470434db24b7e00d16fd864895c942ae0 +size 218 diff --git a/icons/pixelarticons/svg/modem.svg b/icons/pixelarticons/svg/modem.svg new file mode 100644 index 0000000..10e747d --- /dev/null +++ b/icons/pixelarticons/svg/modem.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5e3e8f149efba2fe47e0fcfdcbea5a88672aaf26a7f71fc930a28a680d1aefc +size 267 diff --git a/icons/pixelarticons/svg/money.svg b/icons/pixelarticons/svg/money.svg new file mode 100644 index 0000000..b1af45f --- /dev/null +++ b/icons/pixelarticons/svg/money.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b431b2ef8d58aa13e795bd37bd352c5ad3d91e38073009cdeb7f8a79bcc9ec8 +size 194 diff --git a/icons/pixelarticons/svg/monitor.svg b/icons/pixelarticons/svg/monitor.svg new file mode 100644 index 0000000..d5aa9ab --- /dev/null +++ b/icons/pixelarticons/svg/monitor.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bfe6df83d6b44e596be6b6b5246cc11d4e8f9de6f258a6c1c015b5626cc25a68 +size 174 diff --git a/icons/pixelarticons/svg/mood-happy.svg b/icons/pixelarticons/svg/mood-happy.svg new file mode 100644 index 0000000..c9df452 --- /dev/null +++ b/icons/pixelarticons/svg/mood-happy.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67b8e50122e5e2cd450e82c369c28d4f1db427d3e63fbddb8ff7dea45cf7c1e6 +size 237 diff --git a/icons/pixelarticons/svg/mood-neutral.svg b/icons/pixelarticons/svg/mood-neutral.svg new file mode 100644 index 0000000..f503c85 --- /dev/null +++ b/icons/pixelarticons/svg/mood-neutral.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95bf9e15de557c471715e8fe6f01d8c10e561430626dcf0c2acb6cbefe863dc4 +size 207 diff --git a/icons/pixelarticons/svg/mood-sad.svg b/icons/pixelarticons/svg/mood-sad.svg new file mode 100644 index 0000000..1da2de8 --- /dev/null +++ b/icons/pixelarticons/svg/mood-sad.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b872f8954208f5423efc05fa6f667941f1a90bd1d553b9471b3c6f4428aaca55 +size 227 diff --git a/icons/pixelarticons/svg/moon-star.svg b/icons/pixelarticons/svg/moon-star.svg new file mode 100644 index 0000000..b717f8c --- /dev/null +++ b/icons/pixelarticons/svg/moon-star.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:11c270b28e9552bf5ce54d85f9792271d386f2077444eb684c14fcf7cfc48b40 +size 318 diff --git a/icons/pixelarticons/svg/moon-stars.svg b/icons/pixelarticons/svg/moon-stars.svg new file mode 100644 index 0000000..a4b084a --- /dev/null +++ b/icons/pixelarticons/svg/moon-stars.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee9829797cb5e622a913ccb16fb04947da3ea70e5f0b89d90d443dced9691418 +size 317 diff --git a/icons/pixelarticons/svg/moon.svg b/icons/pixelarticons/svg/moon.svg new file mode 100644 index 0000000..afea7d7 --- /dev/null +++ b/icons/pixelarticons/svg/moon.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23d0b7a703ebda571ffdf6d0dd0a0501c5c9803c8681638b0652756e23194d87 +size 283 diff --git a/icons/pixelarticons/svg/more-horizontal.svg b/icons/pixelarticons/svg/more-horizontal.svg new file mode 100644 index 0000000..71379ee --- /dev/null +++ b/icons/pixelarticons/svg/more-horizontal.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5cefd2b9c98eade390f55edfaa2a0e6e09c6b2a98373e26aeb8c70e8777d977 +size 201 diff --git a/icons/pixelarticons/svg/more-vertical.svg b/icons/pixelarticons/svg/more-vertical.svg new file mode 100644 index 0000000..dcb0c1a --- /dev/null +++ b/icons/pixelarticons/svg/more-vertical.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:471f2c1b9f2d69404855dff693e28056309cb88094fa16db609731e7be0314e5 +size 205 diff --git a/icons/pixelarticons/svg/mouse.svg b/icons/pixelarticons/svg/mouse.svg new file mode 100644 index 0000000..58ad13d --- /dev/null +++ b/icons/pixelarticons/svg/mouse.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea0be940a66bf9ec47a828577a0b555794e56e1d6b51aed78c6b8a6a10a650a3 +size 173 diff --git a/icons/pixelarticons/svg/move.svg b/icons/pixelarticons/svg/move.svg new file mode 100644 index 0000000..b7da318 --- /dev/null +++ b/icons/pixelarticons/svg/move.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ae20a323c3b7806163894b76d6c1c721b3453a434b3f304902d20f85da8bcdd +size 295 diff --git a/icons/pixelarticons/svg/movie.svg b/icons/pixelarticons/svg/movie.svg new file mode 100644 index 0000000..b9179c5 --- /dev/null +++ b/icons/pixelarticons/svg/movie.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49364cecacff007c83ee9ca661d891d0507af094567d3e650f577f8b5d4852ea +size 274 diff --git a/icons/pixelarticons/svg/music.svg b/icons/pixelarticons/svg/music.svg new file mode 100644 index 0000000..bf73862 --- /dev/null +++ b/icons/pixelarticons/svg/music.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b78648bb2aa085b9f1053744e0cb215f25dc153f3f922af554af1324703329d1 +size 184 diff --git a/icons/pixelarticons/svg/next.svg b/icons/pixelarticons/svg/next.svg new file mode 100644 index 0000000..982f073 --- /dev/null +++ b/icons/pixelarticons/svg/next.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db7ce4ebe55eb9895baa66d82cf1193b6b9bcc936a751a9962cc47dd83de7fc7 +size 172 diff --git a/icons/pixelarticons/svg/note-delete.svg b/icons/pixelarticons/svg/note-delete.svg new file mode 100644 index 0000000..10bc7f2 --- /dev/null +++ b/icons/pixelarticons/svg/note-delete.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ea3ca1df733e96b3823954cfbdf66a1bd99a5f37918bc950bd98606bc9190fa +size 228 diff --git a/icons/pixelarticons/svg/note-multiple.svg b/icons/pixelarticons/svg/note-multiple.svg new file mode 100644 index 0000000..ce970ce --- /dev/null +++ b/icons/pixelarticons/svg/note-multiple.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee891a598417866afe9af2edb845989dd8ba446f714b83ae8880f711644de1c8 +size 197 diff --git a/icons/pixelarticons/svg/note-plus.svg b/icons/pixelarticons/svg/note-plus.svg new file mode 100644 index 0000000..81dad0c --- /dev/null +++ b/icons/pixelarticons/svg/note-plus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db364eb62fc24d7b683e949745587ed09a1e1c68b5592abaca34ea759e4ede1c +size 217 diff --git a/icons/pixelarticons/svg/note.svg b/icons/pixelarticons/svg/note.svg new file mode 100644 index 0000000..9961434 --- /dev/null +++ b/icons/pixelarticons/svg/note.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8db38f3547d5c28c7dd67213c1bf99003e225e8a4cf1c0f7f80cebd25d0ca490 +size 176 diff --git a/icons/pixelarticons/svg/notes-delete.svg b/icons/pixelarticons/svg/notes-delete.svg new file mode 100644 index 0000000..9f5419b --- /dev/null +++ b/icons/pixelarticons/svg/notes-delete.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:627545d0cdbd79d44608ff8809bda4452630f539062cf8884f265872f35a5b86 +size 256 diff --git a/icons/pixelarticons/svg/notes-multiple.svg b/icons/pixelarticons/svg/notes-multiple.svg new file mode 100644 index 0000000..2c7d282 --- /dev/null +++ b/icons/pixelarticons/svg/notes-multiple.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:168d74db5f57c6ec634d73c11a0585b58e4d52e94ee73868ff17559407aa0afe +size 217 diff --git a/icons/pixelarticons/svg/notes-plus.svg b/icons/pixelarticons/svg/notes-plus.svg new file mode 100644 index 0000000..64fc8be --- /dev/null +++ b/icons/pixelarticons/svg/notes-plus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c49aecfed0f0dd6205224464b3c246e247f47439ccc7bb0608690122468b3d77 +size 229 diff --git a/icons/pixelarticons/svg/notes.svg b/icons/pixelarticons/svg/notes.svg new file mode 100644 index 0000000..e745b05 --- /dev/null +++ b/icons/pixelarticons/svg/notes.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:820da6709a905d03262fcf2936e1ff22a44388d8c870a7a72e98a3beaa6a7363 +size 196 diff --git a/icons/pixelarticons/svg/notification-off.svg b/icons/pixelarticons/svg/notification-off.svg new file mode 100644 index 0000000..ae0b5d1 --- /dev/null +++ b/icons/pixelarticons/svg/notification-off.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:40e01f348941bffcdab222a253521e5f371470a05de26a699a3163c4f9b1571c +size 289 diff --git a/icons/pixelarticons/svg/notification.svg b/icons/pixelarticons/svg/notification.svg new file mode 100644 index 0000000..e0a4582 --- /dev/null +++ b/icons/pixelarticons/svg/notification.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:27be998edbb5488dcbe31f78313d2df2e320245279309097b2a7bfeda796c4ff +size 212 diff --git a/icons/pixelarticons/svg/open.svg b/icons/pixelarticons/svg/open.svg new file mode 100644 index 0000000..22b35a6 --- /dev/null +++ b/icons/pixelarticons/svg/open.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c38c0d599270102abe1c74c0ee52c8017ec25ebab6d7e1c7e5081a670f241e1 +size 218 diff --git a/icons/pixelarticons/svg/paint-bucket.svg b/icons/pixelarticons/svg/paint-bucket.svg new file mode 100644 index 0000000..c6e9544 --- /dev/null +++ b/icons/pixelarticons/svg/paint-bucket.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:54cd5614d3089e6104a8a72c306ea4b3825628621d7edc4c0cefe5d71390c74d +size 200 diff --git a/icons/pixelarticons/svg/paperclip.svg b/icons/pixelarticons/svg/paperclip.svg new file mode 100644 index 0000000..01cd931 --- /dev/null +++ b/icons/pixelarticons/svg/paperclip.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50f93660fb3851f01b5839a5a69e2bc25ee73e2e903ab94ed68c5cbacf372fa8 +size 162 diff --git a/icons/pixelarticons/svg/pause.svg b/icons/pixelarticons/svg/pause.svg new file mode 100644 index 0000000..1fa41c8 --- /dev/null +++ b/icons/pixelarticons/svg/pause.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c5c8490ce67fa6a6cf52464f53ee8eccf1af10e8ef4c1365bea0ffb1a9a73645 +size 147 diff --git a/icons/pixelarticons/svg/percent.svg b/icons/pixelarticons/svg/percent.svg new file mode 100644 index 0000000..0bf38ab --- /dev/null +++ b/icons/pixelarticons/svg/percent.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b328c96cf13fb9339e9c3dadd95f99afcc6b286900bdd326d9095bdb5f1ee20e +size 259 diff --git a/icons/pixelarticons/svg/picture-in-picture-alt.svg b/icons/pixelarticons/svg/picture-in-picture-alt.svg new file mode 100644 index 0000000..3f25598 --- /dev/null +++ b/icons/pixelarticons/svg/picture-in-picture-alt.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:051f0c4e4d356ede854f99102ccbf9c90bd44dc6584e36b278e66124c74c5a92 +size 177 diff --git a/icons/pixelarticons/svg/picture-in-picture.svg b/icons/pixelarticons/svg/picture-in-picture.svg new file mode 100644 index 0000000..9faf1af --- /dev/null +++ b/icons/pixelarticons/svg/picture-in-picture.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:10ef2435bb4d2a34d40b50f5794729c1df06654083304de43bdd9bac3b23b316 +size 176 diff --git a/icons/pixelarticons/svg/pin.svg b/icons/pixelarticons/svg/pin.svg new file mode 100644 index 0000000..2cae11d --- /dev/null +++ b/icons/pixelarticons/svg/pin.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3df87f16a2b1d6f6f018d50b50cbce689825fa6e8b644e611b74fb650d5e761 +size 302 diff --git a/icons/pixelarticons/svg/pixelarticons.svg b/icons/pixelarticons/svg/pixelarticons.svg new file mode 100644 index 0000000..5b88faf --- /dev/null +++ b/icons/pixelarticons/svg/pixelarticons.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f87d78b7c44b2d78badbf63ad9e7031f45c7deb3a7f485ac5f99d4b1bc78c517 +size 228 diff --git a/icons/pixelarticons/svg/play.svg b/icons/pixelarticons/svg/play.svg new file mode 100644 index 0000000..6aa6f9d --- /dev/null +++ b/icons/pixelarticons/svg/play.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a788587fcce6d827f84d84dca4320fdad3a26fa7f45de28f45bde2241290c5c0 +size 159 diff --git a/icons/pixelarticons/svg/playlist.svg b/icons/pixelarticons/svg/playlist.svg new file mode 100644 index 0000000..243f97d --- /dev/null +++ b/icons/pixelarticons/svg/playlist.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ffc81f57955400d789461586b8313d41f57e860274239bf5f2620c82c0a1794 +size 217 diff --git a/icons/pixelarticons/svg/plus.svg b/icons/pixelarticons/svg/plus.svg new file mode 100644 index 0000000..c0650c8 --- /dev/null +++ b/icons/pixelarticons/svg/plus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e43e5618a63999f7e84522f94ba4e7227a462c935fa99c9c137b50a639dd4224 +size 151 diff --git a/icons/pixelarticons/svg/power.svg b/icons/pixelarticons/svg/power.svg new file mode 100644 index 0000000..e87949b --- /dev/null +++ b/icons/pixelarticons/svg/power.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3fe6f49424df42686699cdfe234980aeb8becf61534813627786d08de0048b9f +size 205 diff --git a/icons/pixelarticons/svg/prev.svg b/icons/pixelarticons/svg/prev.svg new file mode 100644 index 0000000..785c8a5 --- /dev/null +++ b/icons/pixelarticons/svg/prev.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f125f5a3365a94a1678136596a191d6e7d8793837f0d90d4ed49c828ae8b5cb +size 173 diff --git a/icons/pixelarticons/svg/print.svg b/icons/pixelarticons/svg/print.svg new file mode 100644 index 0000000..b494587 --- /dev/null +++ b/icons/pixelarticons/svg/print.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1526f69a069518e939c8a5d57372085f63e7fe9fe0011c8d888fb304b91bd18 +size 202 diff --git a/icons/pixelarticons/svg/radio-handheld.svg b/icons/pixelarticons/svg/radio-handheld.svg new file mode 100644 index 0000000..85c53e4 --- /dev/null +++ b/icons/pixelarticons/svg/radio-handheld.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d43c0ea26753db4974c40afd2ff504b3a2def5c5760d2f9562bcf69ef554881a +size 162 diff --git a/icons/pixelarticons/svg/radio-on.svg b/icons/pixelarticons/svg/radio-on.svg new file mode 100644 index 0000000..ca8eec1 --- /dev/null +++ b/icons/pixelarticons/svg/radio-on.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d6c013d84dfaffa9e413725f7b93396ab9755dd9c9fb830c0477cd985403c1b +size 251 diff --git a/icons/pixelarticons/svg/radio-signal.svg b/icons/pixelarticons/svg/radio-signal.svg new file mode 100644 index 0000000..ff8ccc2 --- /dev/null +++ b/icons/pixelarticons/svg/radio-signal.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01bd49c4e3fe811740be5bcf7f1c4feec3f89cdf43de4d23f842fc40f077df00 +size 316 diff --git a/icons/pixelarticons/svg/radio-tower.svg b/icons/pixelarticons/svg/radio-tower.svg new file mode 100644 index 0000000..fa59690 --- /dev/null +++ b/icons/pixelarticons/svg/radio-tower.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6cc370298068e21b84283f2b4289c98e85cb25a680812bde09173b92b7809cc +size 317 diff --git a/icons/pixelarticons/svg/reciept-alt.svg b/icons/pixelarticons/svg/reciept-alt.svg new file mode 100644 index 0000000..e7b1872 --- /dev/null +++ b/icons/pixelarticons/svg/reciept-alt.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f5e9ec29a7e6d298b0d741702b47ea090598452a7a05faac7bf575094022333 +size 303 diff --git a/icons/pixelarticons/svg/reciept.svg b/icons/pixelarticons/svg/reciept.svg new file mode 100644 index 0000000..ba47056 --- /dev/null +++ b/icons/pixelarticons/svg/reciept.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77f3c60aea8b7da54965a1a618f82ec09df237b57f1cab412b37de88799ebbda +size 275 diff --git a/icons/pixelarticons/svg/redo.svg b/icons/pixelarticons/svg/redo.svg new file mode 100644 index 0000000..b7cfbb1 --- /dev/null +++ b/icons/pixelarticons/svg/redo.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f7986a26177d896663224a27fed1c5c15ff2023fe0ff120f60e12f953c6770f +size 188 diff --git a/icons/pixelarticons/svg/reload.svg b/icons/pixelarticons/svg/reload.svg new file mode 100644 index 0000000..63e7501 --- /dev/null +++ b/icons/pixelarticons/svg/reload.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3221a70a03bd6dbfc99be6b9fef9f1b7415ccea84f9efae88d6b696883a6ca9 +size 239 diff --git a/icons/pixelarticons/svg/remove-box-multiple.svg b/icons/pixelarticons/svg/remove-box-multiple.svg new file mode 100644 index 0000000..020aee8 --- /dev/null +++ b/icons/pixelarticons/svg/remove-box-multiple.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:124f369d39f316d1dff9d748f5249c3332f22c911d52c36cf70e7278010fb71b +size 184 diff --git a/icons/pixelarticons/svg/remove-box.svg b/icons/pixelarticons/svg/remove-box.svg new file mode 100644 index 0000000..28ba0c4 --- /dev/null +++ b/icons/pixelarticons/svg/remove-box.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73999a094b4bc99dc9670de90d6bae9bb76a9fa19886b1af66b5129d7ac9571a +size 165 diff --git a/icons/pixelarticons/svg/repeat.svg b/icons/pixelarticons/svg/repeat.svg new file mode 100644 index 0000000..a5c0b41 --- /dev/null +++ b/icons/pixelarticons/svg/repeat.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e692f5c5403faa79c3e6a3025487cca1fe244851fac3aaa90e32ed2eede1db4a +size 256 diff --git a/icons/pixelarticons/svg/reply-all.svg b/icons/pixelarticons/svg/reply-all.svg new file mode 100644 index 0000000..4ce0a0e --- /dev/null +++ b/icons/pixelarticons/svg/reply-all.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99ff2b21bcc3f05f1e15f76aac862df7ad3d8e2e9e24e0718505bfd9015e71a9 +size 238 diff --git a/icons/pixelarticons/svg/reply.svg b/icons/pixelarticons/svg/reply.svg new file mode 100644 index 0000000..89c180f --- /dev/null +++ b/icons/pixelarticons/svg/reply.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f1b6a8d9fac60d69fd23d63e5097f7c0355cddfbd524f3adc2e05fc903e9361 +size 170 diff --git a/icons/pixelarticons/svg/rounded-corner.svg b/icons/pixelarticons/svg/rounded-corner.svg new file mode 100644 index 0000000..59bca1f --- /dev/null +++ b/icons/pixelarticons/svg/rounded-corner.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a2a0ac184adfb15fd9e325ed91a410669634b7ebbb95c7e4a88ca692adf7ce59 +size 316 diff --git a/icons/pixelarticons/svg/save.svg b/icons/pixelarticons/svg/save.svg new file mode 100644 index 0000000..ee9d6cc --- /dev/null +++ b/icons/pixelarticons/svg/save.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e0a9f4506f42ccc6f0aab963b1a2dbf6d7833b52cccfbcfdda465d2537416fd +size 200 diff --git a/icons/pixelarticons/svg/scale.svg b/icons/pixelarticons/svg/scale.svg new file mode 100644 index 0000000..21264a8 --- /dev/null +++ b/icons/pixelarticons/svg/scale.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:32085556bba676eb52b21089aa5cee73fad06f5eae8bdc089ba22cae1c9f93a5 +size 213 diff --git a/icons/pixelarticons/svg/script-text.svg b/icons/pixelarticons/svg/script-text.svg new file mode 100644 index 0000000..e9d8d69 --- /dev/null +++ b/icons/pixelarticons/svg/script-text.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee3e413dba7f2f5d339ea3abc25c7cc97cf4ed7df5275ecb93d0eefd8a23ca13 +size 228 diff --git a/icons/pixelarticons/svg/script.svg b/icons/pixelarticons/svg/script.svg new file mode 100644 index 0000000..d943a13 --- /dev/null +++ b/icons/pixelarticons/svg/script.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9f4a61939149f42819457062379df07841ba37f1c9663f7cc32c3b41dd4446d +size 201 diff --git a/icons/pixelarticons/svg/scroll-horizontal.svg b/icons/pixelarticons/svg/scroll-horizontal.svg new file mode 100644 index 0000000..c40674d --- /dev/null +++ b/icons/pixelarticons/svg/scroll-horizontal.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7245e0b66a76deda1725aee1449e34118d476fbdc3cd7feb842cc950cc39e804 +size 255 diff --git a/icons/pixelarticons/svg/scroll-vertical.svg b/icons/pixelarticons/svg/scroll-vertical.svg new file mode 100644 index 0000000..55cf018 --- /dev/null +++ b/icons/pixelarticons/svg/scroll-vertical.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82e36827a3f924aeb97c9d733591d8f94f797c35e8de07f3e970bb0f34f39f45 +size 234 diff --git a/icons/pixelarticons/svg/sd.svg b/icons/pixelarticons/svg/sd.svg new file mode 100644 index 0000000..06b8bba --- /dev/null +++ b/icons/pixelarticons/svg/sd.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb58d7d87c67bca04e93db13a9ac29c3c724a914a52614e290fa31624e3641a0 +size 191 diff --git a/icons/pixelarticons/svg/search.svg b/icons/pixelarticons/svg/search.svg new file mode 100644 index 0000000..c0ff837 --- /dev/null +++ b/icons/pixelarticons/svg/search.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:742afc7d8d1ebef61556ec3dbbdb9177353ad8922e3c994f93e2b0f11051b3c3 +size 257 diff --git a/icons/pixelarticons/svg/section-copy.svg b/icons/pixelarticons/svg/section-copy.svg new file mode 100644 index 0000000..f4e3f0e --- /dev/null +++ b/icons/pixelarticons/svg/section-copy.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13ac402f67e8b0ce79f73b1d11c5f71668117f0ad8a7bee33d10b99e7374140a +size 394 diff --git a/icons/pixelarticons/svg/section-minus.svg b/icons/pixelarticons/svg/section-minus.svg new file mode 100644 index 0000000..ec47c43 --- /dev/null +++ b/icons/pixelarticons/svg/section-minus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ffcab3bf5b9b558fcf3930513052bbd1e44418cae93d7262411347bfc49640a +size 320 diff --git a/icons/pixelarticons/svg/section-plus.svg b/icons/pixelarticons/svg/section-plus.svg new file mode 100644 index 0000000..093c640 --- /dev/null +++ b/icons/pixelarticons/svg/section-plus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b18b900abeea5d942c8ebeac03a76807672ecd5e54c20311d95a5fd611305822 +size 339 diff --git a/icons/pixelarticons/svg/section-x.svg b/icons/pixelarticons/svg/section-x.svg new file mode 100644 index 0000000..83f9f7e --- /dev/null +++ b/icons/pixelarticons/svg/section-x.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eaf32e1568d6ac8e9ad7c0517f06feb8dec200f10ef4716d3f4163ad527d8144 +size 359 diff --git a/icons/pixelarticons/svg/section.svg b/icons/pixelarticons/svg/section.svg new file mode 100644 index 0000000..bdbe44e --- /dev/null +++ b/icons/pixelarticons/svg/section.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18032ac66671e48abeb875dc551f0b768a1441601e97b726dcc528caaac63ba5 +size 356 diff --git a/icons/pixelarticons/svg/server.svg b/icons/pixelarticons/svg/server.svg new file mode 100644 index 0000000..6b7c7d5 --- /dev/null +++ b/icons/pixelarticons/svg/server.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a38afcfa06ddc6c61512edd5a06acb11f9d4ad9e3611ce848f168d0887937ff +size 189 diff --git a/icons/pixelarticons/svg/sharp-corner.svg b/icons/pixelarticons/svg/sharp-corner.svg new file mode 100644 index 0000000..749da8c --- /dev/null +++ b/icons/pixelarticons/svg/sharp-corner.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:789faff49befc93c8a03d26764eff967acb38fe178573240e4765cc0647ebb70 +size 292 diff --git a/icons/pixelarticons/svg/shield-off.svg b/icons/pixelarticons/svg/shield-off.svg new file mode 100644 index 0000000..9f41b57 --- /dev/null +++ b/icons/pixelarticons/svg/shield-off.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c10682575546fb9905ad5455e3c18cd082e875b431fb849b551b80d01b1a0c42 +size 300 diff --git a/icons/pixelarticons/svg/shield.svg b/icons/pixelarticons/svg/shield.svg new file mode 100644 index 0000000..516c752 --- /dev/null +++ b/icons/pixelarticons/svg/shield.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:36db545be2930b3cdb88be2438657c498c5043274742da500fd95bfd37601ee9 +size 231 diff --git a/icons/pixelarticons/svg/ship.svg b/icons/pixelarticons/svg/ship.svg new file mode 100644 index 0000000..37735fe --- /dev/null +++ b/icons/pixelarticons/svg/ship.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04af7904f31c841823aa1d5fe33a6c853342d67e5ad4952b9895b43c47c14d3b +size 188 diff --git a/icons/pixelarticons/svg/shopping-bag.svg b/icons/pixelarticons/svg/shopping-bag.svg new file mode 100644 index 0000000..7814c38 --- /dev/null +++ b/icons/pixelarticons/svg/shopping-bag.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6de37cf27cf68b86a126ceda011d5f5709d19bf1b478b84146d21bd081c381d +size 193 diff --git a/icons/pixelarticons/svg/shuffle.svg b/icons/pixelarticons/svg/shuffle.svg new file mode 100644 index 0000000..2222a7c --- /dev/null +++ b/icons/pixelarticons/svg/shuffle.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5d08552d3c7042db2066948169400066d0b33d8b3aa39d8d873c0b51b3ed8ad +size 219 diff --git a/icons/pixelarticons/svg/sliders-2.svg b/icons/pixelarticons/svg/sliders-2.svg new file mode 100644 index 0000000..a7a67d5 --- /dev/null +++ b/icons/pixelarticons/svg/sliders-2.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad852d62a3e76263c1d61c75fee0eaeb775b41adf2d5c14a1905499007dcb872 +size 230 diff --git a/icons/pixelarticons/svg/sliders.svg b/icons/pixelarticons/svg/sliders.svg new file mode 100644 index 0000000..c2ea5b3 --- /dev/null +++ b/icons/pixelarticons/svg/sliders.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf2d9bc3e199cbc678dc4f0421640d4cd156f64e022e4bc53ff1dbaca0486447 +size 240 diff --git a/icons/pixelarticons/svg/sort-alphabetic.svg b/icons/pixelarticons/svg/sort-alphabetic.svg new file mode 100644 index 0000000..bd12370 --- /dev/null +++ b/icons/pixelarticons/svg/sort-alphabetic.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d94ca01a13cacefae9b68347dd6ee583ba2c1ca4d982c3459c94a3f93bfb0700 +size 302 diff --git a/icons/pixelarticons/svg/sort-numeric.svg b/icons/pixelarticons/svg/sort-numeric.svg new file mode 100644 index 0000000..6560440 --- /dev/null +++ b/icons/pixelarticons/svg/sort-numeric.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:51c8bc8ffc3d5c92df6e910ef53f1cbf72fc82493cc12674b0ead9ff5a0add6b +size 281 diff --git a/icons/pixelarticons/svg/sort.svg b/icons/pixelarticons/svg/sort.svg new file mode 100644 index 0000000..f392c05 --- /dev/null +++ b/icons/pixelarticons/svg/sort.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3eb228d2cb1958a72c828d0a6db3b094cf65bfe660854c391617fd461b7e8e77 +size 232 diff --git a/icons/pixelarticons/svg/speaker.svg b/icons/pixelarticons/svg/speaker.svg new file mode 100644 index 0000000..19fc7a4 --- /dev/null +++ b/icons/pixelarticons/svg/speaker.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:15c6804f245b09d1846bcc86a1efe58652ae613e7e7592d4321d1defc6544067 +size 205 diff --git a/icons/pixelarticons/svg/speed-fast.svg b/icons/pixelarticons/svg/speed-fast.svg new file mode 100644 index 0000000..3e15d4e --- /dev/null +++ b/icons/pixelarticons/svg/speed-fast.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:29907e586ffe7ac234be402c232a5d1246b0169616e39b71298e9dcd29a5cbe4 +size 250 diff --git a/icons/pixelarticons/svg/speed-medium.svg b/icons/pixelarticons/svg/speed-medium.svg new file mode 100644 index 0000000..f2939f0 --- /dev/null +++ b/icons/pixelarticons/svg/speed-medium.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:34abfbde6183421fdb0f977a75cf16aad66a9bf260ca2c30b589d0bdb58aae5f +size 242 diff --git a/icons/pixelarticons/svg/speed-slow.svg b/icons/pixelarticons/svg/speed-slow.svg new file mode 100644 index 0000000..c395b0e --- /dev/null +++ b/icons/pixelarticons/svg/speed-slow.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56fc2c1204c59ee13497c18aeb06d232577d127e40c2c7ab20538b3b13edc077 +size 259 diff --git a/icons/pixelarticons/svg/spotlight.svg b/icons/pixelarticons/svg/spotlight.svg new file mode 100644 index 0000000..c8d4cb9 --- /dev/null +++ b/icons/pixelarticons/svg/spotlight.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9f2f1ce27bbe5b32f6d0ff614c2a9e9684c83e625eaaf05f13ae9451e148149 +size 181 diff --git a/icons/pixelarticons/svg/store.svg b/icons/pixelarticons/svg/store.svg new file mode 100644 index 0000000..7f03c33 --- /dev/null +++ b/icons/pixelarticons/svg/store.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d1dae5255b198e911a2061170dd8859e867fc1da42c0c32ebf19fecc644b65b +size 198 diff --git a/icons/pixelarticons/svg/subscriptions.svg b/icons/pixelarticons/svg/subscriptions.svg new file mode 100644 index 0000000..60f1a20 --- /dev/null +++ b/icons/pixelarticons/svg/subscriptions.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1dc27ec4b6a9ed1fbe196570c4aea9c7bcd49e2363ae1d74b4ddf0aaf219610 +size 180 diff --git a/icons/pixelarticons/svg/subtitles.svg b/icons/pixelarticons/svg/subtitles.svg new file mode 100644 index 0000000..d2c52e0 --- /dev/null +++ b/icons/pixelarticons/svg/subtitles.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2dd89decf9e2ba756442962834a1a9699803ce61a4c244df87a1f69cfa0d585e +size 168 diff --git a/icons/pixelarticons/svg/suitcase.svg b/icons/pixelarticons/svg/suitcase.svg new file mode 100644 index 0000000..35aee37 --- /dev/null +++ b/icons/pixelarticons/svg/suitcase.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:690ffcb91c083e4e065abf676e22dc9721aa13fa8c13be531a0ea9eeb70a2dc3 +size 198 diff --git a/icons/pixelarticons/svg/sun-alt.svg b/icons/pixelarticons/svg/sun-alt.svg new file mode 100644 index 0000000..ded271d --- /dev/null +++ b/icons/pixelarticons/svg/sun-alt.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ebfb80551b1178475c2053845161313fdaacbdc1275b54ed349c08e78082249 +size 328 diff --git a/icons/pixelarticons/svg/sun.svg b/icons/pixelarticons/svg/sun.svg new file mode 100644 index 0000000..a6fce9a --- /dev/null +++ b/icons/pixelarticons/svg/sun.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f160dad3aa7a532ca509a9d5ee0a331525857c1ec5fb798b3fc902ba8850d42 +size 303 diff --git a/icons/pixelarticons/svg/switch.svg b/icons/pixelarticons/svg/switch.svg new file mode 100644 index 0000000..58f5653 --- /dev/null +++ b/icons/pixelarticons/svg/switch.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a4657c8fc3b1bd29140241a66e4f8cca8c0d27c770558cf894dcb45a9b44c9b3 +size 317 diff --git a/icons/pixelarticons/svg/sync.svg b/icons/pixelarticons/svg/sync.svg new file mode 100644 index 0000000..85acda3 --- /dev/null +++ b/icons/pixelarticons/svg/sync.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ecbd1ba27a082a68f70d064ff9284d95de43844ff96f6a508ecc5b1874a35667 +size 231 diff --git a/icons/pixelarticons/svg/tab.svg b/icons/pixelarticons/svg/tab.svg new file mode 100644 index 0000000..c3fc03b --- /dev/null +++ b/icons/pixelarticons/svg/tab.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9667d8d56c39351eb755d1787e9ddaeb28b34b3e1656f355a4bb3e8ee812e133 +size 152 diff --git a/icons/pixelarticons/svg/table.svg b/icons/pixelarticons/svg/table.svg new file mode 100644 index 0000000..ccf3e12 --- /dev/null +++ b/icons/pixelarticons/svg/table.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc54d192aa7af8dc95b91ee703751f3d84db97a0c5d0f0e00f7319d6618e6632 +size 189 diff --git a/icons/pixelarticons/svg/tea.svg b/icons/pixelarticons/svg/tea.svg new file mode 100644 index 0000000..12661a2 --- /dev/null +++ b/icons/pixelarticons/svg/tea.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b731923d534c495f4800d282d14c37f5f6b5feb5ffe9b71d4430d6affb02eac9 +size 199 diff --git a/icons/pixelarticons/svg/teach.svg b/icons/pixelarticons/svg/teach.svg new file mode 100644 index 0000000..e192dd9 --- /dev/null +++ b/icons/pixelarticons/svg/teach.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:11680f9f0c5886118c69abd4409ab02a00344c6e0000569e866f919e9a363ac5 +size 187 diff --git a/icons/pixelarticons/svg/text-add.svg b/icons/pixelarticons/svg/text-add.svg new file mode 100644 index 0000000..fe03d4f --- /dev/null +++ b/icons/pixelarticons/svg/text-add.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a4b69ef6fce626eb0bcbc03ab7d709b38a99459cf7b36136dac7bcfc3cf68040 +size 210 diff --git a/icons/pixelarticons/svg/text-colums.svg b/icons/pixelarticons/svg/text-colums.svg new file mode 100644 index 0000000..b4610b1 --- /dev/null +++ b/icons/pixelarticons/svg/text-colums.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:855267774e1bbb221327eef949b7ff115338cb44722503d34b3632945f626ac4 +size 236 diff --git a/icons/pixelarticons/svg/text-search.svg b/icons/pixelarticons/svg/text-search.svg new file mode 100644 index 0000000..e7362bf --- /dev/null +++ b/icons/pixelarticons/svg/text-search.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ec5366b89d5972d32215784ab17fec65191974ee7b4908b07467cd4f622d1ce +size 217 diff --git a/icons/pixelarticons/svg/text-wrap.svg b/icons/pixelarticons/svg/text-wrap.svg new file mode 100644 index 0000000..a90dcd6 --- /dev/null +++ b/icons/pixelarticons/svg/text-wrap.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae4ce586ee8f812be6ac2ab4ce4fbd4aa0fd0af0014441c2c0e89602e8de0837 +size 217 diff --git a/icons/pixelarticons/svg/timeline.svg b/icons/pixelarticons/svg/timeline.svg new file mode 100644 index 0000000..11ff626 --- /dev/null +++ b/icons/pixelarticons/svg/timeline.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e058cfce13e38f442ad6d699a9ce07d93000c12d8d19cadfcbc63353e24ad76 +size 218 diff --git a/icons/pixelarticons/svg/toggle-left.svg b/icons/pixelarticons/svg/toggle-left.svg new file mode 100644 index 0000000..f3b03b9 --- /dev/null +++ b/icons/pixelarticons/svg/toggle-left.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:787a6d20ba02e9d7c2c36dcc48a58ee5a45064f78658c94b6f7e3fa8606e7639 +size 191 diff --git a/icons/pixelarticons/svg/toggle-right.svg b/icons/pixelarticons/svg/toggle-right.svg new file mode 100644 index 0000000..a14d98e --- /dev/null +++ b/icons/pixelarticons/svg/toggle-right.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fdb1ee0c38ee198eedca5e17397a917f95be404bd51ba842e5901dd076fb9652 +size 192 diff --git a/icons/pixelarticons/svg/tournament.svg b/icons/pixelarticons/svg/tournament.svg new file mode 100644 index 0000000..0a3808d --- /dev/null +++ b/icons/pixelarticons/svg/tournament.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ebf4eb650b8ec35882c2586f33338d25665a9db8937fe2e6a8ebc6914ce47819 +size 184 diff --git a/icons/pixelarticons/svg/track-changes.svg b/icons/pixelarticons/svg/track-changes.svg new file mode 100644 index 0000000..a57ed74 --- /dev/null +++ b/icons/pixelarticons/svg/track-changes.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0fb05e7210ea65ba63289c5027f6b6d2972228602afbfd882832ea7bc6557944 +size 188 diff --git a/icons/pixelarticons/svg/trash-alt.svg b/icons/pixelarticons/svg/trash-alt.svg new file mode 100644 index 0000000..a1a78ac --- /dev/null +++ b/icons/pixelarticons/svg/trash-alt.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bbe2c4611f1d633aa764cf0cbff506dc1d1e5e13618c6c22f135d34173884d27 +size 182 diff --git a/icons/pixelarticons/svg/trash.svg b/icons/pixelarticons/svg/trash.svg new file mode 100644 index 0000000..34d2176 --- /dev/null +++ b/icons/pixelarticons/svg/trash.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec5afd95ae495275ddbdbe91459fd7b68bda0315a495b16af34fbd34e1b73570 +size 212 diff --git a/icons/pixelarticons/svg/trending-down.svg b/icons/pixelarticons/svg/trending-down.svg new file mode 100644 index 0000000..6298ca3 --- /dev/null +++ b/icons/pixelarticons/svg/trending-down.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:29992c17bdb5037c40c8f9de004a8ffbca32bd808e6b2091f4e94b6f79e64497 +size 215 diff --git a/icons/pixelarticons/svg/trending-up.svg b/icons/pixelarticons/svg/trending-up.svg new file mode 100644 index 0000000..f649876 --- /dev/null +++ b/icons/pixelarticons/svg/trending-up.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca9798c2cf8eb565d823fa90ddcd9fd5667b1f583b2d5c4154f2530269a8f9c1 +size 265 diff --git a/icons/pixelarticons/svg/trending.svg b/icons/pixelarticons/svg/trending.svg new file mode 100644 index 0000000..f445957 --- /dev/null +++ b/icons/pixelarticons/svg/trending.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cdd79e2736c2ca1a205b8e6a7e761c1746d8fdb5ae86ce97d38dfeac6b9d3ae6 +size 238 diff --git a/icons/pixelarticons/svg/trophy.svg b/icons/pixelarticons/svg/trophy.svg new file mode 100644 index 0000000..a1e946a --- /dev/null +++ b/icons/pixelarticons/svg/trophy.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a66b7f10a6677682369204579b03b19ff3baf3ff2e8fd743f2da346d3cd0f03 +size 221 diff --git a/icons/pixelarticons/svg/truck.svg b/icons/pixelarticons/svg/truck.svg new file mode 100644 index 0000000..69676e5 --- /dev/null +++ b/icons/pixelarticons/svg/truck.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c5e676560d9fbe75ca7aac91d348397473d6fc035ade732363fa0d387f464c6 +size 206 diff --git a/icons/pixelarticons/svg/undo.svg b/icons/pixelarticons/svg/undo.svg new file mode 100644 index 0000000..f9543ed --- /dev/null +++ b/icons/pixelarticons/svg/undo.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:844433a424e5bc32ac377288018f9b8a603a15e0460a2277a43b09209e4e520c +size 201 diff --git a/icons/pixelarticons/svg/ungroup.svg b/icons/pixelarticons/svg/ungroup.svg new file mode 100644 index 0000000..dd096b9 --- /dev/null +++ b/icons/pixelarticons/svg/ungroup.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:12d432d15b12d36e3e2d79f7f16a91e47721ce66c21170f9b5291e6227e64dbf +size 235 diff --git a/icons/pixelarticons/svg/unlink.svg b/icons/pixelarticons/svg/unlink.svg new file mode 100644 index 0000000..2a6c8bb --- /dev/null +++ b/icons/pixelarticons/svg/unlink.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9964ff7b4966795b8eb016dd639fff3c23330c8e1116f551d1a7787147cb34a1 +size 182 diff --git a/icons/pixelarticons/svg/upload.svg b/icons/pixelarticons/svg/upload.svg new file mode 100644 index 0000000..3d932fb --- /dev/null +++ b/icons/pixelarticons/svg/upload.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77a3236158f8756d3fe58ba1dae9c9e48e6a965e80d36c562210d61b1d03655e +size 193 diff --git a/icons/pixelarticons/svg/user-minus.svg b/icons/pixelarticons/svg/user-minus.svg new file mode 100644 index 0000000..ada549c --- /dev/null +++ b/icons/pixelarticons/svg/user-minus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ce19031e1935ead30c813ee91a52174835d9a188cc7f5b6ab89f49a4c1bea3fc +size 221 diff --git a/icons/pixelarticons/svg/user-plus.svg b/icons/pixelarticons/svg/user-plus.svg new file mode 100644 index 0000000..d2a11af --- /dev/null +++ b/icons/pixelarticons/svg/user-plus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99e6b4b063de242695d2171a80ce5e3ef7f2ff388b64930a4010c6ffb39687c4 +size 236 diff --git a/icons/pixelarticons/svg/user-x.svg b/icons/pixelarticons/svg/user-x.svg new file mode 100644 index 0000000..da7dd71 --- /dev/null +++ b/icons/pixelarticons/svg/user-x.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:83268f2df4a9ced9ea9140154a71f577c61e6b7e603d2726dee12276886a0282 +size 260 diff --git a/icons/pixelarticons/svg/user.svg b/icons/pixelarticons/svg/user.svg new file mode 100644 index 0000000..bfb7a81 --- /dev/null +++ b/icons/pixelarticons/svg/user.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:751251a11af49d909f1653b3b51d39fc81dfed5a2bdfcf1cc6f803f8e3173286 +size 202 diff --git a/icons/pixelarticons/svg/users.svg b/icons/pixelarticons/svg/users.svg new file mode 100644 index 0000000..78935ac --- /dev/null +++ b/icons/pixelarticons/svg/users.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7c1c380031020df2dadd8aea492998005fdc5ee07423f2df50c9279ee368c73 +size 292 diff --git a/icons/pixelarticons/svg/video-off.svg b/icons/pixelarticons/svg/video-off.svg new file mode 100644 index 0000000..1d5d116 --- /dev/null +++ b/icons/pixelarticons/svg/video-off.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a0c119fea0a2674042a99ce5707e1a9e8924b075de8f3dbbc1010c41c1aa39c4 +size 235 diff --git a/icons/pixelarticons/svg/video.svg b/icons/pixelarticons/svg/video.svg new file mode 100644 index 0000000..0236736 --- /dev/null +++ b/icons/pixelarticons/svg/video.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28656268810c793d627d57baeca3ad036e14c2bc4f9e6cff8a20cabb2b9b0af0 +size 177 diff --git a/icons/pixelarticons/svg/view-col.svg b/icons/pixelarticons/svg/view-col.svg new file mode 100644 index 0000000..a4fcd32 --- /dev/null +++ b/icons/pixelarticons/svg/view-col.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39bff57dfb99121504d182aa12701c6500cc4cbcc29d01615d6e0f764be5dcd1 +size 176 diff --git a/icons/pixelarticons/svg/view-list.svg b/icons/pixelarticons/svg/view-list.svg new file mode 100644 index 0000000..0572aa6 --- /dev/null +++ b/icons/pixelarticons/svg/view-list.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c24bd800fbdcd4bdd1f85e159382ed0705ebcb69ef68a2a9e0798c57cd68d18 +size 177 diff --git a/icons/pixelarticons/svg/viewport-narrow.svg b/icons/pixelarticons/svg/viewport-narrow.svg new file mode 100644 index 0000000..4bb5f60 --- /dev/null +++ b/icons/pixelarticons/svg/viewport-narrow.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:076d0de96e935f5b8a749f9c170617d99a49434b58ff5ada5a2e0cee007bf25d +size 291 diff --git a/icons/pixelarticons/svg/viewport-wide.svg b/icons/pixelarticons/svg/viewport-wide.svg new file mode 100644 index 0000000..7174408 --- /dev/null +++ b/icons/pixelarticons/svg/viewport-wide.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1056abda75aa4270b109d276a9dc9363d4447ecfaf8f3b8a1dbff704bd0f0342 +size 272 diff --git a/icons/pixelarticons/svg/visible.svg b/icons/pixelarticons/svg/visible.svg new file mode 100644 index 0000000..a660565 --- /dev/null +++ b/icons/pixelarticons/svg/visible.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13f1e369507973942a04213c9254333a1223226c75c4163bb1aba928c60f92de +size 410 diff --git a/icons/pixelarticons/svg/volume-1.svg b/icons/pixelarticons/svg/volume-1.svg new file mode 100644 index 0000000..f15f360 --- /dev/null +++ b/icons/pixelarticons/svg/volume-1.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c23f75942e99ea0e44d1d99f463466165adc6199c25933469185264177dbd9f3 +size 208 diff --git a/icons/pixelarticons/svg/volume-2.svg b/icons/pixelarticons/svg/volume-2.svg new file mode 100644 index 0000000..cba61fa --- /dev/null +++ b/icons/pixelarticons/svg/volume-2.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f80b5dbf91da6d571ad67c477598402e6d23385c37f7b5696366ea2ad7b105f +size 259 diff --git a/icons/pixelarticons/svg/volume-3.svg b/icons/pixelarticons/svg/volume-3.svg new file mode 100644 index 0000000..bd12b84 --- /dev/null +++ b/icons/pixelarticons/svg/volume-3.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ccce35d054f729e5555d75c23a5a5edca3606b4818888de9d8c6becab2ae92cb +size 291 diff --git a/icons/pixelarticons/svg/volume-minus.svg b/icons/pixelarticons/svg/volume-minus.svg new file mode 100644 index 0000000..f7a8c0e --- /dev/null +++ b/icons/pixelarticons/svg/volume-minus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4b09057b6d9447197c979b148d62424f92db1217f8e31112adc07c0eded5dd4 +size 206 diff --git a/icons/pixelarticons/svg/volume-plus.svg b/icons/pixelarticons/svg/volume-plus.svg new file mode 100644 index 0000000..46b4f6a --- /dev/null +++ b/icons/pixelarticons/svg/volume-plus.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d09d32069ef650815f5a1eaba198fa8e1cc123e5e69afa84a8041603cf62128f +size 234 diff --git a/icons/pixelarticons/svg/volume-vibrate.svg b/icons/pixelarticons/svg/volume-vibrate.svg new file mode 100644 index 0000000..417f2d1 --- /dev/null +++ b/icons/pixelarticons/svg/volume-vibrate.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc7a16792fde42fe4777540ae9a5d8c266134b00cbdd5b3d9585f3573556a858 +size 285 diff --git a/icons/pixelarticons/svg/volume-x.svg b/icons/pixelarticons/svg/volume-x.svg new file mode 100644 index 0000000..454d36c --- /dev/null +++ b/icons/pixelarticons/svg/volume-x.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d989f2312427c254d66515162332fad361ce6f884b5b584320089ba9bc5b017b +size 255 diff --git a/icons/pixelarticons/svg/volume.svg b/icons/pixelarticons/svg/volume.svg new file mode 100644 index 0000000..f9ef360 --- /dev/null +++ b/icons/pixelarticons/svg/volume.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a29bfa5f21fa41bc75155c759150e1b86072eb456fe793a5f3f19912861b40c +size 202 diff --git a/icons/pixelarticons/svg/wallet.svg b/icons/pixelarticons/svg/wallet.svg new file mode 100644 index 0000000..e439429 --- /dev/null +++ b/icons/pixelarticons/svg/wallet.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f65aff0100b63633110b412e8e7e5965b8d4c7ed93ac1df9c6ea84db2d885fa +size 201 diff --git a/icons/pixelarticons/svg/warning-box.svg b/icons/pixelarticons/svg/warning-box.svg new file mode 100644 index 0000000..5d559ca --- /dev/null +++ b/icons/pixelarticons/svg/warning-box.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ede1b34198ed695cf011e56b56c6d335b1ed9a1ea7138cdf9749dbf1d0f7c1ee +size 188 diff --git a/icons/pixelarticons/svg/wind.svg b/icons/pixelarticons/svg/wind.svg new file mode 100644 index 0000000..3d62c03 --- /dev/null +++ b/icons/pixelarticons/svg/wind.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5f80399abc63b5792dffda481894493d2374a6ea86ce5df725d98b2f423083b2 +size 197 diff --git a/icons/pixelarticons/svg/zap.svg b/icons/pixelarticons/svg/zap.svg new file mode 100644 index 0000000..9c082cf --- /dev/null +++ b/icons/pixelarticons/svg/zap.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2283a01d56256297fbe26240c563e1253859e9d3747fdaac63c4ff1b1473b80a +size 270 diff --git a/icons/pixelarticons/svg/zoom-in.svg b/icons/pixelarticons/svg/zoom-in.svg new file mode 100644 index 0000000..cac8373 --- /dev/null +++ b/icons/pixelarticons/svg/zoom-in.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe4f60cf12a24a84aeda669d0a59c72a89b768a4299c6db510d3ddead8e72b92 +size 259 diff --git a/icons/pixelarticons/svg/zoom-out.svg b/icons/pixelarticons/svg/zoom-out.svg new file mode 100644 index 0000000..f255b30 --- /dev/null +++ b/icons/pixelarticons/svg/zoom-out.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4978ac6553eac855b60aa409b4e29b4e45deebedc56bb38c71fcff4d5bd89310 +size 241 diff --git a/img/die_shot_apple_m1.avif b/img/die_shot_apple_m1.avif new file mode 100644 index 0000000..157c54b Binary files /dev/null and b/img/die_shot_apple_m1.avif differ diff --git a/img/die_shot_intel_4004.png b/img/die_shot_intel_4004.png new file mode 100644 index 0000000..62648a6 --- /dev/null +++ b/img/die_shot_intel_4004.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79e930d8180bda37e3bc6f38a2825683eb9d2915d6f5c30f65f68316dc9b5b0e +size 1383173 diff --git a/img/die_shot_intel_i7_nehalem.jpg b/img/die_shot_intel_i7_nehalem.jpg new file mode 100644 index 0000000..3021d42 Binary files /dev/null and b/img/die_shot_intel_i7_nehalem.jpg differ diff --git a/img/die_shot_pentium_orig.jpg b/img/die_shot_pentium_orig.jpg new file mode 100644 index 0000000..fcfe13a Binary files /dev/null and b/img/die_shot_pentium_orig.jpg differ diff --git a/img/fediverse.svg b/img/fediverse.svg new file mode 100644 index 0000000..f925c7c --- /dev/null +++ b/img/fediverse.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2f6feda393c1aed4f347961780b2af1c9b4b1985a3e36becf3fcc9000b10004 +size 163386 diff --git a/img/profile.png b/img/profile.png new file mode 100644 index 0000000..b942c3d --- /dev/null +++ b/img/profile.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c733b0df32fc304f64f85217cf3fcfe7cba19ed75d8cfdfacd7ee42a1104385 +size 6740 diff --git a/img/slider-thumb-overlay.avif b/img/slider-thumb-overlay.avif new file mode 100644 index 0000000..6478350 Binary files /dev/null and b/img/slider-thumb-overlay.avif differ diff --git a/img/tildeverse.svg b/img/tildeverse.svg new file mode 100644 index 0000000..6505a31 --- /dev/null +++ b/img/tildeverse.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d1d067c02c43eb77adf222b604c47ded17db72c3ffc867cdcbf2599b0a3df45 +size 15048 diff --git a/img/v60_switch.avif b/img/v60_switch.avif new file mode 100644 index 0000000..44f6f71 Binary files /dev/null and b/img/v60_switch.avif differ diff --git a/index.md b/index.md new file mode 100644 index 0000000..91fe8bd --- /dev/null +++ b/index.md @@ -0,0 +1,16 @@ +--- +layout: index.vto +title: mario's cave at 1159st +short_title: 1159 +description: Using fourier transform to headbang progressive grooves +--- +From a land that streches along the edge of the world, +where the sun rises though the Andes and hides through the cold waters of the Pacific, +a young aspiring magician lives detached from the outside world covered in the shadows of his cave polishing his craft. +Fueled by the power of some wires, this cybernaut gains his joy exploring the infinity of an interconnected network. +Though the natural curiosity of understanding this complex system, he finds joy in learning how this kind of magic works. +In his cave he works on building new technology to help the life of the online explorers. + +Working in microelectronics by day, and developing software at night, this is the journal of a man named Mario. +Here you will find my adventures brewing potions, casting spells on low level code and necromancy rituals over metal symphonies. +Hope your visit to my virtual land gives you fortune and new interests!. \ No newline at end of file diff --git a/js/audio-player.js b/js/audio-player.js new file mode 100644 index 0000000..8922f3e --- /dev/null +++ b/js/audio-player.js @@ -0,0 +1,450 @@ +function scrollText(input, n, s) { + let spaces = '!'.repeat(n - 1); + let fullText = spaces + input + spaces; + let start = s - 1; + let end = start + n; + return fullText.substring(start, end); +} + +document.addEventListener('DOMContentLoaded', () => { + // DOM Elements + const playButton = document.querySelector('.audio-player .play-button'); + const slider = document.querySelector('.audio-player .volume-slider'); + const modeSwitch = document.querySelector('.audio-player .switch input'); + const canvas = document.querySelector('.audio-player .audio-spectrum'); + const ctx = canvas.getContext('2d'); + const ledText = document.querySelector('.audio-player .led-on'); + + // Radio channels + const radioChannels = [ + { name: 'anonradio', url: 'https://anonradio.net:8443/anonradio' }, + { name: 'tilderadio', url: 'https://azuracast.tilderadio.org/radio/8000/radio.ogg' }, + { name: 'texto-plano', url: 'http://texto-plano.xyz:8000/live.ogg' }, + { name: '1159', url: 'http://1159.cl:25565/stream' } + ]; + + let currentChannelIndex = 0; // Default to first channel (anonradio) + let volumeLevel = 50; // Default volume level + let isVolumeMode = true; // Default mode to volume + let metadataQueue = []; // Queue for metadata + let ledInterval = null; + let currentChannelTimeout = null; // Timeout for scheduling CURRENT_CHANNEL state + + // Audio and Player state + let player = null; + let audioFallback = null; + let analyser = null; + let audioContext = null; + let frequencyData = null; + + // Grid dimensions (configurable) + const numRows = 10; // Number of rows in the grid + const numCols = 20; // Number of columns in the grid (must be an even number for frequency bands to be paired) + const gapPercentage = 0.1; // Gap percentage between grid cells + const bandGapPercentage = 0.25; // Gap percentage between pairs of frequency bands + const columnGapPercentage = 0.1; // Gap percentage between columns inside a pair + + // Colors (configurable) + const inactiveColor = '#141f1c'; // Inactive grid color + const activeColor = '#14eb8a'; // Active grid color + + // Enums for Player and Text States + const PlayerState = { + PLAYING: 'playing', + LOADING: 'loading', + PAUSED: 'paused' + }; + + const TextState = { + OFF: 'off', // New default state + IDLE: 'idle', + VOLUME_CHANGE: 'volume_change', + CHANNEL_CHANGE: 'channel_change', + LOADING: 'loading', + METADATA: 'metadata', + CURRENT_CHANNEL: 'current_channel', + SCHEDULE: 'schedule', + TIME: 'time' + }; + + let playerState = PlayerState.PAUSED; // Initial player state + let textState = TextState.OFF; // Set default text state to OFF + let currentScrollIndex = 1; // For scrolling text + let currentScrollText = ''; // Text being scrolled + + canvas.width = canvas.offsetWidth; + canvas.height = canvas.offsetHeight; + + // Helper Functions + function setPlayPauseIcon(state) { + const playButtonImg = playButton.querySelector("img"); + switch (state) { + case PlayerState.PLAYING: + playButtonImg.src = "/icons/pixelarticons/svg/pause.svg"; + break; + case PlayerState.LOADING: + playButtonImg.src = "/icons/pixelarticons/svg/loader.svg"; + break; + case PlayerState.PAUSED: + default: + playButtonImg.src = "/icons/pixelarticons/svg/play.svg"; + break; + } + playButton.disabled = false; // Ensure button is enabled after state change + } + + function resetUI() { + setPlayPauseIcon(PlayerState.PAUSED); + } + + function logChannelOrVolume() { + if (isVolumeMode) { + console.log(`Volume set to: ${volumeLevel}`); + } else { + console.log(`Radio channel: ${radioChannels[currentChannelIndex].name}`); + } + } + + function stopCurrentPlayback() { + if (player && player.state === "playing") { + player.stop(); + } + + if (audioFallback) { + audioFallback.pause(); + audioFallback.src = ""; + audioFallback.load(); + audioFallback = null; + } + playerState = PlayerState.PAUSED; + setTextState(TextState.OFF); // Set text state to OFF when playback is stopped + } + + // Text State Handling + function setTextState(state) { + clearInterval(ledInterval); // Clear any ongoing interval + clearTimeout(currentChannelTimeout); // Clear any existing timeout for CURRENT_CHANNEL + textState = state; + currentScrollIndex = 1; // Reset scroll index for new text + + if (state === TextState.OFF) { + // Clear the display + ledText.textContent = '!!!!!!!!'; + } else if (state === TextState.LOADING) { + // Blink "loading" text + ledInterval = setInterval(() => { + ledText.textContent = ledText.textContent === "!!!!!!!!" ? "loading" : "!!!!!!!!"; // Blinking effect + }, 500); + } else if (state === TextState.VOLUME_CHANGE) { + // Show volume in the format "vol: xx" + ledText.textContent = `vol: ${volumeLevel.toString().padStart(2, '0')}`; + setTimeout(() => setTextState(TextState.IDLE), 1000); // Revert to idle after 1 second + } else if (state === TextState.CHANNEL_CHANGE) { + // Show the current channel (first 4 letters) + const channelName = radioChannels[currentChannelIndex].name.substring(0, 4); + ledText.textContent = `ch: ${channelName}`; + setTimeout(() => setTextState(TextState.IDLE), 1000); // Revert to idle after 1 second + } else if (state === TextState.METADATA || state === TextState.CURRENT_CHANNEL) { + // Start scrolling text + currentScrollText = state === TextState.METADATA ? metadataQueue[0] : radioChannels[currentChannelIndex].name; + startScrollingText(currentScrollText); + } else if (state === TextState.IDLE) { + ledText.textContent = '!!!!!!!!'; // Clear the display when idle + + // Schedule the CURRENT_CHANNEL state after 10 seconds if there's no metadata + if (metadataQueue.length === 0) { + currentChannelTimeout = setTimeout(() => { + setTextState(TextState.CURRENT_CHANNEL); + }, 10000); // 10 seconds delay to show the current channel name + } + } + } + + // Scroll Function + function startScrollingText(text) { + const n = 8; // LED display size + + ledInterval = setInterval(() => { + // Scroll the text using the scrollText function + ledText.textContent = scrollText(text, n, currentScrollIndex); + currentScrollIndex++; + + // Check if scrolling is done + if (currentScrollIndex > text.length + n) { + clearInterval(ledInterval); + if (textState === TextState.METADATA) { + metadataQueue.shift(); // Remove the current metadata from the queue + } + setTextState(TextState.IDLE); // Revert to idle after scrolling is complete + } + }, 250); // Speed of scrolling + } + + // Metadata Queue Handling + function handleMetadata(metadata) { + metadataQueue.push(metadata); + if (textState === TextState.IDLE && metadataQueue.length > 0) { + setTextState(TextState.METADATA); // Show metadata if the player is idle + } + } + + // Initialize Player Function + function initializePlayer(streamUrl) { + stopCurrentPlayback(); // Ensure any current playback is stopped + + resetUI(); + setTextState(TextState.LOADING); // Set text to loading state + setPlayPauseIcon(PlayerState.LOADING); // Set button to loading state + playerState = PlayerState.LOADING; + + const onMetadata = (metadata) => { + if (metadata && metadata.StreamTitle) { + handleMetadata(metadata.StreamTitle); // Queue the metadata to be displayed + } + setPlayPauseIcon(PlayerState.PLAYING); // Update the button icon as soon as playback starts + playerState = PlayerState.PLAYING; // Update state to playing + setTextState(TextState.IDLE); // Reset text to idle once loading completes + }; + + const onError = (error) => { + console.error('Icecast playback failed:', error); + fallbackToAudio(streamUrl); // Handle fallback if Icecast fails + }; + + player = new IcecastMetadataPlayer(streamUrl, { onMetadata, onError }); + + if (player.audioElement) { + setupAudioContext(player.audioElement); + player.play().then(() => { + setPlayPauseIcon(PlayerState.PLAYING); // Ensure the button updates after playback starts + playerState = PlayerState.PLAYING; // Set state to playing + setTextState(TextState.IDLE); // Set text state to idle when playback starts + }).catch(() => { + setPlayPauseIcon(PlayerState.PAUSED); // Reset icon if play fails + playerState = PlayerState.PAUSED; + }); + } + } + + // Fallback to Audio Function + function fallbackToAudio(streamUrl) { + audioFallback = new Audio(streamUrl); + audioFallback.volume = volumeLevel / 100; + setPlayPauseIcon(PlayerState.LOADING); + playerState = PlayerState.LOADING; + + audioFallback.addEventListener('playing', () => { + setPlayPauseIcon(PlayerState.PLAYING); // Update icon once fallback starts playing + playerState = PlayerState.PLAYING; + setTextState(TextState.IDLE); // Set the text status to IDLE when fallback starts playing + }); + + audioFallback.addEventListener('canplay', () => { + audioFallback.play().then(() => { + console.log('Fallback playback started'); + setPlayPauseIcon(PlayerState.PLAYING); // Ensure the icon updates correctly + playerState = PlayerState.PLAYING; + setTextState(TextState.IDLE); // Set the text status to IDLE when playback starts + }).catch(() => { + setPlayPauseIcon(PlayerState.PAUSED); + playerState = PlayerState.PAUSED; + setTextState(TextState.OFF); // In case of failure, reset the text state + }); + }); + + audioFallback.addEventListener('error', () => { + console.error('Fallback audio failed.'); + setPlayPauseIcon(PlayerState.PAUSED); + playerState = PlayerState.PAUSED; + setTextState(TextState.OFF); // In case of an error, set text state to OFF + }); + } + + // Setup Audio Context + function setupAudioContext(stream) { + try { + audioContext = new (window.AudioContext || window.webkitAudioContext)(); + const source = audioContext.createMediaElementSource(stream); + analyser = audioContext.createAnalyser(); + analyser.fftSize = 64; + frequencyData = new Uint8Array(analyser.frequencyBinCount); + + source.connect(analyser); + analyser.connect(audioContext.destination); + + drawSpectrum(); // Start drawing the spectrum visualization + } catch (e) { + console.warn("Audio context failed:", e); + analyser = null; + } + } + + // Draw Spectrum Function + function drawSpectrum() { + if (!analyser || !frequencyData) return; + + analyser.getByteFrequencyData(frequencyData); + + const availableWidth = canvas.width; + const numPairs = numCols / 2; + + const totalUnits = numCols + numPairs * columnGapPercentage + (numPairs - 1) * bandGapPercentage; + const barWidth = availableWidth / totalUnits; + const columnGapWidth = barWidth * columnGapPercentage; + const bandGapWidth = barWidth * bandGapPercentage; + + const rowHeight = canvas.height / numRows; // Dynamic row height based on configurable number of rows + const gapHeight = rowHeight * gapPercentage; + + ctx.clearRect(0, 0, canvas.width, canvas.height); + + let barPosition = 0; + for (let pairIndex = 0; pairIndex < numPairs; pairIndex++) { + const frequencyIndex = pairIndex; + let frequencyValue = frequencyData[frequencyIndex]; + + const numActiveRows = Math.floor((frequencyValue / 255) * numRows); + + // First bar in pair + for (let j = 0; j < numRows; j++) { + const color = j < numActiveRows ? activeColor : inactiveColor; // Use configurable colors + ctx.fillStyle = color; + ctx.fillRect( + barPosition, + (numRows - j - 1) * rowHeight + gapHeight / 2, + barWidth, + rowHeight - gapHeight + ); + } + barPosition += barWidth; + + // Add column gap + barPosition += columnGapWidth; + + // Second bar in pair + for (let j = 0; j < numRows; j++) { + const color = j < numActiveRows ? activeColor : inactiveColor; // Use configurable colors + ctx.fillStyle = color; + ctx.fillRect( + barPosition, + (numRows - j - 1) * rowHeight + gapHeight / 2, + barWidth, + rowHeight - gapHeight + ); + } + barPosition += barWidth; + + // Add band gap after each pair except the last one + if (pairIndex < numPairs - 1) { + barPosition += bandGapWidth; + } + } + + requestAnimationFrame(drawSpectrum); // Keep animating + } + + // Grid Initialization Function + function drawGrid() { + const availableWidth = canvas.width; + const numPairs = numCols / 2; + + const totalUnits = numCols + numPairs * columnGapPercentage + (numPairs - 1) * bandGapPercentage; + const barWidth = availableWidth / totalUnits; + const columnGapWidth = barWidth * columnGapPercentage; + const bandGapWidth = barWidth * bandGapPercentage; + + const rowHeight = canvas.height / numRows; // Dynamic row height based on configurable number of rows + const gapHeight = rowHeight * gapPercentage; + + ctx.clearRect(0, 0, canvas.width, canvas.height); + + let barPosition = 0; + for (let pairIndex = 0; pairIndex < numPairs; pairIndex++) { + // First bar in pair + for (let j = 0; j < numRows; j++) { + ctx.fillStyle = inactiveColor; // Use configurable inactive color + ctx.fillRect( + barPosition, + (numRows - j - 1) * rowHeight + gapHeight / 2, + barWidth, + rowHeight - gapHeight + ); + } + barPosition += barWidth; + + // Add column gap + barPosition += columnGapWidth; + + // Second bar in pair + for (let j = 0; j < numRows; j++) { + ctx.fillStyle = inactiveColor; // Use configurable inactive color + ctx.fillRect( + barPosition, + (numRows - j - 1) * rowHeight + gapHeight / 2, + barWidth, + rowHeight - gapHeight + ); + } + barPosition += barWidth; + + // Add band gap after each pair except the last one + if (pairIndex < numPairs - 1) { + barPosition += bandGapWidth; + } + } + } + + // Event Listeners for Volume/Channel Changes + slider.addEventListener('input', () => { + const sliderValue = slider.value; + + if (isVolumeMode) { + volumeLevel = sliderValue; + if (player && player.audioElement) { + player.audioElement.volume = volumeLevel / 100; + } + if (audioFallback) { + audioFallback.volume = volumeLevel / 100; + } + setTextState(TextState.VOLUME_CHANGE); // Set text state to volume change + } else { + currentChannelIndex = Math.floor((sliderValue / 100) * radioChannels.length); + setTextState(TextState.CHANNEL_CHANGE); // Set text state to channel change + } + + logChannelOrVolume(); + }); + + // Toggle Switch Mode Handling and Slider Update + modeSwitch.addEventListener('change', () => { + isVolumeMode = modeSwitch.checked; + + if (isVolumeMode) { + console.log("Switched to Volume Mode"); + slider.value = volumeLevel; // Update slider to current volume + } else { + console.log("Switched to Channel Mode"); + slider.value = (currentChannelIndex / (radioChannels.length - 1)) * 100; // Update slider to current channel position + } + + logChannelOrVolume(); // Log the current value + }); + + playButton.addEventListener('click', () => { + if (playerState === PlayerState.PLAYING) { + stopCurrentPlayback(); + setPlayPauseIcon(PlayerState.PAUSED); + setTextState(TextState.OFF); // Set to OFF when paused + } else { + const selectedChannelUrl = radioChannels[currentChannelIndex].url; + setTextState(TextState.LOADING); + initializePlayer(selectedChannelUrl); + } + }); + + // Ensure the grid is initialized on page load + drawGrid(); + + // Turn the LED display OFF initially + setTextState(TextState.OFF); +}); diff --git a/js/calendar.js b/js/calendar.js new file mode 100644 index 0000000..16ce17c --- /dev/null +++ b/js/calendar.js @@ -0,0 +1,128 @@ +import ICAL from "../lib/ical.min.js" + +document.addEventListener("DOMContentLoaded", function() { + const monthNames = ["January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December"]; + + let currentMonth = new Date().getMonth(); + let currentYear = new Date().getFullYear(); + let eventsData = {}; + + fetch('http://mario.sdf.org/public_events.ical') + .then(response => response.text()) + .then(data => { + const parsedICal = ICAL.parse(data); + const comp = new ICAL.Component(parsedICal); + const vevents = comp.getAllSubcomponents('vevent'); + + vevents.forEach(event => { + const eventStart = ICAL.Time.fromData(event.getFirstPropertyValue('dtstart')).toJSDate(); + const eventDate = new Date(eventStart.getFullYear(), eventStart.getMonth(), eventStart.getDate()); + + const key = `${eventDate.getFullYear()}-${eventDate.getMonth() + 1}-${eventDate.getDate()}`; + if (!eventsData[key]) { + eventsData[key] = []; + } + + eventsData[key].push(event.getFirstPropertyValue('summary')); + }); + + renderCalendar(currentMonth, currentYear); + }); + + function renderCalendar(month, year) { + const firstDay = new Date(year, month, 1).getDay(); + const lastDate = new Date(year, month + 1, 0).getDate(); + const lastDatePrevMonth = new Date(year, month, 0).getDate(); + + document.querySelector(".month th[colspan='5']").textContent = `${monthNames[month]} ${year}`; + + const daysCells = document.querySelectorAll(".days td"); + daysCells.forEach(cell => { + cell.textContent = ''; + cell.classList.remove("cal-preview-next", "cal-preview-prev", "active", "event"); + }); + + let startDay = (firstDay === 0) ? 6 : firstDay - 1; + for (let i = startDay - 1; i >= 0; i--) { + daysCells[i].textContent = lastDatePrevMonth - (startDay - 1 - i); + daysCells[i].classList.add("cal-preview-prev"); + } + + let dayCounter = 1; + for (let i = startDay; i < startDay + lastDate; i++) { + const currentDay = dayCounter++; + + daysCells[i].textContent = currentDay; + + const eventKey = `${year}-${month + 1}-${currentDay}`; + + if (eventsData[eventKey] && eventsData[eventKey].length > 0) { + daysCells[i].classList.add("event"); + } + + daysCells[i].addEventListener('mouseover', function() { + const hoverDate = new Date(year, month, currentDay); + updateEventsTable(hoverDate); + }); + } + + let nextMonthCounter = 1; + for (let i = startDay + lastDate; i < daysCells.length; i++) { + daysCells[i].textContent = nextMonthCounter++; + daysCells[i].classList.add("cal-preview-next"); + } + + const today = new Date(); + if (today.getFullYear() === year && today.getMonth() === month) { + daysCells[startDay + today.getDate() - 1].classList.add("active"); + updateEventsTable(today); + } + + daysCells.forEach(cell => { + cell.addEventListener('mouseleave', function() { + updateEventsTable(today) + }); + }); + } + + + function updateEventsTable(date) { + const key = `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`; + const eventsTable = document.querySelector(".events"); + const header = eventsTable.querySelector("th"); + const eventsBody = eventsTable.querySelector("tr:nth-child(2)"); + + header.textContent = `Events on ${date.toDateString()}`; + + if (eventsData[key]) { + eventsBody.innerHTML = eventsData[key].map(event => `${event}`).join(''); + } else { + eventsBody.innerHTML = "Nothing special today."; + } + } + + function changeMonth(delta) { + currentMonth += delta; + + if (currentMonth < 0) { + currentMonth = 11; + currentYear--; + } else if (currentMonth > 11) { + currentMonth = 0; + currentYear++; + } + + renderCalendar(currentMonth, currentYear); + } + + document.querySelector(".prev").addEventListener("click", function() { + changeMonth(-1); + }); + + document.querySelector(".next").addEventListener("click", function() { + changeMonth(1); + }); + + renderCalendar(currentMonth, currentYear); +}); diff --git a/js/clock.js b/js/clock.js new file mode 100644 index 0000000..e7d3c7a --- /dev/null +++ b/js/clock.js @@ -0,0 +1,198 @@ +document.addEventListener('DOMContentLoaded', () => { + const canvas = document.querySelector('.analog-clock'); + const ctx = canvas.getContext('2d'); + const digitalClock = document.querySelector('.digital-clock .time'); + const timezoneToggle = document.getElementsByClassName('toggle-timezone')[0]; + + const pixelSize = 2; // Size of each "pixel" + + // Color variables + const clockFaceColor = '#b8c1e0'; + const clockFaceBackgroundColor = 'transparent'; // Make background transparent + const hourHandColor = '#0c8d53'; + const minuteHandColor = '#72f3b9'; + const secondHandColor = '#14eb8a'; + const hourMarkerColor = '#7182c1'; + + let canvasWidth, canvasHeight; + let centerX, centerY, radius; + + let timezoneOffset = -3; // Initially set to CL (UTC-3) + + // Resize canvas to fill 100% of its container + function resizeCanvas() { + canvasWidth = canvas.clientWidth; + canvasHeight = canvas.clientHeight; + + // Instead of setting canvas width and height in JavaScript, rely on CSS + canvas.width = canvas.clientWidth; + canvas.height = canvas.clientHeight; + + centerX = canvas.width / 2; + centerY = canvas.height / 2; + radius = (Math.min(canvas.width, canvas.height) / 2) - pixelSize * 2; + + drawClock(); // Redraw clock after resizing + } + + // Event listener for window resize + window.addEventListener('resize', resizeCanvas); + + // Toggle between UTC and CL time zones + timezoneToggle.addEventListener('change', function() { + if (this.checked) { + timezoneOffset = 0; // UTC + } else { + timezoneOffset = -3; // Santiago, Chile (UTC-3) + } + }); + + function drawClock() { + // Clear canvas + ctx.clearRect(0, 0, canvas.width, canvas.height); + + // No need to fill background, keep it transparent + drawClockFace(); + drawClockHands(); + updateDigitalClock(); + } + + function drawClockFace() { + // Draw clock face using pixel art circle + ctx.fillStyle = clockFaceColor; + drawCircle(centerX, centerY, radius); + + // Draw hour markers + ctx.fillStyle = hourMarkerColor; + for (let hour = 0; hour < 12; hour++) { + const angle = (Math.PI / 6) * hour - Math.PI / 2; + const x1 = centerX + Math.cos(angle) * (radius - pixelSize * 5); + const y1 = centerY + Math.sin(angle) * (radius - pixelSize * 5); + const x2 = centerX + Math.cos(angle) * radius; + const y2 = centerY + Math.sin(angle) * radius; + + drawLine(x1, y1, x2, y2); + } + } + + function drawCircle(x0, y0, radius) { + x0 = Math.round(x0 / pixelSize) * pixelSize; + y0 = Math.round(y0 / pixelSize) * pixelSize; + radius = Math.round(radius / pixelSize) * pixelSize; + + let x = 0; + let y = radius; + let d = 1 - radius; + + while (x <= y) { + drawCirclePoints(x0, y0, x, y); + x += pixelSize; + if (d < 0) { + d += 2 * x + pixelSize; + } else { + y -= pixelSize; + d += 2 * (x - y) + pixelSize; + } + } + } + + function drawCirclePoints(x0, y0, x, y) { + drawPixel(x0 + x, y0 + y); + drawPixel(x0 - x, y0 + y); + drawPixel(x0 + x, y0 - y); + drawPixel(x0 - x, y0 - y); + drawPixel(x0 + y, y0 + x); + drawPixel(x0 - y, y0 + x); + drawPixel(x0 + y, y0 - x); + drawPixel(x0 - y, y0 - x); + } + + function drawClockHands() { + const now = new Date(); + // Adjust time according to timezoneOffset + const utc = now.getTime() + (now.getTimezoneOffset() * 60000); + const localTime = new Date(utc + (timezoneOffset * 3600000)); + + const hours = localTime.getHours() % 12; + const minutes = localTime.getMinutes(); + const seconds = localTime.getSeconds(); + + // Calculate angles + const hourAngle = ((Math.PI / 6) * hours) + ((Math.PI / 360) * minutes) - Math.PI / 2; + const minuteAngle = ((Math.PI / 30) * minutes) - Math.PI / 2; + const secondAngle = ((Math.PI / 30) * seconds) - Math.PI / 2; + + // Draw hour hand + ctx.fillStyle = hourHandColor; + drawHand(hourAngle, radius * 0.5); + + // Draw minute hand + ctx.fillStyle = minuteHandColor; + drawHand(minuteAngle, radius * 0.8); + + // Draw second hand + ctx.fillStyle = secondHandColor; + drawHand(secondAngle, radius * 0.9); + } + + function drawHand(angle, length) { + const x1 = centerX; + const y1 = centerY; + const x2 = centerX + Math.cos(angle) * length; + const y2 = centerY + Math.sin(angle) * length; + + drawLine(x1, y1, x2, y2); + } + + function drawLine(x0, y0, x1, y1) { + x0 = Math.round(x0 / pixelSize) * pixelSize; + y0 = Math.round(y0 / pixelSize) * pixelSize; + x1 = Math.round(x1 / pixelSize) * pixelSize; + y1 = Math.round(y1 / pixelSize) * pixelSize; + + const dx = Math.abs(x1 - x0); + const dy = -Math.abs(y1 - y0); + + const sx = (x0 < x1) ? pixelSize : -pixelSize; + const sy = (y0 < y1) ? pixelSize : -pixelSize; + + let err = dx + dy; + + while (true) { + drawPixel(x0, y0); + + if (x0 === x1 && y0 === y1) break; + + const e2 = 2 * err; + if (e2 >= dy) { + err += dy; + x0 += sx; + } + if (e2 <= dx) { + err += dx; + y0 += sy; + } + } + } + + function drawPixel(x, y) { + ctx.fillRect(x - (pixelSize / 2), y - (pixelSize / 2), pixelSize, pixelSize); + } + + function updateDigitalClock() { + const now = new Date(); + const utc = now.getTime() + (now.getTimezoneOffset() * 60000); + const localTime = new Date(utc + (timezoneOffset * 3600000)); + + const hours = String(localTime.getHours()).padStart(2, '0'); + const minutes = String(localTime.getMinutes()).padStart(2, '0'); + const seconds = String(localTime.getSeconds()).padStart(2, '0'); + + digitalClock.textContent = `${hours}:${minutes}:${seconds}`; + } + + // Initial setup + resizeCanvas(); + setInterval(drawClock, 1000); + drawClock(); // Initial call to display clock immediately +}); diff --git a/js/theme-toggle.js b/js/theme-toggle.js new file mode 100644 index 0000000..0ce9452 --- /dev/null +++ b/js/theme-toggle.js @@ -0,0 +1,22 @@ +document.addEventListener('DOMContentLoaded', () => { + const themeToggle = document.getElementById('theme-toggle'); + const themeIcon = document.getElementById('theme-icon'); + + function applyTheme(theme) { + document.documentElement.setAttribute('data-theme', theme); + themeIcon.src = theme === 'dark' ? 'icons/pixelarticons/svg/moon.svg' : 'icons/pixelarticons/svg/sun-alt.svg'; + themeToggle.checked = theme === 'dark'; + } + + const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; + + applyTheme(systemPrefersDark ? 'dark' : 'light'); + + themeToggle.addEventListener('change', function() { + if (this.checked) { + applyTheme('dark'); + } else { + applyTheme('light'); + } + }); +}); diff --git a/lib/ical.min.js b/lib/ical.min.js new file mode 100644 index 0000000..5a3aa83 --- /dev/null +++ b/lib/ical.min.js @@ -0,0 +1,5 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * Portions Copyright (C) Philipp Kewisch */ +class t{static fromString(e){return new t(e)}constructor(t){this.value=t}icaltype="binary";decodeValue(){return this._b64_decode(this.value)}setEncodedValue(t){this.value=this._b64_encode(t)}_b64_encode(t){let e,i,r,n,s,a,o,l,h="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",u=0,c=0,d="",m=[];if(!t)return t;do{e=t.charCodeAt(u++),i=t.charCodeAt(u++),r=t.charCodeAt(u++),l=e<<16|i<<8|r,n=l>>18&63,s=l>>12&63,a=l>>6&63,o=63&l,m[c++]=h.charAt(n)+h.charAt(s)+h.charAt(a)+h.charAt(o)}while(u>16&255,i=l>>8&255,r=255&l,m[c++]=64==a?String.fromCharCode(e):64==o?String.fromCharCode(e,i):String.fromCharCode(e,i,r)}while(ui)-(e12||(i=[0,31,28,31,30,31,30,31,31,30,31,30,31][t],2==t&&(i+=s.isLeapYear(e))),i}static isLeapYear(t){return t<=1752?t%4==0:t%4==0&&t%100!=0||t%400==0}static fromDayOfYear(t,e){let i=e,r=t,n=new s;n.auto_normalize=!1;let a=s.isLeapYear(i)?1:0;if(r<1)return i--,a=s.isLeapYear(i)?1:0,r+=s.daysInYearPassedMonth[a][12],s.fromDayOfYear(r,i);if(r>s.daysInYearPassedMonth[a][12])return a=s.isLeapYear(i)?1:0,r-=s.daysInYearPassedMonth[a][12],i++,s.fromDayOfYear(r,i);n.year=i,n.isDate=!0;for(let t=11;t>=0;t--)if(r>s.daysInYearPassedMonth[a][t]){n.month=t+1,n.day=r-s.daysInYearPassedMonth[a][t];break}return n.auto_normalize=!0,n}static fromStringv2(t){return new s({year:parseInt(t.slice(0,4),10),month:parseInt(t.slice(5,7),10),day:parseInt(t.slice(8,10),10),isDate:!0})}static fromDateString(t){return new s({year:p(t.slice(0,4)),month:p(t.slice(5,7)),day:p(t.slice(8,10)),isDate:!0})}static fromDateTimeString(t,e){if(t.length<19)throw new Error('invalid date-time value: "'+t+'"');let i,r;t[19]&&"Z"===t[19]?i=c.utcTimezone:e&&(r=e.getParameter("tzid"),e.parent&&("standard"===e.parent.name||"daylight"===e.parent.name?i=c.localTimezone:r&&(i=e.parent.getTimeZoneByID(r))));const n={year:p(t.slice(0,4)),month:p(t.slice(5,7)),day:p(t.slice(8,10)),hour:p(t.slice(11,13)),minute:p(t.slice(14,16)),second:p(t.slice(17,19))};return r&&!i&&(n.timezone=r),new s(n,i)}static fromString(t,e){return t.length>10?s.fromDateTimeString(t,e):s.fromDateString(t)}static fromJSDate(t,e){return(new s).fromJSDate(t,e)}static fromData=function(t,e){return(new s).fromData(t,e)};static now(){return s.fromJSDate(new Date,!1)}static weekOneStarts(t,e){let i=s.fromData({year:t,month:1,day:1,isDate:!0}),r=i.dayOfWeek(),n=e||s.DEFAULT_WEEK_START;return r>s.THURSDAY&&(i.day+=7),n>s.THURSDAY&&(i.day-=7),i.day-=r-n,i}static getDominicalLetter(t){let e="GFEDCBA",i=(t+(t/4|0)+(t/400|0)-(t/100|0)-1)%7;return s.isLeapYear(t)?e[(i+6)%7]+e[i]:e[i]}static#t=null;static get epochTime(){return this.#t||(this.#t=s.fromData({year:1970,month:1,day:1,hour:0,minute:0,second:0,isDate:!1,timezone:"Z"})),this.#t}static _cmp_attr(t,e,i){return t[i]>e[i]?1:t[i]=0){o.day=1,0!=n&&n--,a=o.day;let e=t-o.dayOfWeek();e<0&&(e+=7),a+=e,a-=t,i=t}else{o.day=r,n++,i=o.dayOfWeek()-t,i<0&&(i+=7),i=r-i}return i+=7*n,a+i}isNthWeekDay(t,e){let i=this.dayOfWeek();return 0===e&&i===t||this.nthWeekDay(t,e)===this.day}weekNumber(t){let e,i=(this.year<<12)+(this.month<<8)+(this.day<<3)+t;if(i in s._wnCache)return s._wnCache[i];let r=this.clone();r.isDate=!0;let n=this.year;12==r.month&&r.day>25?(e=s.weekOneStarts(n+1,t),r.compare(e)<0?e=s.weekOneStarts(n,t):n++):(e=s.weekOneStarts(n,t),r.compare(e)<0&&(e=s.weekOneStarts(--n,t)));let a=A(r.subtractDate(e).toSeconds()/86400/7)+1;return s._wnCache[i]=a,a}addDuration(t){let e=t.isNegative?-1:1,i=this.second,r=this.minute,n=this.hour,s=this.day;i+=e*t.seconds,r+=e*t.minutes,n+=e*t.hours,s+=e*t.days,s+=7*e*t.weeks,this.second=i,this.minute=r,this.hour=n,this.day=s,this._cachedUnixTime=null}subtractDate(t){let e=this.toUnixTime()+this.utcOffset(),i=t.toUnixTime()+t.utcOffset();return r.fromSeconds(e-i)}subtractDateTz(t){let e=this.toUnixTime(),i=t.toUnixTime();return r.fromSeconds(e-i)}compare(t){let e=this.toUnixTime(),i=t.toUnixTime();return e>i?1:i>e?-1:0}compareDateOnlyTz(t,e){let i=this.convertToZone(e),r=t.convertToZone(e),n=0;return 0!=(n=s._cmp_attr(i,r,"year"))||0!=(n=s._cmp_attr(i,r,"month"))||(n=s._cmp_attr(i,r,"day")),n}convertToZone(t){let e=this.clone(),i=this.zone.tzid==t.tzid;return this.isDate||i||c.convert_time(e,this.zone,t),e.zone=t,e}utcOffset(){return this.zone==c.localTimezone||this.zone==c.utcTimezone?0:this.zone.utcOffset(this)}toICALString(){let t=this.toString();return t.length>10?ut.icalendar.value["date-time"].toICAL(t):ut.icalendar.value.date.toICAL(t)}toString(){let t=this.year+"-"+Y(this.month)+"-"+Y(this.day);return this.isDate||(t+="T"+Y(this.hour)+":"+Y(this.minute)+":"+Y(this.second),this.zone===c.utcTimezone&&(t+="Z")),t}toJSDate(){return this.zone==c.localTimezone?this.isDate?new Date(this.year,this.month-1,this.day):new Date(this.year,this.month-1,this.day,this.hour,this.minute,this.second,0):new Date(1e3*this.toUnixTime())}_normalize(){return this._time.isDate&&(this._time.hour=0,this._time.minute=0,this._time.second=0),this.adjust(0,0,0,0),this}adjust(t,e,i,r,n){let a,o,l,h,u,c,d,m=0,f=0,p=n||this._time;if(p.isDate||(l=p.second+r,p.second=l%60,a=A(l/60),p.second<0&&(p.second+=60,a--),h=p.minute+i+a,p.minute=h%60,o=A(h/60),p.minute<0&&(p.minute+=60,o--),u=p.hour+e+o,p.hour=u%24,m=A(u/24),p.hour<0&&(p.hour+=24,m--)),p.month>12?f=A((p.month-1)/12):p.month<1&&(f=A(p.month/12)-1),p.year+=f,p.month-=12*f,c=p.day+t+m,c>0)for(;d=s.daysInMonth(p.month,p.year),!(c<=d);)p.month++,p.month>12&&(p.year++,p.month=1),c-=d;else for(;c<=0;)1==p.month?(p.year--,p.month=12):p.month--,c+=s.daysInMonth(p.month,p.year);return p.day=c,this._cachedUnixTime=null,this}fromUnixTime(t){this.zone=c.utcTimezone;let e=new Date(1e3*t);this.year=e.getUTCFullYear(),this.month=e.getUTCMonth()+1,this.day=e.getUTCDate(),this._time.isDate?(this.hour=0,this.minute=0,this.second=0):(this.hour=e.getUTCHours(),this.minute=e.getUTCMinutes(),this.second=e.getUTCSeconds()),this._cachedUnixTime=null}toUnixTime(){if(null!==this._cachedUnixTime)return this._cachedUnixTime;let t=this.utcOffset(),e=Date.UTC(this.year,this.month-1,this.day,this.hour,this.minute,this.second-t);return this._cachedUnixTime=e/1e3,this._cachedUnixTime}toJSON(){let t,e=["year","month","day","hour","minute","second","isDate"],i=Object.create(null),r=0,n=e.length;for(;r1)throw new h("invalid ical body. component began but did not end");return e=null,1==i.length?i[0]:i}l.property=function(t,e){let i={component:[[],[]],designSet:e||ut.defaultSet};return l._handleContentLine(t,i),i.component[1][0]},l.component=function(t){return l(t)};class h extends Error{constructor(t){super(t),this.name=this.constructor.name;try{throw new Error}catch(t){if(t.stack){let e=t.stack.split("\n");e.shift(),this.stack=e.join("\n")}}}}l.ParserError=h,l._handleContentLine=function(t,e){let i,r,n,s,a,o,u=t.indexOf(":"),c=t.indexOf(";"),d={};if(-1!==c&&-1!==u&&c>u&&(c=-1),-1!==c){if(n=t.slice(0,Math.max(0,c)).toLowerCase(),a=l._parseParameters(t.slice(Math.max(0,c)),0,e.designSet),-1==a[2])throw new h("Invalid parameters in '"+t+"'");if(d=a[0],i=a[1].length+a[2]+c,-1===(r=t.slice(Math.max(0,i)).indexOf(":")))throw new h("Missing parameter value in '"+t+"'");s=t.slice(Math.max(0,i+r+1))}else{if(-1===u)throw new h('invalid line (no token ";" or ":") "'+t+'"');if(n=t.slice(0,Math.max(0,u)).toLowerCase(),s=t.slice(Math.max(0,u+1)),"begin"===n){let t=[s.toLowerCase(),[],[]];return 1===e.stack.length?e.component.push(t):e.component[2].push(t),e.stack.push(e.component),e.component=t,void(e.designSet||(e.designSet=ut.getDesignSet(e.component[0])))}if("end"===n)return void(e.component=e.stack.pop())}let m,f,p,y,_=!1,g=!1;e.designSet.propertyGroups&&-1!==n.indexOf(".")?(f=n.split("."),d.group=f[0],p=f[1]):p=n,p in e.designSet.property&&(m=e.designSet.property[p],"multiValue"in m&&(_=m.multiValue),"structuredValue"in m&&(g=m.structuredValue),s&&"detectType"in m&&(o=m.detectType(s))),o||(o="value"in d?d.value.toLowerCase():m?m.defaultType:"unknown"),delete d.value,_&&g?(s=l._parseMultiValue(s,g,o,[],_,e.designSet,g),y=[p,d,o,s]):_?(y=[p,d,o],l._parseMultiValue(s,_,o,y,null,e.designSet,!1)):g?(s=l._parseMultiValue(s,g,o,[],null,e.designSet,g),y=[p,d,o,s]):(s=l._parseValue(s,o,e.designSet,!1),y=[p,d,o,s]),"vcard"!==e.component[0]||0!==e.component[1].length||"version"===n&&"4.0"===s||(e.designSet=ut.getDesignSet("vcard3")),e.component[1].push(y)},l._parseValue=function(t,e,i,r){return e in i.value&&"fromICAL"in i.value[e]?i.value[e].fromICAL(t,r):t},l._parseParameters=function(t,e,i){let r,n,s,a,o,u,c=e,d=0,m={},f=-1;for(;!1!==d&&-1!==(d=_(t,"=",d+1));){if(r=t.slice(c+1,d),0==r.length)throw new h("Empty parameter name in '"+t+"'");if(n=r.toLowerCase(),u=!1,o=!1,a=n in i.param&&i.param[n].valueType?i.param[n].valueType:"text",n in i.param&&(o=i.param[n].multiValue,i.param[n].multiValueSeparateDQuote&&(u=l._rfc6868Escape('"'+o+'"'))),'"'===t[d+1]){if(f=d+2,d=_(t,'"',f),o&&-1!=d){let e=!0;for(;e;)t[d+1]==o&&'"'==t[d+2]?d=_(t,'"',d+3):e=!1}if(-1===d)throw new h('invalid line (no matching double quote) "'+t+'"');s=t.slice(f,d),c=_(t,";",d),-1===c&&(d=!1)}else{f=d+1;let e=_(t,";",f),i=_(t,":",f);-1!==i&&e>i?(e=i,d=!1):-1===e?(e=-1===i?t.length:i,d=!1):(c=e,d=e),s=t.slice(f,e)}if(s=l._rfc6868Escape(s),o){let t=u||o;s=l._parseMultiValue(s,t,a,[],null,i)}else s=l._parseValue(s,a,i);o&&n in m?Array.isArray(m[n])?m[n].push(s):m[n]=[m[n],s]:m[n]=s}return[m,s,f]},l._rfc6868Escape=function(t){return t.replace(/\^['n^]/g,(function(t){return o[t]}))},l._parseMultiValue=function(t,e,i,r,n,s,a){let o,h=0,u=0;if(0===e.length)return t;for(;-1!==(h=_(t,e,u));)o=t.slice(u,h),o=n?l._parseMultiValue(o,n,i,[],null,s,a):l._parseValue(o,i,s,a),r.push(o),u=h+e.length;return o=t.slice(u),o=n?l._parseMultiValue(o,n,i,[],null,s,a):l._parseValue(o,i,s,a),r.push(o),1==r.length?r[0]:r},l._eachLine=function(t,e){let i,r,n,s=t.length,o=t.search(a),l=o;do{l=t.indexOf("\n",o)+1,n=l>1&&"\r"===t[l-2]?2:1,0===l&&(l=s,n=0),r=t[o]," "===r||"\t"===r?i+=t.slice(o+1,l-n):(i&&e(null,i),i=t.slice(o,l-n)),o=l}while(l!==s);i=i.trim(),i.length&&e(null,i)};const u=["tzid","location","tznames","latitude","longitude"];class c{static _compare_change_fn(t,e){return t.yeare.year?1:t.monthe.month?1:t.daye.day?1:t.houre.hour?1:t.minutee.minute?1:t.seconde.second?1:0}static convert_time(t,e,i){if(t.isDate||e.tzid==i.tzid||e==c.localTimezone||i==c.localTimezone)return t.zone=i,t;let r=e.utcOffset(t);return t.adjust(0,0,0,-r),r=i.utcOffset(t),t.adjust(0,0,0,r),null}static fromData(t){return(new c).fromData(t)}static#e=null;static get utcTimezone(){return this.#e||(this.#e=c.fromData({tzid:"UTC"})),this.#e}static#i=null;static get localTimezone(){return this.#i||(this.#i=c.fromData({tzid:"floating"})),this.#i}static adjust_change(t,e,i,r,n){return s.prototype.adjust.call(t,e,i,r,n,t)}static _minimumExpansionYear=-1;static EXTRA_COVERAGE=5;constructor(t){this.wrappedJSObject=this,this.fromData(t)}tzid="";location="";tznames="";latitude=0;longitude=0;component=null;expandedUntilYear=0;icalclass="icaltimezone";fromData(t){if(this.expandedUntilYear=0,this.changes=[],t instanceof yt)this.component=t;else{if(t&&"component"in t)if("string"==typeof t.component){let e=l(t.component);this.component=new yt(e)}else t.component instanceof yt?this.component=t.component:this.component=null;for(let e of u)t&&e in t&&(this[e]=t[e])}return this.component instanceof yt&&!this.tzid&&(this.tzid=this.component.getFirstPropertyValue("tzid")),this}utcOffset(t){if(this==c.utcTimezone||this==c.localTimezone)return 0;if(this._ensureCoverage(t.year),!this.changes.length)return 0;let e={year:t.year,month:t.month,day:t.day,hour:t.hour,minute:t.minute,second:t.second},i=this._findNearbyChange(e),r=-1,n=1;for(;;){let t=D(this.changes[i],!0);if(t.utcOffset=0?r=i:n=-1,-1==n&&-1!=r)break;if(i+=n,i<0)return 0;if(i>=this.changes.length)break}let s=this.changes[r];if(s.utcOffset-s.prevUtcOffset<0&&r>0){let t=D(s,!0);if(c.adjust_change(t,0,0,0,t.prevUtcOffset),c._compare_change_fn(e,t)<0){let t=this.changes[r-1],e=!1;s.is_daylight!=e&&t.is_daylight==e&&(s=t)}}return s.utcOffset}_findNearbyChange(t){let e=g(this.changes,t,c._compare_change_fn);return e>=this.changes.length?this.changes.length-1:e}_ensureCoverage(t){if(-1==c._minimumExpansionYear){let t=s.now();c._minimumExpansionYear=t.year}let e=t;if(ee)&&t);)r.year=t.year,r.month=t.month,r.day=t.day,r.hour=t.hour,r.minute=t.minute,r.second=t.second,r.isDate=t.isDate,c.adjust_change(r,0,0,0,-r.prevUtcOffset),i.push(r)}}else r=a(),r.year=n.year,r.month=n.month,r.day=n.day,r.hour=n.hour,r.minute=n.minute,r.second=n.second,c.adjust_change(r,0,0,0,-r.prevUtcOffset),i.push(r);return i}toString(){return this.tznames?this.tznames:this.tzid}}let d=null;const m={get count(){return null===d?0:Object.keys(d).length},reset:function(){d=Object.create(null);let t=c.utcTimezone;d.Z=t,d.UTC=t,d.GMT=t},has:function(t){return null!==d&&!!d[t]},get:function(t){return null===d&&this.reset(),d[t]},register:function(t,e){if(null===d&&this.reset(),t instanceof yt&&"vtimezone"===t.name&&(t=(e=new c(t)).tzid),!(e instanceof c))throw new TypeError("timezone must be ICAL.Timezone or ICAL.Component");d[t]=e},remove:function(t){return null===d?null:delete d[t]}};function f(t){return"number"==typeof t&&isNaN(t)}function p(t){let e=parseInt(t,10);if(f(e))throw new Error('Could not extract integer from "'+t+'"');return e}function y(t,e){if(void 0!==t)return t instanceof e?t:new e(t)}function _(t,e,i){for(;-1!==(i=t.indexOf(e,i));){if(!(i>0&&"\\"===t[i-1]))return i;i+=1}return-1}function g(t,e,i){if(!t.length)return 0;let r,n,s=0,a=t.length-1;for(;s<=a;)if(r=s+Math.floor((a-s)/2),n=i(e,t[r]),n<0)a=r-1;else{if(!(n>0))break;s=r+1}return n<0?r:n>0?r+1:r}function D(t,e){if(t&&"object"==typeof t){if(t instanceof Date)return new Date(t.getTime());if("clone"in t)return t.clone();if(Array.isArray(t)){let i=[];for(let r=0;r65535?2:1:(e+=Tt.newLineChar+" "+i.slice(0,Math.max(0,r)),i=i.slice(Math.max(0,r)),r=n=0)}return e.slice(Tt.newLineChar.length+1)}function Y(t){switch("string"!=typeof t&&("number"==typeof t&&(t=parseInt(t)),t=String(t)),t.length){case 0:return"00";case 1:return"0"+t;default:return t}}function A(t){return t<0?Math.ceil(t):Math.floor(t)}function O(t,e){for(let i in t){let r=Object.getOwnPropertyDescriptor(t,i);r&&!Object.getOwnPropertyDescriptor(e,i)&&Object.defineProperty(e,i,r)}return e}var b=Object.freeze({__proto__:null,updateTimezones:function(t){let e,i,r,n,s;if(!t||"vcalendar"!==t.name)return t;for(e=t.getAllSubcomponents(),i=[],r={},s=0;si)-(i>e)}_normalize(){let t=this.toSeconds(),e=this.factor;for(;t<-43200;)t+=97200;for(;t>50400;)t-=97200;this.fromSeconds(t),0==t&&(this.factor=e)}toICALString(){return ut.icalendar.value["utc-offset"].toICAL(this.toString())}toString(){return(1==this.factor?"+":"-")+Y(this.hours)+":"+Y(this.minutes)}}class E extends s{static fromDateAndOrTimeString(t,e){function i(t,e,i){return t?p(t.slice(e,e+i)):null}let r=t.split("T"),n=r[0],s=r[1],a=s?ut.vcard.value.time._splitZone(s):[],o=a[0],l=a[1],h=n?n.length:0,u=l?l.length:0,d=n&&"-"==n[0]&&"-"==n[1],m=l&&"-"==l[0],f={year:d?null:i(n,0,4),month:!d||4!=h&&7!=h?7==h||10==h?i(n,5,2):null:i(n,2,2),day:5==h?i(n,3,2):7==h&&d?i(n,5,2):10==h?i(n,8,2):null,hour:m?null:i(l,0,2),minute:m&&3==u?i(l,1,2):u>4?i(l,m?1:3,2):null,second:4==u?i(l,2,2):6==u?i(l,4,2):8==u?i(l,6,2):null};return o="Z"==o?c.utcTimezone:o&&":"==o[3]?S.fromString(o):null,new E(f,o,e)}constructor(t,e,i){super(t,e),this.icaltype=i||"date-and-or-time"}icalclass="vcardtime";icaltype="date-and-or-time";clone(){return new E(this._time,this.zone,this.icaltype)}_normalize(){return this}utcOffset(){return this.zone instanceof S?this.zone.toSeconds():s.prototype.utcOffset.apply(this,arguments)}toICALString(){return ut.vcard.value[this.icaltype].toICAL(this.toString())}toString(){let t,e=this.year,i=this.month,r=this.day,n=this.hour,s=this.minute,a=this.second,o=null!==i,l=null!==r,h=null!==n,u=null!==s,d=null!==a,m=(null!==e?Y(e)+(o||l?"-":""):o||l?"--":"")+(o?Y(i):"")+(l?"-"+Y(r):""),f=(h?Y(n):"-")+(h&&u?":":"")+(u?Y(s):"")+(h||u?"":"-")+(u&&d?":":"")+(d?Y(a):"");if(this.zone===c.utcTimezone)t="Z";else if(this.zone instanceof S)t=this.zone.toString();else if(this.zone===c.localTimezone)t="";else if(this.zone instanceof c){t=S.fromSeconds(this.zone.utcOffset(this)).toString()}else t="";switch(this.icaltype){case"time":return f+t;case"date-and-or-time":case"date-time":return m+("--"==f?"":"T"+f+t);case"date":return m}return null}}class C{static _indexMap={BYSECOND:0,BYMINUTE:1,BYHOUR:2,BYDAY:3,BYMONTHDAY:4,BYYEARDAY:5,BYWEEKNO:6,BYMONTH:7,BYSETPOS:8};static _expandMap={SECONDLY:[1,1,1,1,1,1,1,1],MINUTELY:[2,1,1,1,1,1,1,1],HOURLY:[2,2,1,1,1,1,1,1],DAILY:[2,2,2,1,1,1,1,1],WEEKLY:[2,2,2,2,3,3,1,1],MONTHLY:[2,2,2,2,2,3,3,1],YEARLY:[2,2,2,2,2,2,2,2]};static UNKNOWN=0;static CONTRACT=1;static EXPAND=2;static ILLEGAL=3;constructor(t){this.fromData(t)}completed=!1;rule=null;dtstart=null;last=null;occurrence_number=0;by_indices=null;initialized=!1;by_data=null;days=null;days_index=0;fromData(t){if(this.rule=y(t.rule,B),!this.rule)throw new Error("iterator requires a (ICAL.Recur) rule");if(this.dtstart=y(t.dtstart,s),!this.dtstart)throw new Error("iterator requires a (ICAL.Time) dtstart");t.by_data?this.by_data=t.by_data:this.by_data=D(this.rule.parts,!0),t.occurrence_number&&(this.occurrence_number=t.occurrence_number),this.days=t.days||[],t.last&&(this.last=y(t.last,s)),this.by_indices=t.by_indices,this.by_indices||(this.by_indices={BYSECOND:0,BYMINUTE:0,BYHOUR:0,BYDAY:0,BYMONTH:0,BYWEEKNO:0,BYMONTHDAY:0}),this.initialized=t.initialized||!1,this.initialized||this.init()}init(){this.initialized=!0,this.last=this.dtstart.clone();let t=this.by_data;if("BYDAY"in t&&this.sort_byday_rules(t.BYDAY),"BYYEARDAY"in t&&("BYMONTH"in t||"BYWEEKNO"in t||"BYMONTHDAY"in t||"BYDAY"in t))throw new Error("Invalid BYYEARDAY rule");if("BYWEEKNO"in t&&"BYMONTHDAY"in t)throw new Error("BYWEEKNO does not fit to BYMONTHDAY");if("MONTHLY"==this.rule.freq&&("BYYEARDAY"in t||"BYWEEKNO"in t))throw new Error("For MONTHLY recurrences neither BYYEARDAY nor BYWEEKNO may appear");if("WEEKLY"==this.rule.freq&&("BYYEARDAY"in t||"BYMONTHDAY"in t))throw new Error("For WEEKLY recurrences neither BYMONTHDAY nor BYYEARDAY may appear");if("YEARLY"!=this.rule.freq&&"BYYEARDAY"in t)throw new Error("BYYEARDAY may only appear in YEARLY rules");this.last.second=this.setup_defaults("BYSECOND","SECONDLY",this.dtstart.second),this.last.minute=this.setup_defaults("BYMINUTE","MINUTELY",this.dtstart.minute),this.last.hour=this.setup_defaults("BYHOUR","HOURLY",this.dtstart.hour);let e=this.last.day=this.setup_defaults("BYMONTHDAY","DAILY",this.dtstart.day);if(this.last.month=this.setup_defaults("BYMONTH","MONTHLY",this.dtstart.month),"WEEKLY"==this.rule.freq)if("BYDAY"in t){let[,e]=this.ruleDayOfWeek(t.BYDAY[0],this.rule.wkst),i=e-this.last.dayOfWeek(this.rule.wkst);(this.last.dayOfWeek(this.rule.wkst)=0||i<0)&&(this.last.day+=i)}else{let e=B.numericDayToIcalDay(this.dtstart.dayOfWeek());t.BYDAY=[e]}if("YEARLY"==this.rule.freq){for(;this.expand_year_days(this.last.year),!(this.days.length>0);)this.increment_year(this.rule.interval);this._nextByYearDay()}if("MONTHLY"==this.rule.freq&&this.has_by_data("BYDAY")){let t=null,e=this.last.clone(),i=s.daysInMonth(this.last.month,this.last.year);for(let r of this.by_data.BYDAY){this.last=e.clone();let[n,a]=this.ruleDayOfWeek(r),o=this.last.nthWeekDay(a,n);if(n>=6||n<=-6)throw new Error("Malformed values in BYDAY part");if(o>i||o<=0){if(t&&t.month==e.month)continue;for(;o>i||o<=0;)this.increment_month(),i=s.daysInMonth(this.last.month,this.last.year),o=this.last.nthWeekDay(a,n)}this.last.day=o,(!t||this.last.compare(t)<0)&&(t=this.last.clone())}if(this.last=t.clone(),this.has_by_data("BYMONTHDAY")&&this._byDayAndMonthDay(!0),this.last.day>i||0==this.last.day)throw new Error("Malformed values in BYDAY part")}else if(this.has_by_data("BYMONTHDAY")){this.last.day=1;let t=s.daysInMonth(this.last.month,this.last.year);if(e<0)this.last.day=t+e+1;else if(this.by_data.BYMONTHDAY[0]>t){if(!this.next_month()&&!this.next_month()&&!this.next_month())throw new Error("No possible occurrences")}else this.last.day=e}}next(){let t,e=this.last?this.last.clone():null;if(this.rule.count&&this.occurrence_number>=this.rule.count||this.rule.until&&this.last.compare(this.rule.until)>0)return this.completed=!0,null;if(0==this.occurrence_number&&this.last.compare(this.dtstart)>=0)return this.occurrence_number++,this.last;do{switch(t=1,this.rule.freq){case"SECONDLY":this.next_second();break;case"MINUTELY":this.next_minute();break;case"HOURLY":this.next_hour();break;case"DAILY":this.next_day();break;case"WEEKLY":this.next_week();break;case"MONTHLY":t=this.next_month();break;case"YEARLY":this.next_year();break;default:return null}}while(!this.check_contracting_rules()||this.last.compare(this.dtstart)<0||!t);if(0==this.last.compare(e))throw new Error("Same occurrence found twice, protecting you from death by recursion");return this.rule.until&&this.last.compare(this.rule.until)>0?(this.completed=!0,null):(this.occurrence_number++,this.last)}next_second(){return this.next_generic("BYSECOND","SECONDLY","second","minute")}increment_second(t){return this.increment_generic(t,"second",60,"minute")}next_minute(){return this.next_generic("BYMINUTE","MINUTELY","minute","hour","next_second")}increment_minute(t){return this.increment_generic(t,"minute",60,"hour")}next_hour(){return this.next_generic("BYHOUR","HOURLY","hour","monthday","next_minute")}increment_hour(t){this.increment_generic(t,"hour",24,"monthday")}next_day(){let t="DAILY"==this.rule.freq;return 0==this.next_hour()||(t?this.increment_monthday(this.rule.interval):this.increment_monthday(1)),0}next_week(){let t=0;if(0==this.next_weekday_by_week())return t;if(this.has_by_data("BYWEEKNO")){this.by_indices.BYWEEKNO++,this.by_indices.BYWEEKNO==this.by_data.BYWEEKNO.length&&(this.by_indices.BYWEEKNO=0,t=1),this.last.month=1,this.last.day=1;let e=this.by_data.BYWEEKNO[this.by_indices.BYWEEKNO];this.last.day+=7*e,t&&this.increment_year(1)}else this.increment_monthday(7*this.rule.interval);return t}normalizeByMonthDayRules(t,e,i){let r,n=s.daysInMonth(e,t),a=[],o=0,l=i.length;for(;on)){if(r<0)r=n+(r+1);else if(0===r)continue;-1===a.indexOf(r)&&a.push(r)}return a.sort((function(t,e){return t-e}))}_byDayAndMonthDay(t){let e,i,r,n,a=this.by_data.BYDAY,o=0,l=a.length,h=0,u=this,c=this.last.day;function d(){for(n=s.daysInMonth(u.last.month,u.last.year),e=u.normalizeByMonthDayRules(u.last.year,u.last.month,u.by_data.BYMONTHDAY),r=e.length;e[o]<=c&&(!t||e[o]!=c)&&on){m();continue}let t=e[o++];if(t>=i){c=t;for(let t=0;ti&&(this.last.day=1,this.increment_month(),this.is_day_in_byday(this.last)?this.has_by_data("BYSETPOS")&&!this.check_set_position(1)||(t=1):t=0)}else if(this.has_by_data("BYMONTHDAY")){this.by_indices.BYMONTHDAY++,this.by_indices.BYMONTHDAY>=this.by_data.BYMONTHDAY.length&&(this.by_indices.BYMONTHDAY=0,this.increment_month());let e=s.daysInMonth(this.last.month,this.last.year),i=this.by_data.BYMONTHDAY[this.by_indices.BYMONTHDAY];i<0&&(i=e+i+1),i>e?(this.last.day=1,t=this.is_day_in_byday(this.last)):this.last.day=i}else{this.increment_month();let e=s.daysInMonth(this.last.month,this.last.year);this.by_data.BYMONTHDAY[0]>e?t=0:this.last.day=this.by_data.BYMONTHDAY[0]}return t}next_weekday_by_week(){let t=0;if(0==this.next_hour())return t;if(!this.has_by_data("BYDAY"))return 1;for(;;){let e=new s;this.by_indices.BYDAY++,this.by_indices.BYDAY==Object.keys(this.by_data.BYDAY).length&&(this.by_indices.BYDAY=0,t=1);let i=this.by_data.BYDAY[this.by_indices.BYDAY],r=this.ruleDayOfWeek(i)[1];r-=this.rule.wkst,r<0&&(r+=7),e.year=this.last.year,e.month=this.last.month,e.day=this.last.day;let n=e.startDoyWeek(this.rule.wkst);if(r+n<1&&!t)continue;let a=s.fromDayOfYear(n+r,this.last.year);return this.last.year=a.year,this.last.month=a.month,this.last.day=a.day,t}}next_year(){if(0==this.next_hour())return 0;if(++this.days_index==this.days.length){this.days_index=0;do{this.increment_year(this.rule.interval),this.expand_year_days(this.last.year)}while(0==this.days.length)}return this._nextByYearDay(),1}_nextByYearDay(){let t=this.days[this.days_index],e=this.last.year;t<1&&(t+=1,e+=1);let i=s.fromDayOfYear(t,e);this.last.day=i.day,this.last.month=i.month}ruleDayOfWeek(t,e){let i=t.match(/([+-]?[0-9])?(MO|TU|WE|TH|FR|SA|SU)/);if(i){return[parseInt(i[1]||0,10),t=B.icalDayToNumericDay(i[2],e)]}return[0,0]}next_generic(t,e,i,r,n){let s=t in this.by_data,a=this.rule.freq==e,o=0;if(n&&0==this[n]())return o;if(s){this.by_indices[t]++;let e=this.by_data[t];this.by_indices[t]==e.length&&(this.by_indices[t]=0,o=1),this.last[i]=e[this.by_indices[t]]}else a&&this["increment_"+i](this.rule.interval);return s&&o&&a&&this["increment_"+r](1),o}increment_monthday(t){for(let e=0;et&&(this.last.day-=t,this.increment_month())}}increment_month(){if(this.last.day=1,this.has_by_data("BYMONTH"))this.by_indices.BYMONTH++,this.by_indices.BYMONTH==this.by_data.BYMONTH.length&&(this.by_indices.BYMONTH=0,this.increment_year(1)),this.last.month=this.by_data.BYMONTH[this.by_indices.BYMONTH];else{"MONTHLY"==this.rule.freq?this.last.month+=this.rule.interval:this.last.month++,this.last.month--;let t=A(this.last.month/12);this.last.month%=12,this.last.month++,0!=t&&this.increment_year(t)}}increment_year(t){this.last.year+=t}increment_generic(t,e,i,r){this.last[e]+=t;let n=A(this.last[e]/i);this.last[e]%=i,0!=n&&this["increment_"+r](n)}has_by_data(t){return t in this.rule.parts}expand_year_days(t){let e=new s;this.days=[];let i={},r=["BYDAY","BYWEEKNO","BYMONTHDAY","BYMONTH","BYYEARDAY"];for(let t of r)t in this.rule.parts&&(i[t]=this.rule.parts[t]);if("BYMONTH"in i&&"BYWEEKNO"in i){let r=1,n={};e.year=t,e.isDate=!0;for(let i=0;i0?(e=h+7*(s-1),e<=r&&this.days.push(a+e)):(e=u+7*(s+1),e>0&&this.days.push(a+e))}}this.days.sort((function(t,e){return t-e}))}else if(2==n&&"BYDAY"in i&&"BYMONTHDAY"in i){let e=this.expand_by_day(t);for(let i of e){let e=s.fromDayOfYear(i,t);this.by_data.BYMONTHDAY.indexOf(e.day)>=0&&this.days.push(i)}}else if(3==n&&"BYDAY"in i&&"BYMONTHDAY"in i&&"BYMONTH"in i){let e=this.expand_by_day(t);for(let i of e){let e=s.fromDayOfYear(i,t);this.by_data.BYMONTH.indexOf(e.month)>=0&&this.by_data.BYMONTHDAY.indexOf(e.day)>=0&&this.days.push(i)}}else if(2==n&&"BYDAY"in i&&"BYWEEKNO"in i){let e=this.expand_by_day(t);for(let i of e){let e=s.fromDayOfYear(i,t).weekNumber(this.rule.wkst);this.by_data.BYWEEKNO.indexOf(e)&&this.days.push(i)}}else 3==n&&"BYDAY"in i&&"BYWEEKNO"in i&&"BYMONTHDAY"in i||(this.days=1==n&&"BYYEARDAY"in i?this.days.concat(this.by_data.BYYEARDAY):[]);return 0}expand_by_day(t){let e=[],i=this.last.clone();i.year=t,i.month=1,i.day=1,i.isDate=!0;let r=i.dayOfWeek();i.month=12,i.day=31,i.isDate=!0;let n=i.dayOfWeek(),s=i.dayOfYear();for(let t of this.by_data.BYDAY){let i=this.ruleDayOfWeek(t),a=i[0],o=i[1];if(0==a){for(let t=(o+7-r)%7+1;t<=s;t+=7)e.push(t)}else if(a>0){let t;t=o>=r?o-r+1:o-r+8,e.push(t+7*(a-1))}else{let t;a=-a,t=o<=n?s-n+o:s-n+o-7,e.push(t-7*(a-1))}}return e}is_day_in_byday(t){if(this.by_data.BYDAY)for(let e of this.by_data.BYDAY){let i=this.ruleDayOfWeek(e),r=i[0],n=i[1],s=t.dayOfWeek();if(0==r&&n==s||t.nthWeekDay(n,r)==t.day)return 1}return 0}check_set_position(t){if(this.has_by_data("BYSETPOS")){return-1!==this.by_data.BYSETPOS.indexOf(t)}return!1}sort_byday_rules(t){for(let e=0;ethis.ruleDayOfWeek(t[e],this.rule.wkst)[1]){let r=t[e];t[e]=t[i],t[i]=r}}}check_contract_restriction(t,e){let i=C._indexMap[t],r=C._expandMap[this.rule.freq][i],n=!1;if(t in this.by_data&&r==C.CONTRACT){let i=this.by_data[t];for(let t of i)if(t==e){n=!0;break}}else n=!0;return n}check_contracting_rules(){let t=this.last.dayOfWeek(),e=this.last.weekNumber(this.rule.wkst),i=this.last.dayOfYear();return this.check_contract_restriction("BYSECOND",this.last.second)&&this.check_contract_restriction("BYMINUTE",this.last.minute)&&this.check_contract_restriction("BYHOUR",this.last.hour)&&this.check_contract_restriction("BYDAY",B.numericDayToIcalDay(t))&&this.check_contract_restriction("BYWEEKNO",e)&&this.check_contract_restriction("BYMONTHDAY",this.last.day)&&this.check_contract_restriction("BYMONTH",this.last.month)&&this.check_contract_restriction("BYYEARDAY",i)}setup_defaults(t,e,i){let r=C._indexMap[t];return C._expandMap[this.rule.freq][r]!=C.CONTRACT&&(t in this.by_data||(this.by_data[t]=[i]),this.rule.freq!=e)?this.by_data[t][0]:i}toJSON(){let t=Object.create(null);return t.initialized=this.initialized,t.rule=this.rule.toJSON(),t.dtstart=this.dtstart.toJSON(),t.by_data=this.by_data,t.days=this.days,t.last=this.last.toJSON(),t.by_indices=this.by_indices,t.occurrence_number=this.occurrence_number,t}}const w=/^(SU|MO|TU|WE|TH|FR|SA)$/,x=/^([+-])?(5[0-3]|[1-4][0-9]|[1-9])?(SU|MO|TU|WE|TH|FR|SA)$/,v={SU:s.SUNDAY,MO:s.MONDAY,TU:s.TUESDAY,WE:s.WEDNESDAY,TH:s.THURSDAY,FR:s.FRIDAY,SA:s.SATURDAY},N=Object.fromEntries(Object.entries(v).map((t=>t.reverse()))),I=["SECONDLY","MINUTELY","HOURLY","DAILY","WEEKLY","MONTHLY","YEARLY"];class B{static fromString(t){let e=this._stringToData(t,!1);return new B(e)}static fromData(t){return new B(t)}static _stringToData(t,e){let i=Object.create(null),r=t.split(";"),n=r.length;for(let t=0;t7&&(i-=7),N[i]}constructor(t){this.wrappedJSObject=this,this.parts={},t&&"object"==typeof t&&this.fromData(t)}parts=null;interval=1;wkst=s.MONDAY;until=null;count=null;freq=null;icalclass="icalrecur";icaltype="recur";iterator(t){return new C({rule:this,dtstart:t})}clone(){return new B(this.toJSON())}isFinite(){return!(!this.count&&!this.until)}isByCount(){return!(!this.count||this.until)}addComponent(t,e){let i=t.toUpperCase();i in this.parts?this.parts[i].push(e):this.parts[i]=[e]}setComponent(t,e){this.parts[t.toUpperCase()]=e.slice()}getComponent(t){let e=t.toUpperCase();return e in this.parts?this.parts[e].slice():[]}getNextOccurrence(t,e){let i,r=this.iterator(t);do{i=r.next()}while(i&&i.compare(e)<=0);return i&&e.zone&&(i.zone=e.zone),i}fromData(t){for(let e in t){let i=e.toUpperCase();i in L?Array.isArray(t[e])?this.parts[i]=t[e]:this.parts[i]=[t[e]]:this[e]=t[e]}this.interval&&"number"!=typeof this.interval&&M.INTERVAL(this.interval,this),this.wkst&&"number"!=typeof this.wkst&&(this.wkst=B.icalDayToNumericDay(this.wkst)),!this.until||this.until instanceof s||(this.until=s.fromString(this.until))}toJSON(){let t=Object.create(null);t.freq=this.freq,this.count&&(t.count=this.count),this.interval>1&&(t.interval=this.interval);for(let[e,i]of Object.entries(this.parts))Array.isArray(i)&&1==i.length?t[e.toLowerCase()]=i[0]:t[e.toLowerCase()]=D(i);return this.until&&(t.until=this.until.toString()),"wkst"in this&&this.wkst!==s.DEFAULT_WEEK_START&&(t.wkst=B.numericDayToIcalDay(this.wkst)),t}toString(){let t="FREQ="+this.freq;this.count&&(t+=";COUNT="+this.count),this.interval>1&&(t+=";INTERVAL="+this.interval);for(let[e,i]of Object.entries(this.parts))t+=";"+e+"="+i;return this.until&&(t+=";UNTIL="+this.until.toICALString()),"wkst"in this&&this.wkst!==s.DEFAULT_WEEK_START&&(t+=";WKST="+B.numericDayToIcalDay(this.wkst)),t}}function z(t,e,i,r){let n=r;if("+"===r[0]&&(n=r.slice(1)),n=p(n),void 0!==e&&r '+e);if(void 0!==i&&r>i)throw new Error(t+': invalid value "'+r+'" must be < '+e);return n}const M={FREQ:function(t,e,i){if(-1===I.indexOf(t))throw new Error('invalid frequency "'+t+'" expected: "'+I.join(", ")+'"');e.freq=t},COUNT:function(t,e,i){e.count=p(t)},INTERVAL:function(t,e,i){e.interval=p(t),e.interval<1&&(e.interval=1)},UNTIL:function(t,e,i){t.length>10?e.until=ut.icalendar.value["date-time"].fromICAL(t):e.until=ut.icalendar.value.date.fromICAL(t),i||(e.until=s.fromString(e.until))},WKST:function(t,e,i){if(!w.test(t))throw new Error('invalid WKST value "'+t+'"');e.wkst=B.icalDayToNumericDay(t)}},L={BYSECOND:z.bind(void 0,"BYSECOND",0,60),BYMINUTE:z.bind(void 0,"BYMINUTE",0,59),BYHOUR:z.bind(void 0,"BYHOUR",0,23),BYDAY:function(t){if(x.test(t))return t;throw new Error('invalid BYDAY value "'+t+'"')},BYMONTHDAY:z.bind(void 0,"BYMONTHDAY",-31,31),BYYEARDAY:z.bind(void 0,"BYYEARDAY",-366,366),BYWEEKNO:z.bind(void 0,"BYWEEKNO",-53,53),BYMONTH:z.bind(void 0,"BYMONTH",1,12),BYSETPOS:z.bind(void 0,"BYSETPOS",-366,366)};class k{static fromString(t,e){let i=t.split("/");if(2!==i.length)throw new Error('Invalid string value: "'+t+'" must contain a "/" char.');let n={start:s.fromDateTimeString(i[0],e)},a=i[1];return r.isValueString(a)?n.duration=r.fromString(a):n.end=s.fromDateTimeString(a,e),new k(n)}static fromData(t){return new k(t)}static fromJSON(t,e,i){function n(t,e){return i?s.fromString(t,e):s.fromDateTimeString(t,e)}return r.isValueString(t[1])?k.fromData({start:n(t[0],e),duration:r.fromString(t[1])}):k.fromData({start:n(t[0],e),end:n(t[1],e)})}constructor(t){if(this.wrappedJSObject=this,t&&"start"in t){if(t.start&&!(t.start instanceof s))throw new TypeError(".start must be an instance of ICAL.Time");this.start=t.start}if(t&&t.end&&t.duration)throw new Error("cannot accept both end and duration");if(t&&"end"in t){if(t.end&&!(t.end instanceof s))throw new TypeError(".end must be an instance of ICAL.Time");this.end=t.end}if(t&&"duration"in t){if(t.duration&&!(t.duration instanceof r))throw new TypeError(".duration must be an instance of ICAL.Duration");this.duration=t.duration}}start=null;end=null;duration=null;icalclass="icalperiod";icaltype="period";clone(){return k.fromData({start:this.start?this.start.clone():null,end:this.end?this.end.clone():null,duration:this.duration?this.duration.clone():null})}getDuration(){return this.duration?this.duration:this.end.subtractDate(this.start)}getEnd(){if(this.end)return this.end;{let t=this.start.clone();return t.addDuration(this.duration),t}}toString(){return this.start+"/"+(this.end||this.duration)}toJSON(){return[this.start.toString(),(this.end||this.duration).toString()]}toICALString(){return this.start.toICALString()+"/"+(this.end||this.duration).toICALString()}}const P=/\\\\|\\,|\\[Nn]/g,U=/\\|,|\n/g;function j(t,e){return{matches:/.*/,fromICAL:function(e,i){return function(t,e,i){if(-1===t.indexOf("\\"))return t;i&&(e=new RegExp(e.source+"|\\\\"+i,e.flags));return t.replace(e,X)}(e,t,i)},toICAL:function(t,i){let r=e;return i&&(r=new RegExp(r.source+"|"+i,r.flags)),t.replace(r,(function(t){switch(t){case"\\":return"\\\\";case";":return"\\;";case",":return"\\,";case"\n":return"\\n";default:return t}}))}}}const V={defaultType:"text"},H={defaultType:"text",multiValue:","},R={defaultType:"text",structuredValue:";"},W={defaultType:"integer"},F={defaultType:"date-time",allowedTypes:["date-time","date"]},K={defaultType:"date-time"},q={defaultType:"uri"},J={defaultType:"utc-offset"},Z={defaultType:"recur"},G={defaultType:"date-and-or-time",allowedTypes:["date-time","date","text"]};function X(t){switch(t){case"\\\\":return"\\";case"\\;":return";";case"\\,":return",";case"\\n":case"\\N":return"\n";default:return t}}let Q={categories:H,url:q,version:V,uid:V},$={boolean:{values:["TRUE","FALSE"],fromICAL:function(t){return"TRUE"===t},toICAL:function(t){return t?"TRUE":"FALSE"}},float:{matches:/^[+-]?\d+\.\d+$/,fromICAL:function(t){let e=parseFloat(t);return f(e)?0:e},toICAL:function(t){return String(t)}},integer:{fromICAL:function(t){let e=parseInt(t);return f(e)?0:e},toICAL:function(t){return String(t)}},"utc-offset":{toICAL:function(t){return t.length<7?t.slice(0,3)+t.slice(4,6):t.slice(0,3)+t.slice(4,6)+t.slice(7,9)},fromICAL:function(t){return t.length<6?t.slice(0,3)+":"+t.slice(3,5):t.slice(0,3)+":"+t.slice(3,5)+":"+t.slice(5,7)},decorate:function(t){return S.fromString(t)},undecorate:function(t){return t.toString()}}};const tt=O($,{text:j(/\\\\|\\;|\\,|\\[Nn]/g,/\\|;|,|\n/g),uri:{},binary:{decorate:function(e){return t.fromString(e)},undecorate:function(t){return t.toString()}},"cal-address":{},date:{decorate:function(t,e){return ht.strict?s.fromDateString(t,e):s.fromString(t,e)},undecorate:function(t){return t.toString()},fromICAL:function(t){return!ht.strict&&t.length>=15?tt["date-time"].fromICAL(t):t.slice(0,4)+"-"+t.slice(4,6)+"-"+t.slice(6,8)},toICAL:function(t){let e=t.length;return 10==e?t.slice(0,4)+t.slice(5,7)+t.slice(8,10):e>=19?tt["date-time"].toICAL(t):t}},"date-time":{fromICAL:function(t){if(ht.strict||8!=t.length){let e=t.slice(0,4)+"-"+t.slice(4,6)+"-"+t.slice(6,8)+"T"+t.slice(9,11)+":"+t.slice(11,13)+":"+t.slice(13,15);return t[15]&&"Z"===t[15]&&(e+="Z"),e}return tt.date.fromICAL(t)},toICAL:function(t){let e=t.length;if(10!=e||ht.strict){if(e>=19){let e=t.slice(0,4)+t.slice(5,7)+t.slice(8,13)+t.slice(14,16)+t.slice(17,19);return t[19]&&"Z"===t[19]&&(e+="Z"),e}return t}return tt.date.toICAL(t)},decorate:function(t,e){return ht.strict?s.fromDateTimeString(t,e):s.fromString(t,e)},undecorate:function(t){return t.toString()}},duration:{decorate:function(t){return r.fromString(t)},undecorate:function(t){return t.toString()}},period:{fromICAL:function(t){let e=t.split("/");return e[0]=tt["date-time"].fromICAL(e[0]),r.isValueString(e[1])||(e[1]=tt["date-time"].fromICAL(e[1])),e},toICAL:function(t){return t=t.slice(),ht.strict||10!=t[0].length?t[0]=tt["date-time"].toICAL(t[0]):t[0]=tt.date.toICAL(t[0]),r.isValueString(t[1])||(ht.strict||10!=t[1].length?t[1]=tt["date-time"].toICAL(t[1]):t[1]=tt.date.toICAL(t[1])),t.join("/")},decorate:function(t,e){return k.fromJSON(t,e,!ht.strict)},undecorate:function(t){return t.toJSON()}},recur:{fromICAL:function(t){return B._stringToData(t,!0)},toICAL:function(t){let e="";for(let[i,r]of Object.entries(t))"until"==i?r=r.length>10?tt["date-time"].toICAL(r):tt.date.toICAL(r):"wkst"==i?"number"==typeof r&&(r=B.numericDayToIcalDay(r)):Array.isArray(r)&&(r=r.join(",")),e+=i.toUpperCase()+"="+r+";";return e.slice(0,Math.max(0,e.length-1))},decorate:function(t){return B.fromData(t)},undecorate:function(t){return t.toJSON()}},time:{fromICAL:function(t){if(t.length<6)return t;let e=t.slice(0,2)+":"+t.slice(2,4)+":"+t.slice(4,6);return"Z"===t[6]&&(e+="Z"),e},toICAL:function(t){if(t.length<8)return t;let e=t.slice(0,2)+t.slice(3,5)+t.slice(6,8);return"Z"===t[8]&&(e+="Z"),e}}});let et=O(Q,{action:V,attach:{defaultType:"uri"},attendee:{defaultType:"cal-address"},calscale:V,class:V,comment:V,completed:K,contact:V,created:K,description:V,dtend:F,dtstamp:K,dtstart:F,due:F,duration:{defaultType:"duration"},exdate:{defaultType:"date-time",allowedTypes:["date-time","date"],multiValue:","},exrule:Z,freebusy:{defaultType:"period",multiValue:","},geo:{defaultType:"float",structuredValue:";"},"last-modified":K,location:V,method:V,organizer:{defaultType:"cal-address"},"percent-complete":W,priority:W,prodid:V,"related-to":V,repeat:W,rdate:{defaultType:"date-time",allowedTypes:["date-time","date","period"],multiValue:",",detectType:function(t){return-1!==t.indexOf("/")?"period":-1===t.indexOf("T")?"date":"date-time"}},"recurrence-id":F,resources:H,"request-status":R,rrule:Z,sequence:W,status:V,summary:V,transp:V,trigger:{defaultType:"duration",allowedTypes:["duration","date-time"]},tzoffsetfrom:J,tzoffsetto:J,tzurl:q,tzid:V,tzname:V});const it=O($,{text:j(P,U),uri:j(P,U),date:{decorate:function(t){return E.fromDateAndOrTimeString(t,"date")},undecorate:function(t){return t.toString()},fromICAL:function(t){return 8==t.length?tt.date.fromICAL(t):"-"==t[0]&&6==t.length?t.slice(0,4)+"-"+t.slice(4):t},toICAL:function(t){return 10==t.length?tt.date.toICAL(t):"-"==t[0]&&7==t.length?t.slice(0,4)+t.slice(5):t}},time:{decorate:function(t){return E.fromDateAndOrTimeString("T"+t,"time")},undecorate:function(t){return t.toString()},fromICAL:function(t){let e=it.time._splitZone(t,!0),i=e[0],r=e[1];return 6==r.length?r=r.slice(0,2)+":"+r.slice(2,4)+":"+r.slice(4,6):4==r.length&&"-"!=r[0]?r=r.slice(0,2)+":"+r.slice(2,4):5==r.length&&(r=r.slice(0,3)+":"+r.slice(3,5)),5!=i.length||"-"!=i[0]&&"+"!=i[0]||(i=i.slice(0,3)+":"+i.slice(3)),r+i},toICAL:function(t){let e=it.time._splitZone(t),i=e[0],r=e[1];return 8==r.length?r=r.slice(0,2)+r.slice(3,5)+r.slice(6,8):5==r.length&&"-"!=r[0]?r=r.slice(0,2)+r.slice(3,5):6==r.length&&(r=r.slice(0,3)+r.slice(4,6)),6!=i.length||"-"!=i[0]&&"+"!=i[0]||(i=i.slice(0,3)+i.slice(4)),r+i},_splitZone:function(t,e){let i,r,n=t.length-1,s=t.length-(e?5:6),a=t[s];return"Z"==t[n]?(i=t[n],r=t.slice(0,Math.max(0,n))):t.length>6&&("-"==a||"+"==a)?(i=t.slice(s),r=t.slice(0,Math.max(0,s))):(i="",r=t),[i,r]}},"date-time":{decorate:function(t){return E.fromDateAndOrTimeString(t,"date-time")},undecorate:function(t){return t.toString()},fromICAL:function(t){return it["date-and-or-time"].fromICAL(t)},toICAL:function(t){return it["date-and-or-time"].toICAL(t)}},"date-and-or-time":{decorate:function(t){return E.fromDateAndOrTimeString(t,"date-and-or-time")},undecorate:function(t){return t.toString()},fromICAL:function(t){let e=t.split("T");return(e[0]?it.date.fromICAL(e[0]):"")+(e[1]?"T"+it.time.fromICAL(e[1]):"")},toICAL:function(t){let e=t.split("T");return it.date.toICAL(e[0])+(e[1]?"T"+it.time.toICAL(e[1]):"")}},timestamp:tt["date-time"],"language-tag":{matches:/^[a-zA-Z0-9-]+$/},"phone-number":{fromICAL:function(t){return Array.from(t).filter((function(t){return"\\"===t?void 0:t})).join("")},toICAL:function(t){return Array.from(t).map((function(t){return","===t||";"===t?"\\"+t:t})).join("")}}});let rt=O(Q,{adr:{defaultType:"text",structuredValue:";",multiValue:","},anniversary:G,bday:G,caladruri:q,caluri:q,clientpidmap:R,email:V,fburl:q,fn:V,gender:R,geo:q,impp:q,key:q,kind:V,lang:{defaultType:"language-tag"},logo:q,member:q,n:{defaultType:"text",structuredValue:";",multiValue:","},nickname:H,note:V,org:{defaultType:"text",structuredValue:";"},photo:q,related:q,rev:{defaultType:"timestamp"},role:V,sound:q,source:q,tel:{defaultType:"uri",allowedTypes:["uri","text"]},title:V,tz:{defaultType:"text",allowedTypes:["text","utc-offset","uri"]},xml:V}),nt=O($,{binary:tt.binary,date:it.date,"date-time":it["date-time"],"phone-number":it["phone-number"],uri:tt.uri,text:tt.text,time:tt.time,vcard:tt.text,"utc-offset":{toICAL:function(t){return t.slice(0,7)},fromICAL:function(t){return t.slice(0,7)},decorate:function(t){return S.fromString(t)},undecorate:function(t){return t.toString()}}}),st=O(Q,{fn:V,n:{defaultType:"text",structuredValue:";",multiValue:","},nickname:H,photo:{defaultType:"binary",allowedTypes:["binary","uri"]},bday:{defaultType:"date-time",allowedTypes:["date-time","date"],detectType:function(t){return-1===t.indexOf("T")?"date":"date-time"}},adr:{defaultType:"text",structuredValue:";",multiValue:","},label:V,tel:{defaultType:"phone-number"},email:V,mailer:V,tz:{defaultType:"utc-offset",allowedTypes:["utc-offset","text"]},geo:{defaultType:"float",structuredValue:";"},title:V,role:V,logo:{defaultType:"binary",allowedTypes:["binary","uri"]},agent:{defaultType:"vcard",allowedTypes:["vcard","text","uri"]},org:R,note:H,prodid:V,rev:{defaultType:"date-time",allowedTypes:["date-time","date"],detectType:function(t){return-1===t.indexOf("T")?"date":"date-time"}},"sort-string":V,sound:{defaultType:"binary",allowedTypes:["binary","uri"]},class:V,key:{defaultType:"binary",allowedTypes:["binary","text"]}}),at={value:tt,param:{cutype:{values:["INDIVIDUAL","GROUP","RESOURCE","ROOM","UNKNOWN"],allowXName:!0,allowIanaToken:!0},"delegated-from":{valueType:"cal-address",multiValue:",",multiValueSeparateDQuote:!0},"delegated-to":{valueType:"cal-address",multiValue:",",multiValueSeparateDQuote:!0},encoding:{values:["8BIT","BASE64"]},fbtype:{values:["FREE","BUSY","BUSY-UNAVAILABLE","BUSY-TENTATIVE"],allowXName:!0,allowIanaToken:!0},member:{valueType:"cal-address",multiValue:",",multiValueSeparateDQuote:!0},partstat:{values:["NEEDS-ACTION","ACCEPTED","DECLINED","TENTATIVE","DELEGATED","COMPLETED","IN-PROCESS"],allowXName:!0,allowIanaToken:!0},range:{values:["THISANDFUTURE"]},related:{values:["START","END"]},reltype:{values:["PARENT","CHILD","SIBLING"],allowXName:!0,allowIanaToken:!0},role:{values:["REQ-PARTICIPANT","CHAIR","OPT-PARTICIPANT","NON-PARTICIPANT"],allowXName:!0,allowIanaToken:!0},rsvp:{values:["TRUE","FALSE"]},"sent-by":{valueType:"cal-address"},tzid:{matches:/^\//},value:{values:["binary","boolean","cal-address","date","date-time","duration","float","integer","period","recur","text","time","uri","utc-offset"],allowXName:!0,allowIanaToken:!0}},property:et,propertyGroups:!1},ot={value:it,param:{type:{valueType:"text",multiValue:","},value:{values:["text","uri","date","time","date-time","date-and-or-time","timestamp","boolean","integer","float","utc-offset","language-tag"],allowXName:!0,allowIanaToken:!0}},property:rt,propertyGroups:!0},lt={value:nt,param:{type:{valueType:"text",multiValue:","},value:{values:["text","uri","date","date-time","phone-number","time","boolean","integer","float","utc-offset","vcard","binary"],allowXName:!0,allowIanaToken:!0}},property:st,propertyGroups:!0};const ht={strict:!0,defaultSet:at,defaultType:"unknown",components:{vcard:ot,vcard3:lt,vevent:at,vtodo:at,vjournal:at,valarm:at,vtimezone:at,daylight:at,standard:at},icalendar:at,vcard:ot,vcard3:lt,getDesignSet:function(t){return t&&t in ht.components?ht.components[t]:ht.defaultSet}};var ut=ht;const ct="\r\n",dt="unknown",mt={'"':"^'","\n":"^n","^":"^^"};function ft(t){"string"==typeof t[0]&&(t=[t]);let e=0,i=t.length,r="";for(;e0&&("version"!==t[1][0][0]||"4.0"!==t[1][0][3])&&(o="vcard3"),e=e||ut.getDesignSet(o);s0&&"object"==typeof t[0]&&"icaltype"in t[0]&&this.resetType(t[0].icaltype),this.isDecorated)for(;i=0;s--)i&&n[s][0]!==i||this._removeObjectByIndex(t,r,s)}addSubcomponent(t){this._components||(this._components=[],this._hydratedComponentCount=0),t.parent&&t.parent.removeSubcomponent(t);let e=this.jCal[2].push(t.jCal);return this._components[e-1]=t,this._hydratedComponentCount++,t.parent=this,t}removeSubcomponent(t){let e=this._removeObject(2,"_components",t);return e&&this._hydratedComponentCount--,e}removeAllSubcomponents(t){let e=this._removeAllObjects(2,"_components",t);return this._hydratedComponentCount=0,e}addProperty(t){if(!(t instanceof pt))throw new TypeError("must be instance of ICAL.Property");this._properties||(this._properties=[],this._hydratedPropertyCount=0),t.parent&&t.parent.removeProperty(t);let e=this.jCal[1].push(t.jCal);return this._properties[e-1]=t,this._hydratedPropertyCount++,t.parent=this,t}addPropertyWithValue(t,e){let i=new pt(t);return i.setValue(e),this.addProperty(i),i}updatePropertyWithValue(t,e){let i=this.getFirstProperty(t);return i?i.setValue(e):i=this.addPropertyWithValue(t,e),i}removeProperty(t){let e=this._removeObject(1,"_properties",t);return e&&this._hydratedPropertyCount--,e}removeAllProperties(t){let e=this._removeAllObjects(1,"_properties",t);return this._hydratedPropertyCount=0,e}toJSON(){return this.jCal}toString(){return ft.component(this.jCal,this._designSet)}getTimeZoneByID(t){if(this.parent)return this.parent.getTimeZoneByID(t);if(!this._timezoneCache)return null;if(this._timezoneCache.has(t))return this._timezoneCache.get(t);const e=this.getAllSubcomponents("vtimezone");for(const i of e)if(i.getFirstProperty("tzid").getFirstValue()===t){const e=new c({component:i,tzid:t});return this._timezoneCache.set(t,e),e}return null}}class _t{constructor(t){this.ruleDates=[],this.exDates=[],this.fromData(t)}complete=!1;ruleIterators=null;ruleDates=null;exDates=null;ruleDateInc=0;exDateInc=0;exDate=null;ruleDate=null;dtstart=null;last=null;fromData(t){let e=y(t.dtstart,s);if(!e)throw new Error(".dtstart (ICAL.Time) must be given");if(this.dtstart=e,t.component)this._init(t.component);else{if(this.last=y(t.last,s)||e.clone(),!t.ruleIterators)throw new Error(".ruleIterators or .component must be given");this.ruleIterators=t.ruleIterators.map((function(t){return y(t,C)})),this.ruleDateInc=t.ruleDateInc,this.exDateInc=t.exDateInc,t.ruleDates&&(this.ruleDates=t.ruleDates.map((t=>y(t,s))),this.ruleDate=this.ruleDates[this.ruleDateInc]),t.exDates&&(this.exDates=t.exDates.map((t=>y(t,s))),this.exDate=this.exDates[this.exDateInc]),void 0!==t.complete&&(this.complete=t.complete)}}next(){let t,e,i,r=0;for(;;){if(r++>500)throw new Error("max tries have occurred, rule may be impossible to fulfill.");if(e=this.ruleDate,t=this._nextRecurrenceIter(this.last),!e&&!t){this.complete=!0;break}if((!e||t&&e.compare(t.last)>0)&&(e=t.last.clone(),t.next()),this.ruleDate===e&&this._nextRuleDay(),this.last=e,!this.exDate||(i=this.exDate.compare(this.last),i<0&&this._nextExDay(),0!==i))return this.last;this._nextExDay()}}toJSON(){function t(t){return t.toJSON()}let e=Object.create(null);return e.ruleIterators=this.ruleIterators.map(t),this.ruleDates&&(e.ruleDates=this.ruleDates.map(t)),this.exDates&&(e.exDates=this.exDates.map(t)),e.ruleDateInc=this.ruleDateInc,e.exDateInc=this.exDateInc,e.last=this.last.toJSON(),e.dtstart=this.dtstart.toJSON(),e.complete=this.complete,e}_extractDates(t,e){let i=[],r=t.getAllProperties(e);for(let t=0,e=r.length;tt.compare(e)));i.splice(t,0,e)}return i}_init(t){if(this.ruleIterators=[],this.last=this.dtstart.clone(),!t.hasProperty("rdate")&&!t.hasProperty("rrule")&&!t.hasProperty("recurrence-id"))return this.ruleDate=this.last.clone(),void(this.complete=!0);if(t.hasProperty("rdate")&&(this.ruleDates=this._extractDates(t,"rdate"),this.ruleDates[0]&&this.ruleDates[0].compare(this.dtstart)<0?(this.ruleDateInc=0,this.last=this.ruleDates[0].clone()):this.ruleDateInc=g(this.ruleDates,this.last,((t,e)=>t.compare(e))),this.ruleDate=this.ruleDates[this.ruleDateInc]),t.hasProperty("rrule")){let e,i,r=t.getAllProperties("rrule"),n=0,s=r.length;for(;nt.compare(e))),this.exDate=this.exDates[this.exDateInc])}_nextExDay(){this.exDate=this.exDates[++this.exDateInc]}_nextRuleDay(){this.ruleDate=this.ruleDates[++this.ruleDateInc]}_nextRecurrenceIter(){let t=this.ruleIterators;if(0===t.length)return null;let e,i,r,n=t.length,s=0;for(;s0)&&(r=e);return r}}class gt{constructor(t,e){t instanceof yt||(e=t,t=null),this.component=t||new yt("vevent"),this._rangeExceptionCache=Object.create(null),this.exceptions=Object.create(null),this.rangeExceptions=[],e&&e.strictExceptions&&(this.strictExceptions=e.strictExceptions),e&&e.exceptions?e.exceptions.forEach(this.relateException,this):this.component.parent&&!this.isRecurrenceException()&&this.component.parent.getAllSubcomponents("vevent").forEach((function(t){t.hasProperty("recurrence-id")&&this.relateException(t)}),this)}static THISANDFUTURE="THISANDFUTURE";exceptions=null;strictExceptions=!1;relateException(t){if(this.isRecurrenceException())throw new Error("cannot relate exception to exceptions");if(t instanceof yt&&(t=new gt(t)),this.strictExceptions&&t.uid!==this.uid)throw new Error("attempted to relate unrelated exception");let e=t.recurrenceId.toString();if(this.exceptions[e]=t,t.modifiesFuture()){let i=[t.recurrenceId.toUnixTime(),e],r=g(this.rangeExceptions,i,Dt);this.rangeExceptions.splice(r,0,i)}}modifiesFuture(){if(!this.component.hasProperty("recurrence-id"))return!1;return this.component.getFirstProperty("recurrence-id").getParameter("range")===gt.THISANDFUTURE}findRangeException(t){if(!this.rangeExceptions.length)return null;let e=t.toUnixTime(),i=g(this.rangeExceptions,[e],Dt);if(i-=1,i<0)return null;let r=this.rangeExceptions[i];return ee[0]?1:e[0]>t[0]?-1:0}var Tt={foldLength:75,debug:!1,newLineChar:"\r\n",Binary:t,Component:yt,ComponentParser:class{constructor(t){void 0===t&&(t={});for(let[e,i]of Object.entries(t))this[e]=i}parseEvent=!0;parseTimezone=!0;oncomplete=function(){};onerror=function(t){};ontimezone=function(t){};onevent=function(t){};process(t){"string"==typeof t&&(t=l(t)),t instanceof yt||(t=new yt(t));let e,i=t.getAllSubcomponents(),r=0,n=i.length;for(;r + */ +"use strict";(self.webpackChunkIcecastMetadataPlayer=self.webpackChunkIcecastMetadataPlayer||[]).push([[385],{209:(U,e,t)=>{t.d(e,{A:()=>a});var s=t(178);function a(){const U=Uint8Array,e=Float32Array;a.modules||Object.defineProperties(a,{modules:{value:new WeakMap},setModule:{value(U,e){a.modules.set(U,Promise.resolve(e))}},getModule:{value(U,e){let t=a.modules.get(U);return t||(e?t=WebAssembly.compile((0,s.D4)(e)):(e=U.wasm,t=a.inflateDynEncodeString(e).then((U=>WebAssembly.compile(U)))),a.modules.set(U,t)),t}},concatFloat32:{value(U,t){let s=new e(t),a=0,n=0;for(;a({errors:U,channelData:e,samplesDecoded:t,sampleRate:s,bitDepth:a})},getDecodedAudioMultiChannel:{value(U,e,t,s,n,r){let i,T,o=[];for(i=0;i(e=(0,s.D4)(e),new Promise((t=>{const s=String.raw`dynEncode0114db91da9bu‡*t“““t“““““t““““$#“U¤¤“U¤¤3yƒ†„‰zzss|yu„svu‡yÚ&ˆ“4<054<,5T44^T44<(6U~J(44< ~A544U~6J0444ˆ†545 444J0444‰J,4U“4ˆU“‡…Ò“7U45“4U4Z“4U4U^/6545T4T44BUˆ~64CU~O4U54U~5 U5T4B4Z!4U~5U5U5T4U~6U4ZTU5U5T44~4O4U2ZTU5T44Z!4B6T44Uˆ~64B6U~O44Uˆ~4O4U~54U~5 44~C4~54U~5 44~5454Uˆ4B6Ub!444~UO4U~5 “U5“4U4ZTUŠ#44U$4†64<4~B6^“4<444~Uˆ~B4U~54Uˆ544~544~Uˆ5 µ“Uä#UJUè#5TT4U0ZTTUX5U5T4T4Uà#~4OU4U $~Cˆ4~54U~5 T44$6U\!TTT4UaT4<6T4<64<Z!44~4N4<U~5 4U”Z!4U±_TUŠ#44U•Uˆ6UÔ~B$544$6U\!4Uˆ6U¤#~B44Uä#~B$~64<6_TU‰#444U”~B~6~54<Y!44<_!T4Y!4<64~444~AN44<U~6J4U5 44J4U”[!U#44UŠO4U~54U~5 U54 “7U6844J44J 4UJ4UJ04VK(44<J44<J$4U´~54U~5 4U¤~5!TTT4U$5"U“5TTTTTTT4U$"4VK,U54<(6U~64<$6_!4< 64~6A54A544U~6#J(U’54A4U‡[!44J(44#~A4Uˆ6U“‡UŠU…[!44†64~64_!4<64~54<6T4<4]TU5 T4Y!44~44~AN4U~54U~54U5 44J(44J UÄA!U5U”#UôJU"UÔJUœ#UÔ"JU˜#U´"JT4U´ZTU5T4UôZTU5T4UDZTU5T4U$[T44~UO4U~5 UÔUô4U~U´$.U5T4UP[T4U~4~UO4U~5 U˜#<Uœ#<4U~U2$.UÄUN 44 ~UO4U~5 44!~UO4U~5 4U~4~UO4U~5 44J44J(U5 44U¤~J@44Uä~J<44UD~J844U~J44U$54U$5U‘54U$54U1^4U1^†!4U•~54U~5U”54U~6U4U^/65T4T4U$54U~4BUˆ~4O4U54U~5 UU'464U'_/54UˆU”~5T4T4U~4BUˆ~UO4U54U~5 U54Uä~4U¤~4U~U'$!44~5U5T44\T44U<~$6U\!4U#aT4U~4Uˆ~4O4U~5 U5U5U5TTT4U$"4YTU5 4Uˆ4~C5U5 U5U5444$4~64~\TUŽ5 4U~4Uˆ~5T4Y!44O4U~54U~54U5 4CYTU‹5 4Uä~4U¤~4U~4$6TU54U\!44Bæ4Bä~[!4U~4UD~4U~4Uˆ~4$6TUŒ54U\!44B†4B„~[!44U<~4U4~$5 4U"U˜#$544"†Y!454U^!44<J44<(J454U~84­U”N!#%'+/37?GOWgw‡—·×÷Uä;U”9$%& !"#`;a.getModule(a,s).then((U=>WebAssembly.instantiate(U,{}))).then((({exports:s})=>{const a=new Map(Object.entries(s)),n=a.get("puff"),r=a.get("memory").buffer,i=new U(r),T=new DataView(r);let o=a.get("__heap_base");const l=e.length,u=o;o+=4,T.setInt32(u,l,!0);const c=o;o+=l,i.set(e,c);const h=o;o+=4,T.setInt32(h,i.byteLength-o,!0),n(o,h,c,u),t(i.slice(o,o+T.getInt32(h,!0)))}))})))}}),Object.defineProperty(this,"wasm",{enumerable:!0,get:()=>this.U}),this.getOutputChannels=(U,e,t)=>{let s=[],a=0;for(;a{const s=this.U.malloc(e.BYTES_PER_ELEMENT*U);return t&&this.t.add(s),{ptr:s,len:U,buf:new e(this.U.HEAP,s,U)}},this.free=()=>{this.t.forEach((U=>{this.U.free(U)})),this.t.clear()},this.codeToString=U=>{const e=[],t=new Uint8Array(this.U.HEAP);for(let s=t[U];0!==s;s=t[++U])e.push(s);return String.fromCharCode.apply(null,e)},this.addError=(U,e,t,s,a,n)=>{U.push({message:e,frameLength:t,frameNumber:s,inputBytes:a,outputSamples:n})},this.instantiate=(U,e)=>(e&&a.setModule(U,e),this.U=new U(a).instantiate(),this.t=new Set,this.U.ready.then((()=>this)))}},374:(U,e,t)=>{t.d(e,{A:()=>n});var s=t(761),a=t(209);class n extends((()=>globalThis.Worker||s)()){constructor(U,e,t,s){a.A.modules||new a.A;let n=a.A.modules.get(t);if(!n){let U,e="text/javascript",r=`'use strict';(${((U,e,t)=>{let s,a,n=new Promise((U=>{a=U}));self.onmessage=({data:{id:r,command:i,data:T}})=>{let o,l=n,u={id:r};"init"===i?(Object.defineProperties(U,{WASMAudioDecoderCommon:{value:e},EmscriptenWASM:{value:t},module:{value:T.module},isWebWorker:{value:!0}}),s=new U(T.options),a()):"free"===i?s.free():"ready"===i?l=l.then((()=>s.ready)):"reset"===i?l=l.then((()=>s.reset())):(Object.assign(u,s[i](Array.isArray(T)?T.map((U=>new Uint8Array(U))):new Uint8Array(T))),o=u.channelData?u.channelData.map((U=>U.buffer)):[]),l.then((()=>self.postMessage(u,o)))}}).toString()})(${t}, ${a.A}, ${s})`;try{U=void 0!==process.versions.node}catch{}n=U?`data:${e};base64,${Buffer.from(r).toString("base64")}`:URL.createObjectURL(new Blob([r],{type:e})),a.A.modules.set(t,n)}super(n,{name:e}),this.i=Number.MIN_SAFE_INTEGER,this.T=new Map,this.onmessage=({data:U})=>{const{id:e,...t}=U;this.T.get(e)(t),this.T.delete(e)},new s(a.A).getModule().then((e=>{this.postToDecoder("init",{module:e,options:U})}))}async postToDecoder(U,e){return new Promise((t=>{this.postMessage({command:U,id:this.i,data:e}),this.T.set(this.i++,t)}))}get ready(){return this.postToDecoder("ready")}async free(){await this.postToDecoder("free").finally((()=>{this.terminate()}))}async reset(){await this.postToDecoder("reset")}}},0:(U,e,t)=>{t.d(e,{A:()=>s});const s=(U,e)=>{Object.defineProperty(U,"name",{value:e})}}}]); +//# sourceMappingURL=icecast-metadata-player-1.17.3.common.min.js.map \ No newline at end of file diff --git a/lib/icecast-metadata-player-1.17.3.common.min.js.map b/lib/icecast-metadata-player-1.17.3.common.min.js.map new file mode 100644 index 0000000..8730b3c --- /dev/null +++ b/lib/icecast-metadata-player-1.17.3.common.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"icecast-metadata-player-1.17.3.common.min.js","mappings":"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","sources":["webpack://IcecastMetadataPlayer/./node_modules/@wasm-audio-decoders/common/src/WASMAudioDecoderCommon.js","webpack://IcecastMetadataPlayer/./node_modules/@wasm-audio-decoders/common/src/WASMAudioDecoderWorker.js","webpack://IcecastMetadataPlayer/./node_modules/@wasm-audio-decoders/common/src/utilities.js"],"sourcesContent":["import { decode } from \"simple-yenc\";\n\nexport default function WASMAudioDecoderCommon() {\n // setup static methods\n const uint8Array = Uint8Array;\n const float32Array = Float32Array;\n\n if (!WASMAudioDecoderCommon.modules) {\n Object.defineProperties(WASMAudioDecoderCommon, {\n modules: {\n value: new WeakMap(),\n },\n\n setModule: {\n value(Ref, module) {\n WASMAudioDecoderCommon.modules.set(Ref, Promise.resolve(module));\n },\n },\n\n getModule: {\n value(Ref, wasmString) {\n let module = WASMAudioDecoderCommon.modules.get(Ref);\n\n if (!module) {\n if (!wasmString) {\n wasmString = Ref.wasm;\n module = WASMAudioDecoderCommon.inflateDynEncodeString(\n wasmString,\n ).then((data) => WebAssembly.compile(data));\n } else {\n module = WebAssembly.compile(decode(wasmString));\n }\n\n WASMAudioDecoderCommon.modules.set(Ref, module);\n }\n\n return module;\n },\n },\n\n concatFloat32: {\n value(buffers, length) {\n let ret = new float32Array(length),\n i = 0,\n offset = 0;\n\n while (i < buffers.length) {\n ret.set(buffers[i], offset);\n offset += buffers[i++].length;\n }\n\n return ret;\n },\n },\n\n getDecodedAudio: {\n value: (errors, channelData, samplesDecoded, sampleRate, bitDepth) => ({\n errors,\n channelData,\n samplesDecoded,\n sampleRate,\n bitDepth,\n }),\n },\n\n getDecodedAudioMultiChannel: {\n value(\n errors,\n input,\n channelsDecoded,\n samplesDecoded,\n sampleRate,\n bitDepth,\n ) {\n let channelData = [],\n i,\n j;\n\n for (i = 0; i < channelsDecoded; i++) {\n const channel = [];\n for (j = 0; j < input.length; ) channel.push(input[j++][i] || []);\n channelData.push(\n WASMAudioDecoderCommon.concatFloat32(channel, samplesDecoded),\n );\n }\n\n return WASMAudioDecoderCommon.getDecodedAudio(\n errors,\n channelData,\n samplesDecoded,\n sampleRate,\n bitDepth,\n );\n },\n },\n\n /*\n ******************\n * Compression Code\n ******************\n */\n\n inflateDynEncodeString: {\n value(source) {\n source = decode(source);\n\n return new Promise((resolve) => {\n // prettier-ignore\n const puffString = String.raw`dynEncode0114db91da9b\u0014u‡\u0015\u0014\u0014\u0014\u0015*\u0017t\u0016““\u0015“t\u0018““““\u0015“t\u0017“““\u0015“\u0017\u001a\u0019\u0014\u0015\u0014\u0016\u0015\u0019\u0017\u0015\u0014$\u001a#\u0016“\u0015U¤¤\u0018\u001f“\u0014U¤¤\u0018\u001f\u001b3\u0017\u001ayƒ†\u0016\u0014\u0018„‰zz\u0014\u0018\u001fss|yu„svu‡y\u0017\u0015\u001eÚ&\u0019ˆ\u0015\u0018“4\u0014<\u001605\u00164\u0014<\u0016,5\u0017\u0017T4\u00154\u0016^\u0018T4\u00144\u0014<\u0016(6\u0018U\u0015~J\u0016(4\u00184\u0014<\u0016 ~A\u0014\u00145\u00194\u00144\u0016U\u001c~6\u0018J\u001604\u00174\u00194\u0016ˆ†5\u00174\u00185\u0016 \u0015\u001f\u001f4\u00144\u00164\u0015J\u001604\u00144\u00174\u0015‰J\u0016,4\u0017U“4\u0015ˆU“‡…\u001fÒ\u0016\u0015\u001a“7\u0014U45\u001b\u0017“4\u0018U4Z\u0018“4\u0017U\u00144\u0017U\u0014^/6\u001c5\u00184\u00165\u0019\u0017T4\u0018\u0018T4\u00144\u0019B\u0015\u0014U\u0015ˆ~6\u001a4\u001aC\u0015\u0014U\u0015~O\u0015\u00144\u0018U\u00155\u00184\u0019U\u0016~5\u0019 \u0015\u001f\u001fU\u00145\u001a\u0016T4\u0014B\u0015\u00144\u0017Z!\u00144\u0014U\u0016~5\u0019U\u00145\u0018U\u00155\u001a\u0017T4\u0018U\u0016~6\u0017U4Z\u0018TU\u00145\u0019U\u00165\u0018\u0017T4\u00184\u001b~4\u0019O\u0015\u00144\u0018U2Z\u0018TU\u00145\u0018\u0017T4\u00184\u001cZ!\u00194\u0016B\u0015\u00146\u0014\u0018T4\u001b4\u0014U\u0015ˆ~6\u00144\u0014B\u0015\u00146\u0014U\u0015~O\u0015\u00144\u00154\u0014U\u0015ˆ~4\u0018O\u0015\u0014\u001f4\u0016U\u0016~5\u00164\u0018U\u0015~5\u0018 \u0014\u001f\u0014\u00194\u00144\u0018~C\u0015\u00144\u0019~5\u00194\u0018U\u0016~5\u0018 \u0015\u001f\u0014\u001f\u0014\u001f4\u00184\u0019~5\u001d4\u00175\u00184\u001aU\u0015ˆ4\u001dB\u0015\u00146\u001aU\u0014b!\u0014\u001f\u001f4\u001a\u00194\u00144\u0018~U\u0014O\u0015\u00144\u0018U\u0016~5\u0018 \u0015\u001f\u001f\u001f\u0015\u0019“U\u00165\u0016\u0017“4\u0016U4Z\u0018TUŠ#\u001f4\u00184\u0014U\u0015$\u00144\u0017†6\u00174\u0015<\u0016\u00144\u0016~B\u0015\u00146\u0019^\u0018“4\u0015<\u0016\u00184\u001a4\u00184\u0017~U\u0015ˆ~B\u0015\u0014\u00194\u0016U\u0016~5\u00164\u0017U\u0015ˆ5\u00174\u00194\u001a~5\u001a4\u00184\u0019~U\u0015ˆ5\u0018 \u0015\u001f\u001f\u001fµ\u0017\u0015\u0019“Uä#U\u0014J\u0016\u0014Uè#5\u0018\u0016T\u0017T4\u0017U0Z\u0018T\u0016TUX5\u0017U\u00155\u0018\u0017T4\u0017\u0018T4\u0017Uà#~4\u0018O\u0015\u0014U\u00154\u0017U $~C\u0015\u0014ˆ4\u0018~5\u00184\u0017U\u0016~5\u0017 \u0015\u0019\u0017T4\u00144\u0015$\u00166\u0019U\u0014\\!\u001a\u0016T\u0016T\u0016T4\u0019U\u0013\u0015a\u0018T4\u0014<\u0016\u00146\u0017\u0018T4\u0014<\u0016\u001c6\u00184\u0014<\u0016\u0018Z!\u001c4\u00174\u0018~4\u0019N\u0014\u0014\u001f4\u0014<\u0016\u001cU\u0015~5\u001a \u0015\u001f4\u0019U”\u0016Z!\u00164\u0019U±\u0016_\u0018TUŠ#\u001f4\u00144\u0019U•\u0016U\u0015ˆ6\u0018UÔ\u001c~B\u0015\u0014$\u00145\u001a4\u00144\u0016$\u00166\u0019U\u0014\\!\u001d4\u0019U\u0015ˆ6\u0017U¤#~B\u0015\u00144\u00144\u0017Uä#~B\u0015\u0014$\u0014~6\u001b4\u0014<\u0016\u001c6\u0017_\u0018TU‰#\u001f4\u00174\u001a4\u0018U”\u001c~B\u0015\u0014~6\u0018~5\u001a4\u0014<\u0016\u0014Y!\u00144\u001a4\u0014<\u0016\u0018_!\u001a\u0017T4\u0018Y!\u00164\u0014<\u0016\u00146\u001a4\u0017~4\u001a4\u00174\u001b~A\u0014\u0014N\u0014\u00144\u00144\u0014<\u0016\u001cU\u0015~6\u0017J\u0016\u001c4\u0018U\u00155\u0018 \u0014\u001f\u0014\u001f4\u00144\u001aJ\u0016\u001c\u001f4\u0019U”\u0016[!\u0015\u001f\u001fU\u0014#\u001f\u0014\u001f\u0014\u001f\u00194\u00184\u0017U\u0015ŠO\u0015\u00144\u0018U\u0016~5\u00184\u0017U\u0015~5\u0017 \u0015\u001f\u001fU\u00155\u0019\u001f4\u0019\u001f\u0013\u001e\u0015 “7\u0014U\u0004\u001e6\u00188\u00144\u00184\u0014J\u0016\u00144\u00184\u0016J\u0016 4\u0018U\u0014J\u0016\u001c4\u0018U\u0014J\u001604\u0018V\u0014K\u0016(4\u00184\u0015<\u0016\u0014J\u0016\u00184\u00184\u0017<\u0016\u0014J\u0016$4\u0018U´\u001e~5\u001f4\u0018U\u0004\u001d~5 4\u0018U¤\u001c~5!\u0016T\u0016T\u0017T4\u0018U\u0015$\u00145\"U“5\u0014\u0016T\u0016T\u0016T\u0016T\u0016T\u0016T\u0016T4\u0018U\u0016$\u0014\"\u0017\u0014\u0015\u0018\u001c\u001f4\u0018V\u0014K\u0017,U\u00165\u00194\u0018<\u0016(6\u0014U\u0018~6\u00164\u0018<\u0016$6\u001d_!\u001c4\u0018<\u0016 6\u001c4\u0014~6\u001aA\u0014\u00145\u001b4\u001aA\u0014\u00155\u001e4\u00184\u0014U\u0017~6#J\u0016(U’5\u00144\u001aA\u0014\u00164\u001bU\u0013\u0015‡[!\u001b4\u00184\u0016J\u0016(4\u001c4#~A\u0014\u00144\u001eU\u001cˆ6\u001aU“‡U\u001cŠU\u0013\u0015…[!\u001b4\u001a4\u001b†6\u00144\u0016~6\u001b4\u001d_!\u001c4\u0018<\u0016\u001c6\u00194\u0014~5\u001a4\u0018<\u0016\u00146\u001d\u0018T4\u0018<\u0016\u00184\u001a]\u0018TU\u00155\u0019 \u001e\u001f\u0017T4\u0014Y!\u00174\u00194\u001d~4\u00164\u001c~A\u0014\u0014N\u0014\u00144\u0019U\u0015~5\u00194\u0016U\u0015~5\u00164\u0014U\u00155\u0014 \u0014\u001f\u0014\u001f4\u00184\u001bJ\u0016(4\u00184\u001aJ\u0016\u001c \u0016\u001fUÄ\u001dA\u0014\u0014!\u0017U\u00145\u0016U”#Uô\u001dJ\u0016\u0014U\u0010\"UÔ\u001dJ\u0016\u0014Uœ#UÔ\"J\u0016\u0014U˜#U´\"J\u0016\u0014\u0017T4\u0016U´\u0016Z\u0018TU\u00145\u0016\u0017T4\u0016Uô\u0015Z\u0018TU\u00145\u0016\u0017T4\u0016UDZ\u0018TU\u00145\u0016\u0017T4\u0016U$[\u0018T4\u00164\u001f~U\u001cO\u0015\u00144\u0016U\u0016~5\u0016 \u0015\u001f\u001fUÔ\u001dUô\u001d4\u0018U\u0004\u0019~U´\u0016$\u0015.U\u00145\u0016\u0017T4\u0016UP[\u0018T4\u0018U\u0004\u0019~4\u0016~U\u0019O\u0015\u00144\u0016U\u0016~5\u0016 \u0015\u001f\u001fU˜#<\u0016\u0014Uœ#<\u0016\u00144\u0018U\u0004\u0019~U2$\u0015.UÄ\u001dU\u0015N\u0014\u0014 \u001d\u00194\u00164 ~U\u001bO\u0015\u00144\u0016U\u0016~5\u0016 \u0015\u001f\u0014\u001f\u0014\u00194\u00164!~U\u001dO\u0015\u00144\u0016U\u0016~5\u0016 \u0015\u001f\u0014\u001f\u0014\u00194\u0018U\u0004\u0019~4\u0016~U\u001cO\u0015\u00144\u0016U\u0016~5\u0016 \u0015\u001f\u0014\u001f\u0014\u001f4\u00184\u0019J\u0016\u001c4\u00184\u0016J\u0016(\u001fU\u00145\u0014 \u0016\u001f4\u00184\u0018U¤\u0015~J\u0016@4\u00184\u0018Uä\u0019~J\u0016<4\u00184\u0018UD~J\u001684\u00184\u0018U\u0004\u0014~J\u001644\u0018U\u0019$\u00145\u00164\u0018U\u0019$\u00145\u0019U‘5\u00144\u0018U\u0018$\u00145\u001b4\u0016U1^4\u0019U1^†!\u00154\u0016U•\u0016~5\u001c4\u0019U\u0015~5\u001aU”\u001d5\u00144\u001bU\u0018~6\u0016U\u00144\u0016U\u0014^/6\u00195\u0016\u0017T4\u0016\u0018T4\u0018U\u0017$\u00145\u001b4\u0018U\u0004\u0019~4\u0014B\u0015\u0014U\u0015ˆ~4\u001bO\u0015\u00144\u0016U\u00155\u00164\u0014U\u0016~5\u0014 \u0015\u0019U\u0014U'4\u00196\u00144\u0014U'_/5\u00164\u0019U\u0015ˆU”\u001d~5\u0014\u0017T4\u0016\u0018T4\u0018U\u0004\u0019~4\u0014B\u0015\u0014U\u0015ˆ~U\u0014O\u0015\u00144\u0016U\u00155\u00164\u0014U\u0016~5\u0014 \u0015\u001f\u001fU5\u00144\u0018Uä\u0019~4\u0018U¤\u0015~4\u0018U\u0004\u0019~U'$\u0015!\u00174\u001a4\u001c~5\u001bU\u00145\u0019\u0017T4\u00194\u001b\\\u0018T4\u00184\u0018U<~$\u00166\u0014U\u0014\\!\u00194\u0014U#a\u0018T4\u0018U\u0004\u0019~4\u0019U\u0015ˆ~4\u0014O\u0015\u00144\u0019U\u0015~5\u0019 \u0016\u001fU\u00145\u001dU\u00175\u001eU\u00175\u0016\u0016T\u0016T\u0016T4\u0014U$\"\u0016\u0014\u0016\u0015\u001f4\u0019Y\u0018TU5\u0014 \u001c\u001f4\u0019U\u0015ˆ4\u0018~C\u0015\u0002\u00195\u001dU\u00165\u0016 \u0015\u001fU\u001f5\u001eU\u001b5\u0016\u001f4\u001b4\u00184\u0016$\u00144\u001e~6\u00164\u0019~\\\u0018TUŽ5\u0014 \u001a\u001f4\u0018U\u0004\u0019~4\u0019U\u0015ˆ~5\u0014\u0017T4\u0016Y!\u00164\u00144\u001dO\u0015\u00144\u0014U\u0016~5\u00144\u0019U\u0015~5\u00194\u0016U\u00155\u0016 \u0014\u001f\u0014\u001f\u001f4\u0018C\u0015\u0004\u001dY\u0018TU‹5\u0014 \u0018\u001f4\u0018Uä\u0019~4\u0018U¤\u0015~4\u0018U\u0004\u0019~4\u001c$\u00156\u0016\u0018TU5\u00144\u0016U\u0014\\!\u00184\u001c4\u0018B\u0015æ\u00194\u0018B\u0015ä\u0019~[!\u0018\u001f4\u0018U\u0004\u0014~4\u0018UD~4\u0018U\u0004\u0019~4\u001cU\u0015ˆ~4\u001a$\u00156\u0016\u0018TUŒ5\u00144\u0016U\u0014\\!\u00184\u001a4\u0018B\u0015†4\u0018B\u0015„~[!\u0018\u001f4\u00184\u0018U<~4\u0018U4~$\u00175\u0014 \u0017\u001f\u0014\u001f\u0014\u001f4\u0018U\u0010\"U˜#$\u00175\u0014\u001f4\u00144\"†Y!\u0014\u001f4\u00145\u00194\u0014U\u0014^!\u0015\u001f4\u00154\u0018<\u0016\u001cJ\u0016\u00144\u00174\u0018<\u0016(J\u0016\u00144\u00145\u0019\u001f4\u0018U\u0004\u001e~8\u00144\u0019\u001f\u001f­\u0015\u0017\u0014U”\u001c\u001fN\u0017\u0014\u0018\u0014\u0019\u0014\u001a\u0014\u001b\u0014\u001c\u0014\u001d\u0014\u001e\u0014\u001f\u0014!\u0014#\u0014%\u0014'\u0014+\u0014/\u00143\u00147\u0014?\u0014G\u0014O\u0014W\u0014g\u0014w\u0014‡\u0014—\u0014·\u0014×\u0014÷\u0014\u0016\u0015\u0014Uä\u001c\u001f;\u0015\u0014\u0015\u0014\u0015\u0014\u0015\u0014\u0016\u0014\u0016\u0014\u0016\u0014\u0016\u0014\u0017\u0014\u0017\u0014\u0017\u0014\u0017\u0014\u0018\u0014\u0018\u0014\u0018\u0014\u0018\u0014\u0019\u0014\u0019\u0014\u0019\u0014\u0019\u0014U”\u001d\u001f9$\u0014%\u0014&\u0014\u0014\u0014\u001c\u0014\u001b\u0014\u001d\u0014\u001a\u0014\u001e\u0014\u0019\u0014\u001f\u0014\u0018\u0014 \u0014\u0017\u0014!\u0014\u0016\u0014\"\u0014\u0015\u0014#`;\n\n WASMAudioDecoderCommon.getModule(WASMAudioDecoderCommon, puffString)\n .then((wasm) => WebAssembly.instantiate(wasm, {}))\n .then(({ exports }) => {\n // required for minifiers that mangle the __heap_base property\n const instanceExports = new Map(Object.entries(exports));\n\n const puff = instanceExports.get(\"puff\");\n const memory = instanceExports.get(\"memory\")[\"buffer\"];\n const dataArray = new uint8Array(memory);\n const heapView = new DataView(memory);\n\n let heapPos = instanceExports.get(\"__heap_base\");\n\n // source length\n const sourceLength = source.length;\n const sourceLengthPtr = heapPos;\n heapPos += 4;\n heapView.setInt32(sourceLengthPtr, sourceLength, true);\n\n // source data\n const sourcePtr = heapPos;\n heapPos += sourceLength;\n dataArray.set(source, sourcePtr);\n\n // destination length\n const destLengthPtr = heapPos;\n heapPos += 4;\n heapView.setInt32(\n destLengthPtr,\n dataArray.byteLength - heapPos,\n true,\n );\n\n // destination data fills in the rest of the heap\n puff(heapPos, destLengthPtr, sourcePtr, sourceLengthPtr);\n\n resolve(\n dataArray.slice(\n heapPos,\n heapPos + heapView.getInt32(destLengthPtr, true),\n ),\n );\n });\n });\n },\n },\n });\n }\n\n Object.defineProperty(this, \"wasm\", {\n enumerable: true,\n get: () => this._wasm,\n });\n\n this.getOutputChannels = (outputData, channelsDecoded, samplesDecoded) => {\n let output = [],\n i = 0;\n\n while (i < channelsDecoded)\n output.push(\n outputData.slice(\n i * samplesDecoded,\n i++ * samplesDecoded + samplesDecoded,\n ),\n );\n\n return output;\n };\n\n this.allocateTypedArray = (len, TypedArray, setPointer = true) => {\n const ptr = this._wasm.malloc(TypedArray.BYTES_PER_ELEMENT * len);\n if (setPointer) this._pointers.add(ptr);\n\n return {\n ptr: ptr,\n len: len,\n buf: new TypedArray(this._wasm.HEAP, ptr, len),\n };\n };\n\n this.free = () => {\n this._pointers.forEach((ptr) => {\n this._wasm.free(ptr);\n });\n this._pointers.clear();\n };\n\n this.codeToString = (ptr) => {\n const characters = [],\n heap = new Uint8Array(this._wasm.HEAP);\n for (let character = heap[ptr]; character !== 0; character = heap[++ptr])\n characters.push(character);\n\n return String.fromCharCode.apply(null, characters);\n };\n\n this.addError = (\n errors,\n message,\n frameLength,\n frameNumber,\n inputBytes,\n outputSamples,\n ) => {\n errors.push({\n message: message,\n frameLength: frameLength,\n frameNumber: frameNumber,\n inputBytes: inputBytes,\n outputSamples: outputSamples,\n });\n };\n\n this.instantiate = (_EmscriptenWASM, _module) => {\n if (_module) WASMAudioDecoderCommon.setModule(_EmscriptenWASM, _module);\n this._wasm = new _EmscriptenWASM(WASMAudioDecoderCommon).instantiate();\n this._pointers = new Set();\n\n return this._wasm.ready.then(() => this);\n };\n}\n","import NodeWorker from \"@eshaz/web-worker\";\nimport WASMAudioDecoderCommon from \"./WASMAudioDecoderCommon.js\";\n\nconst getWorker = () => globalThis.Worker || NodeWorker;\n\nexport default class WASMAudioDecoderWorker extends getWorker() {\n constructor(options, name, Decoder, EmscriptenWASM) {\n if (!WASMAudioDecoderCommon.modules) new WASMAudioDecoderCommon();\n\n let source = WASMAudioDecoderCommon.modules.get(Decoder);\n\n if (!source) {\n let type = \"text/javascript\",\n isNode,\n webworkerSourceCode =\n \"'use strict';\" +\n // dependencies need to be manually resolved when stringifying this function\n `(${((_Decoder, _WASMAudioDecoderCommon, _EmscriptenWASM) => {\n // We're in a Web Worker\n\n // setup Promise that will be resolved once the WebAssembly Module is received\n let decoder,\n moduleResolve,\n modulePromise = new Promise((resolve) => {\n moduleResolve = resolve;\n });\n\n self.onmessage = ({ data: { id, command, data } }) => {\n let messagePromise = modulePromise,\n messagePayload = { id },\n transferList;\n\n if (command === \"init\") {\n Object.defineProperties(_Decoder, {\n WASMAudioDecoderCommon: { value: _WASMAudioDecoderCommon },\n EmscriptenWASM: { value: _EmscriptenWASM },\n module: { value: data.module },\n isWebWorker: { value: true },\n });\n\n decoder = new _Decoder(data.options);\n moduleResolve();\n } else if (command === \"free\") {\n decoder.free();\n } else if (command === \"ready\") {\n messagePromise = messagePromise.then(() => decoder.ready);\n } else if (command === \"reset\") {\n messagePromise = messagePromise.then(() => decoder.reset());\n } else {\n // \"decode\":\n // \"decodeFrame\":\n // \"decodeFrames\":\n Object.assign(\n messagePayload,\n decoder[command](\n // detach buffers\n Array.isArray(data)\n ? data.map((data) => new Uint8Array(data))\n : new Uint8Array(data),\n ),\n );\n // The \"transferList\" parameter transfers ownership of channel data to main thread,\n // which avoids copying memory.\n transferList = messagePayload.channelData\n ? messagePayload.channelData.map((channel) => channel.buffer)\n : [];\n }\n\n messagePromise.then(() =>\n self.postMessage(messagePayload, transferList),\n );\n };\n }).toString()})(${Decoder}, ${WASMAudioDecoderCommon}, ${EmscriptenWASM})`;\n\n try {\n isNode = typeof process.versions.node !== \"undefined\";\n } catch {}\n\n source = isNode\n ? `data:${type};base64,${Buffer.from(webworkerSourceCode).toString(\n \"base64\",\n )}`\n : URL.createObjectURL(new Blob([webworkerSourceCode], { type }));\n\n WASMAudioDecoderCommon.modules.set(Decoder, source);\n }\n\n super(source, { name });\n\n this._id = Number.MIN_SAFE_INTEGER;\n this._enqueuedOperations = new Map();\n\n this.onmessage = ({ data }) => {\n const { id, ...rest } = data;\n this._enqueuedOperations.get(id)(rest);\n this._enqueuedOperations.delete(id);\n };\n\n new EmscriptenWASM(WASMAudioDecoderCommon).getModule().then((module) => {\n this.postToDecoder(\"init\", { module, options });\n });\n }\n\n async postToDecoder(command, data) {\n return new Promise((resolve) => {\n this.postMessage({\n command,\n id: this._id,\n data,\n });\n\n this._enqueuedOperations.set(this._id++, resolve);\n });\n }\n\n get ready() {\n return this.postToDecoder(\"ready\");\n }\n\n async free() {\n await this.postToDecoder(\"free\").finally(() => {\n this.terminate();\n });\n }\n\n async reset() {\n await this.postToDecoder(\"reset\");\n }\n}\n","export const assignNames = (Class, name) => {\n Object.defineProperty(Class, \"name\", { value: name });\n};\n"],"names":["WASMAudioDecoderCommon","uint8Array","Uint8Array","float32Array","Float32Array","modules","Object","defineProperties","value","WeakMap","setModule","Ref","module","set","Promise","resolve","getModule","wasmString","get","WebAssembly","compile","wasm","inflateDynEncodeString","then","data","concatFloat32","buffers","length","ret","i","offset","getDecodedAudio","errors","channelData","samplesDecoded","sampleRate","bitDepth","getDecodedAudioMultiChannel","input","channelsDecoded","j","channel","push","source","puffString","String","raw","instantiate","exports","instanceExports","Map","entries","puff","memory","dataArray","heapView","DataView","heapPos","sourceLength","sourceLengthPtr","setInt32","sourcePtr","destLengthPtr","byteLength","slice","getInt32","defineProperty","this","enumerable","_wasm","getOutputChannels","outputData","output","allocateTypedArray","len","TypedArray","setPointer","ptr","malloc","BYTES_PER_ELEMENT","_pointers","add","buf","HEAP","free","forEach","clear","codeToString","characters","heap","character","fromCharCode","apply","addError","message","frameLength","frameNumber","inputBytes","outputSamples","_EmscriptenWASM","_module","Set","ready","WASMAudioDecoderWorker","globalThis","Worker","getWorker","constructor","options","name","Decoder","EmscriptenWASM","isNode","type","webworkerSourceCode","_Decoder","_WASMAudioDecoderCommon","decoder","moduleResolve","modulePromise","self","onmessage","id","command","transferList","messagePromise","messagePayload","isWebWorker","reset","assign","Array","isArray","map","buffer","postMessage","toString","process","versions","node","Buffer","from","URL","createObjectURL","Blob","super","_id","Number","MIN_SAFE_INTEGER","_enqueuedOperations","rest","delete","postToDecoder","finally","terminate","assignNames","Class"],"sourceRoot":""} \ No newline at end of file diff --git a/lib/icecast-metadata-player-1.17.3.flac.min.js b/lib/icecast-metadata-player-1.17.3.flac.min.js new file mode 100644 index 0000000..a1c966c Binary files /dev/null and b/lib/icecast-metadata-player-1.17.3.flac.min.js differ diff --git a/lib/icecast-metadata-player-1.17.3.flac.min.js.map b/lib/icecast-metadata-player-1.17.3.flac.min.js.map new file mode 100644 index 0000000..f251a81 --- /dev/null +++ b/lib/icecast-metadata-player-1.17.3.flac.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"icecast-metadata-player-1.17.3.flac.min.js","mappings":"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","sources":["webpack://IcecastMetadataPlayer/./node_modules/@eshaz/web-worker/cjs/browser.js","webpack://IcecastMetadataPlayer/./node_modules/@wasm-audio-decoders/flac/src/EmscriptenWasm.js","webpack://IcecastMetadataPlayer/./node_modules/@wasm-audio-decoders/flac/src/FLACDecoder.js","webpack://IcecastMetadataPlayer/./node_modules/@wasm-audio-decoders/flac/src/FLACDecoderWebWorker.js","webpack://IcecastMetadataPlayer/./node_modules/@wasm-audio-decoders/flac/index.js","webpack://IcecastMetadataPlayer/./node_modules/simple-yenc/dist/esm.js"],"sourcesContent":["/**\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nmodule.exports = Worker;","/* **************************************************\n * This file is auto-generated during the build process.\n * Any edits to this file will be overwritten.\n ****************************************************/\n\nexport default function EmscriptenWASM(WASMAudioDecoderCommon) {\nvar Module = Module;\n\nvar out = text => console.log(text);\n\nvar err = text => console.error(text);\n\nfunction ready() {}\n\nModule = {};\n\n/** @param {string|number=} what */ function abort(what) {\n throw what;\n}\n\nfor (var base64ReverseLookup = new Uint8Array(123), /*'z'+1*/ i = 25; i >= 0; --i) {\n base64ReverseLookup[48 + i] = 52 + i;\n base64ReverseLookup[65 + i] = i;\n base64ReverseLookup[97 + i] = 26 + i;\n}\n\nbase64ReverseLookup[43] = 62;\n\nbase64ReverseLookup[47] = 63;\n\n/** @noinline */ function base64Decode(b64) {\n var b1, b2, i = 0, j = 0, bLength = b64.length, output = new Uint8Array((bLength * 3 >> 2) - (b64[bLength - 2] == \"=\") - (b64[bLength - 1] == \"=\"));\n for (;i < bLength; i += 4, j += 3) {\n b1 = base64ReverseLookup[b64.charCodeAt(i + 1)];\n b2 = base64ReverseLookup[b64.charCodeAt(i + 2)];\n output[j] = base64ReverseLookup[b64.charCodeAt(i)] << 2 | b1 >> 4;\n output[j + 1] = b1 << 4 | b2 >> 2;\n output[j + 2] = b2 << 6 | base64ReverseLookup[b64.charCodeAt(i + 3)];\n }\n return output;\n}\n\nif (!EmscriptenWASM.wasm) Object.defineProperty(EmscriptenWASM, \"wasm\", {get: () => String.raw`dynEncode0146c05a3732ò›{Úb\u0013Wt.\u001fá#\u001fû=}ƒEfœ\u0013ÎÄV\tÐë³w¹´ì_\u0019\u0007Y‘¹¬¹°’[o•c\u001f×ßow¬¼´ô0ÀýM¬~ÞD\u0000þðñ\u0000'óù5F\u0006ý\u0004's\"üsêuüµ‡AÊ\u001c}*ê\nà (™¡ÒØûYG+»\u0018\u0014;Øï‚3ãJ†¡€>œÂñ?\býG1=}3/ATfC\u0004yÃ%K\u0005øSyPNçaHof\f¤Ç†ŸfªÌÄLcŠè\u0014fª>grВý9z•ã¢©Ôå?‡nì\u0010b%“Æ5Ç3>¤Þ\b= |¦Iá6Ãö_%U¡6IN#gˆ\nèý—\u00100\u001bü\u0004ü3;$Ýč!D\u0006^ = QãS©\u0007NiȄ\\Æ®9\u001fG\u001e@\u000b÷ƒíÞÊuñ^\n¼ŠõŠ¾©gfr\u001a.”›~o+›¬\u0011öP“\u0012,R€§í[Ž= z¿q¾n—þjë*Ó3ù>º\u0000H\u000f\u0014ñژáФç歒¼\u001aãW+ Î²Š‡†öt\u001bi‘îq6²‡)˜\u0011ïάF’}¾áÆ/ÈJ\u0019‹'ê‘È\\ít77ú¯p\u0006š˜è\u001c¢ š[\n\u0005\u0006\u001bZú\u001e‡Ìè>¢æ\u0002ëíwuß\f¯fžžiâüÜÕ-u1\bwýE\u0011\u001b\u001a Ø#Jš£°ÛR×±“!pÅ»3EyZ:j/?íð$oþ[rúä:dœ#•ÛƒÀpj#­»‹œÉ¦Ï!\u0007éJq\u001b5Cpv™ÛS€È$F®ÍÞ¡»¸µFÚ\u001aTì=}£\u001bQ°\n\u000e\u0007\u0015\u001aúR+ˆ—aËê½P…ëŸssëL8B\u0019e\u001b˜= 9)‹Ð\u001b4O­Ý#ˆy2„¾\u001cÚc= ‘=}Œ^n\u0017p\u0019Ÿ= ¿Ï\u0018ƒ{õ…'\u0014F(u²à]¸OÀÑ÷£¼I¢Ø˜öÖà؂kۃõ”kž‰È¶\"£=M#xûüdô{x ëÎ\u000f©x´¸\u0017 \nRß߈‰\u0012P\u000fÐeX˜‘©\u001dÍNF\u0018\u000eš,!ý^?(HÙ‡ç\u000e\u0014œŠY\u0007ïÏfqƒ’.£í1ÅY¿\u0000¨yU„˜n°.·èç°~ߣiO+\u0004J{ف¡—ÅhþÀhþ\u0010Ý]Â_@\u0018''Š3ËO {‡1bÐ¾€ôàïþ\u0017–j\u001fûQÆ2®”\u0007‡¤+\u0011\u0016Ý\"]¹t\u001c~ð¨Àau¡¿KÐ埫}ÇÀõ\b¬æ7Ð=M\u0011p~½£}D²Ÿ\u0001\u001e©]÷ª\u000bâÊ¥–Hӓ˜-Î[@Y\fü*< žGB\u0003†é\u001f\u001cu)Ð)ð#\u0013Eßí©„}év\u0005á¼èâ\u0001yyiƺˆo6–ÝndbÐÍí\u000f¾šDnŒ\u0016öø\bˆ÷BÊڪ׸Кˆ2\u001dwe¼rGÙR/Ì\u001d}«6DÆ~\u001c?\u001bàþÓºÿÆiÁˆb\u001f»*îõc/®îí,.K3ŸñúÏcóa\u0017€xh·ú¿Šác\u0003è)®AÎü ƒè#Ô<Õ®\u0005é‰i€*.\u001eÎÔO\f·©ß/˜×Êñ$MþrÀ:Ìf£šTr¹qZ=M¶·\u001f²%®0EöØÔ6Næi€H*ÎÕFõ6(\u0017žç\u001b=M…„U'ºÁ[\u0005‡ªeôÐÂþœÔ]ôbuµnƒ\u0013«ùËq¬qrßóöv¡à.…eÖùÉò–wåSb†…>¢\u0016ˆÉUž\u0016à^óÜ¢r©'¥\u001fvÑs\u0011·^Ƅ”Ð?'æ\f­Äj\u0005é²àÁ\u001d\u0012\u0012\u0012\u0012\u0012’É\u0013\u0012\u0012\u0012ÒÜbòðû¨#q¡PëˆÈ´\u0012lté|\u0005\u001dj\u0010ÃÿUº{ýÓô'¹\u0018û<‹úÈ<3\u000b©µ£\u000bµü\u0000ôÁî1ÔDöó­U\u000f\u0006õ0Sd°Ï&Ç涃ˆÛÃbzf\u001a\u001fm­iÈz7pùø\u0010ò¢wD,¼W>;\u0003‡è¼nªHäO¢\u0004\u001fÅ\u0004Š\u0005ë}~î[cÞOŽYÞ¶±\u001eqm6Ñ\u0003‡7‡ÇxG=MJ”$^ÁlXÚ\u0010\u000bö\u0007»Y¸\u00111¬–\u000e©æ¡’¶‡8‹Xé,4˜ŽXôÛ¶‰\u001c\u0019\u001dÁ<þG‘vÑIôO…Áý\u0006Tx×iÍQ1Mb7ÖbÚ·&¿\u0017ó\u000eYê!Ž\u0006\u0014Û\u0014i•àtê›j[w4\u000f(ðfœ—’j=M)E\u0010ŽŠëŠTâ^ûÿГ^Þ2\fÈKAôžYÝä= {–Qt•îthnä £ˆ¶¾Ø»ß\u0012X\u001e\u0019Ÿ¹ ž\bÜ]\u0019¤ÃÞ·Ê<ɯhëƒÅ\"ÏéP‰^³Hz™´OÓN\b>Æ0P\b¢}­9\u0016),Ò¢ôÉ$\u0018ò2\u0004/¥\u0005àyóOÇH ÖÙÉY4\u0010ìÕaj@ÓÜ!cê\u001b‚=}¨\u0017L\u0019‚?Êàý\u001aÜr»';É=Mª0/«) wKs¬ç%}Â\u001egÉV0\n\u0016³\t\u001c3­n\u0005ú‰ÉçÜNmç֖oC\u0003߉=Mjð¦ð©«œ\u0002ž¾uïÛܚy\u001dÎ\u001diê};)ãÛ]¹×ÆÎÔ¬?É[P\tàï\u001c¸ü\u001c\u0015ñ¥ò¹\u001c€²!D¸NCɖóÜoæo¡:\u000b\u0007\u0001¼À^]ó£‘ý5\"Úðê®ÍTŽ×~é3̹Í2_£P«+®Um²ª\u001c\u001b\u001f\u0004+ñï}U\u0002èf\u0013JçՓ!k\u001aÓªˆ= µ\f„´TB˜Â–ú²\u001d\u0010‡Ý¢\u0014\u0014XØ\"[\u001af\u0015e]\u0005Â4-±POm˜þ¿UmBåQ¨âÆx×®Ji\"þçCîT\u0002\u0005\u0005„ƒjw\u000bñm¤³Ð}ª#-[h®\u0015A‚-&Kß,[Î\u001dâ(S$w5•²ÕA-@ð;xoõ_8–xwd\u001d\u001cZº,×7E\u000b–_‡…ÂbD›f‡ÿó24NîkºI=}›½–ú@:÷‘TÝ°\u001e5!\u0003aM¼3\u0002Â\u00132Ø]ì›Z¦$\u001a5qíq:±‰¡\u0007G4Û³±]à9®øÍÑüÇkÿP°N[l½îü\u00031ÅTBˆN»¨.\u0007ӕ¾\u001eO:\u001f\u0003i‰ñȔæIí4\u0011«Þ‚û\"Ïӟ, ‰\u0015”‹–ßÈdExEq‰³´[-äý'Žiwo½€\u0019ÙÕå4!ˆ3arš\u0006'\u0004ù\tݪä\u0005¶$QËʲ\u0014ýGaD\u0010KWX3%΀–z/0T\u0015âz‹\u000bPŽµ·À̈‰üüãÑõåÙ®Óú†A×t\u0006iíˆ\u001c/?ˁQË\u001fÌe\u0002ÃU\u000ec\u001dÛ%\"…yµ$á¿5á•Øó•Ø‰4’ªpýa8ë»h×LihEg|·g†nGHrª¿å\u001e ؖ\t¨A¹¯°R“ÑQ$œQ´1\\‰ŠÖ\u0007soþ£u®Ña˜Nz\u0006t^v\u000bÚº·!ëþz–\u0019¬\u0019ä%?\u0013ãß=}Ð¨­A_\u0003ßÁ5-äÁ4ÿ-äÁ4\u0003)\u0005o–\u0004~×F6˜©ð\u0002.\u0016œ\u0019ٞB=M\u001a’U3§Ž&ù÷̕6äšÙüÑÐ_ò(Y£ôá´ÿ´ºÿ„¯¹×҃UÂþ±y£E\u001c|žãÝ&‡’wW/\u0010{ªRЦ«ãKINmÄNB1ZtÈ\u000biµ˜úp\u001bƉ¶g‰Â\u0010\fKš]d÷£¾\n\u0003ôQÕ\u001et¸¦Í\u000eÇÛ\u000eÇCœÙw¸Ö;×IŠTòŠT–´—diM\b„iMo\\\u001e|̍\u0006F\biÜ'WҒ«H'WýWd_d§fFda= ÉžÎü\u001böóTºbf‚@ŸÚñ—®í‡gPíéƍ\u001dÄìo†\u0006cn˜¶iÆsHxãÆ\u0012ffiHx%°rKªÁG߇†ŒJªof\u0001_ 7VÖ_Jªš†ìYÖÿéƂK\u001a= ×“qZ»ç¶ø®\u001b“£µ³±PL\u001cJj’ŠÏ_Ö\u0016—x1= Þ\u0011ÁD\u001eïðÆ0L™-‹\u000eÑ(¬´Ð\u0014Ûåä4B;%Î4~Ü̾\u0011±•“\u0015Ö\u0000õ·= É0èÔRüvˍ®˜æw屪3üA2gÐ=}æ\u000e\u0000”…_òrÔ»ŸÒý±\u0007õræ‰p ÁóC\u0005,/|O\\·\"qh'<\u001c\u00148yl¯lÚ\u0014·ëyŸëi\t,ôÖ½Æb—¸æþÎ(\u001c—\"–O×ñ\u0011 6m\u001d \u000flj–i¢—¡ŒÝI©ËÁKҗý\u0000\u0017–ãôOTˆ8_ùãFF'5Q\u0016=}’GfÄ_ÉÒßmÕrkù€öpj÷þ7藋ÞhsþMH\u001b~ôŒVÏ]’\u001eg\fûËÝg¼RÁ í\u0007½Ç®c•\u0005zÀ§Ùhê§ Ü\u0010$É>\u001f%{ísªß½\"N™vxOhŒ\u0002–-aQÖkRì\u0003lr\u001et,•‹Øº\t¶\u001b’ê„j\u0010³Ç(rZgIÙ\u001f\u0006ª\u001cyߋl‰È\u000bq\u001döÓOy£\u0002èdO¿‡ÉWFW dœÀlU׊\u0017\u001b\u000eÚÚy¶ÞMÉ\u0010\u0012–ß/qyë|Z\u0005x\f2\f\u0006Ø^<ôvX¯[h;²*¤¡‚\u0010€×jRÊZÑދÖÚôNœbš?‰¤$à= #=M;öoDZQŞM\nÒôE«§Ê\u0019«ûq¦3Á…’Œ\u0007¢Œ,•\u0001\u0012Ä/E>´~\u0006؂xL‹\u0014ÿl'ˆ¢g!*\u0017 xþVwd¬nù“Ö€s°¹w¢ÖÏ\u001aè\u0007s”hϔh ÏŒ€µüཬ}‘¦±YÍ¡\b\u000ehdÎ= \u0013Ó\u000e\u0010Zu¦aò!EHU:ø$ç¹vç¾ñ¼øÚoñ¥5<…mMÑ\u0002Þcád\u0011ՓX\u001eÊŵjm;#—Á\u001ab£mUâÅ&Z(ꁯ•= \u000b¿#dr²Üän\b*(BŠö(æ\u001cQ‚<0XÕ©;bÕðt6n1bÕ\u0002”76;RÕê<ÀjŠL€Úiɤ\u0016Ã\u000e\bÒO;£ˆØ±\u0014ŠïÏÈϐY¹lԯ誨•YQl4É{ÆùyO™î!Z\u0010œøOÁeÓ/¸¦À\\\u0010w\u0019+\u0006º\u0014JßtÞf\u0019+Î/¼µÉûƒ«3~ßo\u000f\u0012â\u0012ZªlUÙ\u001cÎÇ\t)¯'¶h”£=M§”T\u0019Ç\tzZ©T-IÍ/Þ\tb\u001c)¸Šò\fÎ=M\fÎÁW·r¡šp2½ÍŒ¬h\u001e¨&\u000bU\u0002>wuÄ\u0012Ñ5¿oÕ±A5SYwk÷],²þÚ\u0006]¼¥ãeËÿsÕo.ƒJãS\bg’ëv\u0001P¹’ë‰ÄZ”m\n\u001f]X3\nü\u0000Ì3¨\u0002+8ì\u0014\u0001L\\Z\u0010\u0011LxžšîZµPKõ!.ƒøººë͘<\u0016²qU¿\u000eÁd8wU6\u0018s½\u000bLAÆ\u0011D֐ÙюH›ŒX•\bwuÄ\u0012Ñ5¿oq³E\u0014㍺ôé»ðæÑ!Ò.š§xËßñº\\ñéO@ƒd\u0001C~\u0010© x£\fú©\u0000Я\u0015:÷ޔß$Ñ/Ò/A¨ÀȶgÁÂÇd¥®Õ\u0015Û\u000b8Eaѳü\u0007ˆïrZ\u0005|\\ \u0005—‹ç›\u00124 \u001c³õ]L´K\u000eŒæ·+!r¢—\"›c+’?âŒ{Hñ¶×C\u0006)²Y…Oy§òiwª+£Ücø\u0010\u0011aÂ@Ä2Zð\u0010žJ“—#\u001efùx\u001eÏÀ= bdôÙt—w^\u000en\u001a\u0004yL\u001fàw&n­ ¼/\u0002‘At£¼/r0°LLy\u001cèéÁxèd¯­&Nn¼¦Òøumc©ùä÷ÈÒ+©\f,×qZ- \u0011i9VÑùô~5Ñ9·7òqtA(Ø\u000b±<ГhÅðb¯*±\t¨‹\u0004Ì\\@—Q™³§À\u0017\u0019áç.߬\u001d¨îµ¼s\u0012\u0016¬\u001dTŒ84\u0001ܾéôû\u0005ê±Óü~‡ÑÙÕ\u001f¨ŽÀù\u000bÖ;¬Ñ\u001f])\\µ\u0014¡½%(3¹\u001d<\\±VI'Öm\u000bĨ5<\u000f¾+¯Mÿ¥\u0019cÖõ[RæþöÉy\tùÖü-uu{äø!$j?k\u001f\u0000–r:\"´K‡0± [§\\¼ð$\u0007\u000ft¼tx‡Øÿ$çX=}†Øâ“X\u0004ãáâ)!D\u001fªåµ­\u0014l­>\\\u0014lǵÁ­Ùƒ\u0004›­Ùе?\u001fjÕ»OÝ°C\u0014uëôuÃë±í*šhƒIƒ½‚©¥\fƒ\u0000€!dápˆ\u001bL²Ü\u000bQËÿýæö!KU\u0015\u001e=}¹\u001e\u0010Œ\ni\u0006öÒ³lz²á\u000fçáéÖ tûÍX·†™•×'w€\u0011\u001cÍéáûé­\u001aÕüåFÞI®{§ÚoÇÜی_5˜G'ë\u0017þF\"¸\u0006sÇe·ƒ7¿Ù\u0000—p&\u0019Ùػڡï\u0019ˆvíhȕügƒ›å°\u0019\u001c)+®VDõ\u001b=M 44÷×\u0005g#âu\t\u0017'Ê\u0004Ž6d42é+\u0011öñG~4”\u0014\to®H\u001eRÔ71Ží\u0014KÁHCÛÅ=}\u0010\u0005)Ú-’*o\u001b¹¥ƒŽ+~Ú½0æÇâÀUŠ\u001f¥=}ÌY³8þ”©\u0018\u001f\bš»Êr#QÜP‡âÇYm\u001c>F\u0010Å3P°u U\u0000Á#O<´¬\u0018\tÓæþ£ê0ÔÐÄ_ÞÎr~´ñ9\fr-Œ\u0007ö\u0005\u000bÖ]ÜKƯÅ-\u0018˜$q\u0002e\u000e‘¿†%Ñ=MØ\u0006¼\u0002¾è¤ˆ\u001c\u001b×<»êîi^ôüSÂ\u0007ςÄgaiY7TÍ\u0010ÓÖ©Û~4YÙ\u0016M\bɎï»Ý\u0000;¸\u0012«fDF*i!J“Gp\u001aˁÀÆ6¤øhœ¯ÿseqø÷hyègZ¼\u0000|?‡´a³Í|«q³àŠ,:rÆnˆÁ\"ҁ\tÓ Ö‹u|sŒ›\u001e{š!çԞƒ”ža ÆЋ\u0007\u0017V’:Tzæ&ËèBâ“ßæÞíóža\u000bR²ÒcöÌx|hÕ«t*q«?c\u0010\u0010\u0011¡®\fa•Ù´Ñ“\u001aD\u0014’\ná﯑˖\u0002(å(Àg ‹Í\u0010\u0018þ~·6õNx“QÔXTmN-JÕ¼/ãtÃ\u0002‘e5\u0018íz3ÀB•x#)Ő\u0019\u0004uEQ’=}+ÅO/qB)ë³äÈù~»¨.Ý_%¹ãn\u001dlj±Rm±Rá\u0004âRបÌûxâp\f\u0017÷(Õff$I\n×sé©F\u001dEYdÚÃh¤aʜ\n!È6\u0010ÎémG-&£õF8ÀtÀ¯9¤ GàÎ\u0014G²¢uñ™-kÉ#ɟs/tx¼M»Ücgòè\u0005-ïÆdÆP\f«p›¶æ«OŠ°© \u0002¡lûÄñu\u0007iœvÖÒ\u0006êY\u0015s´\"\u0005r„ºv\bÍ3Må‡=MŸº\u0017øC<\u0019Ó/äfô¡ÛÏ$r‚ëy!ÝêÉõ„çež6¹É¹€3\u0004ä\u0019WOë\u0006<[\b\u0015gµ»¡\u000e˜\u0000ðˆGõ\u00160”Sú…'¿„);¤¢\u0014Ub‚ò ªmðÀYs:(<à\\¶¬£÷zü{\u0018‡\t¯\u0003ûi%€ÖUÌi%\b¯:ïbÙôkò¬Ü&”µ+i\u0003ràWKn\u001f\fÇòJ­ØÅ/Çr=MIŸ4¼Mø–´—D‘TÆmaMøèÝä)³AG6hæ¥ÐE&“Ì7Z\u0003Üý'ûfë2•eÜÔ+Ó.-!¦ÿÛ\u0015:Alž\"ù‰H(\u0018‘6•ãû˜ò­\u0003É\\šzKœããžÓ‡{^\u0002þ¶?„š”ð'ô\u0005tÏØQnY´½h£Ïˆ&\u001b@Ž®RîB¾Âæîµÿ'NÓj\u0000ÐÖ>ßÚ½S\u0000•\u001f}¦Eƒ\t©M²õ¯¥ÿei˜œ\u0004þžÊ)O€æ!-ÓÔ«ô\u0001“Á9Ä7¼ ¹»ìÉ'bÜN­É…–M—\tu¥\u0000H½\u0011ú%ÛIYüàM¡Zª\u0012CÔ*ãõ\"uÚ#›ü&‹*ûõøÀÍ9\u0017åþLch×\foߚ˜u%\u0005\u001a\u000b»toíµÆ¿“W;îɎFØ¿u‡«Z^\u001eÈVêßKaϔŽ3\buD;ÅA½E+5E45›­©»]D\u001cU¥D}E6ÅB\u001d…?a\u0012ÀÓN7bNJ=}çºèÐ\u0003Á\u0004\u001a\u00109?…’FÎ\u0015˜‚±\"§¡\u001b| \"\u0011°M/¡\u0018²ƒx}½v¡ö \u0002ou)^l[UEvã\\\u000b\u0007iàƒÜñè…\u001e\u0007c̒žó8(=}Ó\u0014Xºk\u0001éÈ=Mî¢|¾ðܕÖz¢â9>˜ïƒžŠO7¢½®Žäuû3÷õ.¶&ï¥ëhv\u0001TYúÞ©H²'\"Æf\u001a,'Ž\u000eºR.?0ÇG֙uÎÔwò7M\u0014’T‡@@¿.ìkͬ\u0005À\t±t’\u001aߓ†[=MÁ¥T#/ó¢/'*DZ\u0001ÎÕã°Øð–Mÿ\u0014ÖçåKg·W&-+\u0007*\u0011h¶\u0004\u0012ù®Y\u000e¾ˆv3ÙÖoɁžï*\u0017:³¦L¾\u001f\u0007šm‹2Îÿ×FtÓ®)v(šj¾f\u0012°V³‹ž1^€\u001cç[û\u001d|l\"H&›Ù«e°ëYl?„\núHa\u001fÄkÖj\u0019Ticv¬\u0006ίV=M÷¡#yT?‚_}U\u0002z£CÄ¢Å\u0018™ié(\u0018‡UށX—7\u0004û?ç¿|~cx°\u001cêF\u000fXO%k8Ìð\u001ckqjðt7\u0010¿no­ú‘“*?°Ûù•¤[/Œz€ åþ= v\u001d\u000eR¹Ÿ˜þŒéN3åŸD‹Êø&ÿÆe†•\u0001Ô\u000f[[ϊ}X‰È”o 4\u001e•¾Ñ‰5•*¾\u0019‹ÔZ\u00004\u0010X©(¯¶:¶çàFAÝçB#¹žÓ\u0017=M$r¶Ö\u00051ü]ã:ÂÇÇF>óÊæ\u0004d\u0004¹Tµr­\u0005§öŔ=M\u001c±-[õÃï!9\u0016\u0012a€4\u0001¯RëeŠÃo\u00045»\u0007\u001fà|õ\\\u0013šŠ{Û=}f5yf\u0015\u0000Ò1ÅގœÔ?{Ýò¢ø\u0014ŒÇïó\u0016R/ó=}¸¿$ð\u0002o+æ¨dˆ\u0010\u0001.¢[Àž€]v\u0012Ĭ>ß\u0010UHe\u0018ô~Ó׳„beoe™c\u001aâÑÛ~|ÊP\u0013Ôߎ\u000eb5Ý39dìeÆ\u0003á]3“«t]Ãǎ¸..±¾À\u0018Ò­@¿n¡TiEx\u0018œ\tv¶Ã¿î\u0019Šeˆd®\u0014\u000bܛ\tQŽ†g=M’–GžÙ[Ø \u0005\u0017œ¤jñÒH®ŽFjeÊl/÷š\u0000S\u000f&ŽÆ¾éx\u0000Ä ÆK“dóöd@A[óöþ=M\u001aw„p„„\u0006Øk€/9?\u0004‚/€ÆÍ\u0007{֘¹œ,/èAVKqD-bì~/­\u001e\u001e>Þ6Ó\u001dÙÒ|>×I×\b\u0017{ºc(ê+\u001b»\u000e ¹À\"wÓô‰À–•¾Ñg3¢M…¸cú¦\b¢þT¤£M\u0019ÿT¤£M…¸c’-€ÖŽ©Ú’\\B&€Ž\u0010.a¦€\u001d\u0007¦°c\u0001T®ž-–ÿ\u0007ç¸qT[@\"F!¨ÌHü\\\u0017ÿøAÂj8~‚±\u0015vÛ9—okf5IŸ\u00035—“A@ì“=M×ÂÈÒ\u0010åÒµ˜~Löa÷MMξjÅã$\u001d>\\Õ*Տä!Œ8\"Î*Ó3j\u0005\u0014ýa¡ŽÄ·a\u000fuԎ$\"”8aÂ\u0001ÿ‡Ø8\u001dï4€\"a!OÅÙµµ²';\u0011!¾C8Î*UüÙB“\u0004C¦Q\u000fý׺Š8\u00133jÅѵµ´g?>|ØÕՎ\u0004ûã*k\u0004\u0003ûË*™q\u0006Ó'çÂta$w\u0000°GJt\u0007„H¦¢…YÚ£?‡è\"ûÏ\u0002¸kÀ×F-ö*Ìè@¾ÿ>b\tkl¾—›Ò…$¯Y\u0011Ð}†jK–\u0004Ÿ“~\fhÙ\u0010\u0018_«<\\\u0002™/¤\u0001*8ê@\nÜ)R\u0001_¬Køe>\u001e)é(i-i_{=}£\u000f)zÌ\u0012Šx\u001b>a\u0014„CNÄmeÑPò³ûR ’ÒµU\u001fØÀ¬Úȳ>|±¾$:6%wqNuà›Rom\u0010½MÚݜ—¤¤‰×¸è¢e–¤Ÿ‹¿»S‹\u0010Ï8 Ƹ©[+,€\u0010ÓT+ÓG+Mñnµô玗$= –´óè\u0002\u0003Ìh+£¥Un…¤‹?\u000f= ÐÚY+ÕÎ\b\u00046FÎ\u0002Z…Bý\fÄ@¶D¢Ž&¢;Ä}>P\u001dU¤ƒ\\=M\u0002Uˆ#@’â\u001aÿá\u0018ê¶Ø_yÉ$\u000b)€ ÝbfNÍ\t˜dπÝ\"‚²”m´\u0002YÖ·\u0014£>\nž-;¼kG\u0019\u0019\u0000ÁȋW\u0007zÄ·c)g\u000b\u0016Amíae\u0005ym\u001f&SGQŠ!åmyÎFëÀ[\u0003\u0016\u0006hÜEE°Ô\u000eárš\u0006GÔ6m(¸\f’¥Ï_pw‰k¬¡kÙ\u0004XjË*!>dɂEŠŽÉÍÕ\u001cÊ¿\\\u000fÈÚ¶²+?ÊŸkŒ\u0016Xe‚!Iö/¹s÷Sö\u0011 #l%%lÅ\u0000ßey–t7ôí\túã\u000e³»\u0002¿“\u0001Þ\u0004\"tô¤\u0004¢ÛX€\u0003£á#£û_Ç[üÿ’g„\nó\u0001Ü);Q\u000fqí;Ὢ2T\n,RºÞc!= \u001a^RöËUšÓ[°A'†=}eå¤Lo\u001aڀå\u0016‡iRƲᦑ%ä²O\u0012&Çê·MìÑ]¶Yö“ñMÕ.c8qQì;\u001eÂKƒ˜íC•\u0001\u0018¹uNè?…w>èHû×Óáüµá«±f= ;¬%|;¨š¾‘Pmrbx%Ø\u0012ƒ¬t *× <)³ðœ­h)\u0013 ©Qê%xš×´¸>\u00166\u0010-9ÜåïCÿê{Í%¡Çr'Çr¤AÑüõ¿¡7½=M\u000bÁa\u000bu#ÿ>+·7÷Ó(1)¨ýœò,.ÛwŠ\u0000S(›ˆzÆei\u001cmÇ\u001eº\u001f t¡õ\u0018ŠP\u0000\\Þ8þÜ)í\u0002VV¼\u0003§¡ÉFì§õ žŸIO¸d]O\u0013Ö3 @OÜ褏|M›\u00061\u0003|\u0019ç\u0002|õ„\u0007~쌮˄›U\u0015½B‹\u0004\"\u001dž\u0002«\u0007Όu_Ëø\u0001OºWz$ƒ\u0003·3×%D\u0002Ã\u0019÷\u0001%¶24ᖛ%.~÷H1°\u0019!Jç9\u000f\u0004E=M%E)*qî¢XÁÝðcxFrgjž£¾ø ïS¹S¸ÉWnӉº²Çꅺ--ÈÐܘ\fŸ†@=Mþ5cy\u0002\u001a\u001bž(,¦´_ìå\t\u0002m\u0005\u0001gOŽ+çíØÍÎeqKm¼Y{Õ\u0010DiÉô Ìgø}žÎ@Ü%ïèŽvþ‹T\u0005Ïý|\"Xˆhsñ\u001c–ï\u0016\u0001y2L3‰Í-•ƒ€„<ç\u0019„\u0002'\fÃ..­«CÈSÃ\u0010û<\u0016\u0007£\u001eV€—í#\u000eÌ>ð«Á\t®.fn)™dšßèÝ\u0010§tL|rçéF<æ:y3HÌâÌPm‹B\u0002¨zÊ5,“Ä÷7@éj\u000e™\u001dß5*û‹Qu\u000f¤ƒù\"9:\u0010ªØÊ_ˆEÚh=}\b)\u000fãÑNՂ¸‹\u0007‘ifžÁ@\u0006û7_ã\u0019-ìfíìp-ô:öò/¼>·Y]Ùry;{ÈM´ã\u0018\u0002í±eì\u001a®¬D\u001e¦œ±]…³ÑÝ~¡“ÛÃ\u00100Âc5\u0011òÛg¹üÜÏãÃ:ضÙ1-~¬³k\u0005Ƴ=}ô0—^bï(\u0000;áQ™>¿ÁVHÕR(´öÄB+(m«‹*bw“:ªPP ß®= ÄêÑ÷·Î·€ë5E-\"\u001eûxŽ©D\u001f%\u0011ª­â\u0012J/™äç‰y·å^–x\u000f¸©}ÛòlqªyÍ\u001dèé蔉PºA— yi)\u000bü\u001cÚ±ßbI΅͈a›ôzÐ$z^R?øAf€\u001dÉÕ×\u000f\u001e\f&\u001fÑyŠø¬a\u0003®ÈœyQž.SŶ/!\u0015°õû\u001aÔp&naýêEÕè4®å¥ïے×\u000eæN”GÑ4&Hö‰BÐô/‚ÖÆ †\\\u001a{tŠ=M\u0017Þ¦~۔jÀÇ#zP\u001bÖWF\f5ìÜ0‚\u0001ÛçŽy:ð^õ€eÿŠÿŠ%ð\u001f\u000e+¯Ò¼’))\u0012Ò:v•-\u0007¨äüC‚C(\u001e<:ôNíLw\u000b\u001fî»wjV>P‰ÓÏ\u00103Ûëuj¿¥4!/øs/\u0003RtÛÏ&D\u0019\u000f\u00033u\u0012\u001968\u0003\n‹tÅgÿ½abÑõü<¯èB_‡}Ê£îö­h2(æßG!\u0011tÀÞcê8n0ß\\˜\u001et\u0012Æwaʓ>³\bÔs±\n\u0015…TÏ(¾Ð2§{y€º³‹·5ïåX¬ð\u0013v~ˆ,öä\u0013ÈhuoªePÐ\u0002‘\u0013¦bŠ*ùS×µ§oSù»§}ù×Z¬çêZP†­3ä\u0002í3¤—]°¿nÉzZʅe¬ÚGçÿP¯RÊÃB÷¾ÆuT5bWZ*ܼ*—òÃ\u0015žMùT‹ã\u0014\u0013.A.i+n\u001f>þM¡|ô\u000bfþM­‹Ù³¶Ê©Wâÿy>v»d…D\"#£\u001a©hC¯ñ\u0002¹|6@“Ï[\u0011HZôI™†1OX.ò—W¹\u0005„ëÿA;vÛõyÛEВ+!ßøI™é\u0002°‘$÷s¿Á¡84aÀNôì1a߼Ӓ©iKž=}×7WX¯ÚË?ü)ÏϙK];ºtÒt³Aµ\u0003½ì%.’­Ž©µÛŒâlvfKª|àr<ùÌÁ%|¢\bcâ^’Ã\u0006\u000bæÜ m\u000e0·qÛ\u001c\u0019ý|¢ö¹ŽªC‡¥S= 6Jµµˆ@Ãq[•åP¯ú\u001cŒ“-\u001cm\u0017áM¦‹y¸,\u001d\u0004Wç-º]ŸÜ¾Àë™fhdÖ8ƒ4&®p\u0006Ëæ‡(\nT]]YÃRIp–3͗õ‰¤§ËîqŸ\u0007a\u0018›\\ZV\u001f:¦XYQ/øbÑ«V$ÑÊO\u0002”XÙ\"ÿs#œÔ=Mï¹\bÊ\u0017´L¯Iû§ß\taT\u0018!„\"íi\u0017–È\u0004C6Üĉ\u001a±é½“\u0018\u0013Ä~\u0017gVC\u0012\u0017¦ ›aªe¶\"ä=M•»f\u0013\u0007‘O¿KÍ\u0003:\u001dåƒ1šÕƒU\u0004º‰Ü\u0003„ÛŽRâX¡:GGÁŽ\u0004òT_ ­¼RX*\u0007e.rÅØ\u0002Ÿî§RÅßg*Ô\b¥ÈSÈcÇ[²+ý<ˆªZEø£6ñшóè ÙÐ\u0019žFé%^%ˆ&Öj\u0017¢|È\u0017vØYüЦÍ\u0017÷Àì\u0003\u001eÒ\u0006$»¡\"\u000f\u001eÎÓF$£úG)¶\u0001ú—w¾Z‰>\u0014ôÊ5Œƒ,È)E©O\u0015©\u0018E‘CªoÀŽ­qpà\u001b\t”“O~nàÑ#'JÈêæ®äÐÜÌZÐ\f\u0015鋋¹—\u0017Bž\u0017(\u0001hŒJ\u0003\u0014s³Í>5Z…î ¶ÙÁÎ!Î8è¿ÓÙ\u000e»Ó\u001eúÎõ\u0014_xÇô!0r²ª\u000eee\u000b]vˆÀ«\u000eO¿Eחž)o\u000f†¦\u0019F\b6ÏRJÈÞ\u0011oJÜ/å\f\u000e'Օ{T\u0003\b{_4\u0007ó‹Ð³MûfZ’\u000b{b×Bö\u0006Sÿo<=}%€Ëï¨\u000bL”…ãžç3õ{yž\tã\n\u000eå=}üA‘\u0001T\u0004k 6Ĥ t?ØOùñà©\u0000âÞG¿\u0014P#ª\u001d= T5>ïe\u001d4Î-ê[\tLí\u001fjå\u0014Ððð\u0010ʺw\"…v9XÂÝQ,\u001b¯A(\u0005Ž\u0011ø•\u0003:嬫\u0017íäÅýn­Ã0\u001c‰+ºn@ùê\u0012A\u001a…\u0005¯\u0010\u000fF>Aì\u0012L\u000eE³\u0010ú•\u0003CÔsC–<\u0005²/Ì\u001aŕ͆%vØ\u00130‚=Mt›aM\bïÒ­¡.w;…\u0013ÿãI\u000fq\\\u0018]#ÿ0\u000bó|¿zT\núCf¥\f\u0001sœ\u0011§·]\u0014k\f]ó\u001bùAóéë_vš\n= ³\u001bþpÜ݅1pRL¯\u0017U\u0017[ž\u001aB9至¤a\u0012ða£ÛéÝlßßæåê‡ w#ì\u0007ñÜ÷@˜d\b‘ë\u0001…3÷ Æ냃t\u001fÌ æ8Uwgé¸â&Ò= ®þáa¯= \u0002\u0002®7A£ñm«™\nX\u0010v\u000b\u0017;ÀÔ~\u0001‚m±\u0007é–ÔÈJOiMl&f\u0018j’fDâ¸\u0006×a4|6©&\u0015)–ùƒ\u001a=}¡\bÎTåflì{^.¸µòzÊÂuܜnû \u0000\u0019ÝÄV‘¹Ú€sã:ëe\f˜Õ˜õëôuC¿rûn“û\u001aæ:\b§\u0003ÕAjnýàý³ÌaÈ\u000b1˜x+; ·\u0011ƒ\u0013ðüëÃdùW®†ÅÓâ迃2¥\u000e¤>Ôæè‰áÂÔV­˜ò\u0017¶ã:è*¼€\u000f“\tTk]\u001c\u000f\u0001!×u\u001aéZ¤ÑvUAž@àg:V˜6Ã\u0006#€\u001b2¥~B±= $Vykcj.öþ¼³Uož\u0012ˆ'tàuh@9\u0019ë\u001cTŸ-ˆbë—÷,ú\u0000;T[Q\bó\u0011þ_\u0010\u0001à/Ž÷\u0018‡÷8Öé|!Ï=M´n\\žz€lµé¦Ù<Ùý\u0017to ÿÓ°\u0017ŠÐî›(M¿\u000f¶ð ¶¨Ð<öü—íR»\u0010úï\u0006F‹-J°\u0013þŸtê± Ip÷¡·›=}0«\u0007âæm¹þ­÷Œ\b¼ØϘ\u0017q\u0013ÏSëg»\u0001ã€5g½ìô2ý0¶\u000f¯\u0014¦_>±\u001c[]cz\u001b[ n\u001bۊ¤éÿ=MwŒ›= ð’e¤kq~©Ló\u00143:\u001e™’\u0002NڊíÐ.µŒºÕµ¹q(áíàzh ëè“ë\u0016h\f\u001fžÞ-ԍ*ßë\u0014ýç>Îb»¼\u0003®‘~R¡>\u0010ÄK\u0004†,¦§Yñ4'Aّ\u0016¿\u0002\u0014*sxƒ’»aR!~ãlbÃÞ]= \u0011\\º¬Y7¯¢Nïm4‚\u0002¦ÍeÑeÉåj* ¡À\u0006&¼\u0015€\u001d\u001e•³‰oÕìÒÝ\u0010¦Îû= Vd™hÌGŒ\"¹˜R\u0012Ÿ\u0018,bäĀ\u001côZ Û´\u0019t¡6*/•S)^\u0016roœÍtË\fG\u001c†ÚØÚ-\u0015¹\u0016¿\u0015zܱC\u001d\u000b̄m„2úz#\"Ñ’ٓ}—„xýqÆ#¦NLËî^ތí\u001fQ\u000f= \u0006A¿JŽ‰@Œh6jø.t=M^†ãT\u0004•§à5œà%W\t?Äîð‚\fH‡7Ü\u0019G½…¢W6fåúœ;Ý\u001aúsvÞp£^ŽÃï4§VÎ%˜k®JØÄ-\u001bŒˆ±a—…\u0019r~…Tm«P\u001bÁ96X—V“¢\nñ_+]I<àÜmiµ¤¨åå= !I¢+ÔL’n\u0003g=}“!}‘cÄÏ0¤½ŒEñ \u0013ä½Ô}&éû¸:°(¤mÜÜ©Ÿ\b Ó#¶>]ÓÝ\\€isÒ:Ê\u0011Ýìê\u000eÏ= 3\u0017QK\u001dí\u0011 \u001f-ˆ \u001c€r›Ï\t‡ý·’…óSà\n\\5ó™>“VÎK\u0019c†ŽGÖXæVÝ\u0007£v@\u000bâ\u001d¥þÖ\u000e\u0011óŠ\u0004T7\u001föE½\b­å³v½™3bð\b´Ù‰¥½‡½´\u00054\u001d„2Åõ\u0014©&~^*ÍbS¦6ʎw40æÁß\u001dNosÄЍ7÷Ô\u0007øS3\u0011!µ\u00192f$3:HI>'ͧtÕX\u001b~÷}”Ê·(\u0012~÷…”âÑÏ_<(­\u0017ˆ+= 7VLÁdh^ò\u0019r|Ô¥#xaƒÎ\u000fÒ\u0003|ؤv\u0002ˆŸ(ùlytV’ýS\u001bKÈf^_~2ÜñÀ‹‹å˜«\u0017ǎ\u0013n­îp²­\u000eULÇÕN{K*dPÇ\u001b¾«†\u0013~ÝR&?¼‚màÙ¥yv\bÔ827ª™•0Û\u0006 \u000bô\u001d3®rÜ\t@îْ,R%ó/lš³egɓ$_\u0012A\u001a¢Ë\u0004#¿¨«²ÿ\u001b÷+Gøíˆ4ܜY= \u001fõ<ž/\fÎ*¬¾”ýù~ãö8ûÔ*øsðAÙÀ]0{ßémZ\u001eÕ*\u001bÕ@= w”ÅD<\u00188^\u0006Õ\u001bQ.€\u0001\u001c<ýlpàR9Ë\u0000÷Þ)˄kÎ\u001aö1˜\u000e¤QÄ\u0010~\nŸ’K· ¢Š/œðú—ý‰|€&\u0010õ«>\u001c\u0018\u0017\\Šoš\u001b2\u00062¿fñ6ÿÃ&/‚’Œ\u001c\u0005ßW\u0013¥I\"òƒRDðÂEI1í¨‚ÿj¡lÝþ\u0004\u0014‘ÓfŒ.Ót¬Y\u0013\f*|&‰ß\u0017]ä¡\u001d݀³ üelHå9>5òûÕÇ\u00006UÏøSPx0ªú>'0¾].\u0015oÏKs½b\u0012Qˆ}¹\u001e†ée_)]n‘’À.¤j\u0005\bN6Èɯgi“\u0005HÌhÿ(›\u000b\u001fªò¤â•mM{¬Þs¯_}\bIÙ'\tXÔeÜ\u0006?PO\u0016\u001bA³èü\u00199Ö\u0012Éð\u0007îX!ì[†tB\u0014¹\u0015ŽqI$åÛ݃\u0002ÊC­t\u001e]äW›ã\u0017\u001a“æ{Ù&\u0000µ‘öàºû= \u000f\u001a6ñ)Ž£BT\tˆ0Õۀœ Å\\Arò±\n!y§¥ìáQ4ÿ­~+F\u0011¢\\jæÜ'ùH0ŒækÏSNfJ|]7\u0001éŸ\u0017\u001d²È\u001f å_W‡\u0006x3= -5ô·´›þA]\u0012Q\u0015:»t€ h=M‹^ý®\u0017û\u000eÍ\u000bp¬²\u0018¹¢²”€´\u0014¬óct '\u0001œ†\u0010”\u0000¦®’¶7ÁYÙ\u0018¼–\\os\u0016\\DÂé%ŒÛÓ —¼‹+ ×\u0003Ã×! jK\u00045}6\n\u0015\u0006!!x\u0006ñâ\u0017ܗq³wö4\u0016æWŸ:º#è™Ç\u0013{ÏE\u0014,Z4}í¶¥º1\u001dYâ\f]·= ½·= }€ÓãéMqò:\u0019~”ä\u0010zQÖ!•\"ù¦~\t¹Hû$ä-Z´œì¶%“'Kí6‹ÅŒ\t¯P™~™Q’'Ñ\u0017Z\u0014¨”'\\k\tZăädÒ¹~qjƒ%cÅ,6ãÄm/tí$Yãeî\u0003–SêW¬Á\u0018¨êô†\bLW8՚Gô”6”t56œ\u0000£€ôtÞpáaÔ°äã\nÈÚ%¼Ø­Ö\u001bϗ¤ôJ\">$\u0001\u0003’\ftS*8W¢= æÃrÝ,\n=Mº¯”BÿÿzmnÏ¿º¬,\t¸´í“î\"ö¨C½Õ­6µ\u0013˜cCc3_V=}úvOrR¸\u001bôøî¢qøýu¸!Ñ\u0002€ì§|ÂW_0xð%\u000b@õa\bQÅEÕ\u0001ñÎØ!Nè$›!i5\u0012¾^Ü\u0001-ßß?V¬¬¬äOy3{,Þ©”§€,\\¬¬¬¬¬òðôEÚ|\u000eÒÏ3%;˜Ã\u0017B܌x|‘\u0016h£·˜¯˜\u0018ò™\u001b;¶› £”Å\u001ceZßÛ\tm-\u0018Ð:¿Ýó\u0010Ô\t]\u0001h\u0017×ʛT‘b(WA{¬\u0010\b\näïy‰\u000f\u001fØ󤮑3ù²\u001f\u001ctú+|í¢\u0005\u0016Œ\u001an \u0010Ëü\u001eÜÊ»®2Å»(–t\f“ÜŸ\nxi¡*kæ˜Ý\u000b•\u000f«Ä_d$﹀ÿ²5.>]0ésC#ñåìë7Idďêæ\u00057¼pfLq÷é+˜,Ù9†\u0014,·4\u0011 ÈäV©Å¶ín\u0015°ª+\u000fÔú*\u000b³Ýmž$¼KÈc\u0014¸‹È͌û£Ï6w\bx'™Ê[\b-NñÊuW\u001cN¥iòY\u0004‹\u001efÂÕö>W§e'­ÊCÊ¥WTVč~Ž>Y'V'µÊ\tÊÅW ÿsú3bí\u001e¼)+\u000fõ*ƒ\u001d<ŁĢû˜t[Q)8ÿ²\u0015\u001e~y\f¡Ï°\u001c€±š«?Ÿ©Íµ\u001eøG½ŸÍ\u001c„\u0019\tGÃW.çƄU:¦†½†UJ:_æAI@Z\u0016ÃGÃH.¬†eI\u0000W\u0016ÆôM:gæ±GÃF.°†5I\u0000X\u0016ÁÆtM:tæ‘G\u0003I.¨†uM£N.\u000bæ9Gƒeº2¯ÀÛ8BüÄ|ᄩÙa\n:TÍ\u0019W”ܶx\b7Xԍ®kúNMjb†\u001eÚöÏöp§[§—\bh\bâÊÊ÷Êwˆiç‡~ðÉÀBf_…¤šðÓ²\u0015\u000b£QíAòT\u0000\u0017\u0012©C'p1gý¼\u001d\u000e\fÄ\u0007¨éOxR\f+_¨Ö*¢×ç.˜Îq‘¿ôh‹\u0001pÉ»{W\u000e\u001b‹|\u001dμ†Ä“ü©!:1‰\u000bò½î/«´–·£p°Ó!ð®Û!p­Ë!ð«ß!pªÏ!ð¨×!p§Ç!ð¥ä ×\u0013\u0016\u0005j”q d˜˜Ú.$Šv’½\u0013ŠÖ„uŽåPH[î¡àú'j€³§·\u0000¿!/\u0007\u001cøW{*îÁ0pM0Q\u0011$‚ë(Jü·ýÉê\u001aÌuûçëè\u0004¶³µ\u0014{Òé\t®Åž\u000e¾Î}\u0010\u0017go\u00010\u0011ô°\u001fîirµ1\"éÙh°\u0004Îà\\Ç\u0012\t;ûo=}\bw1ÿ]lkÚÃO«sGkï´Ïƒmõ(\u0019ñ®À\u000eoš»i²3¾“ÓŸ±‡;\u0010“2圛Úçg¡\u001a­\u001f話ØÂ\bb¶\u0017¬C*Jp¿ÇpVÀQ‹Ÿ±g:=Mãñ\u001b\u0006¶\u001b2\\ªXd\u001e\u0013Y.\u0006ô\"Û++\u000e.U\u0019'ô*ƒŒ÷ejøœ?Èúo®OV\f\u0005Ëjq\u0019é¨\u0019\u001aÚ0°:x¤õ’ è˪\u0003\u0017\u001bѲáزÐpœf™ruž\u0011GKºÍK\u000e愬ٍà\u0017-ðâ%Ä:qaµ\\±:¡Ì‚\u000fŽ&ü\u0000ó7´\u0011¾ý«\u0002!x0üÒ\u0000sé´\u0011î!x0üÒ\u0000sé´\u0011î!x0üÒ\u0000sé´\u0011î!x0üÒ\u0000sé´\u0011î!0ÿ\t\u0013§íküÑ=Mà½è÷;»ö£ßZ!˱bü±Ä=}›iÂ9äSþ\u0011Œ.@R\u0019\tGÃW.çƄU:¦†½†UJ:_æAI@Z\u0016ÃGÃH.¬†eI\u0000W\u0016ÆôM:gæ±GÃF.°†5I\u0000X\u0016ÁÆtM:tæ‘G\u0003I.¨†uM£N.\u000bæ9Gƒeú7ºql!ëå\u0013,\u0015®µäS¨@NÍ\u0019W”ܶx\b7Xԍ®kúNMjb†\u001eÚöÏöp§[§—\bh\bâÊÊ÷Êwˆiç‡~°J;>½ˆ'ëËŸ4àá¾m\f‰7·â•7£\f= ƒÞ\u000b\u0002ý\u0012ÜT\"bL),x\n´äê.,yZ#Ho=MsÚh#ho#s¬ö´Ï\u000e*Üо´_5À\u0017T\u000ez\tMnž\ntÛ»/N{\u0003&\u0011î\u0012tÛ½Oý›!\u000b\"œ§]·¡›£\u000e³ÛºGý›\u0015?\"œw-·¡Ûâ\u0011x$´-V\u0012lã 7_ƒ\bá˜ZÌ/´¿ð|VŠ\u0002^}ݹcÖ²Ñ1Z\u0007Ó³Xÿ˜Û‡ïçHáï°â1|\u000b\u001c× {“üÇsø$\u0001\u0019‚à\u001f–Ÿ˜[†§ë¡;$å UÐN\u001d(ì#©=M²\u000edá S\u0018Qø$˜ÁŸ°ìŽu\u001aÀ)2_6¹1l¹¶mlíag£0HC™Y¯óÚP²#LNÞp_€T« ]¯&5˜\u0018 \u000f«X5\u001aÙÞ\u0002Ž¸ØT녿úÑ\u0017A¹¸Ÿq»= >êd\u0002$Ì\u001ax¶¾\\9jœu›\t{+²Ö¹‘\u0012œØÜ\u0013ˆ\u0003†|ÉB\u001d¸@ö\\<€ÿÇ+Q¬\u0011\u0000\u001fç-á\u0013¥\\;£Ë¸\taÁ\u00039*\u0010÷$7¬œ·=M¡ò­+¨W¡\u000f*\\þ\\ÏüÝç\bï¥ÝinÀ‘\u001e:Ü\u0016ü\u000bX”<Ô¶|aˆ·Ó[µ]ñ°Y±°U1¨Q‰>_§å \u0005ÄûÃI°=}LOõkbh\u0002Ô¶Þ6Àˆ‘¾Içi\u0002߶‚'#ÊYN5g⎾e'j4å¶x=}•~ËAmâ\u0010CY”)DOí¹EÊyþÅ\bß\"Ž!\u0013È#Úaõ\u001c#´ì\u001f–‚z~\u0016%\u001d!²\u001a±ñúê|±Eé dØ^FèvN\u001dªã«²!\u0004¡²=}Ó-õ03½ÉÄîDt¼\u0005e\u0005s=M\tÂáúH\u0002^¡‰«>‡¤Èµ*‹>ˆ¤Æ•*¿>\u0006¸TòŠ\u0014ÈÛ\u000e_öXSœhí\u0006*~žÏbIq×é¦k¸JòŠTÉÛ\u000egöXNœhM\u0006ªežÏ2Kq׃¦køa\"™òɡ붓÷Tto\u001c\u0007\u000b€~ëžM=MZ1&Ö«m\u001eíÌE÷ã¯ûD\u0017Aè2pürýçæëm…\u0005´M\u0002^\f±ãy1¾,ª[¼Í\u0011‰\u0012\u0012:k'B‡Þ½'òùQ\tejðði!u\tÇ_Ÿ¾»s‘0ß¡›NO£JW\u000bí¶ý\u0003oÈL'´§d4LPï)·g\n\u0005´q\u0006́=  Óa¥m@mèQêu_êÚöHkÀ,ò·X¤¦˜²ð\u0010Ñè\u0017áÀ™úvæÆ5v¼»Y\u0003¡–‚.åÖ áùØY\u001cÞà6‘âsŒ\u0002uœpû0>˜Å\u0010\u0018\u000b‘\u0011„ÖÃÍÄê&Z³…ÛwØ(\u00117և\u001d֒énõÍ*;)IN\u001d®sêÑýԂX\u0003\u001dŠ=MqðøX½ò)oö†7n…G¸Ž\u001d®Ä®Üª9f>H\u0005ånbº›l–©fTy»…_\u0017ÜÿR¤Wµlò¯†5ŽÔ[òk•º}xr¿¸Üç_\u0001ŠQ)åŒ7äÎQ)'a\u000f–Þ\u001fVÖÀN다KŽ»sR·7V+\u0011¶%ø1=}\u0015þZ¨»…\u0001 \u0013ôð;ôÂ%â—)9«Íàò\u0016\n-lDE“BzÎ= }=}¯6(s‘\fÓ;†y—ÐÃózvO¨·òV_¸\u0000_ߪ´ö8Hýí\u001fр°¸†ö\u0000ch÷ç­ã?¡Ûtl\u001bֆý0´áÂ,L\u0012†ÄÞ߅AÄÂÜ*Ø{׬Ü,,L\bÔ\u001c\u0015_´=}ÙÏùs­Q\tŸoˆšr˜ò=MWT^,\b-tóà.\u000e MÊÓå7‚Í괗>–­¢\u0015HÏQ!Ûühî®ÒXÅó\u001dPÂf6ý\u0014\"ü\u001eô4\u0017­QlƒçP¹wÇӞ\u000eeŸ;Œv\u0015ªüR‚Ãvè\u0000÷æUlÈMŠÓrö6®ú)Ƴkéó\u0010Œ\u0015áûÝ\u001f.= Ùɧá¶lÖB*RÿõëlàGÚDf˘þp>æ?®Ø€v¨ý+ä•]'s݆<\u0013)ʾ¨\u0011\u0003\bމ;µ™Òtø”~³}= \u0014L#_¾a\u0003d-3§øÔÙØDØ8Õe|\u001bá\u0016Ü\u0010d§Ý^P_Øy@]…§:Ì!m1U÷Ân\u001fN\u001cíòÂöór’=M\u0012ì²=}¶Al3ݬBSª<ñõ½€\u0000ôÛè\u001bŸ\u0004.¯)T1ÁüÒD-P’\u0001|üí4w‹†À?\u0004¶\u0015„Èj\u0010„‚X#•\néýù\u0010íVP‡(U¼Ãsy\u0005šì\f™ì1á1Ÿ<û\u0010*aÛ³&ÄU—ØZÍUcÈS‘ïƒÖh¦ðG$Ðï[n¼ßp(wâ±a÷÷ÁÃ\u0005ª³Š9H?8 :ÌCG÷\u0013=M¤1Õ#×å!Ɵ©õg!ÒJºB÷IÃ\tämvèý¶iï\tʛ\u000bÕÚÇ.µ^“= x>Þ;óÁH¸w&CgezįXÝîÖ؟GÉGð\u0006¿2Ò¥ujï\u0016ßÚ= \u001e¥Ä5c“Øv5Ҋyõ…9I$ôO<\"½!\u0013tŽ.0Òô6ð­\u0001ߜFÄå\u0016\u0002^Íf&¨(ØZ\u0011\u001fj\nÎΜEV(\u001c7ö¾F76Á4“×,.xs)G\u0003(×Ô]8’e\u0001!\u000ef#«øøð.÷ª«ãJöª¢2#\u000e•JH©G\nc\"AÙ( û¶Š\u0000€(Ý\u0017L• ~vV• ½\u000f‚‚7a*¡¸ïŽ\u0011\u001dB?ƒÿD]–ý\u000e·\u001føp¡,mݪ—àÏï\u0013ÇŽ9¥ÕpUjB Õ\u0011r\u001f\u0016¨@!¾ÊË©èþ(\u001c؇ŽsÈ*Rffºû¹•)'ؼgâ‹G|m¹õëg2Û\u001dҐôڗ³\u0010¬M*Œ\u00198í\bc\u0000\"À= 4 ¥\u0005-£KçÀa(È3çœJ°ÊLïcZîKEcÀ̝\\†¥™æ³M{}!\u0016A¼J£1B\u0019Ÿ¢ÇÌßyÚâù#>¬M=}Äx™\u000bP\n\u0011›¥\"h\u0014üÖ\\\u0014ÿÖ\u001cýÈä\t®‹\\»¶\u000e2NȦ«­P£Îña)LGžë›VôÈ´~5ª€I7͠Îß)Wn‚´ö°\u0016]vjù‘¤\u00190—6Ï\u0000kxjÿ*„ϦuÏó%íóƒR»\u0011Q[¤œ—E.¢ž¹å\u0019ð8zÈÀ\u0006Švy@øÚu‰8+*m¾õ=}¸Û±¼ÊíÁq+ð\u0016]}â1À\tË´Å#€\u001fL'\tÂ8\nëÏUrÁ¬]Ü\u00183ÊVº^Ɛæ{ž\"X–н\u001d) k7œ¶›s1‚õ«\u0003—\u0016ø¬—Mî\u0014Ë*ß@XýF“ÀwðÉØ¥+A\u0011\n¬‡Û–kùö3ÍKŸû\u0001¬E\u0004\u0000D՗(|ðnÌß⡬Æw:²\u0003åb~Ÿ*æw®\u001fH\u001cæë¬J(FR6‘€ŠòÊ5A\u0014\u0010ŸÀ\"\u001f¸¶û\u00007|%6hÛOg†¥HؚJ8‰/QˆÌFR\u0014zšlžl¼òäfç\u001a)2a\u0017\u0004Ò²ƒ,fëE× l«vVjp:¥w~¯/çq\n^²«\bš.žf\f(Ǎkýh3-—d7N(.Š)\u0007ºÃ)¼Ä\u0017ÿ£C—EëD±C½@¥;\u00051%¤¸\u00141ý(Ãí˜g6Ä۞pá¹z²NxŠ–?R\f%a8*kÓ°H<\t_â<9dÖôÿÑ\u001e\u001eӗ\u001c%'Â\u0005a3C¤EšEMFYG2DlLFF¡LF‡ûSQûh¬’§‰FFFFFFFFMTObaX[~…|wjips¶½Ä¿²±¨«Ž•Œ‡š™ £&-4/BA8;\u001e%\u001c\u0017\n\t\u0010\u0013ÖÝäßÒÑÈËîõìçúù\u0000\u0003=M\u0006\u000f\u0014!\"\u001b\u0018E>7<)*30ýöÿ\u0004ñòëèÕÎÇÌÙÚãàmfot‚{xe^W\\IJSP–Ÿ¤‘’‹ˆµ®§¬¹ºÃÀÏÔÍÆÛØáâ÷ü\u0005þóðéê?D=}6+(12\u0007\f\u0015\u000e# \u0019\u001a¯´­¦»¸Á—œ¥ž“‰Š_d]VKHQRglunƒ€yz”†˜›¢¡¼·¾Å°³ª©„v}hkrqLGNU= cZYôïæíøû\u0002\u0001Ü×ÞåÐÓÊÉ$\u001f\u0016\u001d\b\u000b\u0012\u0011,'.R\u0018ÉèžQRFö(§ü³!ü³!üŸ\u0012ü³á½ü³!ü·8S¿9C\u001d=MUFEŠOI·kGŠÉ\u000e؛¸†„\u000esïf\u0003êÚj\u0016š †®s\u0003æ\u0005:Út–Oð‘‰ïI«ëHJS+ÆbÌÙ¶’ô\bsÿh-'sÂ؅8c¤\u000e±¾N=}ªdrÜûøH¼\u000e´\u001eJ1«è’ÇŸv£Ì\u0007®_pLô‰¶ZT\u001d¯~¡í0J¢Íá»ÕÌ&£ÉѶ\u0004$\u000b@Œå)UCÓe7ã¤\u0016\u0011¾Yõ/—‚덺…\\\b( —\u0011¦£³Æ\u001böø¼\u001bd\u001eUÁ±q²õsûOl\u001bZÞT™±t\u0012õ{QŒ\b.à–)¦žÓÆEfpAÅbԉÁrÔ5wƒP­(2¤\u00169¶ \u0015\u0006\u000f~÷}(,$\u0017!¶¥e\u0006#þù;= ¢Õ±Áot5k\u0003N5+‰Ä\fÕ9S\u0005\u0013]?âÅ6\u0015BÙ\u0005?™Ä+•B„u:k\u0002ÐÝA|$+¡ÃIÕ)\u000f„\u001d­6Že\tɞ£®öÓûWz\u0019,\u0016j= µa³Q3ê3üҜ!˜¡†U2w\u0003ê­<ÛÄ\u001f]Á•­/Ø#÷1º\b”\u0019‡ ­‹óJÛé\u0018œÑ0¡“ñˆãî\u0001Sú„\u001a\u001c€–y°²Ïnÿ«úzÚ\u001dP–|\u0010²—sL\u000bé\u001e\\Ð\b!EŒJ\u0006‰¾ZÊ'¯VJ&O\u0002TÈFbHï¾SuÈjÂ]ÈFBbÀ7µDN‡F\u0004\u0012}çTeËfF5-ˆVJ&x¶Ûa¶{NH¶U4M%ÿ[JGþO\u0012)ZâTœ¶tNH¶\\ÔJ‡FD‘Vb†ðGF†FC<½í_ˆxgJˆˆfÊÖVNOgJˆˆfjy’ŽNÊVXHggʆŽNÊVXHgg2\u0003%¥E\u0004ÅÃEB@\tdÎfAζ\bWˆŽ·\u000bSxâiÏ~íî7\fM= ÂéÑ|å‚èÒp\u0015n6\u0006c¸\u001ex\u0015h<ò&ÈY‘²'ËUþù\u000f€ôÒ§ÌKYžy\u0011zÜ^x\u0012n\fR¦Æ\u0005Bçä/æ@Ô®è׉”¯ëÓyà/þìô/ìÍaÀ\u00011üä€\u00002ð\u0014t.æã¹$põè=}ð>(ِ°?+Հ\u0004ñï\u0000õп,ËX¤qñúÝdpòî=MP¾&EJ\u0007IFæNVF\u0006\u0012óÃ!|\u0014ü³!üßÓù³!ü³!ü{©ÏZX&†ÊXR\tµ6i^F9vQ,È[>a\u0012Ǐ>Iâ\tl\u001eP´¦}¾IÕöIÜÉi¶P±\u0006|rÉ˦I*\tsþQ&wîIÛ6F$Ét\u0016Q¥†y\u0002ÉÝæGÔÉ¥&uâG\u001f¶StÈR6dT\u0007—6KÀæHÉL‡ÂðCï+hp°ËδŠ¡³èüÎ6Î÷ ƒ(ð¼˜!‹Z\u001aq×\u0013\u000e\u0004@Ájõ-\u001aEh\u0015ו;ã@o¸ç„ÏbŒì\u0000¯Rè엱ÓÃ\u001aœ)ë·Ñ@Ô\u0010°\u000e\fšéW›Óp±òéÕà}\u0013:†\u0019èÝ\u0017¹\u0013̬m\u0000^£\u001dBÕD\u001bB\u0018Jàü…¨Å©9 +\u001e輕\u0001[Ô£°Í\u001c±mz;°ÀëÊÓDg7à>\u001c5m\u0000DÅܞ•20Ý:±Ï_Cå\n\u0015Š:OBzCy\u0013Ë[\u0019ˆ\u001eS!ìY\u0019‹.'\u001e:d¤“•ì\u0001ö¦˜³ì<“$™?j­8ÝÀ”Ãà2’”ïQُ0v{“\u0012¾Öx“Ÿa5™ü\fu)¡\u0010½\u001cžÔ\u0005˜€\fÓÚ°\u001f¾cbÓ´Œõ¦¦ª\u0007xÞa{Ҁ‡wîaCM\u0005Œ¥ŒF5°úUÆêXLT&•—\t—øPû=Mno\u001aäè̐Ï\u0018£úoð铗c3í\u001e‹Aoœú娋Aoœ~ðíž\u0017ìîÔ\f£~4èÓ)t Z\u001b\u0017D$ý&3ƒD\u0005ýOE+jQg$KVGf\u0003fÇFWF˜r'¾|O\"PÙÊüXܜW´ˆ\bŠç»Ê=M½§”ˆfd\u0010i\u0012´Ïˆè_Šœ\u0015Wÿ\u0002X[Ԏ*ssВjRÔ4jxØ6w„¢‰ÎæŠÚVLX\tƒWËÊãMÊù𶙊šbX\u0015Î-=MãÑÝ=M£ÏQ\nuÒ=M(\u0018(\u000e7A(&>\u0014¾½\"ŽÜãäï§Ã§˜žkray×/§[øª\u0012MrΟ\u000bz÷èîFóâ¬çЯt0VðÔ<ÈL˜aïL r\u001bá“™˜µ\u000bŽ^óRµ\u0012pL= YXi¨\u001awšw5¨âÒïw~É=M¦\f²\u000f‡\nRw…-âžä¹kmf¤n\f¸\u0018¸\u000e(Ãöþ™2\u0014_߯\u0015= åë\u000fB؋\u000fr\u000fú«k¬¿xQy«ŸUxçòðr™¬ÚVÆ\u0010gіRÿʉʀ.KJPaËLnœ.ɬ‰'󺏌±Ì}ÛLàdØt\u0010î\u0011–ë\u0005‘½¬’“=My¾_\u0012:sbÆ£\u0014ü¶\n²]­N=MÄ\u0007LÓbIÜ)©\u0015¬qý¾ØÊ\u001cJuµ›H\u0010Q'ÏX0Xš\u0002½‚­\bšdä\u0006‘¦8üjiÒjÄ8ÿj¿8Û*†\u0018\bjrsßâúu_”0’¸mÕ*!K)K= D]GË¥\býOXKdÄg¥l¾\u0006ÍJ›HYå\u001eEqW…¨F€Ð’\nÿ·‡×É~™‡êWÀv¾·Q·\\\u0018µNºÇ\u0001Š´–Ë÷\u001ca\u001dÁ\tjg\u001fk\u001cX­Î¿ãšdpž ôÑ<‹µ$4/ü½aÃáìáƒ02\\'\\ŸZ½ñøññ±3œÊB\u001fæ{Ö\u000f0Ó\u0012¶zB?Œ/¬—jd¿¹y\\·ÅÙ¨Y…Ⱥ†]5Ñ%Â\u0006\u0019Á5‡@‡“µÁ\"\u001fC\bCø~4„«òqü¼e\u001899´3´¸•ûÏ\u000fŠß\u0015“\u0018ƒè¤¾õáÁv\u001cC\u0003Ð\u0003Â\\†£Ÿ0u{––YˈŸÆ€\u0010²zÎ|èRê•wü^sºC\u0014†Uþ*”›R±Ý·Ý}Œ\u0018ƒÁÍ»Íù\u0001ÿ\"\u0013ÖyJ+김÷•\u0002?â­\u0016$9:9à‡<âù]Ë]«\"Q\u0010\u0007ô\u0007û]Ö2\u0015­û­\u000f\u001f0y\u0012rz1?_ï“j\b‹}³ž,C\u0019Ð\u0019B’†þ\u00180ý= ÊcS욐0ÈLM´Éf®JTì’ïµïýê.aI¯¶ ªépã»\b¾\bát_ÞÃ\u0010À\u0010\u0016Â\u0018ãg\u0015VâJ~qqCÛL”Í\u001f\në¶]Þc[||\nd—Gșö\\\u0012H0UK@\u0006ÃhUï¾òp©ÛÝm/áÃ\u001eÀ\u001e\u001f\u001dÂ\nãf•Vbgc\u001bk?Ø|e;j4óé\u001d¯X3\u000f­ÕOÕ\u000fØÿ=MÛI¢I°ÕiC…\u001d®±\u000eC\u001bû’Gp¾¤qó\\;\tA#ò\f>=}sPQå•>UÖ¦\u0006V,O«X\f{'ØNa§\u0019~œŒÿè?zÊðir×O}ì^P\t‘¾Zw·ÜrTÒ½Y¬s²Êéiøl¸¯(—X\u0002Š$ŠHâu‘LÙ\"ŠlsÊÕFJQS/äRl§†Ùk\u000fúW¼âÊy«Ô‘\u0012eÐR\u0017S7Sk-ð8’¿Ú¢5®An\u0017nÂú’LÔ¶ÕÖ\u0011rYÆÏÇÏ6JÉ\bi­\u0010—ˬðªÌ³Lz\u001b_áêâ*à\u0012åQ\u0012O\u0012Ç-= šd{™Óðz‘jQ³Qçk\u0014¿\u001eÂ+Â\u001d‚Ägø’ý\u0012Žt–+á8oK$\u001b<{è{>°\u001f–-\u001c\u000f |iLã\u0007ýß\u0002›û\u0013úÓø\u001b¡²uX['\u000bøX¶ÉÁÉ\u0002\nøa\u001eY\u001eI5|b:2©4‰U°–Ï\u0017¬Ê–-”²Í¸Í±m\u0005LîTš\t{̀\u0015·,·ú”©Ü¦|RxU§ÍÛÍ£Í>|*ò4ò\u0015Œ\u0004怵€•ÿ&óý}Î= 6À\u001foö\u0017#n…«ÿK\"T\"̵_´¾ôyõé}zk\u001d²\u001dæñ”M¬ £TDi*ç4ç5W\u001fó\u0000µ\u0000•·Á5\u001e¡‹ó>cŸY\u001e2´Ü}Ÿ¤hõºõÂu\u000f\u0015›¤ÙÝ8\"!¯ÅhÀȽ\u0010 \u0007|½á\u0002#8c>X>HÅ}Â:¨Ĉ…°„Ž$!$‰eâ„\u0012õ:\u0001Â\nDí]·ÑgØúŠ”b ûa:LzbÑö´üû²3\u001e,Ñlۘnf£žl/ôn5ÈÁfƒÓl9¤\u0002Ý©\u0005q\u001c\u0019!Åƚ'Èæöˆ\u0018·Š£K=}‡@a±\u0013\\\u0002å)Þ±Æm\u0017ÅZV\u0018aþ;VjƒkmTà ŒCŸzQ\u0011ú 2s]€\u0014A\nêqÚe\u0006eË\u0005jБ0\u0011öZ_¯B\u0013B„\f'ºS9R=}%Jl\u0016¡ÿ½æÏ\u0018lÿ¢ë\u0016|1eè™÷_\u001c<s4ÔA\u0004\u000f\u0006¢@Y´mz tñš |CqºOü\u0016@\u0018„\u0005+¿Í\u001d}Õ:U+]¶ï6ãŠñ¾ñÄI\t\u000e )}9ÂÛ)ù±Ë­ÿ…†h™|ÈáÊ×ØsÐô0´6¼JwLßÉ·\u0003i\nû\u0014ù$%K\u001e“­¸Ÿ\u0016d¯âÂå0æ|¤•‹—\u0012®ë\u001f½úv€¨ÂÇ= \u0000Æ\u0011Íðë\u000f8)ð€³ØäÉàw\u0012\u0010üe´.&?T×øo­\u0006\u0019ˆ×*è¨öÀVÂT÷= ™\u0013o~4^.€/'•I´\u0017·‰ýëx?»\u001bS3NCV:p¼\u0013€\u001a´µ\u000f3\u000e9Ž\u0019nU\u0006=M\b/Ø\u0001PëÀPÂU?\t~$BYDí©ò\u0011+¯7Õisì\u0002L¥N]äo\\î{6™*µ)\u0015,\u001f>¥ÔŸôTÕ=M…Y>”¥\t£SÃ×ôÚŘÃ\u001a0:\u0011\u0016U\u001eÁ±ç#%˜\u0016×59G†^kPÒÆÞؾ‰‹ÉgjI[©Ÿ~%ä2(¿~\u0004Î= ãÍs\u0007!\u00008ƒ\u0011ÂYFK«X~I= k_g\u0015›S˵i\u001d—M¼[\u0005©µ¸#=}‚:ÃM„˜B&Á.Ïê“D¢;XôG0n͇R°Öz\u0010uî²6dªe\u0000Y‰7¨Áϱá=M&!¡ú\u0005º‹¯\u0003D\u0018\u0000ì3³a%\u001aLcëd§êž¹•Ò\u0003~9ºDýæF;sA£\u0010%ÿä÷\u0015¬\u0004\u000eE\u0003\u000eŸÀÿ(CåÝ¢“=} d\u0002_ezÔ𪕕_߁Âòª,Õ?ùѬ۰p\\\u001dõ\u0000úèO´A+“\u0017\u0006\u0018‡[\u001f;CtS®0\u0019\fÃYZ\u001aË Ûcß\u0018yý=}\u001e4y/?ˆÃ\u0000w=Mâ¯[~ØÎc\f<َç:®´þÖkә\nîï ÏjÃx½ð¶úšì\u000e™U\u0017\u0014\u001bñÒ9\u0013Qó±b€¨I\\@\u0005ք\u0017Ã\"U\b”¯\u0001\bñÄë\u0003ë\u0005§úáõŸ¡c\u0013Š†e?½1U= ½ÞÓ\u001ch=MLH\u001a¬Å{/~CV\u001dròÝä˜âå\u001b ÈÕ\u0017ð~Ûï¾$\u000f·-¬ãov[enqõr±†tõµ$\u0018\u0004/3µ\u000b}\u0011t›D 6=M+Ü,\u00013Õ%ÄSD’Á\t?m;õ\u0002Ô·•­\u0003t>ÿ¾¬\u001fÈ\u0010‹S±uuµ\u001cüuÃA™6ž Z\u0014ú\u001aw¿\t\f­C–Vbbˆ1\fgí<\u0010Ñc\u001d©\\ëfû~ó²¶ëîçE+\n,\u00043&!7‘ÜÆѬt¤T\u0014¡RusJ­sぽ”Ç\\fÄ%8Ƶ%Åj\u0004Ìa”úÒO\nFÿ\u0004G×'îfN>=}ub\u000esÇhɈǢYZQAE\tZè\u001a·ÏNÖÁKÐR?”BÆ¢‰\u0010ÅLrm°ªfýtkø¡~wŽJ—= XD}r\u0017qN\u000e³“ÏRC=}nW\nš™iÉS\u0012ÅG`});\n\nvar HEAP8, HEAP16, HEAP32, HEAPU8, HEAPU16, HEAPU32, HEAPF32, HEAPF64, wasmMemory;\n\nfunction updateMemoryViews() {\n var b = wasmMemory.buffer;\n HEAP8 = new Int8Array(b);\n HEAP16 = new Int16Array(b);\n HEAPU8 = new Uint8Array(b);\n HEAPU16 = new Uint16Array(b);\n HEAP32 = new Int32Array(b);\n HEAPU32 = new Uint32Array(b);\n HEAPF32 = new Float32Array(b);\n HEAPF64 = new Float64Array(b);\n}\n\nvar _emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num);\n\nvar abortOnCannotGrowMemory = requestedSize => {\n abort(\"OOM\");\n};\n\nvar _emscripten_resize_heap = requestedSize => {\n var oldSize = HEAPU8.length;\n requestedSize >>>= 0;\n abortOnCannotGrowMemory(requestedSize);\n};\n\nvar UTF8Decoder = new TextDecoder(\"utf8\");\n\n/**\n * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the\n * emscripten HEAP, returns a copy of that string as a Javascript String object.\n *\n * @param {number} ptr\n * @param {number=} maxBytesToRead - An optional length that specifies the\n * maximum number of bytes to read. You can omit this parameter to scan the\n * string until the first 0 byte. If maxBytesToRead is passed, and the string\n * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the\n * string will cut short at that byte index (i.e. maxBytesToRead will not\n * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing\n * frequent uses of UTF8ToString() with and without maxBytesToRead may throw\n * JS JIT optimizations off, so it is worth to consider consistently using one\n * @return {string}\n */ var UTF8ToString = (ptr, maxBytesToRead) => {\n if (!ptr) return \"\";\n var maxPtr = ptr + maxBytesToRead;\n for (var end = ptr; !(end >= maxPtr) && HEAPU8[end]; ) ++end;\n return UTF8Decoder.decode(HEAPU8.subarray(ptr, end));\n};\n\nvar SYSCALLS = {\n varargs: undefined,\n get() {\n var ret = HEAP32[((+SYSCALLS.varargs) >> 2)];\n SYSCALLS.varargs += 4;\n return ret;\n },\n getp() {\n return SYSCALLS.get();\n },\n getStr(ptr) {\n var ret = UTF8ToString(ptr);\n return ret;\n }\n};\n\nvar _fd_close = fd => 52;\n\nvar _fd_read = (fd, iov, iovcnt, pnum) => 52;\n\nvar convertI32PairToI53Checked = (lo, hi) => ((hi + 2097152) >>> 0 < 4194305 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN;\n\nfunction _fd_seek(fd, offset_low, offset_high, whence, newOffset) {\n var offset = convertI32PairToI53Checked(offset_low, offset_high);\n return 70;\n}\n\nvar printCharBuffers = [ null, [], [] ];\n\n/**\n * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given\n * array that contains uint8 values, returns a copy of that string as a\n * Javascript String object.\n * heapOrArray is either a regular array, or a JavaScript typed array view.\n * @param {number} idx\n * @param {number=} maxBytesToRead\n * @return {string}\n */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => {\n var endIdx = idx + maxBytesToRead;\n var endPtr = idx;\n while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr;\n return UTF8Decoder.decode(heapOrArray.buffer ? heapOrArray.subarray(idx, endPtr) : new Uint8Array(heapOrArray.slice(idx, endPtr)));\n};\n\nvar printChar = (stream, curr) => {\n var buffer = printCharBuffers[stream];\n if (curr === 0 || curr === 10) {\n (stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0));\n buffer.length = 0;\n } else {\n buffer.push(curr);\n }\n};\n\nvar _fd_write = (fd, iov, iovcnt, pnum) => {\n var num = 0;\n for (var i = 0; i < iovcnt; i++) {\n var ptr = HEAPU32[((iov) >> 2)];\n var len = HEAPU32[(((iov) + (4)) >> 2)];\n iov += 8;\n for (var j = 0; j < len; j++) {\n printChar(fd, HEAPU8[ptr + j]);\n }\n num += len;\n }\n HEAPU32[((pnum) >> 2)] = num;\n return 0;\n};\n\nvar wasmImports = {\n /** @export */ a: _emscripten_memcpy_js,\n /** @export */ e: _emscripten_resize_heap,\n /** @export */ d: _fd_close,\n /** @export */ b: _fd_read,\n /** @export */ f: _fd_seek,\n /** @export */ c: _fd_write\n};\n\nfunction initRuntime(wasmExports) {\n wasmExports[\"h\"]();\n}\n\nvar imports = {\n \"a\": wasmImports\n};\n\nvar _free, _malloc, _create_decoder, _destroy_decoder, _decode_frame;\n\n\nthis.setModule = (data) => {\n WASMAudioDecoderCommon.setModule(EmscriptenWASM, data);\n};\n\nthis.getModule = () =>\n WASMAudioDecoderCommon.getModule(EmscriptenWASM);\n\nthis.instantiate = () => {\n this.getModule().then((wasm) => WebAssembly.instantiate(wasm, imports)).then((instance) => {\n const wasmExports = instance.exports;\n _free = wasmExports[\"i\"];\n _malloc = wasmExports[\"j\"];\n _create_decoder = wasmExports[\"k\"];\n _destroy_decoder = wasmExports[\"l\"];\n _decode_frame = wasmExports[\"m\"];\n wasmMemory = wasmExports[\"g\"];\n updateMemoryViews();\n initRuntime(wasmExports);\n ready();\n});\n\nthis.ready = new Promise(resolve => {\n ready = resolve;\n}).then(() => {\n this.HEAP = wasmMemory.buffer;\n this.malloc = _malloc;\n this.free = _free;\n this.create_decoder = _create_decoder;\n this.destroy_decoder = _destroy_decoder;\n this.decode_frame = _decode_frame;\n});\nreturn this;\n}}","import { WASMAudioDecoderCommon } from \"@wasm-audio-decoders/common\";\nimport CodecParser, {\n data,\n absoluteGranulePosition,\n samples,\n codecFrames,\n isLastPage,\n} from \"codec-parser\";\n\nimport EmscriptenWASM from \"./EmscriptenWasm.js\";\n\nexport function Decoder() {\n // injects dependencies when running as a web worker\n // async\n this._init = () => {\n return new this._WASMAudioDecoderCommon()\n .instantiate(this._EmscriptenWASM, this._module)\n .then((common) => {\n this._common = common;\n\n this._inputBytes = 0;\n this._outputSamples = 0;\n this._frameNumber = 0;\n\n this._channels = this._common.allocateTypedArray(1, Uint32Array);\n this._sampleRate = this._common.allocateTypedArray(1, Uint32Array);\n this._bitsPerSample = this._common.allocateTypedArray(1, Uint32Array);\n this._samplesDecoded = this._common.allocateTypedArray(1, Uint32Array);\n this._outputBufferPtr = this._common.allocateTypedArray(1, Uint32Array);\n this._outputBufferLen = this._common.allocateTypedArray(1, Uint32Array);\n\n this._errorStringPtr = this._common.allocateTypedArray(1, Uint32Array);\n this._stateStringPtr = this._common.allocateTypedArray(1, Uint32Array);\n\n this._decoder = this._common.wasm.create_decoder(\n this._channels.ptr,\n this._sampleRate.ptr,\n this._bitsPerSample.ptr,\n this._samplesDecoded.ptr,\n this._outputBufferPtr.ptr,\n this._outputBufferLen.ptr,\n this._errorStringPtr.ptr,\n this._stateStringPtr.ptr,\n );\n });\n };\n\n Object.defineProperty(this, \"ready\", {\n enumerable: true,\n get: () => this._ready,\n });\n\n // async\n this.reset = () => {\n this.free();\n return this._init();\n };\n\n this.free = () => {\n this._common.wasm.destroy_decoder(this._decoder);\n\n this._common.free();\n };\n\n this._decode = (data) => {\n if (!(data instanceof Uint8Array))\n throw Error(\n \"Data to decode must be Uint8Array. Instead got \" + typeof data,\n );\n\n const input = this._common.allocateTypedArray(\n data.length,\n Uint8Array,\n false,\n );\n input.buf.set(data);\n\n this._common.wasm.decode_frame(this._decoder, input.ptr, input.len);\n\n let errorMessage = [],\n error;\n if (this._errorStringPtr.buf[0])\n errorMessage.push(\n \"Error: \" + this._common.codeToString(this._errorStringPtr.buf[0]),\n );\n\n if (this._stateStringPtr.buf[0])\n errorMessage.push(\n \"State: \" + this._common.codeToString(this._stateStringPtr.buf[0]),\n );\n\n if (errorMessage.length) {\n error = errorMessage.join(\"; \");\n console.error(\n \"@wasm-audio-decoders/flac: \\n\\t\" + errorMessage.join(\"\\n\\t\"),\n );\n }\n\n const output = new Float32Array(\n this._common.wasm.HEAP,\n this._outputBufferPtr.buf[0],\n this._outputBufferLen.buf[0],\n );\n\n const decoded = {\n error: error,\n outputBuffer: this._common.getOutputChannels(\n output,\n this._channels.buf[0],\n this._samplesDecoded.buf[0],\n ),\n samplesDecoded: this._samplesDecoded.buf[0],\n };\n\n this._common.wasm.free(this._outputBufferPtr.buf[0]);\n this._outputBufferLen.buf[0] = 0;\n this._samplesDecoded.buf[0] = 0;\n\n return decoded;\n };\n\n this.decodeFrames = (frames) => {\n let outputBuffers = [],\n errors = [],\n outputSamples = 0;\n\n for (let i = 0; i < frames.length; i++) {\n let offset = 0;\n const data = frames[i];\n\n while (offset < data.length) {\n const chunk = data.subarray(offset, offset + this._MAX_INPUT_SIZE);\n offset += chunk.length;\n\n const decoded = this._decode(chunk);\n\n outputBuffers.push(decoded.outputBuffer);\n outputSamples += decoded.samplesDecoded;\n\n if (decoded.error)\n this._common.addError(\n errors,\n decoded.error,\n data.length,\n this._frameNumber,\n this._inputBytes,\n this._outputSamples,\n );\n\n this._inputBytes += data.length;\n this._outputSamples += decoded.samplesDecoded;\n }\n\n this._frameNumber++;\n }\n\n return this._WASMAudioDecoderCommon.getDecodedAudioMultiChannel(\n errors,\n outputBuffers,\n this._channels.buf[0],\n outputSamples,\n this._sampleRate.buf[0],\n this._bitsPerSample.buf[0],\n );\n };\n\n // injects dependencies when running as a web worker\n this._isWebWorker = Decoder.isWebWorker;\n this._WASMAudioDecoderCommon =\n Decoder.WASMAudioDecoderCommon || WASMAudioDecoderCommon;\n this._EmscriptenWASM = Decoder.EmscriptenWASM || EmscriptenWASM;\n this._module = Decoder.module;\n\n this._MAX_INPUT_SIZE = 65535 * 8;\n\n this._ready = this._init();\n\n return this;\n}\n\nexport const setDecoderClass = Symbol();\n\nconst determineDecodeMethod = Symbol();\nconst decodeFlac = Symbol();\nconst decodeOggFlac = Symbol();\nconst placeholderDecodeMethod = Symbol();\nconst decodeMethod = Symbol();\nconst init = Symbol();\n\nexport default class FLACDecoder {\n constructor() {\n this._onCodec = (codec) => {\n if (codec !== \"flac\")\n throw new Error(\n \"@wasm-audio-decoders/flac does not support this codec \" + codec,\n );\n };\n\n // instantiate to create static properties\n new WASMAudioDecoderCommon();\n\n this[init]();\n this[setDecoderClass](Decoder);\n }\n\n [init]() {\n this[decodeMethod] = placeholderDecodeMethod;\n this._codecParser = null;\n this._beginningSampleOffset = undefined;\n }\n\n [determineDecodeMethod](data) {\n if (!this._codecParser && data.length >= 4) {\n let codec = \"audio/\";\n\n if (\n data[0] !== 0x4f || // O\n data[1] !== 0x67 || // g\n data[2] !== 0x67 || // g\n data[3] !== 0x53 // S\n ) {\n codec += \"flac\";\n this[decodeMethod] = decodeFlac;\n } else {\n codec += \"ogg\";\n this[decodeMethod] = decodeOggFlac;\n }\n\n this._codecParser = new CodecParser(codec, {\n onCodec: this._onCodec,\n enableFrameCRC32: false,\n });\n }\n }\n\n [setDecoderClass](decoderClass) {\n if (this._decoder) {\n const oldDecoder = this._decoder;\n oldDecoder.ready.then(() => oldDecoder.free());\n }\n\n this._decoder = new decoderClass();\n this._ready = this._decoder.ready;\n }\n\n [decodeFlac](flacFrames) {\n return this._decoder.decodeFrames(flacFrames.map((f) => f[data] || f));\n }\n\n [decodeOggFlac](oggPages) {\n const frames = oggPages\n .map((page) => page[codecFrames].map((f) => f[data]))\n .flat();\n\n const decoded = this._decoder.decodeFrames(frames);\n\n const oggPage = oggPages[oggPages.length - 1];\n if (oggPages.length && Number(oggPage[absoluteGranulePosition]) > -1) {\n if (this._beginningSampleOffset === undefined) {\n this._beginningSampleOffset =\n oggPage[absoluteGranulePosition] - BigInt(oggPage[samples]);\n }\n\n if (oggPage[isLastPage]) {\n // trim any extra samples that are decoded beyond the absoluteGranulePosition, relative to where we started in the stream\n const samplesToTrim =\n decoded.samplesDecoded - Number(oggPage[absoluteGranulePosition]);\n\n if (samplesToTrim > 0) {\n for (let i = 0; i < decoded.channelData.length; i++)\n decoded.channelData[i] = decoded.channelData[i].subarray(\n 0,\n decoded.samplesDecoded - samplesToTrim,\n );\n\n decoded.samplesDecoded -= samplesToTrim;\n }\n }\n }\n\n return decoded;\n }\n\n [placeholderDecodeMethod]() {\n return WASMAudioDecoderCommon.getDecodedAudio([], [], 0, 0, 0);\n }\n\n get ready() {\n return this._ready;\n }\n\n async reset() {\n this[init]();\n return this._decoder.reset();\n }\n\n free() {\n this._decoder.free();\n }\n\n async decode(flacData) {\n if (this[decodeMethod] === placeholderDecodeMethod)\n this[determineDecodeMethod](flacData);\n\n return this[this[decodeMethod]]([\n ...this._codecParser.parseChunk(flacData),\n ]);\n }\n\n async flush() {\n const decoded = this[this[decodeMethod]]([...this._codecParser.flush()]);\n\n await this.reset();\n return decoded;\n }\n\n async decodeFile(flacData) {\n this[determineDecodeMethod](flacData);\n\n const decoded = this[this[decodeMethod]]([\n ...this._codecParser.parseAll(flacData),\n ]);\n\n await this.reset();\n return decoded;\n }\n\n async decodeFrames(flacFrames) {\n return this[decodeFlac](flacFrames);\n }\n}\n","import { WASMAudioDecoderWorker } from \"@wasm-audio-decoders/common\";\nimport EmscriptenWASM from \"./EmscriptenWasm.js\";\nimport FLACDecoder, { Decoder, setDecoderClass } from \"./FLACDecoder.js\";\n\nclass DecoderWorker extends WASMAudioDecoderWorker {\n constructor(options) {\n super(options, \"flac-decoder\", Decoder, EmscriptenWASM);\n }\n\n async decodeFrames(frames) {\n return this.postToDecoder(\"decodeFrames\", frames);\n }\n}\n\nexport default class FLACDecoderWebWorker extends FLACDecoder {\n constructor() {\n super();\n\n super[setDecoderClass](DecoderWorker);\n }\n\n async free() {\n super.free();\n }\n\n terminate() {\n this._decoder.terminate();\n }\n}\n","import FLACDecoder from \"./src/FLACDecoder.js\";\nimport FLACDecoderWebWorker from \"./src/FLACDecoderWebWorker.js\";\nimport { assignNames } from \"@wasm-audio-decoders/common\";\n\nassignNames(FLACDecoder, \"FLACDecoder\");\nassignNames(FLACDecoderWebWorker, \"FLACDecoderWebWorker\");\n\nexport { FLACDecoder, FLACDecoderWebWorker };\n","const t=(t,n=4294967295,e=79764919)=>{const r=new Int32Array(256);let o,s,i,c=n;for(o=0;o<256;o++){for(i=o<<24,s=8;s>0;--s)i=2147483648&i?i<<1^e:i<<1;r[o]=i}for(o=0;o>24^t[o])];return c},n=t=>{const n=[];for(const e of t){let t=(e+42)%256;0===t||10===t||13===t||61===t?n.push(\"=\"+String.fromCharCode((t+64)%256)):n.push(String.fromCharCode(t))}return n.join(\"\")},e=(n,e=t)=>{const r=t=>new Uint8Array(t.length/2).map(((n,e)=>parseInt(t.substring(2*e,2*(e+1)),16))),o=t=>r(t)[0],s=new Map;[,8364,,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,,381,,,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,,382,376].forEach(((t,n)=>s.set(t,n)));const i=new Uint8Array(n.length);let c,a,l,f=!1,g=0,h=42,p=n.length>13&&\"dynEncode\"===n.substring(0,9),u=0;p&&(u=11,a=o(n.substring(9,u)),a<=1&&(u+=2,h=o(n.substring(11,u))),1===a&&(u+=8,l=(t=>new DataView(r(t).buffer).getInt32(0,!0))(n.substring(13,u))));const d=256-h;for(let t=u;t255){const t=s.get(c);t&&(c=t+127)}f&&(f=!1,c-=64),i[g++]=c0?c+d:c-h}else f=!0;const m=i.subarray(0,g);if(p&&1===a){const t=e(m);if(t!==l){const n=\"Decode failed crc32 validation\";throw console.error(\"`simple-yenc`\\n\",n+\"\\n\",\"Expected: \"+l+\"; Got: \"+t+\"\\n\",\"Visit https://github.com/eshaz/simple-yenc for more information\"),Error(n)}}return m},r=(n,e='\"',r=t,o)=>{const s=(t,n)=>(t%n+n)%n,i=(t,n)=>n.push(String.fromCharCode(61,(t+64)%256)),c=t=>t.map((t=>t.toString(16).padStart(2,\"0\")));let a,l,f=[],g=1/0,h=Array(256).fill(0);if('\"'===e?(l=[0,8,9,10,11,12,13,34,92,61],a=t=>0===t||8===t||9===t||10===t||11===t||12===t||13===t||34===t||92===t||61===t):\"'\"===e?(l=[0,8,9,10,11,12,13,39,92,61],a=t=>0===t||8===t||9===t||10===t||11===t||12===t||13===t||39===t||92===t||61===t):\"`\"===e&&(l=[13,61,96],f=[7,205,231],a=(t,n)=>13===t||36===t&&123===n||61===t||92===t&&(85===n||117===n)||96===t),void 0===o){o=0;for(let t=0;t{const n=new Uint8Array(4);return new DataView(n.buffer).setInt32(0,t,!0),[...n]})(r(n)))];for(let t=0;tt.replace(/[\\\\]/g,\"\\\\\\\\\").replace(/[`]/g,\"\\\\`\").replace(/\\${/g,\"\\\\${\");export{t as crc32,e as decode,r as dynamicEncode,n as encode,o as stringify};\n"],"names":["module","exports","Worker","EmscriptenWASM","WASMAudioDecoderCommon","HEAPU8","HEAPU32","wasmMemory","out","text","console","log","err","error","ready","base64ReverseLookup","Uint8Array","i","wasm","Object","defineProperty","get","String","raw","UTF8Decoder","TextDecoder","printCharBuffers","printChar","stream","curr","buffer","heapOrArray","idx","maxBytesToRead","endIdx","endPtr","decode","subarray","slice","UTF8ArrayToString","length","push","wasmImports","a","dest","src","num","copyWithin","e","requestedSize","what","abort","d","fd","b","iov","iovcnt","pnum","f","offset_low","offset_high","whence","newOffset","c","ptr","len","j","_free","_malloc","_create_decoder","_destroy_decoder","_decode_frame","imports","this","setModule","data","getModule","instantiate","then","WebAssembly","instance","wasmExports","Int8Array","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","initRuntime","Promise","resolve","HEAP","malloc","free","create_decoder","destroy_decoder","decode_frame","Decoder","_init","_WASMAudioDecoderCommon","_EmscriptenWASM","_module","common","_common","_inputBytes","_outputSamples","_frameNumber","_channels","allocateTypedArray","_sampleRate","_bitsPerSample","_samplesDecoded","_outputBufferPtr","_outputBufferLen","_errorStringPtr","_stateStringPtr","_decoder","enumerable","_ready","reset","_decode","Error","input","buf","set","errorMessage","codeToString","join","output","decoded","outputBuffer","getOutputChannels","samplesDecoded","decodeFrames","frames","outputBuffers","errors","outputSamples","offset","chunk","_MAX_INPUT_SIZE","addError","getDecodedAudioMultiChannel","_isWebWorker","isWebWorker","setDecoderClass","Symbol","determineDecodeMethod","decodeFlac","decodeOggFlac","placeholderDecodeMethod","decodeMethod","init","FLACDecoder","constructor","_onCodec","codec","_codecParser","_beginningSampleOffset","undefined","onCodec","enableFrameCRC32","decoderClass","oldDecoder","flacFrames","map","oggPages","page","flat","oggPage","Number","BigInt","samplesToTrim","channelData","getDecodedAudio","flacData","parseChunk","flush","decodeFile","parseAll","DecoderWorker","WASMAudioDecoderWorker","options","super","postToDecoder","FLACDecoderWebWorker","terminate","t","n","r","o","s","parseInt","substring","Map","forEach","l","g","h","p","u","DataView","getInt32","charCodeAt","m"],"sourceRoot":""} \ No newline at end of file diff --git a/lib/icecast-metadata-player-1.17.3.main.min.js b/lib/icecast-metadata-player-1.17.3.main.min.js new file mode 100644 index 0000000..700a667 --- /dev/null +++ b/lib/icecast-metadata-player-1.17.3.main.min.js @@ -0,0 +1,23 @@ +/*! For license information please see icecast-metadata-player-1.17.3.main.min.js.LICENSE.txt */ + +/*! + * Copyright 2021-2023 Ethan Halsall + * https://github.com/eshaz/icecast-metadata-js + * + * This file is part of icecast-metadata-player. + * + * icecast-metadata-player free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * icecast-metadata-player distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see + */ +var IcecastMetadataPlayer;(()=>{"use strict";var t,s,i,e={317:(t,s,i)=>{i.d(s,{fp:()=>re,HQ:()=>ne,p:()=>ae,Ay:()=>he,wx:()=>oe,we:()=>ce,cJ:()=>de,Er:()=>ue,$:()=>le});const e=Symbol,h=(()=>{const t="left",s="center",i="right";return["","front ","side ","rear "].map((e=>[[t,i],[t,i,s],[t,s,i],[s,t,i],[s]].flatMap((t=>t.map((t=>e+t)).join(", ")))))})(),r="LFE",n="monophonic (mono)",a="stereo",o="surround",c=(t,...s)=>`${[n,a,`linear ${o}`,"quadraphonic",`5.0 ${o}`,`5.1 ${o}`,`6.1 ${o}`,`7.1 ${o}`][t-1]} (${s.join(", ")})`,u=[n,c(2,h[0][0]),c(3,h[0][2]),c(4,h[1][0],h[3][0]),c(5,h[1][2],h[3][0]),c(6,h[1][2],h[3][0],r),c(7,h[1][2],h[2][0],h[3][4],r),c(8,h[1][2],h[2][0],h[3][0],r)],l=48e3,d=44100,y=32e3,f=24e3,m=22050,p=16e3,w=8e3,g="absoluteGranulePosition",b="bandwidth",S="bitDepth",q="bitrate",M=q+"Maximum",A=q+"Minimum",v=q+"Nominal",P="buffer",E=P+"Fullness",_="codec",T=_+"Frames",C="coupledStreamCount",I="crc",R=I+"16",x=I+"32",$="data",k="description",O="duration",D="emphasis",B="hasOpusPadding",L="header",U="isContinuedPacket",F="isCopyrighted",N="isFirstPage",j="isHome",W="isLastPage",G="isOriginal",H="isPrivate",Q="isVbr",V="layer",Y="length",z="mode",K=z+"Extension",J="mpeg",Z=J+"Version",X="numberAACFrames",tt="outputGain",st="preSkip",it="profile",et=e(),ht="protection",rt="rawData",nt="segments",at="subarray",ot="version",ct="vorbis",ut=ct+"Comments",lt=ct+"Setup",dt="block",yt=dt+"ingStrategy",ft=e(),mt=dt+"Size",pt=dt+"size0",wt=dt+"size1",gt=e(),bt="channel",St=bt+"MappingFamily",qt=bt+"MappingTable",Mt=bt+"Mode",At=e(),vt=bt+"s",Pt="copyright",Et=Pt+"Id",_t=Pt+"IdStart",Tt="frame",Ct=Tt+"Count",It=Tt+"Length",Rt="Number",xt=Tt+Rt,$t=Tt+"Padding",kt=Tt+"Size",Ot="Rate",Dt="inputSample"+Ot,Bt="page",Lt=Bt+"Checksum",Ut=e(),Ft=Bt+"SegmentTable",Nt=Bt+"Sequence"+Rt,jt="sample",Wt=jt+Rt,Gt=jt+Ot,Ht=e(),Qt=jt+"s",Vt="stream",Yt=Vt+"Count",zt=Vt+"Info",Kt=Vt+"Serial"+Rt,Jt=Vt+"StructureVersion",Zt="total",Xt=Zt+"BytesOut",ts=Zt+"Duration",ss=Zt+"Samples",is=e(),es=e(),hs=e(),rs=e(),ns=e(),as=e(),os=e(),cs=e(),us=e(),ls=e(),ds=e(),ys=e(),fs=e(),ms=e(),ps=e(),ws=e(),gs=e(),bs=e(),Ss=Uint8Array,qs=DataView,Ms="reserved",As="bad",vs="free",Ps="none",Es="16bit CRC",_s=(t,s,i)=>{for(let e=0;e0;t--)h=i(h);t[e]=h}return t},Ts=_s(new Ss(256),(t=>t),(t=>128&t?7^t<<1:t<<1)),Cs=[_s(new Uint16Array(256),(t=>t<<8),(t=>t<<1^(32768&t?32773:0)))],Is=[_s(new Uint32Array(256),(t=>t),(t=>t>>>1^3988292384*(1&t)))];for(let t=0;t<15;t++){Cs.push(new Uint16Array(256)),Is.push(new Uint32Array(256));for(let s=0;s<=255;s++)Cs[t+1][s]=Cs[0][Cs[t][s]>>>8]^Cs[t][s]<<8,Is[t+1][s]=Is[t][s]>>>8^Is[0][255&Is[t][s]]}const Rs=t=>{const s=t[Y],i=s-16;let e=0,h=0;for(;h<=i;)e=Is[15][255&(t[h++]^e)]^Is[14][255&(t[h++]^e>>>8)]^Is[13][255&(t[h++]^e>>>16)]^Is[12][t[h++]^e>>>24]^Is[11][t[h++]]^Is[10][t[h++]]^Is[9][t[h++]]^Is[8][t[h++]]^Is[7][t[h++]]^Is[6][t[h++]]^Is[5][t[h++]]^Is[4][t[h++]]^Is[3][t[h++]]^Is[2][t[h++]]^Is[1][t[h++]]^Is[0][t[h++]];for(;h!==s;)e=Is[0][255&(e^t[h++])]^e>>>8;return~e},xs=(...t)=>{const s=new Ss(t.reduce(((t,s)=>t+s[Y]),0));return t.reduce(((t,i)=>(s.set(i,t),t+i[Y])),0),s},$s=t=>String.fromCharCode(...t),ks=[0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15],Os=t=>ks[15&t]<<4|ks[t>>4];class Ds{constructor(t){this.t=t,this.i=8*t[Y]}set position(t){this.i=t}get position(){return this.i}read(t){const s=Math.floor(this.i/8),i=this.i%8;this.i-=t;return(Os(this.t[s-1])<<8)+Os(this.t[s])>>7-i&255}}class Bs{constructor(t,s){this.h=t,this.S=s,this[ps]()}[ws](){this.q=!0}[ps](){this.M=new Map,this.A=new WeakMap,this.v=!1,this.P=!1,this._=null,this.q=!1}[ms](t,s){if(this.S){this._!==t&&(this._=t,this.P=!0);const i=this.A.get(this.M.get(this.T));this.P&&i&&this.S({bitrate:t,...i},s),this.P=!1}}[us](t){const s=this.M.get(t);return s&&this.C(t),s}[ls](t,s,i){this.q&&(this.v||(this.h({...s}),this.v=!0),this.C(t),this.M.set(t,s),this.A.set(s,i))}C(t){this.S&&t!==this.T&&(this.P=!0,this.T=t)}}const Ls=new WeakMap,Us=new WeakMap;class Fs{constructor(t,s){this.I=t,this.M=s}*[os](){let t;for(;;){if(t=yield*this.Frame[ds](this.I,this.M,0),t)return t;this.I[es](1)}}*[cs](t){let s=yield*this[os]();const i=Us.get(s)[Y];if(t||this.I.R||(yield*this.Header[us](this.I,this.M,i)))return this.M[ws](),this.I[es](i),this.I[rs](s),s;this.I[ns](`Missing ${Tt} at ${i} bytes from current position.`,`Dropping current ${Tt} and trying again.`),this.M[ps](),this.I[es](1)}}class Ns{constructor(t,s){Us.set(this,{[L]:t}),this[$]=s}}class js extends Ns{static*[ds](t,s,i,e,h){const r=yield*t[us](i,e,h);if(r){const t=Ls.get(r)[It],e=Ls.get(r)[Qt];return new s(r,(yield*i[is](t,h))[at](0,t),e)}return null}constructor(t,s,i){super(t,s),this[L]=t,this[Qt]=i,this[O]=i/t[Gt]*1e3,this[xt]=null,this[Xt]=null,this[ss]=null,this[ts]=null,Us.get(this)[Y]=s[Y]}}const Ws="unsynchronizationFlag",Gs="extendedHeaderFlag",Hs="experimentalFlag",Qs="footerPresent";class Vs{static*getID3v2Header(t,s,i){const e={};let h=yield*t[is](3,i);if(73!==h[0]||68!==h[1]||51!==h[2])return null;if(h=yield*t[is](10,i),e[ot]=`id3v2.${h[3]}.${h[4]}`,15&h[5])return null;if(e[Ws]=!!(128&h[5]),e[Gs]=!!(64&h[5]),e[Hs]=!!(32&h[5]),e[Qs]=!!(16&h[5]),128&h[6]||128&h[7]||128&h[8]||128&h[9])return null;const r=h[6]<<21|h[7]<<14|h[8]<<7|h[9];return e[Y]=10+r,new Vs(e)}constructor(t){this[ot]=t[ot],this[Ws]=t[Ws],this[Gs]=t[Gs],this[Hs]=t[Hs],this[Qs]=t[Qs],this[Y]=t[Y]}}class Ys{constructor(t){Ls.set(this,t),this[S]=t[S],this[q]=null,this[vt]=t[vt],this[Mt]=t[Mt],this[Gt]=t[Gt]}}const zs={0:[vs,vs,vs,vs,vs],16:[32,32,32,32,8],240:[As,As,As,As,As]},Ks=(t,s,i)=>8*((t+i)%s+s)*(1<<(t+i)/s)-8*s*(s/8|0);for(let t=2;t<15;t++)zs[t<<4]=[32*t,Ks(t,4,0),Ks(t,4,-1),Ks(t,8,4),Ks(t,8,0)];const Js="bands ",Zs=" to 31",Xs={0:Js+4+Zs,16:Js+8+Zs,32:Js+12+Zs,48:Js+16+Zs},ti="bitrateIndex",si="v2",ii="v1",ei="Intensity stereo ",hi=", MS stereo ",ri="on",ni="off",ai={0:ei+ni+hi+ni,16:ei+ri+hi+ni,32:ei+ni+hi+ri,48:ei+ri+hi+ri},oi={0:{[k]:Ms},2:{[k]:"Layer III",[$t]:1,[K]:ai,[ii]:{[ti]:2,[Qt]:1152},[si]:{[ti]:4,[Qt]:576}},4:{[k]:"Layer II",[$t]:1,[K]:Xs,[Qt]:1152,[ii]:{[ti]:1},[si]:{[ti]:4}},6:{[k]:"Layer I",[$t]:4,[K]:Xs,[Qt]:384,[ii]:{[ti]:0},[si]:{[ti]:3}}},ci="MPEG Version ",ui="ISO/IEC ",li={0:{[k]:`${ci}2.5 (later extension of MPEG 2)`,[V]:si,[Gt]:{0:11025,4:12e3,8:w,12:Ms}},8:{[k]:Ms},16:{[k]:`${ci}2 (${ui}13818-3)`,[V]:si,[Gt]:{0:m,4:f,8:p,12:Ms}},24:{[k]:`${ci}1 (${ui}11172-3)`,[V]:ii,[Gt]:{0:d,4:l,8:y,12:Ms}},length:Y},di={0:Es,1:Ps},yi={0:Ps,1:"50/15 ms",2:Ms,3:"CCIT J.17"},fi={0:{[vt]:2,[k]:a},64:{[vt]:2,[k]:"joint "+a},128:{[vt]:2,[k]:"dual channel"},192:{[vt]:1,[k]:n}};class mi extends Ys{static*[us](t,s,i){const e={},h=yield*Vs.getID3v2Header(t,s,i);h&&(yield*t[is](h[Y],i),t[es](h[Y]));const r=yield*t[is](4,i),n=$s(r[at](0,4)),a=s[us](n);if(a)return new mi(a);if(255!==r[0]||r[1]<224)return null;const o=li[24&r[1]];if(o[k]===Ms)return null;const c=6&r[1];if(oi[c][k]===Ms)return null;const u={...oi[c],...oi[c][o[V]]};if(e[Z]=o[k],e[V]=u[k],e[Qt]=u[Qt],e[ht]=di[1&r[1]],e[Y]=4,e[q]=zs[240&r[2]][u[ti]],e[q]===As)return null;if(e[Gt]=o[Gt][12&r[2]],e[Gt]===Ms)return null;if(e[$t]=2&r[2]&&u[$t],e[H]=!!(1&r[2]),e[It]=Math.floor(125*e[q]*e[Qt]/e[Gt]+e[$t]),!e[It])return null;const l=192&r[3];if(e[Mt]=fi[l][k],e[vt]=fi[l][vt],e[K]=u[K][48&r[3]],e[F]=!!(8&r[3]),e[G]=!!(4&r[3]),e[D]=yi[3&r[3]],e[D]===Ms)return null;e[S]=16;{const{length:t,frameLength:i,samples:h,...r}=e;s[ls](n,e,r)}return new mi(e)}constructor(t){super(t),this[q]=t[q],this[D]=t[D],this[$t]=t[$t],this[F]=t[F],this[G]=t[G],this[H]=t[H],this[V]=t[V],this[K]=t[K],this[Z]=t[Z],this[ht]=t[ht]}}class pi extends js{static*[ds](t,s,i){return yield*super[ds](mi,pi,t,s,i)}constructor(t,s,i){super(t,s,i)}}class wi extends Fs{constructor(t,s,i){super(t,s),this.Frame=pi,this.Header=mi,i(this[_])}get[_](){return J}*[ys](){return yield*this[cs]()}}const gi={0:"MPEG-4",8:"MPEG-2"},bi={0:"valid",2:As,4:As,6:As},Si={0:Es,1:Ps},qi={0:"AAC Main",64:"AAC LC (Low Complexity)",128:"AAC SSR (Scalable Sample Rate)",192:"AAC LTP (Long Term Prediction)"},Mi={0:96e3,4:88200,8:64e3,12:l,16:d,20:y,24:f,28:m,32:p,36:12e3,40:11025,44:w,48:7350,52:Ms,56:Ms,60:"frequency is written explicitly"},Ai={0:{[vt]:0,[k]:"Defined in AOT Specific Config"},64:{[vt]:1,[k]:n},128:{[vt]:2,[k]:c(2,h[0][0])},192:{[vt]:3,[k]:c(3,h[1][3])},256:{[vt]:4,[k]:c(4,h[1][3],h[3][4])},320:{[vt]:5,[k]:c(5,h[1][3],h[3][0])},384:{[vt]:6,[k]:c(6,h[1][3],h[3][0],r)},448:{[vt]:8,[k]:c(8,h[1][3],h[2][0],h[3][0],r)}};class vi extends Ys{static*[us](t,s,i){const e={},h=yield*t[is](7,i),r=$s([h[0],h[1],h[2],252&h[3]|3&h[6]]),n=s[us](r);if(n)Object.assign(e,n);else{if(255!==h[0]||h[1]<240)return null;if(e[Z]=gi[8&h[1]],e[V]=bi[6&h[1]],e[V]===As)return null;const t=1&h[1];e[ht]=Si[t],e[Y]=t?7:9,e[et]=192&h[2],e[Ht]=60&h[2];const i=2&h[2];if(e[it]=qi[e[et]],e[Gt]=Mi[e[Ht]],e[Gt]===Ms)return null;e[H]=!!i,e[At]=448&(h[2]<<8|h[3]),e[Mt]=Ai[e[At]][k],e[vt]=Ai[e[At]][vt],e[G]=!!(32&h[3]),e[j]=!!(8&h[3]),e[Et]=!!(8&h[3]),e[_t]=!!(4&h[3]),e[S]=16,e[Qt]=1024,e[X]=3&h[6];{const{length:t,channelModeBits:i,profileBits:h,sampleRateBits:n,frameLength:a,samples:o,numberAACFrames:c,...u}=e;s[ls](r,e,u)}}if(e[It]=8191&(h[3]<<11|h[4]<<3|h[5]>>5),!e[It])return null;const a=2047&(h[5]<<6|h[6]>>2);return e[E]=2047===a?"VBR":a,new vi(e)}constructor(t){super(t),this[Et]=t[Et],this[_t]=t[_t],this[E]=t[E],this[j]=t[j],this[G]=t[G],this[H]=t[H],this[V]=t[V],this[Y]=t[Y],this[Z]=t[Z],this[X]=t[X],this[it]=t[it],this[ht]=t[ht]}get audioSpecificConfig(){const t=Ls.get(this),s=t[et]+64<<5|t[Ht]<<5|t[At]>>3,i=new Ss(2);return new qs(i[P]).setUint16(0,s,!1),i}}class Pi extends js{static*[ds](t,s,i){return yield*super[ds](vi,Pi,t,s,i)}constructor(t,s,i){super(t,s,i)}}class Ei extends Fs{constructor(t,s,i){super(t,s),this.Frame=Pi,this.Header=vi,i(this[_])}get[_](){return"aac"}*[ys](){return yield*this[cs]()}}class _i extends js{static k(t){return(t[t[Y]-2]<<8)+t[t[Y]-1]}static[bs](t){const s=_i.k(t),i=(t=>{const s=t[Y],i=s-16;let e=0,h=0;for(;h<=i;)e^=t[h++]<<8|t[h++],e=Cs[15][e>>8]^Cs[14][255&e]^Cs[13][t[h++]]^Cs[12][t[h++]]^Cs[11][t[h++]]^Cs[10][t[h++]]^Cs[9][t[h++]]^Cs[8][t[h++]]^Cs[7][t[h++]]^Cs[6][t[h++]]^Cs[5][t[h++]]^Cs[4][t[h++]]^Cs[3][t[h++]]^Cs[2][t[h++]]^Cs[1][t[h++]]^Cs[0][t[h++]];for(;h!==s;)e=(255&e)<<8^Cs[0][e>>8^t[h++]];return e})(t[at](0,-2));return s===i}constructor(t,s,i){s[zt]=i,s[R]=_i.k(t),super(s,t,Ls.get(s)[Qt])}}const Ti="get from STREAMINFO metadata block",Ci={0:"Fixed",1:"Variable"},Ii={0:Ms,16:192};for(let t=2;t<16;t++)Ii[t<<4]=t<6?576*2**(t-2):2**t;const Ri={0:Ti,1:88200,2:176400,3:192e3,4:w,5:p,6:m,7:f,8:y,9:d,10:l,11:96e3,15:As},xi={0:{[vt]:1,[k]:n},16:{[vt]:2,[k]:c(2,h[0][0])},32:{[vt]:3,[k]:c(3,h[0][1])},48:{[vt]:4,[k]:c(4,h[1][0],h[3][0])},64:{[vt]:5,[k]:c(5,h[1][1],h[3][0])},80:{[vt]:6,[k]:c(6,h[1][1],r,h[3][0])},96:{[vt]:7,[k]:c(7,h[1][1],r,h[3][4],h[2][0])},112:{[vt]:8,[k]:c(8,h[1][1],r,h[3][0],h[2][0])},128:{[vt]:2,[k]:`${a} (left, diff)`},144:{[vt]:2,[k]:`${a} (diff, right)`},160:{[vt]:2,[k]:`${a} (avg, diff)`},176:Ms,192:Ms,208:Ms,224:Ms,240:Ms},$i={0:Ti,2:8,4:12,6:Ms,8:16,10:20,12:24,14:Ms};class ki extends Ys{static D(t){if(t[0]>254)return null;if(t[0]<128)return{value:t[0],length:1};let s=1;for(let i=64;i&t[0];i>>=1)s++;let i=s-1,e=0,h=0;for(;i>0;h+=6,i--){if(128!=(192&t[i]))return null;e|=(63&t[i])<>s)<{let s=0;const i=t[Y];for(let e=0;e!==i;e++)s=Ts[s^t[e]];return s})(e[at](0,h[Y]-1)))return null;if(!n){const{blockingStrategyBits:t,frameNumber:i,sampleNumber:e,samples:n,sampleRateBits:a,blockSizeBits:o,crc:c,length:u,...l}=h;s[ls](r,h,l)}return new ki(h)}constructor(t){super(t),this[R]=null,this[yt]=t[yt],this[mt]=t[mt],this[xt]=t[xt],this[Wt]=t[Wt],this[zt]=null}}class Oi extends Fs{constructor(t,s,i){super(t,s),this.Frame=_i,this.Header=ki,i(this[_])}get[_](){return"flac"}*B(t){const s=yield*this.I[is](2,0),i=s[Y]-2;for(;t{const s=ki[gs](t,this.M);if(s)return new _i(t,s,this.L);this.I[ns]("Failed to parse Ogg FLAC frame","Skipping invalid FLAC frame")})).filter((t=>!!t))),t}}class Di{static*[us](t,s,i){const e={};let h=yield*t[is](28,i);if(79!==h[0]||103!==h[1]||103!==h[2]||83!==h[3])return null;e[Jt]=h[4];if(248&h[5])return null;e[W]=!!(4&h[5]),e[N]=!!(2&h[5]),e[U]=!!(1&h[5]);const r=new qs(Ss.from(h[at](0,28))[P]);try{e[g]=r.getBigInt64(6,!0)}catch{}e[Kt]=r.getInt32(14,!0),e[Nt]=r.getInt32(18,!0),e[Lt]=r.getInt32(22,!0);const n=h[26];e[Y]=n+27,h=yield*t[is](e[Y],i),e[It]=0,e[Ft]=[],e[Ut]=Ss.from(h[at](27,e[Y]));for(let t=0,s=0;t{const s=zi[gs](this.U,t,this.M);if(s)return new Li(t,s);this.I[as]("Failed to parse Ogg Opus Header","Not a valid Ogg Opus file")}))),t}}class Ji extends js{constructor(t,s,i){super(s,t,i)}}const Zi={};for(let t=0;t<8;t++)Zi[t+6]=2**(6+t);class Xi extends Ys{static[gs](t,s,i,e){if(t[Y]<30)throw new Error("Out of data while inside an Ogg Page");const h=$s(t[at](0,30)),r=s[us](h);if(r)return new Xi(r);const n={[Y]:30};if("vorbis"!==h.substr(0,7))return null;n[$]=Ss.from(t[at](0,30));const a=new qs(n[$][P]);if(n[ot]=a.getUint32(7,!0),0!==n[ot])return null;if(n[vt]=t[11],n[Mt]=u[n[vt]-1]||"application defined",n[Gt]=a.getUint32(12,!0),n[M]=a.getInt32(16,!0),n[v]=a.getInt32(20,!0),n[A]=a.getInt32(24,!0),n[wt]=Zi[(240&t[28])>>4],n[pt]=Zi[15&t[28]],n[pt]>n[wt])return null;if(1!==t[29])return null;n[S]=32,n[lt]=e,n[ut]=i;{const{length:t,data:i,version:e,vorbisSetup:r,vorbisComments:a,...o}=n;s[ls](h,n,o)}return new Xi(n)}constructor(t){super(t),this[M]=t[M],this[A]=t[A],this[v]=t[v],this[pt]=t[pt],this[wt]=t[wt],this[$]=t[$],this[ut]=t[ut],this[lt]=t[lt]}}class te extends Fs{constructor(t,s,i){super(t,s),this.Frame=Ji,i(this[_]),this.U=null,this.N=!1,this.W=null}get[_](){return ct}[fs](t){t[T]=[];for(const s of Us.get(t)[nt])if(1===s[0])this.M[ws](),this.U=t[$],this.N=!1;else if(3===s[0])this.G=s;else if(5===s[0])this.H=s,this.V=this.Y(s),this.N=!0;else if(this.N){const i=Xi[gs](this.U,this.M,this.G,this.H);i?t[T].push(new Ji(s,i,this.K(s,i))):this.I[logError]("Failed to parse Ogg Vorbis Header","Not a valid Ogg Vorbis file")}return t}K(t,s){const i=this.V.blockFlags[t[0]>>1&this.V.mask]?s[wt]:s[pt],e=null===this.W?0:(this.W+i)/4;return this.W=i,e}Y(t){const s=new Ds(t),i={count:0,blockFlags:[]};for(;1&~s.read(1););let e;for(;i.count<64&&s.position>0;){Os(s.read(8));let t=0;for(;0===s.read(8)&&t++<3;);if(4!==t){1+((126&Os(e))>>1)!==i.count&&this.I[ns]("vorbis derived mode count did not match actual mode count");break}e=s.read(7),i.blockFlags.unshift(1&e),s.position+=6,i.count++}return i.mask=(1<1&&t[Nt]>1&&this.I[ns]("Unexpected gap in Ogg Page Sequence Number.",`Expected: ${this.rt+1}, Got: ${t[Nt]}`),this.rt=t[Nt]}nt(t){null===this.tt&&(this.rt=t[Nt],this.tt=this.et(t)),this.ht(t);const s=Us.get(t),i=Ls.get(s[L]);let e=0;if(s[nt]=i[Ft].map((s=>t[$][at](e,e+=s))),this.Z[Y]&&(s[nt][0]=xs(this.Z,s[nt][0]),this.Z=new Ss),255===i[Ut][i[Ut][Y]-1]&&(this.Z=xs(this.Z,s[nt].pop())),this.tt){const s=this.it[fs](t);return this.I[rs](s),s}return t}}class ie extends Fs{constructor(t,s,i){super(t,s),this.J=i,this.Frame=Bi,this.Header=Di,this.ot=new Map,this.ct=null}get[_](){const t=this.ot.get(this.ct);return t?t.codec:""}*[ys](){const t=yield*this[cs](!0);this.ct=t[Kt];let s=this.ot.get(this.ct);return s||(s=new se(this.I,this.M,this.J),this.ot.set(this.ct,s)),t[W]&&this.ot.delete(this.ct),s.nt(t)}}const ee=()=>{};const he=class{constructor(t,{onCodec:s,onCodecHeader:i,onCodecUpdate:e,enableLogging:h=!1,enableFrameCRC32:r=!0}={}){this.ut=t,this.J=s||ee,this.h=i||ee,this.S=e,this.lt=h,this.dt=r?Rs:ee,this[ps]()}get[_](){return this.it?this.it[_]:""}[ps](){this.M=new Bs(this.h,this.S),this.yt=this.ft(),this.yt.next()}*flush(){this.R=!0;for(let t=this.yt.next();t.value;t=this.yt.next())yield t.value;this.R=!1,this[ps]()}*parseChunk(t){for(let s=this.yt.next(t);s.value;s=this.yt.next())yield s.value}parseAll(t){return[...this.parseChunk(t),...this.flush()]}*ft(){if(this.ut.match(/aac/))this.it=new Ei(this,this.M,this.J);else if(this.ut.match(/mpeg/))this.it=new wi(this,this.M,this.J);else if(this.ut.match(/flac/))this.it=new Oi(this,this.M,this.J);else{if(!this.ut.match(/ogg/))throw new Error(`Unsupported Codec ${mimeType}`);this.it=new ie(this,this.M,this.J)}for(this.wt=0,this.gt=0,this.bt=0,this.St=0,this.qt=0,this.Mt=void 0,this.At=new Uint8Array(0);;){const t=yield*this.it[ys]();t&&(yield t)}}*[is](t=0,s=0){let i;for(;this.At[Y]<=t+s;){if(i=yield,this.R)return this.At[at](s);i&&(this.bt+=i[Y],this.At=xs(this.At,i))}return this.At[at](s)}[es](t){this.gt+=t,this.At=this.At[at](t)}[hs](t){this.Mt=t[L][Gt],t[L][q]=t[O]>0?8*Math.round(t[$][Y]/t[O]):0,t[xt]=this.wt++,t[Xt]=this.St,t[ss]=this.qt,t[ts]=this.qt/this.Mt*1e3,t[x]=this.dt(t[$]),this.M[ms](t[L][q],t[ts]),this.St+=t[$][Y],this.qt+=t[Qt]}[rs](t){t[T]?(t[T].forEach((s=>{t[O]+=s[O],t[Qt]+=s[Qt],this[hs](s)})),t[ss]=this.qt,t[ts]=this.qt/this.Mt*1e3||0,t[Xt]=this.St):this[hs](t)}vt(t,s){if(this.lt){const i=[`${_}: ${this[_]}`,`inputMimeType: ${this.ut}`,`readPosition: ${this.gt}`,`totalBytesIn: ${this.bt}`,`${Xt}: ${this.St}`],e=Math.max(...i.map((t=>t[Y])));s.push(`--stats--${"-".repeat(e-9)}`,...i,"-".repeat(e)),t("codec-parser",s.reduce(((t,s)=>t+"\n "+s),""))}}[ns](...t){this.vt(console.warn,t)}[as](...t){this.vt(console.error,t)}},re=g,ne=T,ae=$,oe=L,ce=W,ue=ut,le=lt,de=Qt}},h={};function r(t){var s=h[t];if(void 0!==s)return s.exports;var i=h[t]={exports:{}};return e[t](i,i.exports,r),i.exports}r.m=e,t=[],r.O=(s,i,e,h)=>{if(!i){var n=1/0;for(u=0;u=h)&&Object.keys(r.O).every((t=>r.O[t](i[o])))?i.splice(o--,1):(a=!1,h0&&t[u-1][2]>h;u--)t[u]=t[u-1];t[u]=[i,e,h]},r.F={},r.E=t=>{Object.keys(r.F).map((s=>{r.F[s](t)}))},r.d=(t,s)=>{for(var i in s)r.o(s,i)&&!r.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:s[i]})},r.f={},r.e=t=>Promise.all(Object.keys(r.f).reduce(((s,i)=>(r.f[i](t,s),s)),[])),r.u=t=>385===t?"icecast-metadata-player-1.17.3.common.min.js":"icecast-metadata-player-1.17.3."+{88:"mpeg",398:"vorbis",694:"opus",731:"synaudio",762:"mediasource",993:"flac"}[t]+".min.js",r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),r.o=(t,s)=>Object.prototype.hasOwnProperty.call(t,s),s={},i="IcecastMetadataPlayer:",r.l=(t,e,h,n)=>{if(s[t])s[t].push(e);else{var a,o;if(void 0!==h)for(var c=document.getElementsByTagName("script"),u=0;u{a.onerror=a.onload=null,clearTimeout(y);var h=s[t];if(delete s[t],a.parentNode&&a.parentNode.removeChild(a),h&&h.forEach((t=>t(e))),i)return i(e)},y=setTimeout(d.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=d.bind(null,a.onerror),a.onload=d.bind(null,a.onload),o&&document.head.appendChild(a)}},r.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"Pt",{value:!0})},(()=>{var t;r.g.importScripts&&(t=r.g.location+"");var s=r.g.document;if(!t&&s&&(s.currentScript&&(t=s.currentScript.src),!t)){var i=s.getElementsByTagName("script");if(i.length)for(var e=i.length-1;e>-1&&(!t||!/^http(s?):/.test(t));)t=i[e--].src}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),r.p=t})(),(()=>{var t={792:0};r.f.j=(s,i)=>{var e=r.o(t,s)?t[s]:void 0;if(0!==e)if(e)i.push(e[2]);else{var h=new Promise(((i,h)=>e=t[s]=[i,h]));i.push(e[2]=h);var n=r.p+r.u(s),a=new Error;r.l(n,(i=>{if(r.o(t,s)&&(0!==(e=t[s])&&(t[s]=void 0),e)){var h=i&&("load"===i.type?"missing":i.type),n=i&&i.target&&i.target.src;a.message="Loading chunk "+s+" failed.\n("+h+": "+n+")",a.name="ChunkLoadError",a.type=h,a.request=n,e[1](a)}}),"chunk-"+s,s)}},r.F.j=s=>{if(!r.o(t,s)||void 0===t[s]){t[s]=null;var i=document.createElement("link");r.nc&&i.setAttribute("nonce",r.nc),i.rel="prefetch",i.as="script",i.href=r.p+r.u(s),document.head.appendChild(i)}},r.O.j=s=>0===t[s];var s=(s,i)=>{var e,h,[n,a,o]=i,c=0;if(n.some((s=>0!==t[s]))){for(e in a)r.o(a,e)&&(r.m[e]=a[e]);if(o)var u=o(r)}for(s&&s(i);c{r.E(731),r.E(762)}),5);var n={};(()=>{r.d(n,{default:()=>gt});const t=()=>{},s=new WeakMap,i={LOADING:"loading",PLAYING:"playing",STOPPING:"stopping",STOPPED:"stopped",RETRYING:"retrying",SWITCHING:"switching"},e={BUFFER:"buffer",PLAY:"play",PLAY_READY:"playready",LOAD:"load",STREAM_START:"streamstart",STREAM:"stream",STREAM_END:"streamend",METADATA:"metadata",METADATA_ENQUEUE:"metadataenqueue",CODEC_UPDATE:"codecupdate",STOP:"stop",RETRY:"retry",RETRY_TIMEOUT:"retrytimeout",SWITCH:"switch",WARN:"warn",ERROR:"error",PLAYBACK_ERROR:"playbackerror"},h=Symbol(),a=Symbol(),o=Symbol(),c=Symbol(),u=Symbol(),l=Symbol(),d=Symbol(),y=Symbol(),f=Symbol(),m=Symbol(),p=Symbol(),w=Symbol(),g=Symbol(),b=Symbol(),S=Symbol(),q=Symbol(),M=Symbol(),A=Symbol(),v=Symbol(),P=Symbol(),E=Symbol(),_=Symbol(),T=Symbol(),C=Symbol(),I=Symbol(),R=Symbol(),x=Symbol(),$=Symbol("synced"),k=Symbol("syncing"),O=Symbol("pcm_synced"),D=Symbol("not_synced"),B=t=>{const s=new Uint8Array(t.reduce(((t,s)=>t+s.length),0));return t.reduce(((t,i)=>(s.set(i,t),t+i.length)),0),s};class L{constructor(){this.Et=[]}hasEventListener(t,s){return this.Et.some((i=>i.type===t&&i.listener===s))}addEventListener(t,s,i={}){return this.hasEventListener(t,s)||this.Et.push({type:t,listener:s,options:i}),this}removeEventListener(t,s){const i=this.Et.findIndex((i=>i.type===t&&i.listener===s));return i>=0&&this.Et.splice(i,1),this}removeEventListeners(){return this.Et=[],this}dispatchEvent(t){return this.Et.filter((s=>s.type===t.type)).forEach((s=>{const{type:i,listener:e,options:{once:h}}=s;e.call(this,t),!0===h&&this.removeEventListener(i,e)})),this}}class U{constructor(){this._t=0,this.Tt=0,this.Ct=0,this.It=0,this.Rt=0,this.xt=0,this.$t=0}get stats(){return{totalBytesRead:this._t,streamBytesRead:this.Tt,metadataLengthBytesRead:this.Ct,metadataBytesRead:this.It,currentBytesRemaining:this.Rt,currentStreamBytesRemaining:this.xt,currentMetadataBytesRemaining:this.$t}}set currentStreamBytesRemaining(t){this.xt+=t}set currentMetadataBytesRemaining(t){this.$t=t}addBytes(t){this._t+=t,this.Rt-=t}addStreamBytes(t){this.Tt+=t,this.xt-=t}addMetadataLengthBytes(t){this.Ct+=t}addMetadataBytes(t){this.It+=t,this.$t-=t}addCurrentBytesRemaining(t){this.Rt+=t}}const F=()=>{};class N{constructor(t){this.kt=0,this.Ot=0,this.Dt=new Uint8Array(0),this.Bt=[],this.Lt=0,this.Ut=new U,this.Ft=t.onStream||F,this.Nt=t.onMetadata||F,this.jt=t.onMetadataFailed||F,this.Wt=t.onError||F,this.lt=t.enableLogging||!1,this.Gt=Promise.resolve(),this.Ht=Promise.resolve(),this.yt=this.Qt(),this.yt.next()}*Qt(){for(this.kt=1/0;;)this.Vt(yield*this.Yt()),yield*this.zt()}static Kt(...t){const s=t.reduce(((t,s)=>t+s.length),0);return this.Jt(t,s)}static Jt(t,s){const i=new Uint8Array(s);return t.reduce(((t,s)=>(i.set(s,t),t+s.length)),0),i}*iterator(t){for(let s=this.yt.next(t);s.value;s=this.yt.next())yield s.value}readAll(t){for(let s=this.yt.next(t);s.value;s=this.yt.next());}async*asyncIterator(t){for(let s=this.yt.next(t);s.value;s=this.yt.next())await this.Gt,await this.Ht,yield s.value}async asyncReadAll(t){for(let s=this.yt.next(t);s.value;s=this.yt.next())await this.Gt,await this.Ht}Zt(...t){this.lt&&console.warn("icecast-metadata-js",t.reduce(((t,s)=>t+"\n "+s),"")),this.Wt(...t)}Vt(t){this.Bt.push(t),this.Lt+=t.length}*zt(){if(this.Bt.length){const t=N.Jt(this.Bt,this.Lt);this.Bt=[],this.Lt=0,this.Ut.addStreamBytes(t.length);const s={stream:t,stats:this.Ut.stats};this.Gt=this.Ft(s),yield s}}*Xt(t){yield*this.zt();const s={metadata:t,stats:this.Ut.stats};this.Ht=this.Nt(s),yield s}*Yt(t=0){for(this.Ot===this.Dt.length&&(this.Dt=yield*this.ts(),this.Ot=0);this.Dt.length-this.Ot[^\0]+?)='(?[^\0]*?)(;$|';|'$|$)/,i={};for(const e of t.match(new RegExp(s,"g"))||[]){const t=e.match(s);t&&(i[t.groups.key]=t.groups.val)}return i}get icyMetaInt(){return this.es}*ns(){if(this.es>0)return!0;if(!this.hs)return!1;this.Zt("Passed in Icy-MetaInt is invalid. Attempting to detect ICY Metadata.","See https://github.com/eshaz/icecast-metadata-js for information on how to properly request ICY Metadata.");const t=[null,83,116,114,101,97,109,84,105,116,108,101,61],s=Date.now();let i=0;for(;s+this.hs>Date.now();){this.Dt=N.Kt(this.Dt,yield*this.ts());t:for(;i65307)return this.Zt("This stream is not an Ogg stream. No Ogg metadata will be returned.","See https://github.com/eshaz/icecast-metadata-js for information on Ogg metadata."),this.jt("ogg"),!1;const s=yield*this.Yt(27),i=yield*this.Yt(s[26]);return this.kt=i.reduce(((t,s)=>t+s),0),!0}*fs(){const t=yield*this.Yt(8);return yield*this.os(),this.ws(/\x7fFLAC/,t.subarray(0,5))?{regex:/^[\x84|\x04]/,length:4}:this.ws(/OpusHead/,t.subarray(0,8))?{regex:/OpusTags/,length:8}:this.ws(/\x01vorbis/,t.subarray(0,7))?{regex:/\x03vorbis/,length:7}:void 0}*us({regex:t,length:s}){this.ws(t,yield*this.Yt(s))&&(yield*this.Xt(yield*this.gs()))}*os(){for(;this.kt;)yield*this.Yt()}*Yt(t){const s=yield*super.Yt(t);return this.Vt(s),s}*ts(){const t=yield*super.ts();return this.Ut.currentStreamBytesRemaining=t.length,t}*gs(){const t=this.ps(yield*this.Yt(4));this.Ut.addMetadataBytes(4);const s=this.ss.decode(yield*this.Yt(t));this.Ut.addMetadataBytes(t);const i=this.ps(yield*this.Yt(4));this.Ut.addMetadataBytes(4);const e=[];for(let t=0;t{const i=s.indexOf(61),e=String.fromCharCode(...s.subarray(0,i)).toUpperCase(),h=this.ss.decode(s.subarray(i+1));return t[e]=t[e]?`${t[e]}; ${h}`:h,t}),{VENDOR_STRING:s})}}class G{constructor(t){const{onStream:s,...i}=t;this.bs=new W(t),this.Ss=new j(i)}get icyMetaInt(){return this.Ss.icyMetaInt}*iterator(t){for(const s of this.Ss.iterator(t))s.stream?yield*this.bs.iterator(s.stream):yield s}readAll(t){for(const s of this.Ss.iterator(t))s.stream&&this.bs.readAll(s.stream)}async*asyncIterator(t){for await(const s of this.Ss.asyncIterator(t))if(s.stream)for await(const t of this.bs.asyncIterator(s.stream))yield t;else yield s}async asyncReadAll(t){for await(const s of this.Ss.iterator(t))s.stream&&await this.bs.asyncReadAll(s.stream)}}class H{constructor({metadataTypes:t=["icy"],...s}={}){const i=t.includes("icy"),e=t.includes("ogg");this.qs=i&&e?new G(s):e?new W(s):i?new j(s):new N(s)}static parseIcyMetadata(t){return j.parseIcyMetadata(t)}get icyMetaInt(){return this.qs.icyMetaInt}*iterator(t){yield*this.qs.iterator(t)}readAll(t){this.qs.readAll(t)}async*asyncIterator(t){return yield*this.qs.asyncIterator(t)}async asyncReadAll(t){return this.qs.asyncReadAll(t)}}const Q=()=>{};class V{constructor(t,{onStream:s=Q,...i}){let e;this.Ms=new ReadableStream({async start(h){e=new H({icyMetaInt:parseInt(t.headers.get("Icy-MetaInt")),...i,onStream:async t=>(h.enqueue(t.stream),s(t))});for await(const s of V.asyncIterator(t.body))await e.asyncReadAll(s);h.close()}}),this.As=e}get icyMetaInt(){return this.As.icyMetaInt}get readableStream(){return this.Ms}async startReading(){try{for await(const t of V.asyncIterator(this.Ms));}catch(t){if("AbortError"!==t.name)throw t}}static asyncIterator(t){const s=t.getReader();return{[Symbol.asyncIterator]:()=>({next:()=>s.read()})}}}const Y=()=>{};class z{constructor({icyBr:t,onMetadataUpdate:s=Y,onMetadataEnqueue:i=Y,paused:e=!1}){this.vs=t,this.Ps=s,this.Es=i,this._s=e,this.Ts=e,this.Cs=!0,this.Is=[],this.Rs=[]}get metadataQueue(){return this.Rs.map((({xs:t,...s})=>s))}addMetadata({metadata:t,stats:s},i,e=0){const h={metadata:t,timestampOffset:i,timestamp:e+=s?this.getTimeByBytes(s.currentStreamPosition):0};this.Ts?this.Is.push(h):this.$s(h)}getTimeByBytes(t){return this.vs?t/(125*this.vs):0}startQueue(t){this.Ts&&(this.Is.forEach((s=>{void 0!==t&&(s.timestamp=t),(void 0===t||s.timestampOffset>=s.timestamp)&&this.$s(s)})),this.Is=[],this.Ts=!1)}purgeMetadataQueue(){this.Rs.forEach((t=>clearTimeout(t.xs))),this.Rs=[],this.Is=[],this.Ts=this._s,this.Cs=!0}$s(t){this.Rs.push(t),this.Es(t.metadata,t.timestampOffset,t.timestamp),this.Cs?(this.ks(),this.Cs=!1):t.xs=setTimeout((()=>{this.ks()}),1e3*(t.timestampOffset-t.timestamp))}ks(){if(this.Rs.length){const{metadata:t,timestampOffset:s,timestamp:i}=this.Rs.shift();this.Ps(t,s,i)}}}var K=r(317);let J;const Z=new Worker(URL.createObjectURL(new Blob(["self.onmessage = () => self.postMessage(!!self.Worker)"],{type:"text/javascript"})));Z.onmessage=t=>{J=t.data,Z.terminate()},Z.postMessage(null);class X{constructor(t,s){this.CRC_DURATION=3e5,this.PCM_DURATION=6e4,this.As=t,this.Os=s,this.initSync(),this.initQueue()}initSync(){clearTimeout(this.Ds),this.Ds=null,this.Bs=null,this.Ls=!0,this.Us=[],this.Fs=0,this.Ns=null,this.js=null,this.Ws=null}initQueue(){this.Gs=0,this.Hs=0,this.Qs=0,this.Vs=[],this.Ys=0,this.zs={},this.Ks=[],this.Js=0}get buffered(){return this.Hs/this.Qs-this.Os.currentTime||0}add(t){const{crc32:s,duration:i,samples:e}=t;this.Hs+=e,this.Qs=t.header.sampleRate,this.Vs.push({crc32:s,duration:i}),this.Ys+=i;let h=this.zs[s];if(h||(h=[],this.zs[s]=h),h.push(this.Gs++),this.Ys>=this.CRC_DURATION){const{crc32:t,duration:s}=this.Vs.shift();this.Ys-=s;const i=this.zs[t];i.shift(),i.length||delete this.zs[t]}this.Ks.push(t),this.Js+=i,this.Js>=this.PCM_DURATION&&(this.Js-=this.Ks.shift().duration)}addAll(t){t.forEach((t=>this.add(t)))}Zs(t){for(const s of t)this.Fs+=s.duration,this.Us.push(s)}async sync(s){if(null===this.Ds){const s=this.buffered;this.Xs=t,this.Ds=setTimeout((()=>{this.Bs=`Buffer underrun after syncing for ${s.toFixed(2)} seconds.`,this.Xs(this.Bs)}),1e3*s)}return this.Zs(s),new Promise((async(t,s)=>{let i;null!==this.Bs?s(this.Bs):this.Xs=s,this.Ls&&(i=this.ti()),i||(this.Ls=!1,i=await this.si()),i?t(i):s("Old and new request do not match.")})).catch((t=>{this.As.state!==i.STOPPING&&this.As.state!==i.STOPPED&&this.As[P](e.WARN,`Reconnected successfully after ${this.As.state}.`,"Unable to sync old and new request.",t);const s=this.Us;return this.initSync(),this.initQueue(),[s,D]})).then((t=>([$,O].includes(t[1])&&this.initSync(),t)))}ti(){if(!this.Us.length)return[[],k];const t=this.Us[0].crc32,s=this.zs[t];let i,h,r;if(s){t:for(const t of s){r=t-(this.Gs-this.Vs.length);for(let t=0;tt+s),0)/1e3).toFixed(3)} seconds) of overlapping audio data in new request.`,"Synchronized old and new request."),[this.Us.slice(t),$]}}}async si(){try{const t=1,s=16,i=(t,s)=>t/s;if(!this.Ns){let h;try{h=(await r.e(731).then(r.bind(r,875))).default}catch(t){return void this.As[P](e.WARN,"Failed to synchronize old and new stream","Missing `synaudio` dependency.")}const[n,a,o]=await this.ii(),c=o*t;if(a.samplesDecoded<=c)return[[],k];const u=new h({correlationSampleSize:c,initialGranularity:s});this.Ns=await(J?u.syncWorkerConcurrent(n,a,Math.max(navigator.hardwareConcurrency-1,1)):u.syncWorker(n,a)),this.Ns.offsetFromEnd=i(n.samplesDecoded-this.Ns.sampleOffset,o)}const{correlation:h,offsetFromEnd:n}=this.Ns;let a=1e3*(this.buffered-n);if(-a>this.Fs)return[[],k];const o=0;if(a<0){let t=0;for(let s=0;ta;t++)s-=this.Us[t].duration;this.Us=this.Us.slice(t-o)}else for(let t=0;t{let i=t.length-1;for(let e=0;e0;i--)e+=t[i].duration;return this.As[u].decodeAudioData(B(t.slice(i).map((({data:t})=>t))).buffer)};[this.js,this.Ws]=await Promise.all([this.js?this.js:t(this.Ks,2e3*this.buffered),t(this.Us,1/0)]);const s=t=>{const s={channelData:[],samplesDecoded:t.length};for(let i=0;i{this.syncState=D}}static parseMimeType(t){return t.match(/^(?:application\/|audio\/|)(?[a-zA-Z]+)(?:$|;[ ]*codecs=(?:\'|\")(?[a-zA-Z,]+)(?:\'|\"))/)}static canPlayType(t,s,i){const e=tt.parseMimeType(s),h=s=>s.reduce(((s,i)=>{if(""===s)return"";const e=t(i);return e?"maybe"===e||"maybe"===s?"maybe":!0===e||"probably"===e?"probably":void 0:""}),null);if(e){const{mime:t,codecs:r}=e.groups,n=i&&i[t];if(!n||Array.isArray(n))return h(n||[s])||h([`audio/${t}`]);if("object"==typeof n){if(r){const t=r.split(",");return t.length>1?"":n[t[0]]?h(n[t[0]]):""}return"maybe"}}return""}enablePlayButton(t){this.ri.removeAttribute("src"),this.ri.srcObject=null,t.includes("mediasource")?this.ri.src=URL.createObjectURL(new MediaSource):t.includes("webaudio")?(this.ui=new MediaStream,this.ri.srcObject=this.ui):t.includes("html5")&&(this.ri.src="data:audio/mpeg;base64,//sQxAAABFgC/SCEYACCgB9AAAAAppppVCAHBAEIgBByw9WD5+J8ufwxiDEDsMfE+D4fwG/RUGCx6VO4awVxV3qDtQNPiXKnZUNSwKuUDR6IgaeoGg7Fg6pMQU1FMy4xMDCqqqqqqqr/+xLEB4PAAAGkAAAAIAAANIAAAASqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo=",this.ri.loop=!0)}get syncStateUpdate(){return this.li}get syncState(){return this.di}set syncState(t){this.di=t,this.yi&&this.yi(t),this.li=new Promise((t=>{this.yi=t}))}get isSupported(){return!1}get isAudioPlayer(){return!1}get metadataTimestamp(){return 0}get currentTime(){return 0}get waiting(){return Promise.resolve()}get icecastMetadataQueue(){return this.fi}set icecastMetadataQueue(t){this.fi=t}get codecUpdateQueue(){return this.mi}set codecUpdateQueue(t){this.mi=t}get metadataQueue(){return this.fi?this.fi.metadataQueue:[]}pi(){this.fi.startQueue(this.wi),this.mi.startQueue(this.wi)}async gi(){this.syncState=$,this.syncFrames=[],this.syncDelay=null,this.bi=new X(this.As,this)}async start(t){let s;this.wi=t,[e.RETRY,e.SWITCH].forEach((t=>this.As.addEventListener(t,this.ci)));const h=new Promise((t=>{s=t,[i.PLAYING,i.STOPPING].forEach((t=>this.As.addEventListener(t,s,{once:!0})))})).finally((()=>{[i.PLAYING,i.STOPPING].forEach((t=>this.As.removeEventListener(t,s)))}));await h}async end(){[e.RETRY,e.SWITCH].forEach((t=>this.As.removeEventListener(t,this.ci))),this.fi.purgeMetadataQueue(),this.mi.purgeMetadataQueue()}onStream(t){return t}onMetadata(t){this.fi.addMetadata(t,this.metadataTimestamp,this.currentTime)}onCodecUpdate(t,s){const i=this.currentTime;s{this.Si||this.end()})),this.gi()}static canPlayType(t){return st.isSupported?super.canPlayType((t=>(new Audio).canPlayType(t)),t):""}static get isSupported(){return Boolean(window.Audio)}static get name(){return"html5"}get isAudioPlayer(){return!0}get metadataTimestamp(){return this.qi?(this.qi.totalDuration+this.Mi)/1e3:0}get currentTime(){return this.Ai&&(performance.now()-this.Ai)/1e3}get waiting(){return new Promise((t=>{this.ri.addEventListener("waiting",t,{once:!0})}))}async gi(){super.gi(),this.qi=null,this.Ai=0,this.Mi=0,this.Si=!1}async start(t){const s=super.start(t);this.Pi=performance.now(),this.ri.src=null,this.ri.srcObject=null,this.ri.src=this.ei,this.As.state!==i.STOPPING&&this.As.state!==i.STOPPED&&(this.ri.addEventListener("playing",(()=>{this.Ai=performance.now(),this.Mi=performance.now()-this.Pi,this.pi(),this.As[P](e.PLAY)}),{once:!0}),this.As[P](e.PLAY_READY),this.Si=!0),await s}async end(){super.end(),this.ri.src=null,this.ri.srcObject=null,this.gi()}onStream(t){this.qi=t[t.length-1]||this.qi,this.syncState===D&&(this.syncState=D)}}class it extends tt{constructor(t,s,i,e,h){super(t,s,i,e,h),this.Ei=r.e(762).then(r.bind(r,448)),this.gi()}static canPlayType(t){return it.isSupported?MediaSource.isTypeSupported(t)?"probably":super.canPlayType(MediaSource.isTypeSupported,t,{mpeg:['audio/mp4;codecs="mp3"'],aac:['audio/mp4;codecs="mp4a.40.2"'],aacp:['audio/mp4;codecs="mp4a.40.2"'],flac:['audio/mp4;codecs="flac"'],ogg:{flac:['audio/mp4;codecs="flac"'],opus:['audio/mp4;codecs="opus"','audio/webm;codecs="opus"'],vorbis:['audio/webm;codecs="vorbis"']}}):""}static get isSupported(){return Boolean(window.MediaSource)}static get name(){return"mediasource"}get isAudioPlayer(){return!0}get metadataTimestamp(){return this._i&&this._i.sourceBuffers.length&&Math.max(this._i.sourceBuffers[0].timestampOffset,this._i.sourceBuffers[0].buffered.length?this._i.sourceBuffers[0].buffered.end(0):0)||0}get currentTime(){return this.ri.currentTime}get waiting(){return new Promise((t=>{this.ri.addEventListener("waiting",t,{once:!0})}))}async gi(){super.gi(),this.Ti=[],this.Si=!1,this.Ci=!1,this.Ii=new Promise((t=>{this.Ri=t})),this.xi=new Promise((t=>{this.$i=t})),this.ki=this.Oi(this.ut,this.X),await this.xi}async start(t){const s=super.start(t);await this.Ii,await this.Di(),await s}async end(){super.end(),await this.gi()}async onStream(t){if((t=t.flatMap((t=>t.codecFrames?t.codecFrames.map((s=>(s.isLastPage=t.isLastPage,s))):t))).length){switch(this.syncState){case D:this.bi.initSync(),this.syncState=k;case k:[this.syncFrames,this.syncState,this.syncDelay]=await this.bi.sync(t),t=this.syncFrames}switch(this.syncState){case O:break;case $:await this.xi,await this.ki(t),this.bi.addAll(t)}}}Oi(t,s){return MediaSource.isTypeSupported(t)?(this.Bi(t),async t=>this.Li(B(t.map((t=>t.data))))):(this.hi.then((i=>this.Ui(t,s,i.channels))).then((()=>{this.Bi(this.Fi.mimeType)})),t.match(/ogg/)?async i=>{let e=[];for await(const h of i){if(this.Ci!==h.isLastPage)if(h.isLastPage)this.Ci=!0;else{await this.Li(B(e)),e=[];const i=await this.hi;await this.Ui(t,s,i.channels),this.Ci=!1}e.push(...this.Fi.iterator([h]))}await this.Li(B(e))}:async t=>this.Li(B([...this.Fi.iterator(t)])))}async Ui(t,s,i){this.Fi=new(await this.Ei).default(t,{codec:s,preferredContainer:i>2?"webm":"fmp4"}),MediaSource.isTypeSupported(this.Fi.mimeType)||this.As[P](e.PLAYBACK_ERROR,`Media Source Extensions API in your browser does not support ${t} or ${this.Fi.mimeType}.See: https://caniuse.com/mediasource and https://developer.mozilla.org/en-US/docs/Web/API/Media_Source_Extensions_API`)}Bi(t){this._i=new MediaSource,this.Ri(),this._i.addEventListener("sourceopen",(()=>{this.As.state!==i.STOPPED&&this.As.state!==i.STOPPING&&(this._i.addSourceBuffer(t).mode="sequence"),this.Ni=0,this.$i()}),{once:!0})}async Di(){this.ri.loop=!1,this.ri.src=URL.createObjectURL(this._i),await this.xi}async ji(){return new Promise((t=>{const s=this._i.sourceBuffers[0];s.updating?s.addEventListener("updateend",t,{once:!0}):t()}))}async Li(t){if(this.As[P](e.STREAM,t),this._i.sourceBuffers.length||this.As[P](e.WARN,"Attempting to append audio, but MediaSource has not been or is no longer initialized","Please be sure that `detachAudioElement()` was called and awaited before reusing the element with a new IcecastMetadataPlayer instance"),this.As.state!==i.STOPPING&&this._i.sourceBuffers.length){this.Ti.push(t);try{for(;this.Ti.length;)this._i.sourceBuffers[0].appendBuffer(this.Ti.shift()),await this.ji()}catch(t){if("QuotaExceededError"!==t.name)throw t}this.Si||(this.ni<=this.metadataTimestamp?(this.ri.addEventListener("playing",(()=>{this.pi(),this.As[P](e.PLAY)}),{once:!0}),this.As[P](e.PLAY_READY),this.Si=!0):this.As[P](e.BUFFER,this.metadataTimestamp)),this.ri.currentTime>5+this.ni&&this.Ni+5e3'audio/ogg;codecs="opus"'===t||'audio/ogg;codecs="flac"'===t||'audio/ogg;codecs="vorbis"'===t||"audio/mpeg"===t||"audio/flac"===t),t,{flac:["audio/flac"],mpeg:["audio/mpeg"],ogg:{flac:['audio/ogg;codecs="flac"'],opus:['audio/ogg;codecs="opus"'],vorbis:['audio/ogg;codecs="vorbis"']}}):""}static get isSupported(){return Boolean(window.WebAssembly&&(window.AudioContext||window.webkitAudioContext)&&window.MediaStream)}static get name(){return"webaudio"}get isAudioPlayer(){return!0}get metadataTimestamp(){return this.Gi/1e3}get currentTime(){return(performance.now()-this.Hi)/1e3||0}get waiting(){return this.Qi}Vi(t){let s;this.Yi+=t,s=setTimeout((()=>{this.Yi-=t,this.zi.delete(s),this.zi.size||this.Ki()}),this.Yi),this.zi.add(s)}Ki(){this.Ji&&this.Ji(),this.Qi=new Promise((t=>{this.Ji=t}))}Zi(){this.zi&&this.zi.forEach((t=>clearTimeout(t))),this.zi=new Set,this.Yi=0,this.Ki()}async Xi(){let t;this.te=new Promise((t=>{this.se=t}));try{switch(this.X){case"mpeg":const{MPEGDecoderWebWorker:s}=await Promise.all([r.e(385),r.e(88)]).then(r.bind(r,121));t=s;break;case"opus":const{OpusDecoderWebWorker:i}=await Promise.all([r.e(385),r.e(694)]).then(r.bind(r,978));t=i;break;case"flac":const{FLACDecoderWebWorker:e}=await Promise.all([r.e(385),r.e(993)]).then(r.bind(r,655));t=e;break;case"vorbis":const{OggVorbisDecoderWebWorker:h}=await Promise.all([r.e(385),r.e(398)]).then(r.bind(r,994));t=h}}catch(t){return void this.As[P](e.PLAYBACK_ERROR,`Missing \`webaudio-${this.X}\` dependency.`,`Unable to playback playback \`${this.X}\` audio.`)}if(t){const s=await this.hi;this.se(),this.ie=new t(s)}else this.As[P](e.PLAYBACK_ERROR,"Unsupported `webaudio` playback codec: "+this.X)}async gi(){super.gi(),this.Gi=0,this.ee=0,this.he=0,this.Mt=0,this.Hi=void 0,this.Si=!1,this.Zi(),this.re=new Promise((t=>{this.ne=t}))}async start(t){this.ie||await this.Xi();const s=super.start(t);this.ne(),await s}async end(){super.end(),this.ie&&(this.ie.terminate(),this.ie=null),this.ui&&this.ui.stream.getTracks().forEach((t=>this.ui.stream.removeTrack(t))),this.gi()}async onStream(t){if("vorbis"!==this.X)switch(t=t.flatMap((t=>t.codecFrames||t)),this.syncState){case D:this.bi.initSync(),this.syncState=k;case k:[this.syncFrames,this.syncState,this.syncDelay]=await this.bi.sync(t),t=this.syncFrames}switch(this.syncState){case O:break;case $:t.length&&(this.Gi=t[t.length-1].totalDuration,this.ae(t))}}async ae(t){if(await this.te,this.ie){let s;await this.ie.ready,"vorbis"===this.X?s=this.ie.decodeOggPages(t):(s=this.ie.decodeFrames(t.map((t=>t.data))),this.bi.addAll(t)),s.then((t=>this.oe(t)))}}async oe({channelData:t,samplesDecoded:s,sampleRate:h}){if(await this.re,this.As.state!==i.STOPPING&&this.As.state!==i.STOPPED&&s){this.As[P](e.STREAM,{channelData:t,samplesDecoded:s,sampleRate:h}),this.Mt||(this.Mt=h,this.ui=this.Wi.createMediaStreamDestination(),this.ui.channelCount=this.Wi.destination.maxChannelCount,this.ri.srcObject=this.ui.stream);const i=this.Wi.createBuffer(t.length,s,this.Mt);t.forEach(((t,s)=>i.getChannelData(s).set(t)));const r=this.Wi.createBufferSource();r.buffer=i,r.connect(this.ui);const n=100,a=this.ee*n+this.he,o=Math.round(this.Wi.currentTime*this.Mt*n);at.isSupported?t.name:""))}static canPlayType(t){return{mediasource:it.canPlayType(t),html5:st.canPlayType(t),webaudio:et.canPlayType(t)}}get endpoint(){return this.ei}get player(){return this.Os}get playbackMethod(){return this.ue}get icyMetaInt(){return this.me&&this.me.icyMetaInt}async playStream(){return this.fetchStream().then((async t=>(this.As[P](e.STREAM_START),this.readIcecastResponse(t).finally((()=>{this.As[P](e.STREAM_END)}))))).catch((t=>{if(this.As.state!==i.SWITCHING)throw t}))}async switchStream(){this.As.state!==i.PLAYING&&(this.fe(),await this.ye);const t=s.get(this.As);t[x]=i.SWITCHING,t[R].abort(),t[R]=new AbortController}async fetchStream(){const t=s.get(this.As);this.ei=t[C].next().value;const i=t[I]?{"Icy-MetaData":1}:{};if(i.Range="bytes=0-",t[M]){const s=t[M];i.Authorization="Basic "+btoa(s.user+":"+s.password)}const e=await fetch(this.ei,{method:"GET",headers:i,signal:t[R].signal});if(!e.ok){const t=new Error(`${e.status} received from ${e.url}`);throw t.name="HTTP Response Error",t}return e}async readIcecastResponse(t){const i=t.headers.get("content-type"),h=s.get(this.As);let r;const n=new Promise((t=>{r=t})),a=new Promise((t=>{this.I=new K.Ay(i,{onCodec:t,onCodecHeader:r,onCodecUpdate:this.ce&&((...t)=>this.Os.onCodecUpdate(...t)),enableLogging:this.lt})}));this.me=new V(t,{onMetadata:async t=>{this.Os.onMetadata(t)},onStream:async({stream:t})=>{this.As[P](e.STREAM,t);const s=[...this.I.parseChunk(t)];if(this.Os.isAudioPlayer){const t=[...this.de,...s];this.de=[],await this.Os.onStream(t)}else this.de.push(...s)},onError:(...t)=>this.As[P](e.WARN,...t),metadataTypes:h[o],icyCharacterEncoding:h[f],icyDetectionTimeout:h[m],...h[y]?{icyMetaInt:h[y]}:{}});const c=this.me.startReading(),u=await a;this.Os.isAudioPlayer||([this.Os,this.ue]=this.pe(i,u,n)),this.Os.syncState===$?this.Os.start():await this.ge(i,u,n),await c}async ge(t,s,e){let h,r,n=!1,a=!1;const o=this.Os,c=this.Os.icecastMetadataQueue,u=this.Os.codecUpdateQueue;this.le(),o.icecastMetadataQueue=this.fi,o.codecUpdateQueue=this.mi;const l=()=>{a=!0,this.As.state===i.STOPPING&&this.As.state===i.STOPPED||(o.icecastMetadataQueue.purgeMetadataQueue(),o.codecUpdateQueue.purgeMetadataQueue(),this.Os.start(Math.max(0,o.syncDelay/1e3)).then((()=>o.end())).then(r))};this.fe=()=>{n=!0,this.fi.purgeMetadataQueue(),this.mi.purgeMetadataQueue(),this.Os.icecastMetadataQueue=c,this.Os.codecUpdateQueue=u,void 0===h||a||(clearTimeout(h),l())};const d=()=>this.Os.syncStateUpdate.then((a=>{if(n)r();else switch(a){case k:return d();case $:this.fi.purgeMetadataQueue(),this.mi.purgeMetadataQueue(),this.Os.icecastMetadataQueue=c,this.Os.codecUpdateQueue=u,this.As.state===i.STOPPING&&this.As.state===i.STOPPED||(this.As[x]=i.PLAYING),r();break;case O:case D:o.icecastMetadataQueue=c,o.codecUpdateQueue=u,[this.Os,this.ue]=this.pe(t,s,e),this.de.push(...o.syncFrames),h=setTimeout(l,Math.max(o.syncDelay,0))}}));let y;this.ye=new Promise((t=>{r=t,y=()=>{this.fe(),r()},this.As.addEventListener(i.STOPPING,y,{once:!0}),d()})).finally((()=>{this.As.removeEventListener(i.STOPPING,y)}))}le(){this.fi=new z({onMetadataUpdate:(...t)=>this.As[P](e.METADATA,...t),onMetadataEnqueue:(...t)=>this.As[P](e.METADATA_ENQUEUE,...t),paused:!0}),this.mi=new z({onMetadataUpdate:(...t)=>this.As[P](e.CODEC_UPDATE,...t),paused:!0})}pe(t,i,e){const{[s.get(this.As)[c]]:h,...r}={mediasource:it,webaudio:et,html5:st};let n,a;for(const s of Object.values({firstMethod:h,...r})){const h=s.canPlayType(`${t};codecs="${i}"`);if("probably"===h||"maybe"===h){a=s.name,n=new s(this.As,this.ei,t,i,e),n.icecastMetadataQueue=this.fi,n.codecUpdateQueue=this.mi;break}}if(!n)throw new Error(`Your browser does not support this audio codec ${t}${i&&`;codecs="${i}"`}`);return[n,a]}}let rt;try{new window.EventTarget,rt=window.EventTarget}catch{rt=L}const nt=Symbol(),at=Symbol(),ot=Symbol(),ct=Symbol(),ut=Symbol(),lt=Symbol(),dt=Symbol(),yt=Symbol(),ft=Symbol(),mt=Symbol(),pt=Symbol(),wt=Symbol();class gt extends rt{static*[A](t){for(;;){const i=s.get(t)[h];for(const e of i)if(yield e,s.get(t)[h]!==i)break}}static[v](t,s,i={}){const e={[h]:(t&&(Array.isArray(t)?t:[t]))??i[h],[d]:s.bufferLength??i[d]??1,[y]:s.icyMetaInt??i[y],[f]:s.icyCharacterEncoding??i[f],[m]:s.icyDetectionTimeout??i[m],[o]:(s.metadataTypes??i[o])||["icy"],[I]:((s.metadataTypes??i[o])||["icy"]).includes("icy"),[p]:s.enableLogging??i[p]??!1,[q]:Boolean(s.enableCodecUpdate??i[q]??s.onCodecUpdate),[a]:s.endpointOrder??i[a]??"ordered",[w]:s.retryDelayRate??i[w]??.1,[g]:s.retryDelayMin??i[g]??.5,[b]:s.retryDelayMax??i[b]??2,[S]:s.retryTimeout??i[S]??30,[c]:(s.playbackMethod??i[c])||"mediasource",[M]:s.authentication??i[M]};return e[h]!==i[h]&&"random"===e[a]&&(e[h]=e[h].sort((()=>.5-Math.random()))),e}constructor(h,r={}){super(),s.set(this,{[C]:gt[A](this),[l]:r.audioElement||new Audio,...gt[v](h,r),[ot]:{[e.PLAY]:r.onPlay||t,[e.PLAY_READY]:t,[e.LOAD]:r.onLoad||t,[e.STREAM_START]:r.onStreamStart||t,[e.BUFFER]:r.onBuffer||t,[e.STREAM]:r.onStream||t,[e.STREAM_END]:r.onStreamEnd||t,[e.METADATA]:r.onMetadata||t,[e.METADATA_ENQUEUE]:r.onMetadataEnqueue||t,[e.CODEC_UPDATE]:r.onCodecUpdate||t,[e.STOP]:r.onStop||t,[e.RETRY]:r.onRetry||t,[e.RETRY_TIMEOUT]:r.onRetryTimeout||t,[e.SWITCH]:r.onSwitch||t,[e.WARN]:(...t)=>{this[T](console.warn,r.onWarn,t)},[e.ERROR]:(...t)=>{this[T](console.error,r.onError,t)},[e.PLAYBACK_ERROR]:(...t)=>{this.state!==i.RETRYING?(this[P](e.ERROR,...t),this.stop()):s.get(this)[mt]()}},[mt]:()=>{clearTimeout(s.get(this)[wt]),this.removeEventListener(e.STREAM_START,s.get(this)[mt]),s.get(this)[l].removeEventListener("waiting",s.get(this)[yt]);try{s.get(this)[l].pause()}catch(t){s.get(this)[dt](t)}try{s.get(this)[at]=s.get(this)[nt].player.end()}catch{}},[ut]:()=>{this.play()},[ct]:()=>{this.stop()},[dt]:t=>{const s=t?.target?.error||t;this[P](e.PLAYBACK_ERROR,"The audio element encountered an error."+({1:" MEDIA_ERR_ABORTED The fetching of the associated resource was aborted by the user's request.",2:" MEDIA_ERR_NETWORK Some kind of network error occurred which prevented the media from being successfully fetched, despite having previously been available.",3:" MEDIA_ERR_DECODE Despite having previously been determined to be usable, an error occurred while trying to decode the media resource, resulting in an error.",4:" MEDIA_ERR_SRC_NOT_SUPPORTED The associated resource or media provider object (such as a MediaStream) has been found to be unsuitable.",5:" MEDIA_ERR_ENCRYPTED"}[s?.code]||""))},[lt]:()=>{const t=s.get(this)[l];(this.state===i.LOADING||!t.loop&&this.state!==i.STOPPING&&this.state!==i.STOPPED)&&t.play().then((()=>{this[x]=i.PLAYING})).catch((t=>{this[P](e.PLAYBACK_ERROR,t,"Playback failed.")}))},[ft]:t}),this[E](),this[x]=i.STOPPED,s.get(this)[nt]=new ht(this)}static canPlayType(t){return ht.canPlayType(t)}get audioElement(){return s.get(this)[l]}get[u](){return gt.constructor[u]}get endpoint(){return s.get(this)[nt].endpoint}get icyMetaInt(){return s.get(this)[nt].icyMetaInt}get metadataQueue(){return s.get(this)[nt].player.metadataQueue}get state(){return s.get(this)[x]}get playbackMethod(){return s.get(this)[nt].playbackMethod}set[x](t){this.dispatchEvent(new CustomEvent(t)),s.get(this)[x]=t}[E](){const t=s.get(this)[l];t.addEventListener("pause",s.get(this)[ct]),t.addEventListener("play",s.get(this)[ut]),t.addEventListener("error",s.get(this)[dt]),this.addEventListener(e.PLAY_READY,s.get(this)[lt])}async detachAudioElement(){const t=s.get(this)[l];t.removeEventListener("pause",s.get(this)[ct]),t.removeEventListener("play",s.get(this)[ut]),t.removeEventListener("error",s.get(this)[dt]),this.removeEventListener(e.PLAY_READY,s.get(this)[lt]),await this.stop()}async play(){if(this.state===i.STOPPED){const t=new Promise((t=>{this.addEventListener(e.PLAY,t,{once:!0})})),h=new Promise((t=>{this.addEventListener(e.STREAM_END,t,{once:!0})}));s.get(this)[R]=new AbortController,this[x]=i.LOADING,this[P](e.LOAD);const r=async()=>s.get(this)[nt].playStream().then((async()=>{if(this.state===i.SWITCHING)return this[P](e.SWITCH),r();this.state!==i.STOPPING&&this.state!==i.STOPPED&&(await t,await h,await s.get(this)[nt].player.waiting)})).catch((async t=>{if(t&&"AbortError"!==t.name){if(await this[_](t))return this[P](e.RETRY),r();s.get(this)[R].abort(),this.state!==i.STOPPING&&this.state!==i.STOPPED&&this[P](e.ERROR,t.message.match(/network|fetch|offline|codec/i)?t:t.stack,t)}}));new Promise(((t,i)=>{s.get(this)[ft]=i,r().then(t)})).catch((t=>{if(this.state!==i.STOPPING)throw t})).finally((()=>{s.get(this)[mt](),this[P](e.STOP),this[x]=i.STOPPED})),await t}}async stop(){this.state!==i.STOPPED&&this.state!==i.STOPPING&&(this[x]=i.STOPPING,s.get(this)[R].abort(),s.get(this)[ft](),await new Promise((t=>{this.addEventListener(e.STOP,t,{once:!0})})))}async switchEndpoint(t,e){if(this.state!==i.STOPPED&&this.state!==i.STOPPING){const i=s.get(this);return Object.assign(i,gt[v](t,e,i)),i[nt].switchStream()}}async[_](t){if(0===s.get(this)[S])return!1;if(s.get(this)[x]===i.RETRYING)return await new Promise((t=>{this.addEventListener(i.STOPPING,t,{once:!0});const e=Math.min(1e3*s.get(this)[g]*(s.get(this)[w]+1)**s.get(this)[pt]++,1e3*s.get(this)[b]);setTimeout((()=>{this.removeEventListener(i.STOPPING,t),t()}),e+.3*e*Math.random())})),s.get(this)[x]===i.RETRYING;if(s.get(this)[x]!==i.STOPPING&&s.get(this)[x]!==i.STOPPED&&(t.message.match(/network|fetch|offline|Error in body stream/i)||"HTTP Response Error"===t.name)){this[P](e.ERROR,t.name,t),this[x]=i.RETRYING,s.get(this)[I]&&this[P](e.WARN,"This stream was requested with ICY metadata.",'If there is a CORS preflight failure, try removing "icy" from the metadataTypes option.',"See https://github.com/eshaz/icecast-metadata-js#cors for more details.");const h=new Promise((t=>{s.get(this)[yt]=t,s.get(this)[l].addEventListener("waiting",s.get(this)[yt],{once:!0})}));return s.get(this)[wt]=setTimeout((()=>{h.then((()=>{s.get(this)[x]===i.RETRYING&&(this[P](e.RETRY_TIMEOUT),this.stop())}))}),1e3*s.get(this)[S]),s.get(this)[pt]=0,!0}return!1}[P](t,...i){this.dispatchEvent(new CustomEvent(t,{detail:i})),s.get(this)[ot][t](...i)}[T](t,i,e){s.get(this)[p]&&t("icecast-metadata-js",e.reduce(((t,s)=>t+"\n "+s),"")),i&&i(...e)}}const bt=window.AudioContext||window.webkitAudioContext;if(bt&&!gt.constructor[u]){gt.constructor[u]="audio context pending";const t=t=>{console.error("icecast-metadata-js","Failed to start the AudioContext. WebAudio playback will not be possible.",t)},s=["touchstart","touchend","mousedown","keydown"],i=()=>{s.forEach((t=>document.removeEventListener(t,i)));const e=new bt({latencyHint:"interactive"});e.destination.channelCount=e.destination.maxChannelCount,e.resume().then((()=>{e.createScriptProcessor(16384,2,2).connect(e.destination),e.onstatechange=()=>{"running"!==e.state&&e.resume().catch(t)}})).catch(t),gt.constructor[u]=e};s.forEach((t=>document.addEventListener(t,i)))}})(),n=r.O(n),IcecastMetadataPlayer=n.default})(); +//# sourceMappingURL=icecast-metadata-player-1.17.3.main.min.js.map \ No newline at end of file diff --git a/lib/icecast-metadata-player-1.17.3.main.min.js.LICENSE.txt b/lib/icecast-metadata-player-1.17.3.main.min.js.LICENSE.txt new file mode 100644 index 0000000..5152e9a --- /dev/null +++ b/lib/icecast-metadata-player-1.17.3.main.min.js.LICENSE.txt @@ -0,0 +1,19 @@ +/** + * @license + * @see https://github.com/eshaz/icecast-metadata-js + * @copyright 2021-2024 Ethan Halsall + * This file is part of icecast-metadata-player. + * + * icecast-metadata-player free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * icecast-metadata-player distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see + */ diff --git a/lib/icecast-metadata-player-1.17.3.main.min.js.map b/lib/icecast-metadata-player-1.17.3.main.min.js.map new file mode 100644 index 0000000..1eb603a --- /dev/null +++ b/lib/icecast-metadata-player-1.17.3.main.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"icecast-metadata-player-1.17.3.main.min.js","mappings":"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","sources":["webpack://IcecastMetadataPlayer/webpack/runtime/chunk loaded","webpack://IcecastMetadataPlayer/webpack/runtime/load script","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/constants.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/utilities.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/codecs/HeaderCache.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/globals.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/codecs/Parser.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/containers/Frame.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/codecs/CodecFrame.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/metadata/ID3v2.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/codecs/CodecHeader.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/codecs/mpeg/MPEGHeader.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/codecs/mpeg/MPEGFrame.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/codecs/mpeg/MPEGParser.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/codecs/aac/AACHeader.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/codecs/aac/AACFrame.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/codecs/aac/AACParser.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/codecs/flac/FLACFrame.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/codecs/flac/FLACHeader.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/codecs/flac/FLACParser.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/containers/ogg/OggPageHeader.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/containers/ogg/OggPage.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/codecs/opus/OpusFrame.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/codecs/opus/OpusHeader.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/codecs/opus/OpusParser.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/codecs/vorbis/VorbisFrame.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/codecs/vorbis/VorbisHeader.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/codecs/vorbis/VorbisParser.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/containers/ogg/OggParser.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/src/CodecParser.js","webpack://IcecastMetadataPlayer/./node_modules/codec-parser/index.js","webpack://IcecastMetadataPlayer/webpack/bootstrap","webpack://IcecastMetadataPlayer/webpack/runtime/chunk prefetch function","webpack://IcecastMetadataPlayer/webpack/runtime/define property getters","webpack://IcecastMetadataPlayer/webpack/runtime/ensure chunk","webpack://IcecastMetadataPlayer/webpack/runtime/get javascript chunk filename","webpack://IcecastMetadataPlayer/webpack/runtime/global","webpack://IcecastMetadataPlayer/webpack/runtime/hasOwnProperty shorthand","webpack://IcecastMetadataPlayer/webpack/runtime/make namespace object","webpack://IcecastMetadataPlayer/webpack/runtime/publicPath","webpack://IcecastMetadataPlayer/webpack/runtime/jsonp chunk loading","webpack://IcecastMetadataPlayer/webpack/runtime/startup prefetch","webpack://IcecastMetadataPlayer/./src/global.js","webpack://IcecastMetadataPlayer/./src/EventTargetPolyfill.js","webpack://IcecastMetadataPlayer/./node_modules/icecast-metadata-js/src/MetadataParser/Stats.js","webpack://IcecastMetadataPlayer/./node_modules/icecast-metadata-js/src/MetadataParser/MetadataParser.js","webpack://IcecastMetadataPlayer/./node_modules/icecast-metadata-js/src/MetadataParser/IcyMetadataParser.js","webpack://IcecastMetadataPlayer/./node_modules/icecast-metadata-js/src/MetadataParser/OggMetadataParser.js","webpack://IcecastMetadataPlayer/./node_modules/icecast-metadata-js/src/MetadataParser/DualMetadataParser.js","webpack://IcecastMetadataPlayer/./node_modules/icecast-metadata-js/src/IcecastMetadataReader.js","webpack://IcecastMetadataPlayer/./node_modules/icecast-metadata-js/src/IcecastReadableStream.js","webpack://IcecastMetadataPlayer/./node_modules/icecast-metadata-js/src/IcecastMetadataQueue.js","webpack://IcecastMetadataPlayer/./src/FrameQueue.js","webpack://IcecastMetadataPlayer/./src/players/Player.js","webpack://IcecastMetadataPlayer/./src/players/HTML5Player.js","webpack://IcecastMetadataPlayer/./src/players/MediaSourcePlayer.js","webpack://IcecastMetadataPlayer/./src/players/WebAudioPlayer.js","webpack://IcecastMetadataPlayer/./src/PlayerFactory.js","webpack://IcecastMetadataPlayer/./src/IcecastMetadataPlayer.js"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"IcecastMetadataPlayer:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","const symbol = Symbol;\n\n// prettier-ignore\n/*\n[\n [\n \"left, right\",\n \"left, right, center\",\n \"left, center, right\",\n \"center, left, right\",\n \"center\"\n ],\n [\n \"front left, front right\",\n \"front left, front right, front center\",\n \"front left, front center, front right\",\n \"front center, front left, front right\",\n \"front center\"\n ],\n [\n \"side left, side right\",\n \"side left, side right, side center\",\n \"side left, side center, side right\",\n \"side center, side left, side right\",\n \"side center\"\n ],\n [\n \"rear left, rear right\",\n \"rear left, rear right, rear center\",\n \"rear left, rear center, rear right\",\n \"rear center, rear left, rear right\",\n \"rear center\"\n ]\n]\n*/\n\nconst mappingJoin = \", \";\n\nexport const channelMappings = (() => {\n const front = \"front\";\n const side = \"side\";\n const rear = \"rear\";\n const left = \"left\";\n const center = \"center\";\n const right = \"right\";\n\n return [\"\", front + \" \", side + \" \", rear + \" \"].map((x) =>\n [\n [left, right],\n [left, right, center],\n [left, center, right],\n [center, left, right],\n [center],\n ].flatMap((y) => y.map((z) => x + z).join(mappingJoin)),\n );\n})();\n\nexport const lfe = \"LFE\";\nexport const monophonic = \"monophonic (mono)\";\nexport const stereo = \"stereo\";\nconst surround = \"surround\";\n\nexport const getChannelMapping = (channelCount, ...mappings) =>\n `${\n [\n monophonic,\n stereo,\n `linear ${surround}`,\n \"quadraphonic\",\n `5.0 ${surround}`,\n `5.1 ${surround}`,\n `6.1 ${surround}`,\n `7.1 ${surround}`,\n ][channelCount - 1]\n } (${mappings.join(mappingJoin)})`;\n\n// prettier-ignore\nexport const vorbisOpusChannelMapping = [\n monophonic,\n getChannelMapping(2,channelMappings[0][0]),\n getChannelMapping(3,channelMappings[0][2]),\n getChannelMapping(4,channelMappings[1][0],channelMappings[3][0]),\n getChannelMapping(5,channelMappings[1][2],channelMappings[3][0]),\n getChannelMapping(6,channelMappings[1][2],channelMappings[3][0],lfe),\n getChannelMapping(7,channelMappings[1][2],channelMappings[2][0],channelMappings[3][4],lfe),\n getChannelMapping(8,channelMappings[1][2],channelMappings[2][0],channelMappings[3][0],lfe),\n]\n\n// sampleRates\nexport const rate192000 = 192000;\nexport const rate176400 = 176400;\nexport const rate96000 = 96000;\nexport const rate88200 = 88200;\nexport const rate64000 = 64000;\nexport const rate48000 = 48000;\nexport const rate44100 = 44100;\nexport const rate32000 = 32000;\nexport const rate24000 = 24000;\nexport const rate22050 = 22050;\nexport const rate16000 = 16000;\nexport const rate12000 = 12000;\nexport const rate11025 = 11025;\nexport const rate8000 = 8000;\nexport const rate7350 = 7350;\n\n// header key constants\nexport const absoluteGranulePosition = \"absoluteGranulePosition\";\nexport const bandwidth = \"bandwidth\";\nexport const bitDepth = \"bitDepth\";\nexport const bitrate = \"bitrate\";\nexport const bitrateMaximum = bitrate + \"Maximum\";\nexport const bitrateMinimum = bitrate + \"Minimum\";\nexport const bitrateNominal = bitrate + \"Nominal\";\nexport const buffer = \"buffer\";\nexport const bufferFullness = buffer + \"Fullness\";\nexport const codec = \"codec\";\nexport const codecFrames = codec + \"Frames\";\nexport const coupledStreamCount = \"coupledStreamCount\";\nexport const crc = \"crc\";\nexport const crc16 = crc + \"16\";\nexport const crc32 = crc + \"32\";\nexport const data = \"data\";\nexport const description = \"description\";\nexport const duration = \"duration\";\nexport const emphasis = \"emphasis\";\nexport const hasOpusPadding = \"hasOpusPadding\";\nexport const header = \"header\";\nexport const isContinuedPacket = \"isContinuedPacket\";\nexport const isCopyrighted = \"isCopyrighted\";\nexport const isFirstPage = \"isFirstPage\";\nexport const isHome = \"isHome\";\nexport const isLastPage = \"isLastPage\";\nexport const isOriginal = \"isOriginal\";\nexport const isPrivate = \"isPrivate\";\nexport const isVbr = \"isVbr\";\nexport const layer = \"layer\";\nexport const length = \"length\";\nexport const mode = \"mode\";\nexport const modeExtension = mode + \"Extension\";\nexport const mpeg = \"mpeg\";\nexport const mpegVersion = mpeg + \"Version\";\nexport const numberAACFrames = \"numberAAC\" + \"Frames\";\nexport const outputGain = \"outputGain\";\nexport const preSkip = \"preSkip\";\nexport const profile = \"profile\";\nexport const profileBits = symbol();\nexport const protection = \"protection\";\nexport const rawData = \"rawData\";\nexport const segments = \"segments\";\nexport const subarray = \"subarray\";\nexport const version = \"version\";\nexport const vorbis = \"vorbis\";\nexport const vorbisComments = vorbis + \"Comments\";\nexport const vorbisSetup = vorbis + \"Setup\";\n\nconst block = \"block\";\nexport const blockingStrategy = block + \"ingStrategy\";\nexport const blockingStrategyBits = symbol();\nexport const blockSize = block + \"Size\";\nexport const blocksize0 = block + \"size0\";\nexport const blocksize1 = block + \"size1\";\nexport const blockSizeBits = symbol();\n\nconst channel = \"channel\";\nexport const channelMappingFamily = channel + \"MappingFamily\";\nexport const channelMappingTable = channel + \"MappingTable\";\nexport const channelMode = channel + \"Mode\";\nexport const channelModeBits = symbol();\nexport const channels = channel + \"s\";\n\nconst copyright = \"copyright\";\nexport const copyrightId = copyright + \"Id\";\nexport const copyrightIdStart = copyright + \"IdStart\";\n\nexport const frame = \"frame\";\nexport const frameCount = frame + \"Count\";\nexport const frameLength = frame + \"Length\";\n\nconst Number = \"Number\";\nexport const frameNumber = frame + Number;\nexport const framePadding = frame + \"Padding\";\nexport const frameSize = frame + \"Size\";\n\nconst Rate = \"Rate\";\nexport const inputSampleRate = \"inputSample\" + Rate;\n\nconst page = \"page\";\nexport const pageChecksum = page + \"Checksum\";\nexport const pageSegmentBytes = symbol();\nexport const pageSegmentTable = page + \"SegmentTable\";\nexport const pageSequenceNumber = page + \"Sequence\" + Number;\n\nconst sample = \"sample\";\nexport const sampleNumber = sample + Number;\nexport const sampleRate = sample + Rate;\nexport const sampleRateBits = symbol();\nexport const samples = sample + \"s\";\n\nconst stream = \"stream\";\nexport const streamCount = stream + \"Count\";\nexport const streamInfo = stream + \"Info\";\nexport const streamSerialNumber = stream + \"Serial\" + Number;\nexport const streamStructureVersion = stream + \"StructureVersion\";\n\nconst total = \"total\";\nexport const totalBytesOut = total + \"BytesOut\";\nexport const totalDuration = total + \"Duration\";\nexport const totalSamples = total + \"Samples\";\n\n// private methods\nexport const readRawData = symbol();\nexport const incrementRawData = symbol();\nexport const mapCodecFrameStats = symbol();\nexport const mapFrameStats = symbol();\nexport const logWarning = symbol();\nexport const logError = symbol();\nexport const syncFrame = symbol();\nexport const fixedLengthFrameSync = symbol();\nexport const getHeader = symbol();\nexport const setHeader = symbol();\nexport const getFrame = symbol();\nexport const parseFrame = symbol();\nexport const parseOggPage = symbol();\nexport const checkCodecUpdate = symbol();\nexport const reset = symbol();\nexport const enable = symbol();\nexport const getHeaderFromUint8Array = symbol();\nexport const checkFrameFooterCrc16 = symbol();\n\nexport const uint8Array = Uint8Array;\nexport const dataView = DataView;\n\nexport const reserved = \"reserved\";\nexport const bad = \"bad\";\nexport const free = \"free\";\nexport const none = \"none\";\nexport const sixteenBitCRC = \"16bit CRC\";\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport { length, uint8Array } from \"./constants.js\";\n\nconst getCrcTable = (crcTable, crcInitialValueFunction, crcFunction) => {\n for (let byte = 0; byte < crcTable[length]; byte++) {\n let crc = crcInitialValueFunction(byte);\n\n for (let bit = 8; bit > 0; bit--) crc = crcFunction(crc);\n\n crcTable[byte] = crc;\n }\n return crcTable;\n};\n\nconst crc8Table = getCrcTable(\n new uint8Array(256),\n (b) => b,\n (crc) => (crc & 0x80 ? 0x07 ^ (crc << 1) : crc << 1),\n);\n\nconst flacCrc16Table = [\n getCrcTable(\n new Uint16Array(256),\n (b) => b << 8,\n (crc) => (crc << 1) ^ (crc & (1 << 15) ? 0x8005 : 0),\n ),\n];\n\nconst crc32Table = [\n getCrcTable(\n new Uint32Array(256),\n (b) => b,\n (crc) => (crc >>> 1) ^ ((crc & 1) * 0xedb88320),\n ),\n];\n\n// build crc tables\nfor (let i = 0; i < 15; i++) {\n flacCrc16Table.push(new Uint16Array(256));\n crc32Table.push(new Uint32Array(256));\n\n for (let j = 0; j <= 0xff; j++) {\n flacCrc16Table[i + 1][j] =\n flacCrc16Table[0][flacCrc16Table[i][j] >>> 8] ^\n (flacCrc16Table[i][j] << 8);\n\n crc32Table[i + 1][j] =\n (crc32Table[i][j] >>> 8) ^ crc32Table[0][crc32Table[i][j] & 0xff];\n }\n}\n\nconst crc8 = (data) => {\n let crc = 0;\n const dataLength = data[length];\n\n for (let i = 0; i !== dataLength; i++) crc = crc8Table[crc ^ data[i]];\n\n return crc;\n};\n\nconst flacCrc16 = (data) => {\n const dataLength = data[length];\n const crcChunkSize = dataLength - 16;\n let crc = 0;\n let i = 0;\n\n while (i <= crcChunkSize) {\n crc ^= (data[i++] << 8) | data[i++];\n crc =\n flacCrc16Table[15][crc >> 8] ^\n flacCrc16Table[14][crc & 0xff] ^\n flacCrc16Table[13][data[i++]] ^\n flacCrc16Table[12][data[i++]] ^\n flacCrc16Table[11][data[i++]] ^\n flacCrc16Table[10][data[i++]] ^\n flacCrc16Table[9][data[i++]] ^\n flacCrc16Table[8][data[i++]] ^\n flacCrc16Table[7][data[i++]] ^\n flacCrc16Table[6][data[i++]] ^\n flacCrc16Table[5][data[i++]] ^\n flacCrc16Table[4][data[i++]] ^\n flacCrc16Table[3][data[i++]] ^\n flacCrc16Table[2][data[i++]] ^\n flacCrc16Table[1][data[i++]] ^\n flacCrc16Table[0][data[i++]];\n }\n\n while (i !== dataLength)\n crc = ((crc & 0xff) << 8) ^ flacCrc16Table[0][(crc >> 8) ^ data[i++]];\n\n return crc;\n};\n\nconst crc32Function = (data) => {\n const dataLength = data[length];\n const crcChunkSize = dataLength - 16;\n let crc = 0;\n let i = 0;\n\n while (i <= crcChunkSize)\n crc =\n crc32Table[15][(data[i++] ^ crc) & 0xff] ^\n crc32Table[14][(data[i++] ^ (crc >>> 8)) & 0xff] ^\n crc32Table[13][(data[i++] ^ (crc >>> 16)) & 0xff] ^\n crc32Table[12][data[i++] ^ (crc >>> 24)] ^\n crc32Table[11][data[i++]] ^\n crc32Table[10][data[i++]] ^\n crc32Table[9][data[i++]] ^\n crc32Table[8][data[i++]] ^\n crc32Table[7][data[i++]] ^\n crc32Table[6][data[i++]] ^\n crc32Table[5][data[i++]] ^\n crc32Table[4][data[i++]] ^\n crc32Table[3][data[i++]] ^\n crc32Table[2][data[i++]] ^\n crc32Table[1][data[i++]] ^\n crc32Table[0][data[i++]];\n\n while (i !== dataLength)\n crc = crc32Table[0][(crc ^ data[i++]) & 0xff] ^ (crc >>> 8);\n\n return crc ^ -1;\n};\n\nconst concatBuffers = (...buffers) => {\n const buffer = new uint8Array(\n buffers.reduce((acc, buf) => acc + buf[length], 0),\n );\n\n buffers.reduce((offset, buf) => {\n buffer.set(buf, offset);\n return offset + buf[length];\n }, 0);\n\n return buffer;\n};\n\nconst bytesToString = (bytes) => String.fromCharCode(...bytes);\n\n// prettier-ignore\nconst reverseTable = [0x0,0x8,0x4,0xc,0x2,0xa,0x6,0xe,0x1,0x9,0x5,0xd,0x3,0xb,0x7,0xf];\nconst reverse = (val) =>\n (reverseTable[val & 0b1111] << 4) | reverseTable[val >> 4];\n\nclass BitReader {\n constructor(data) {\n this._data = data;\n this._pos = data[length] * 8;\n }\n\n set position(position) {\n this._pos = position;\n }\n\n get position() {\n return this._pos;\n }\n\n read(bits) {\n const byte = Math.floor(this._pos / 8);\n const bit = this._pos % 8;\n this._pos -= bits;\n\n const window =\n (reverse(this._data[byte - 1]) << 8) + reverse(this._data[byte]);\n\n return (window >> (7 - bit)) & 0xff;\n }\n}\n\nexport {\n crc8,\n flacCrc16,\n crc32Function,\n reverse,\n concatBuffers,\n bytesToString,\n BitReader,\n};\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport {\n getHeader,\n setHeader,\n checkCodecUpdate,\n reset,\n enable,\n} from \"../constants.js\";\n\nexport default class HeaderCache {\n constructor(onCodecHeader, onCodecUpdate) {\n this._onCodecHeader = onCodecHeader;\n this._onCodecUpdate = onCodecUpdate;\n this[reset]();\n }\n\n [enable]() {\n this._isEnabled = true;\n }\n\n [reset]() {\n this._headerCache = new Map();\n this._codecUpdateData = new WeakMap();\n this._codecHeaderSent = false;\n this._codecShouldUpdate = false;\n this._bitrate = null;\n this._isEnabled = false;\n }\n\n [checkCodecUpdate](bitrate, totalDuration) {\n if (this._onCodecUpdate) {\n if (this._bitrate !== bitrate) {\n this._bitrate = bitrate;\n this._codecShouldUpdate = true;\n }\n\n // only update if codec data is available\n const codecData = this._codecUpdateData.get(\n this._headerCache.get(this._currentHeader),\n );\n\n if (this._codecShouldUpdate && codecData) {\n this._onCodecUpdate(\n {\n bitrate,\n ...codecData,\n },\n totalDuration,\n );\n }\n\n this._codecShouldUpdate = false;\n }\n }\n\n [getHeader](key) {\n const header = this._headerCache.get(key);\n\n if (header) {\n this._updateCurrentHeader(key);\n }\n\n return header;\n }\n\n [setHeader](key, header, codecUpdateFields) {\n if (this._isEnabled) {\n if (!this._codecHeaderSent) {\n this._onCodecHeader({ ...header });\n this._codecHeaderSent = true;\n }\n this._updateCurrentHeader(key);\n\n this._headerCache.set(key, header);\n this._codecUpdateData.set(header, codecUpdateFields);\n }\n }\n\n _updateCurrentHeader(key) {\n if (this._onCodecUpdate && key !== this._currentHeader) {\n this._codecShouldUpdate = true;\n this._currentHeader = key;\n }\n }\n}\n","export const headerStore = new WeakMap();\nexport const frameStore = new WeakMap();\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport { frameStore } from \"../globals.js\";\nimport {\n frame,\n length,\n incrementRawData,\n mapFrameStats,\n logWarning,\n syncFrame,\n fixedLengthFrameSync,\n getFrame,\n getHeader,\n reset,\n enable,\n} from \"../constants.js\";\n\n/**\n * @abstract\n * @description Abstract class containing methods for parsing codec frames\n */\nexport default class Parser {\n constructor(codecParser, headerCache) {\n this._codecParser = codecParser;\n this._headerCache = headerCache;\n }\n\n *[syncFrame]() {\n let frameData;\n\n do {\n frameData = yield* this.Frame[getFrame](\n this._codecParser,\n this._headerCache,\n 0,\n );\n if (frameData) return frameData;\n this._codecParser[incrementRawData](1); // increment to continue syncing\n } while (true);\n }\n\n /**\n * @description Searches for Frames within bytes containing a sequence of known codec frames.\n * @param {boolean} ignoreNextFrame Set to true to return frames even if the next frame may not exist at the expected location\n * @returns {Frame}\n */\n *[fixedLengthFrameSync](ignoreNextFrame) {\n let frameData = yield* this[syncFrame]();\n const frameLength = frameStore.get(frameData)[length];\n\n if (\n ignoreNextFrame ||\n this._codecParser._flushing ||\n // check if there is a frame right after this one\n (yield* this.Header[getHeader](\n this._codecParser,\n this._headerCache,\n frameLength,\n ))\n ) {\n this._headerCache[enable](); // start caching when synced\n\n this._codecParser[incrementRawData](frameLength); // increment to the next frame\n this._codecParser[mapFrameStats](frameData);\n return frameData;\n }\n\n this._codecParser[logWarning](\n `Missing ${frame} at ${frameLength} bytes from current position.`,\n `Dropping current ${frame} and trying again.`,\n );\n this._headerCache[reset](); // frame is invalid and must re-sync and clear cache\n this._codecParser[incrementRawData](1); // increment to invalidate the current frame\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport { frameStore } from \"../globals.js\";\nimport { data, header } from \"../constants.js\";\n\n/**\n * @abstract\n */\nexport default class Frame {\n constructor(headerValue, dataValue) {\n frameStore.set(this, { [header]: headerValue });\n\n this[data] = dataValue;\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport { frameStore, headerStore } from \"../globals.js\";\nimport {\n sampleRate,\n length,\n frameNumber,\n header,\n samples,\n duration,\n totalBytesOut,\n totalSamples,\n totalDuration,\n frameLength,\n subarray,\n readRawData,\n getFrame,\n getHeader,\n} from \"../constants.js\";\nimport Frame from \"../containers/Frame.js\";\n\nexport default class CodecFrame extends Frame {\n static *[getFrame](Header, Frame, codecParser, headerCache, readOffset) {\n const headerValue = yield* Header[getHeader](\n codecParser,\n headerCache,\n readOffset,\n );\n\n if (headerValue) {\n const frameLengthValue = headerStore.get(headerValue)[frameLength];\n const samplesValue = headerStore.get(headerValue)[samples];\n\n const frame = (yield* codecParser[readRawData](\n frameLengthValue,\n readOffset,\n ))[subarray](0, frameLengthValue);\n\n return new Frame(headerValue, frame, samplesValue);\n } else {\n return null;\n }\n }\n\n constructor(headerValue, dataValue, samplesValue) {\n super(headerValue, dataValue);\n\n this[header] = headerValue;\n this[samples] = samplesValue;\n this[duration] = (samplesValue / headerValue[sampleRate]) * 1000;\n this[frameNumber] = null;\n this[totalBytesOut] = null;\n this[totalSamples] = null;\n this[totalDuration] = null;\n\n frameStore.get(this)[length] = dataValue[length];\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\n// https://id3.org/Developer%20Information\n\nimport { length, version, readRawData } from \"../constants.js\";\n\nconst unsynchronizationFlag = \"unsynchronizationFlag\";\nconst extendedHeaderFlag = \"extendedHeaderFlag\";\nconst experimentalFlag = \"experimentalFlag\";\nconst footerPresent = \"footerPresent\";\n\nexport default class ID3v2 {\n static *getID3v2Header(codecParser, headerCache, readOffset) {\n const headerLength = 10;\n const header = {};\n\n let data = yield* codecParser[readRawData](3, readOffset);\n // Byte (0-2 of 9)\n // ID3\n if (data[0] !== 0x49 || data[1] !== 0x44 || data[2] !== 0x33) return null;\n\n data = yield* codecParser[readRawData](headerLength, readOffset);\n\n // Byte (3-4 of 9)\n // * `BBBBBBBB|........`: Major version\n // * `........|BBBBBBBB`: Minor version\n header[version] = `id3v2.${data[3]}.${data[4]}`;\n\n // Byte (5 of 9)\n // * `....0000.: Zeros (flags not implemented yet)\n if (data[5] & 0b00001111) return null;\n\n // Byte (5 of 9)\n // * `CDEF0000`: Flags\n // * `C.......`: Unsynchronisation (indicates whether or not unsynchronisation is used)\n // * `.D......`: Extended header (indicates whether or not the header is followed by an extended header)\n // * `..E.....`: Experimental indicator (indicates whether or not the tag is in an experimental stage)\n // * `...F....`: Footer present (indicates that a footer is present at the very end of the tag)\n header[unsynchronizationFlag] = !!(data[5] & 0b10000000);\n header[extendedHeaderFlag] = !!(data[5] & 0b01000000);\n header[experimentalFlag] = !!(data[5] & 0b00100000);\n header[footerPresent] = !!(data[5] & 0b00010000);\n\n // Byte (6-9 of 9)\n // * `0.......|0.......|0.......|0.......`: Zeros\n if (\n data[6] & 0b10000000 ||\n data[7] & 0b10000000 ||\n data[8] & 0b10000000 ||\n data[9] & 0b10000000\n )\n return null;\n\n // Byte (6-9 of 9)\n // * `.FFFFFFF|.FFFFFFF|.FFFFFFF|.FFFFFFF`: Tag Length\n // The ID3v2 tag size is encoded with four bytes where the most significant bit (bit 7)\n // is set to zero in every byte, making a total of 28 bits. The zeroed bits are ignored,\n // so a 257 bytes long tag is represented as $00 00 02 01.\n const dataLength =\n (data[6] << 21) | (data[7] << 14) | (data[8] << 7) | data[9];\n\n header[length] = headerLength + dataLength;\n\n return new ID3v2(header);\n }\n\n constructor(header) {\n this[version] = header[version];\n this[unsynchronizationFlag] = header[unsynchronizationFlag];\n this[extendedHeaderFlag] = header[extendedHeaderFlag];\n this[experimentalFlag] = header[experimentalFlag];\n this[footerPresent] = header[footerPresent];\n this[length] = header[length];\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport { headerStore } from \"../globals.js\";\nimport {\n bitDepth,\n channelMode,\n sampleRate,\n bitrate,\n channels,\n} from \"../constants.js\";\n\nexport default class CodecHeader {\n /**\n * @private\n */\n constructor(header) {\n headerStore.set(this, header);\n\n this[bitDepth] = header[bitDepth];\n this[bitrate] = null; // set during frame mapping\n this[channels] = header[channels];\n this[channelMode] = header[channelMode];\n this[sampleRate] = header[sampleRate];\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport {\n reserved,\n bad,\n free,\n none,\n sixteenBitCRC,\n rate44100,\n rate48000,\n rate32000,\n rate22050,\n rate24000,\n rate16000,\n rate11025,\n rate12000,\n rate8000,\n monophonic,\n stereo,\n bitDepth,\n channelMode,\n sampleRate,\n bitrate,\n channels,\n isOriginal,\n isPrivate,\n layer,\n length,\n mpegVersion,\n frameLength,\n protection,\n emphasis,\n framePadding,\n isCopyrighted,\n modeExtension,\n description,\n samples,\n subarray,\n readRawData,\n incrementRawData,\n getHeader,\n setHeader,\n} from \"../../constants.js\";\nimport { bytesToString } from \"../../utilities.js\";\n\nimport ID3v2 from \"../../metadata/ID3v2.js\";\nimport CodecHeader from \"../CodecHeader.js\";\n\n// http://www.mp3-tech.org/programmer/frame_header.html\n\nconst bitrateMatrix = {\n // bits | V1,L1 | V1,L2 | V1,L3 | V2,L1 | V2,L2 & L3\n 0b00000000: [free, free, free, free, free],\n 0b00010000: [32, 32, 32, 32, 8],\n // 0b00100000: [64, 48, 40, 48, 16,],\n // 0b00110000: [96, 56, 48, 56, 24,],\n // 0b01000000: [128, 64, 56, 64, 32,],\n // 0b01010000: [160, 80, 64, 80, 40,],\n // 0b01100000: [192, 96, 80, 96, 48,],\n // 0b01110000: [224, 112, 96, 112, 56,],\n // 0b10000000: [256, 128, 112, 128, 64,],\n // 0b10010000: [288, 160, 128, 144, 80,],\n // 0b10100000: [320, 192, 160, 160, 96,],\n // 0b10110000: [352, 224, 192, 176, 112,],\n // 0b11000000: [384, 256, 224, 192, 128,],\n // 0b11010000: [416, 320, 256, 224, 144,],\n // 0b11100000: [448, 384, 320, 256, 160,],\n 0b11110000: [bad, bad, bad, bad, bad],\n};\n\nconst calcBitrate = (idx, interval, intervalOffset) =>\n 8 *\n (((idx + intervalOffset) % interval) + interval) *\n (1 << ((idx + intervalOffset) / interval)) -\n 8 * interval * ((interval / 8) | 0);\n\n// generate bitrate matrix\nfor (let i = 2; i < 15; i++)\n bitrateMatrix[i << 4] = [\n i * 32, // V1,L1\n calcBitrate(i, 4, 0), // V1,L2\n calcBitrate(i, 4, -1), // V1,L3\n calcBitrate(i, 8, 4), // V2,L1\n calcBitrate(i, 8, 0), // V2,L2 & L3\n ];\n\nconst v1Layer1 = 0;\nconst v1Layer2 = 1;\nconst v1Layer3 = 2;\nconst v2Layer1 = 3;\nconst v2Layer23 = 4;\n\nconst bands = \"bands \";\nconst to31 = \" to 31\";\nconst layer12ModeExtensions = {\n 0b00000000: bands + 4 + to31,\n 0b00010000: bands + 8 + to31,\n 0b00100000: bands + 12 + to31,\n 0b00110000: bands + 16 + to31,\n};\n\nconst bitrateIndex = \"bitrateIndex\";\nconst v2 = \"v2\";\nconst v1 = \"v1\";\n\nconst intensityStereo = \"Intensity stereo \";\nconst msStereo = \", MS stereo \";\nconst on = \"on\";\nconst off = \"off\";\nconst layer3ModeExtensions = {\n 0b00000000: intensityStereo + off + msStereo + off,\n 0b00010000: intensityStereo + on + msStereo + off,\n 0b00100000: intensityStereo + off + msStereo + on,\n 0b00110000: intensityStereo + on + msStereo + on,\n};\n\nconst layersValues = {\n 0b00000000: { [description]: reserved },\n 0b00000010: {\n [description]: \"Layer III\",\n [framePadding]: 1,\n [modeExtension]: layer3ModeExtensions,\n [v1]: {\n [bitrateIndex]: v1Layer3,\n [samples]: 1152,\n },\n [v2]: {\n [bitrateIndex]: v2Layer23,\n [samples]: 576,\n },\n },\n 0b00000100: {\n [description]: \"Layer II\",\n [framePadding]: 1,\n [modeExtension]: layer12ModeExtensions,\n [samples]: 1152,\n [v1]: {\n [bitrateIndex]: v1Layer2,\n },\n [v2]: {\n [bitrateIndex]: v2Layer23,\n },\n },\n 0b00000110: {\n [description]: \"Layer I\",\n [framePadding]: 4,\n [modeExtension]: layer12ModeExtensions,\n [samples]: 384,\n [v1]: {\n [bitrateIndex]: v1Layer1,\n },\n [v2]: {\n [bitrateIndex]: v2Layer1,\n },\n },\n};\n\nconst mpegVersionDescription = \"MPEG Version \";\nconst isoIec = \"ISO/IEC \";\nconst mpegVersions = {\n 0b00000000: {\n [description]: `${mpegVersionDescription}2.5 (later extension of MPEG 2)`,\n [layer]: v2,\n [sampleRate]: {\n 0b00000000: rate11025,\n 0b00000100: rate12000,\n 0b00001000: rate8000,\n 0b00001100: reserved,\n },\n },\n 0b00001000: { [description]: reserved },\n 0b00010000: {\n [description]: `${mpegVersionDescription}2 (${isoIec}13818-3)`,\n [layer]: v2,\n [sampleRate]: {\n 0b00000000: rate22050,\n 0b00000100: rate24000,\n 0b00001000: rate16000,\n 0b00001100: reserved,\n },\n },\n 0b00011000: {\n [description]: `${mpegVersionDescription}1 (${isoIec}11172-3)`,\n [layer]: v1,\n [sampleRate]: {\n 0b00000000: rate44100,\n 0b00000100: rate48000,\n 0b00001000: rate32000,\n 0b00001100: reserved,\n },\n },\n length,\n};\n\nconst protectionValues = {\n 0b00000000: sixteenBitCRC,\n 0b00000001: none,\n};\n\nconst emphasisValues = {\n 0b00000000: none,\n 0b00000001: \"50/15 ms\",\n 0b00000010: reserved,\n 0b00000011: \"CCIT J.17\",\n};\n\nconst channelModes = {\n 0b00000000: { [channels]: 2, [description]: stereo },\n 0b01000000: { [channels]: 2, [description]: \"joint \" + stereo },\n 0b10000000: { [channels]: 2, [description]: \"dual channel\" },\n 0b11000000: { [channels]: 1, [description]: monophonic },\n};\n\nexport default class MPEGHeader extends CodecHeader {\n static *[getHeader](codecParser, headerCache, readOffset) {\n const header = {};\n\n // check for id3 header\n const id3v2Header = yield* ID3v2.getID3v2Header(\n codecParser,\n headerCache,\n readOffset,\n );\n\n if (id3v2Header) {\n // throw away the data. id3 parsing is not implemented yet.\n yield* codecParser[readRawData](id3v2Header[length], readOffset);\n codecParser[incrementRawData](id3v2Header[length]);\n }\n\n // Must be at least four bytes.\n const data = yield* codecParser[readRawData](4, readOffset);\n\n // Check header cache\n const key = bytesToString(data[subarray](0, 4));\n const cachedHeader = headerCache[getHeader](key);\n if (cachedHeader) return new MPEGHeader(cachedHeader);\n\n // Frame sync (all bits must be set): `11111111|111`:\n if (data[0] !== 0xff || data[1] < 0xe0) return null;\n\n // Byte (2 of 4)\n // * `111BBCCD`\n // * `...BB...`: MPEG Audio version ID\n // * `.....CC.`: Layer description\n // * `.......D`: Protection bit (0 - Protected by CRC (16bit CRC follows header), 1 = Not protected)\n\n // Mpeg version (1, 2, 2.5)\n const mpegVersionValues = mpegVersions[data[1] & 0b00011000];\n if (mpegVersionValues[description] === reserved) return null;\n\n // Layer (I, II, III)\n const layerBits = data[1] & 0b00000110;\n if (layersValues[layerBits][description] === reserved) return null;\n const layerValues = {\n ...layersValues[layerBits],\n ...layersValues[layerBits][mpegVersionValues[layer]],\n };\n\n header[mpegVersion] = mpegVersionValues[description];\n header[layer] = layerValues[description];\n header[samples] = layerValues[samples];\n header[protection] = protectionValues[data[1] & 0b00000001];\n\n header[length] = 4;\n\n // Byte (3 of 4)\n // * `EEEEFFGH`\n // * `EEEE....`: Bitrate index. 1111 is invalid, everything else is accepted\n // * `....FF..`: Sample rate\n // * `......G.`: Padding bit, 0=frame not padded, 1=frame padded\n // * `.......H`: Private bit.\n header[bitrate] =\n bitrateMatrix[data[2] & 0b11110000][layerValues[bitrateIndex]];\n if (header[bitrate] === bad) return null;\n\n header[sampleRate] = mpegVersionValues[sampleRate][data[2] & 0b00001100];\n if (header[sampleRate] === reserved) return null;\n\n header[framePadding] = data[2] & 0b00000010 && layerValues[framePadding];\n header[isPrivate] = !!(data[2] & 0b00000001);\n\n header[frameLength] = Math.floor(\n (125 * header[bitrate] * header[samples]) / header[sampleRate] +\n header[framePadding],\n );\n if (!header[frameLength]) return null;\n\n // Byte (4 of 4)\n // * `IIJJKLMM`\n // * `II......`: Channel mode\n // * `..JJ....`: Mode extension (only if joint stereo)\n // * `....K...`: Copyright\n // * `.....L..`: Original\n // * `......MM`: Emphasis\n const channelModeBits = data[3] & 0b11000000;\n header[channelMode] = channelModes[channelModeBits][description];\n header[channels] = channelModes[channelModeBits][channels];\n\n header[modeExtension] = layerValues[modeExtension][data[3] & 0b00110000];\n header[isCopyrighted] = !!(data[3] & 0b00001000);\n header[isOriginal] = !!(data[3] & 0b00000100);\n\n header[emphasis] = emphasisValues[data[3] & 0b00000011];\n if (header[emphasis] === reserved) return null;\n\n header[bitDepth] = 16;\n\n // set header cache\n {\n const { length, frameLength, samples, ...codecUpdateFields } = header;\n\n headerCache[setHeader](key, header, codecUpdateFields);\n }\n return new MPEGHeader(header);\n }\n\n /**\n * @private\n * Call MPEGHeader.getHeader(Array) to get instance\n */\n constructor(header) {\n super(header);\n\n this[bitrate] = header[bitrate];\n this[emphasis] = header[emphasis];\n this[framePadding] = header[framePadding];\n this[isCopyrighted] = header[isCopyrighted];\n this[isOriginal] = header[isOriginal];\n this[isPrivate] = header[isPrivate];\n this[layer] = header[layer];\n this[modeExtension] = header[modeExtension];\n this[mpegVersion] = header[mpegVersion];\n this[protection] = header[protection];\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport { getFrame } from \"../../constants.js\";\n\nimport CodecFrame from \"../CodecFrame.js\";\nimport MPEGHeader from \"./MPEGHeader.js\";\n\nexport default class MPEGFrame extends CodecFrame {\n static *[getFrame](codecParser, headerCache, readOffset) {\n return yield* super[getFrame](\n MPEGHeader,\n MPEGFrame,\n codecParser,\n headerCache,\n readOffset,\n );\n }\n\n constructor(header, frame, samples) {\n super(header, frame, samples);\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport {\n codec,\n mpeg,\n fixedLengthFrameSync,\n parseFrame,\n} from \"../../constants.js\";\n\nimport Parser from \"../Parser.js\";\nimport MPEGFrame from \"./MPEGFrame.js\";\nimport MPEGHeader from \"./MPEGHeader.js\";\n\nexport default class MPEGParser extends Parser {\n constructor(codecParser, headerCache, onCodec) {\n super(codecParser, headerCache);\n this.Frame = MPEGFrame;\n this.Header = MPEGHeader;\n\n onCodec(this[codec]);\n }\n\n get [codec]() {\n return mpeg;\n }\n\n *[parseFrame]() {\n return yield* this[fixedLengthFrameSync]();\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\n/*\nhttps://wiki.multimedia.cx/index.php/ADTS\n\nAAAAAAAA AAAABCCD EEFFFFGH HHIJKLMM MMMMMMMM MMMOOOOO OOOOOOPP (QQQQQQQQ QQQQQQQQ)\n\nAACHeader consists of 7 or 9 bytes (without or with CRC).\nLetter Length (bits) Description\nA 12 syncword 0xFFF, all bits must be 1\nB 1 MPEG Version: 0 for MPEG-4, 1 for MPEG-2\nC 2 Layer: always 0\nD 1 protection absent, Warning, set to 1 if there is no CRC and 0 if there is CRC\nE 2 profile, the MPEG-4 Audio Object Type minus 1\nF 4 MPEG-4 Sampling Frequency Index (15 is forbidden)\nG 1 private bit, guaranteed never to be used by MPEG, set to 0 when encoding, ignore when decoding\nH 3 MPEG-4 Channel Configuration (in the case of 0, the channel configuration is sent via an inband PCE)\nI 1 originality, set to 0 when encoding, ignore when decoding\nJ 1 home, set to 0 when encoding, ignore when decoding\nK 1 copyrighted id bit, the next bit of a centrally registered copyright identifier, set to 0 when encoding, ignore when decoding\nL 1 copyright id start, signals that this frame's copyright id bit is the first bit of the copyright id, set to 0 when encoding, ignore when decoding\nM 13 frame length, this value must include 7 or 9 bytes of header length: FrameLength = (ProtectionAbsent == 1 ? 7 : 9) + size(AACFrame)\nO 11 Buffer fullness // 0x7FF for VBR\nP 2 Number of AAC frames (RDBs) in ADTS frame minus 1, for maximum compatibility always use 1 AAC frame per ADTS frame\nQ 16 CRC if protection absent is 0 \n*/\n\nimport { headerStore } from \"../../globals.js\";\nimport { bytesToString } from \"../../utilities.js\";\nimport {\n reserved,\n bad,\n none,\n sixteenBitCRC,\n rate96000,\n rate88200,\n rate64000,\n rate48000,\n rate44100,\n rate32000,\n rate24000,\n rate22050,\n rate16000,\n rate12000,\n rate11025,\n rate8000,\n rate7350,\n channelMappings,\n getChannelMapping,\n monophonic,\n lfe,\n bitDepth,\n channelMode,\n sampleRate,\n channels,\n copyrightId,\n copyrightIdStart,\n bufferFullness,\n isHome,\n isOriginal,\n isPrivate,\n layer,\n length,\n mpegVersion,\n numberAACFrames,\n profile,\n protection,\n frameLength,\n description,\n samples,\n sampleRateBits,\n profileBits,\n channelModeBits,\n buffer,\n readRawData,\n getHeader,\n setHeader,\n uint8Array,\n dataView,\n} from \"../../constants.js\";\n\nimport CodecHeader from \"../CodecHeader.js\";\n\nconst mpegVersionValues = {\n 0b00000000: \"MPEG-4\",\n 0b00001000: \"MPEG-2\",\n};\n\nconst layerValues = {\n 0b00000000: \"valid\",\n 0b00000010: bad,\n 0b00000100: bad,\n 0b00000110: bad,\n};\n\nconst protectionValues = {\n 0b00000000: sixteenBitCRC,\n 0b00000001: none,\n};\n\nconst profileValues = {\n 0b00000000: \"AAC Main\",\n 0b01000000: \"AAC LC (Low Complexity)\",\n 0b10000000: \"AAC SSR (Scalable Sample Rate)\",\n 0b11000000: \"AAC LTP (Long Term Prediction)\",\n};\n\nconst sampleRates = {\n 0b00000000: rate96000,\n 0b00000100: rate88200,\n 0b00001000: rate64000,\n 0b00001100: rate48000,\n 0b00010000: rate44100,\n 0b00010100: rate32000,\n 0b00011000: rate24000,\n 0b00011100: rate22050,\n 0b00100000: rate16000,\n 0b00100100: rate12000,\n 0b00101000: rate11025,\n 0b00101100: rate8000,\n 0b00110000: rate7350,\n 0b00110100: reserved,\n 0b00111000: reserved,\n 0b00111100: \"frequency is written explicitly\",\n};\n\n// prettier-ignore\nconst channelModeValues = {\n 0b000000000: { [channels]: 0, [description]: \"Defined in AOT Specific Config\" },\n /*\n 'monophonic (mono)'\n 'stereo (left, right)'\n 'linear surround (front center, front left, front right)'\n 'quadraphonic (front center, front left, front right, rear center)'\n '5.0 surround (front center, front left, front right, rear left, rear right)'\n '5.1 surround (front center, front left, front right, rear left, rear right, LFE)'\n '7.1 surround (front center, front left, front right, side left, side right, rear left, rear right, LFE)'\n */\n 0b001000000: { [channels]: 1, [description]: monophonic },\n 0b010000000: { [channels]: 2, [description]: getChannelMapping(2,channelMappings[0][0]) },\n 0b011000000: { [channels]: 3, [description]: getChannelMapping(3,channelMappings[1][3]), },\n 0b100000000: { [channels]: 4, [description]: getChannelMapping(4,channelMappings[1][3],channelMappings[3][4]), },\n 0b101000000: { [channels]: 5, [description]: getChannelMapping(5,channelMappings[1][3],channelMappings[3][0]), },\n 0b110000000: { [channels]: 6, [description]: getChannelMapping(6,channelMappings[1][3],channelMappings[3][0],lfe), },\n 0b111000000: { [channels]: 8, [description]: getChannelMapping(8,channelMappings[1][3],channelMappings[2][0],channelMappings[3][0],lfe), },\n};\n\nexport default class AACHeader extends CodecHeader {\n static *[getHeader](codecParser, headerCache, readOffset) {\n const header = {};\n\n // Must be at least seven bytes. Out of data\n const data = yield* codecParser[readRawData](7, readOffset);\n\n // Check header cache\n const key = bytesToString([\n data[0],\n data[1],\n data[2],\n (data[3] & 0b11111100) | (data[6] & 0b00000011), // frame length, buffer fullness varies so don't cache it\n ]);\n const cachedHeader = headerCache[getHeader](key);\n\n if (!cachedHeader) {\n // Frame sync (all bits must be set): `11111111|1111`:\n if (data[0] !== 0xff || data[1] < 0xf0) return null;\n\n // Byte (2 of 7)\n // * `1111BCCD`\n // * `....B...`: MPEG Version: 0 for MPEG-4, 1 for MPEG-2\n // * `.....CC.`: Layer: always 0\n // * `.......D`: protection absent, Warning, set to 1 if there is no CRC and 0 if there is CRC\n header[mpegVersion] = mpegVersionValues[data[1] & 0b00001000];\n\n header[layer] = layerValues[data[1] & 0b00000110];\n if (header[layer] === bad) return null;\n\n const protectionBit = data[1] & 0b00000001;\n header[protection] = protectionValues[protectionBit];\n header[length] = protectionBit ? 7 : 9;\n\n // Byte (3 of 7)\n // * `EEFFFFGH`\n // * `EE......`: profile, the MPEG-4 Audio Object Type minus 1\n // * `..FFFF..`: MPEG-4 Sampling Frequency Index (15 is forbidden)\n // * `......G.`: private bit, guaranteed never to be used by MPEG, set to 0 when encoding, ignore when decoding\n header[profileBits] = data[2] & 0b11000000;\n header[sampleRateBits] = data[2] & 0b00111100;\n const privateBit = data[2] & 0b00000010;\n\n header[profile] = profileValues[header[profileBits]];\n\n header[sampleRate] = sampleRates[header[sampleRateBits]];\n if (header[sampleRate] === reserved) return null;\n\n header[isPrivate] = !!privateBit;\n\n // Byte (3,4 of 7)\n // * `.......H|HH......`: MPEG-4 Channel Configuration (in the case of 0, the channel configuration is sent via an inband PCE)\n header[channelModeBits] = ((data[2] << 8) | data[3]) & 0b111000000;\n header[channelMode] =\n channelModeValues[header[channelModeBits]][description];\n header[channels] = channelModeValues[header[channelModeBits]][channels];\n\n // Byte (4 of 7)\n // * `HHIJKLMM`\n // * `..I.....`: originality, set to 0 when encoding, ignore when decoding\n // * `...J....`: home, set to 0 when encoding, ignore when decoding\n // * `....K...`: copyrighted id bit, the next bit of a centrally registered copyright identifier, set to 0 when encoding, ignore when decoding\n // * `.....L..`: copyright id start, signals that this frame's copyright id bit is the first bit of the copyright id, set to 0 when encoding, ignore when decoding\n header[isOriginal] = !!(data[3] & 0b00100000);\n header[isHome] = !!(data[3] & 0b00001000);\n header[copyrightId] = !!(data[3] & 0b00001000);\n header[copyrightIdStart] = !!(data[3] & 0b00000100);\n header[bitDepth] = 16;\n header[samples] = 1024;\n\n // Byte (7 of 7)\n // * `......PP` Number of AAC frames (RDBs) in ADTS frame minus 1, for maximum compatibility always use 1 AAC frame per ADTS frame\n header[numberAACFrames] = data[6] & 0b00000011;\n\n {\n const {\n length,\n channelModeBits,\n profileBits,\n sampleRateBits,\n frameLength,\n samples,\n numberAACFrames,\n ...codecUpdateFields\n } = header;\n headerCache[setHeader](key, header, codecUpdateFields);\n }\n } else {\n Object.assign(header, cachedHeader);\n }\n\n // Byte (4,5,6 of 7)\n // * `.......MM|MMMMMMMM|MMM.....`: frame length, this value must include 7 or 9 bytes of header length: FrameLength = (ProtectionAbsent == 1 ? 7 : 9) + size(AACFrame)\n header[frameLength] =\n ((data[3] << 11) | (data[4] << 3) | (data[5] >> 5)) & 0x1fff;\n if (!header[frameLength]) return null;\n\n // Byte (6,7 of 7)\n // * `...OOOOO|OOOOOO..`: Buffer fullness\n const bufferFullnessBits = ((data[5] << 6) | (data[6] >> 2)) & 0x7ff;\n header[bufferFullness] =\n bufferFullnessBits === 0x7ff ? \"VBR\" : bufferFullnessBits;\n\n return new AACHeader(header);\n }\n\n /**\n * @private\n * Call AACHeader.getHeader(Array) to get instance\n */\n constructor(header) {\n super(header);\n\n this[copyrightId] = header[copyrightId];\n this[copyrightIdStart] = header[copyrightIdStart];\n this[bufferFullness] = header[bufferFullness];\n this[isHome] = header[isHome];\n this[isOriginal] = header[isOriginal];\n this[isPrivate] = header[isPrivate];\n this[layer] = header[layer];\n this[length] = header[length];\n this[mpegVersion] = header[mpegVersion];\n this[numberAACFrames] = header[numberAACFrames];\n this[profile] = header[profile];\n this[protection] = header[protection];\n }\n\n get audioSpecificConfig() {\n // Audio Specific Configuration\n // * `000EEFFF|F0HHH000`:\n // * `000EE...|........`: Object Type (profileBit + 1)\n // * `.....FFF|F.......`: Sample Rate\n // * `........|.0HHH...`: Channel Configuration\n // * `........|.....0..`: Frame Length (1024)\n // * `........|......0.`: does not depend on core coder\n // * `........|.......0`: Not Extension\n const header = headerStore.get(this);\n\n const audioSpecificConfig =\n ((header[profileBits] + 0x40) << 5) |\n (header[sampleRateBits] << 5) |\n (header[channelModeBits] >> 3);\n\n const bytes = new uint8Array(2);\n new dataView(bytes[buffer]).setUint16(0, audioSpecificConfig, false);\n return bytes;\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport { getFrame } from \"../../constants.js\";\n\nimport CodecFrame from \"../CodecFrame.js\";\nimport AACHeader from \"./AACHeader.js\";\n\nexport default class AACFrame extends CodecFrame {\n static *[getFrame](codecParser, headerCache, readOffset) {\n return yield* super[getFrame](\n AACHeader,\n AACFrame,\n codecParser,\n headerCache,\n readOffset,\n );\n }\n\n constructor(header, frame, samples) {\n super(header, frame, samples);\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport { codec, fixedLengthFrameSync, parseFrame } from \"../../constants.js\";\n\nimport Parser from \"../Parser.js\";\nimport AACFrame from \"./AACFrame.js\";\nimport AACHeader from \"./AACHeader.js\";\n\nexport default class AACParser extends Parser {\n constructor(codecParser, headerCache, onCodec) {\n super(codecParser, headerCache);\n this.Frame = AACFrame;\n this.Header = AACHeader;\n\n onCodec(this[codec]);\n }\n\n get [codec]() {\n return \"aac\";\n }\n\n *[parseFrame]() {\n return yield* this[fixedLengthFrameSync]();\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport { headerStore } from \"../../globals.js\";\nimport { flacCrc16 } from \"../../utilities.js\";\nimport {\n length,\n streamInfo,\n crc16,\n samples,\n subarray,\n checkFrameFooterCrc16,\n} from \"../../constants.js\";\nimport CodecFrame from \"../CodecFrame.js\";\n\nexport default class FLACFrame extends CodecFrame {\n static _getFrameFooterCrc16(data) {\n return (data[data[length] - 2] << 8) + data[data[length] - 1];\n }\n\n // check frame footer crc\n // https://xiph.org/flac/format.html#frame_footer\n static [checkFrameFooterCrc16](data) {\n const expectedCrc16 = FLACFrame._getFrameFooterCrc16(data);\n const actualCrc16 = flacCrc16(data[subarray](0, -2));\n\n return expectedCrc16 === actualCrc16;\n }\n\n constructor(data, header, streamInfoValue) {\n header[streamInfo] = streamInfoValue;\n header[crc16] = FLACFrame._getFrameFooterCrc16(data);\n\n super(header, data, headerStore.get(header)[samples]);\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\n/*\nhttps://xiph.org/flac/format.html\n\nAAAAAAAA AAAAAABC DDDDEEEE FFFFGGGH \n(IIIIIIII...)\n(JJJJJJJJ|JJJJJJJJ)\n(KKKKKKKK|KKKKKKKK)\nLLLLLLLLL\n\nFLAC Frame Header\nLetter Length (bits) Description\nA 13 11111111|11111\nB 1 Reserved 0 - mandatory, 1 - reserved\nC 1 Blocking strategy, 0 - fixed, 1 - variable\nD 4 Block size in inter-channel samples\nE 4 Sample rate\nF 4 Channel assignment\nG 3 Sample size in bits\nH 1 Reserved 0 - mandatory, 1 - reserved\nI ? if(variable blocksize)\n <8-56>:\"UTF-8\" coded sample number (decoded number is 36 bits) [4]\n else\n <8-48>:\"UTF-8\" coded frame number (decoded number is 31 bits) [4]\nJ ? if(blocksize bits == 011x)\n 8/16 bit (blocksize-1)\nK ? if(sample rate bits == 11xx)\n 8/16 bit sample rate\nL 8 CRC-8 (polynomial = x^8 + x^2 + x^1 + x^0, initialized with 0) of everything before the crc, including the sync code\n \n*/\n\nimport {\n reserved,\n bad,\n rate88200,\n rate176400,\n rate192000,\n rate8000,\n rate16000,\n rate22050,\n rate24000,\n rate32000,\n rate44100,\n rate48000,\n rate96000,\n channelMappings,\n getChannelMapping,\n monophonic,\n stereo,\n lfe,\n bitDepth,\n channelMode,\n sampleRate,\n channels,\n length,\n crc16,\n blockingStrategy,\n blockSize,\n frameNumber,\n sampleNumber,\n streamInfo,\n description,\n samples,\n sampleRateBits,\n blockingStrategyBits,\n blockSizeBits,\n crc,\n subarray,\n readRawData,\n getHeader,\n setHeader,\n getHeaderFromUint8Array,\n} from \"../../constants.js\";\nimport { bytesToString, crc8 } from \"../../utilities.js\";\nimport CodecHeader from \"../CodecHeader.js\";\n\nconst getFromStreamInfo = \"get from STREAMINFO metadata block\";\n\nconst blockingStrategyValues = {\n 0b00000000: \"Fixed\",\n 0b00000001: \"Variable\",\n};\n\nconst blockSizeValues = {\n 0b00000000: reserved,\n 0b00010000: 192,\n // 0b00100000: 576,\n // 0b00110000: 1152,\n // 0b01000000: 2304,\n // 0b01010000: 4608,\n // 0b01100000: \"8-bit (blocksize-1) from end of header\",\n // 0b01110000: \"16-bit (blocksize-1) from end of header\",\n // 0b10000000: 256,\n // 0b10010000: 512,\n // 0b10100000: 1024,\n // 0b10110000: 2048,\n // 0b11000000: 4096,\n // 0b11010000: 8192,\n // 0b11100000: 16384,\n // 0b11110000: 32768,\n};\nfor (let i = 2; i < 16; i++)\n blockSizeValues[i << 4] = i < 6 ? 576 * 2 ** (i - 2) : 2 ** i;\n\nconst sampleRateValues = {\n 0b00000000: getFromStreamInfo,\n 0b00000001: rate88200,\n 0b00000010: rate176400,\n 0b00000011: rate192000,\n 0b00000100: rate8000,\n 0b00000101: rate16000,\n 0b00000110: rate22050,\n 0b00000111: rate24000,\n 0b00001000: rate32000,\n 0b00001001: rate44100,\n 0b00001010: rate48000,\n 0b00001011: rate96000,\n // 0b00001100: \"8-bit sample rate (in kHz) from end of header\",\n // 0b00001101: \"16-bit sample rate (in Hz) from end of header\",\n // 0b00001110: \"16-bit sample rate (in tens of Hz) from end of header\",\n 0b00001111: bad,\n};\n\n/* prettier-ignore */\nconst channelAssignments = {\n /*'\n 'monophonic (mono)'\n 'stereo (left, right)'\n 'linear surround (left, right, center)'\n 'quadraphonic (front left, front right, rear left, rear right)'\n '5.0 surround (front left, front right, front center, rear left, rear right)'\n '5.1 surround (front left, front right, front center, LFE, rear left, rear right)'\n '6.1 surround (front left, front right, front center, LFE, rear center, side left, side right)'\n '7.1 surround (front left, front right, front center, LFE, rear left, rear right, side left, side right)'\n */\n 0b00000000: {[channels]: 1, [description]: monophonic},\n 0b00010000: {[channels]: 2, [description]: getChannelMapping(2,channelMappings[0][0])},\n 0b00100000: {[channels]: 3, [description]: getChannelMapping(3,channelMappings[0][1])},\n 0b00110000: {[channels]: 4, [description]: getChannelMapping(4,channelMappings[1][0],channelMappings[3][0])},\n 0b01000000: {[channels]: 5, [description]: getChannelMapping(5,channelMappings[1][1],channelMappings[3][0])},\n 0b01010000: {[channels]: 6, [description]: getChannelMapping(6,channelMappings[1][1],lfe,channelMappings[3][0])},\n 0b01100000: {[channels]: 7, [description]: getChannelMapping(7,channelMappings[1][1],lfe,channelMappings[3][4],channelMappings[2][0])},\n 0b01110000: {[channels]: 8, [description]: getChannelMapping(8,channelMappings[1][1],lfe,channelMappings[3][0],channelMappings[2][0])},\n 0b10000000: {[channels]: 2, [description]: `${stereo} (left, diff)`},\n 0b10010000: {[channels]: 2, [description]: `${stereo} (diff, right)`},\n 0b10100000: {[channels]: 2, [description]: `${stereo} (avg, diff)`},\n 0b10110000: reserved,\n 0b11000000: reserved,\n 0b11010000: reserved,\n 0b11100000: reserved,\n 0b11110000: reserved,\n}\n\nconst bitDepthValues = {\n 0b00000000: getFromStreamInfo,\n 0b00000010: 8,\n 0b00000100: 12,\n 0b00000110: reserved,\n 0b00001000: 16,\n 0b00001010: 20,\n 0b00001100: 24,\n 0b00001110: reserved,\n};\n\nexport default class FLACHeader extends CodecHeader {\n // https://datatracker.ietf.org/doc/html/rfc3629#section-3\n // Char. number range | UTF-8 octet sequence\n // (hexadecimal) | (binary)\n // --------------------+---------------------------------------------\n // 0000 0000-0000 007F | 0xxxxxxx\n // 0000 0080-0000 07FF | 110xxxxx 10xxxxxx\n // 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx\n // 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n static _decodeUTF8Int(data) {\n if (data[0] > 0xfe) {\n return null; // length byte must have at least one zero as the lsb\n }\n\n if (data[0] < 0x80) return { value: data[0], length: 1 };\n\n // get length by counting the number of msb that are set to 1\n let length = 1;\n for (let zeroMask = 0x40; zeroMask & data[0]; zeroMask >>= 1) length++;\n\n let idx = length - 1,\n value = 0,\n shift = 0;\n\n // sum together the encoded bits in bytes 2 to length\n // 1110xxxx 10[cccccc] 10[bbbbbb] 10[aaaaaa]\n //\n // value = [cccccc] | [bbbbbb] | [aaaaaa]\n for (; idx > 0; shift += 6, idx--) {\n if ((data[idx] & 0xc0) !== 0x80) {\n return null; // each byte should have leading 10xxxxxx\n }\n value |= (data[idx] & 0x3f) << shift; // add the encoded bits\n }\n\n // read the final encoded bits in byte 1\n // 1110[dddd] 10[cccccc] 10[bbbbbb] 10[aaaaaa]\n //\n // value = [dddd] | [cccccc] | [bbbbbb] | [aaaaaa]\n value |= (data[idx] & (0x7f >> length)) << shift;\n\n return { value, length };\n }\n\n static [getHeaderFromUint8Array](data, headerCache) {\n const codecParserStub = {\n [readRawData]: function* () {\n return data;\n },\n };\n\n return FLACHeader[getHeader](codecParserStub, headerCache, 0).next().value;\n }\n\n static *[getHeader](codecParser, headerCache, readOffset) {\n // Must be at least 6 bytes.\n let data = yield* codecParser[readRawData](6, readOffset);\n\n // Bytes (1-2 of 6)\n // * `11111111|111110..`: Frame sync\n // * `........|......0.`: Reserved 0 - mandatory, 1 - reserved\n if (data[0] !== 0xff || !(data[1] === 0xf8 || data[1] === 0xf9)) {\n return null;\n }\n\n const header = {};\n\n // Check header cache\n const key = bytesToString(data[subarray](0, 4));\n const cachedHeader = headerCache[getHeader](key);\n\n if (!cachedHeader) {\n // Byte (2 of 6)\n // * `.......C`: Blocking strategy, 0 - fixed, 1 - variable\n header[blockingStrategyBits] = data[1] & 0b00000001;\n header[blockingStrategy] =\n blockingStrategyValues[header[blockingStrategyBits]];\n\n // Byte (3 of 6)\n // * `DDDD....`: Block size in inter-channel samples\n // * `....EEEE`: Sample rate\n header[blockSizeBits] = data[2] & 0b11110000;\n header[sampleRateBits] = data[2] & 0b00001111;\n\n header[blockSize] = blockSizeValues[header[blockSizeBits]];\n if (header[blockSize] === reserved) {\n return null;\n }\n\n header[sampleRate] = sampleRateValues[header[sampleRateBits]];\n if (header[sampleRate] === bad) {\n return null;\n }\n\n // Byte (4 of 6)\n // * `FFFF....`: Channel assignment\n // * `....GGG.`: Sample size in bits\n // * `.......H`: Reserved 0 - mandatory, 1 - reserved\n if (data[3] & 0b00000001) {\n return null;\n }\n\n const channelAssignment = channelAssignments[data[3] & 0b11110000];\n if (channelAssignment === reserved) {\n return null;\n }\n\n header[channels] = channelAssignment[channels];\n header[channelMode] = channelAssignment[description];\n\n header[bitDepth] = bitDepthValues[data[3] & 0b00001110];\n if (header[bitDepth] === reserved) {\n return null;\n }\n } else {\n Object.assign(header, cachedHeader);\n }\n\n // Byte (5...)\n // * `IIIIIIII|...`: VBR block size ? sample number : frame number\n header[length] = 5;\n\n // check if there is enough data to parse UTF8\n data = yield* codecParser[readRawData](header[length] + 8, readOffset);\n\n const decodedUtf8 = FLACHeader._decodeUTF8Int(data[subarray](4));\n if (!decodedUtf8) {\n return null;\n }\n\n if (header[blockingStrategyBits]) {\n header[sampleNumber] = decodedUtf8.value;\n } else {\n header[frameNumber] = decodedUtf8.value;\n }\n\n header[length] += decodedUtf8[length];\n\n // Byte (...)\n // * `JJJJJJJJ|(JJJJJJJJ)`: Blocksize (8/16bit custom value)\n if (header[blockSizeBits] === 0b01100000) {\n // 8 bit\n if (data[length] < header[length])\n data = yield* codecParser[readRawData](header[length], readOffset);\n\n header[blockSize] = data[header[length] - 1] + 1;\n header[length] += 1;\n } else if (header[blockSizeBits] === 0b01110000) {\n // 16 bit\n if (data[length] < header[length])\n data = yield* codecParser[readRawData](header[length], readOffset);\n\n header[blockSize] =\n (data[header[length] - 1] << 8) + data[header[length]] + 1;\n header[length] += 2;\n }\n\n header[samples] = header[blockSize];\n\n // Byte (...)\n // * `KKKKKKKK|(KKKKKKKK)`: Sample rate (8/16bit custom value)\n if (header[sampleRateBits] === 0b00001100) {\n // 8 bit\n if (data[length] < header[length])\n data = yield* codecParser[readRawData](header[length], readOffset);\n\n header[sampleRate] = data[header[length] - 1] * 1000;\n header[length] += 1;\n } else if (header[sampleRateBits] === 0b00001101) {\n // 16 bit\n if (data[length] < header[length])\n data = yield* codecParser[readRawData](header[length], readOffset);\n\n header[sampleRate] =\n (data[header[length] - 1] << 8) + data[header[length]];\n header[length] += 2;\n } else if (header[sampleRateBits] === 0b00001110) {\n // 16 bit\n if (data[length] < header[length])\n data = yield* codecParser[readRawData](header[length], readOffset);\n\n header[sampleRate] =\n ((data[header[length] - 1] << 8) + data[header[length]]) * 10;\n header[length] += 2;\n }\n\n // Byte (...)\n // * `LLLLLLLL`: CRC-8\n if (data[length] < header[length])\n data = yield* codecParser[readRawData](header[length], readOffset);\n\n header[crc] = data[header[length] - 1];\n if (header[crc] !== crc8(data[subarray](0, header[length] - 1))) {\n return null;\n }\n\n {\n if (!cachedHeader) {\n const {\n blockingStrategyBits,\n frameNumber,\n sampleNumber,\n samples,\n sampleRateBits,\n blockSizeBits,\n crc,\n length,\n ...codecUpdateFields\n } = header;\n headerCache[setHeader](key, header, codecUpdateFields);\n }\n }\n return new FLACHeader(header);\n }\n\n /**\n * @private\n * Call FLACHeader.getHeader(Array) to get instance\n */\n constructor(header) {\n super(header);\n\n this[crc16] = null; // set in FLACFrame\n this[blockingStrategy] = header[blockingStrategy];\n this[blockSize] = header[blockSize];\n this[frameNumber] = header[frameNumber];\n this[sampleNumber] = header[sampleNumber];\n this[streamInfo] = null; // set during ogg parsing\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport { frameStore, headerStore } from \"../../globals.js\";\nimport {\n length,\n pageSequenceNumber,\n data,\n codec,\n codecFrames,\n segments,\n subarray,\n readRawData,\n incrementRawData,\n mapFrameStats,\n logWarning,\n parseFrame,\n parseOggPage,\n getHeader,\n enable,\n checkFrameFooterCrc16,\n getHeaderFromUint8Array,\n} from \"../../constants.js\";\nimport Parser from \"../Parser.js\";\nimport FLACFrame from \"./FLACFrame.js\";\nimport FLACHeader from \"./FLACHeader.js\";\n\nconst MIN_FLAC_FRAME_SIZE = 2;\nconst MAX_FLAC_FRAME_SIZE = 512 * 1024;\n\nexport default class FLACParser extends Parser {\n constructor(codecParser, headerCache, onCodec) {\n super(codecParser, headerCache);\n this.Frame = FLACFrame;\n this.Header = FLACHeader;\n\n onCodec(this[codec]);\n }\n\n get [codec]() {\n return \"flac\";\n }\n\n *_getNextFrameSyncOffset(offset) {\n const data = yield* this._codecParser[readRawData](2, 0);\n const dataLength = data[length] - 2;\n\n while (offset < dataLength) {\n // * `11111111|111110..`: Frame sync\n // * `........|......0.`: Reserved 0 - mandatory, 1 - reserved\n const firstByte = data[offset];\n if (firstByte === 0xff) {\n const secondByte = data[offset + 1];\n if (secondByte === 0xf8 || secondByte === 0xf9) break;\n if (secondByte !== 0xff) offset++; // might as well check for the next sync byte\n }\n offset++;\n }\n\n return offset;\n }\n\n *[parseFrame]() {\n // find the first valid frame header\n do {\n const header = yield* FLACHeader[getHeader](\n this._codecParser,\n this._headerCache,\n 0,\n );\n\n if (header) {\n // found a valid frame header\n // find the next valid frame header\n let nextHeaderOffset =\n headerStore.get(header)[length] + MIN_FLAC_FRAME_SIZE;\n\n while (nextHeaderOffset <= MAX_FLAC_FRAME_SIZE) {\n if (\n this._codecParser._flushing ||\n (yield* FLACHeader[getHeader](\n this._codecParser,\n this._headerCache,\n nextHeaderOffset,\n ))\n ) {\n // found a valid next frame header\n let frameData = yield* this._codecParser[readRawData](\n nextHeaderOffset,\n );\n\n if (!this._codecParser._flushing)\n frameData = frameData[subarray](0, nextHeaderOffset);\n\n // check that this is actually the next header by validating the frame footer crc16\n if (FLACFrame[checkFrameFooterCrc16](frameData)) {\n // both frame headers, and frame footer crc16 are valid, we are synced (odds are pretty low of a false positive)\n const frame = new FLACFrame(frameData, header);\n\n this._headerCache[enable](); // start caching when synced\n this._codecParser[incrementRawData](nextHeaderOffset); // increment to the next frame\n this._codecParser[mapFrameStats](frame);\n\n return frame;\n }\n }\n\n nextHeaderOffset = yield* this._getNextFrameSyncOffset(\n nextHeaderOffset + 1,\n );\n }\n\n this._codecParser[logWarning](\n `Unable to sync FLAC frame after searching ${nextHeaderOffset} bytes.`,\n );\n this._codecParser[incrementRawData](nextHeaderOffset);\n } else {\n // not synced, increment data to continue syncing\n this._codecParser[incrementRawData](\n yield* this._getNextFrameSyncOffset(1),\n );\n }\n } while (true);\n }\n\n [parseOggPage](oggPage) {\n if (oggPage[pageSequenceNumber] === 0) {\n // Identification header\n\n this._headerCache[enable]();\n this._streamInfo = oggPage[data][subarray](13);\n } else if (oggPage[pageSequenceNumber] === 1) {\n // Vorbis comments\n } else {\n oggPage[codecFrames] = frameStore\n .get(oggPage)\n [segments].map((segment) => {\n const header = FLACHeader[getHeaderFromUint8Array](\n segment,\n this._headerCache,\n );\n\n if (header) {\n return new FLACFrame(segment, header, this._streamInfo);\n } else {\n this._codecParser[logWarning](\n \"Failed to parse Ogg FLAC frame\",\n \"Skipping invalid FLAC frame\",\n );\n }\n })\n .filter((frame) => !!frame);\n }\n\n return oggPage;\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\n/*\nhttps://xiph.org/ogg/doc/framing.html\n\nAAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA BBBBBBBB 00000CDE\n\n(LSB) (MSB)\nFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF\nGGGGGGGG GGGGGGGG GGGGGGGG GGGGGGGG\nHHHHHHHH HHHHHHHH HHHHHHHH HHHHHHHH\nIIIIIIII IIIIIIII IIIIIIII IIIIIIII\n\nJJJJJJJJ\nLLLLLLLL...\n\nOgg Page Header\nLetter Length (bits) Description\nA 32 0x4f676753, \"OggS\"\nB 8 stream_structure_version\nC 1 (0 no, 1 yes) last page of logical bitstream (eos)\nD 1 (0 no, 1 yes) first page of logical bitstream (bos)\nE 1 (0 no, 1 yes) continued packet\n\nF 64 absolute granule position\nG 32 stream serial number\nH 32 page sequence no\nI 32 page checksum\nJ 8 Number of page segments in the segment table\nL n Segment table (n=page_segments+26).\n Segment table values sum to the total length of the packet.\n Last value is always < 0xFF. Last lacing value will be 0x00 if evenly divisible by 0xFF.\n \n*/\n\nimport { headerStore } from \"../../globals.js\";\nimport {\n absoluteGranulePosition,\n isContinuedPacket,\n isFirstPage,\n isLastPage,\n pageSequenceNumber,\n streamSerialNumber,\n length,\n pageChecksum,\n frameLength,\n streamStructureVersion,\n pageSegmentTable,\n pageSegmentBytes,\n buffer,\n subarray,\n readRawData,\n getHeader,\n uint8Array,\n dataView,\n} from \"../../constants.js\";\n\nexport default class OggPageHeader {\n static *[getHeader](codecParser, headerCache, readOffset) {\n const header = {};\n\n // Must be at least 28 bytes.\n let data = yield* codecParser[readRawData](28, readOffset);\n\n // Bytes (1-4 of 28)\n // Frame sync (must equal OggS): `AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA`:\n if (\n data[0] !== 0x4f || // O\n data[1] !== 0x67 || // g\n data[2] !== 0x67 || // g\n data[3] !== 0x53 // S\n ) {\n return null;\n }\n\n // Byte (5 of 28)\n // * `BBBBBBBB`: stream_structure_version\n header[streamStructureVersion] = data[4];\n\n // Byte (6 of 28)\n // * `00000CDE`\n // * `00000...`: All zeros\n // * `.....C..`: (0 no, 1 yes) last page of logical bitstream (eos)\n // * `......D.`: (0 no, 1 yes) first page of logical bitstream (bos)\n // * `.......E`: (0 no, 1 yes) continued packet\n const zeros = data[5] & 0b11111000;\n if (zeros) return null;\n\n header[isLastPage] = !!(data[5] & 0b00000100);\n header[isFirstPage] = !!(data[5] & 0b00000010);\n header[isContinuedPacket] = !!(data[5] & 0b00000001);\n\n const view = new dataView(uint8Array.from(data[subarray](0, 28))[buffer]);\n\n // Byte (7-14 of 28)\n // * `FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF`\n // * Absolute Granule Position\n\n /**\n * @todo Safari does not support getBigInt64, but it also doesn't support Ogg\n */\n try {\n header[absoluteGranulePosition] = view.getBigInt64(6, true);\n } catch {}\n\n // Byte (15-18 of 28)\n // * `GGGGGGGG|GGGGGGGG|GGGGGGGG|GGGGGGGG`\n // * Stream Serial Number\n header[streamSerialNumber] = view.getInt32(14, true);\n\n // Byte (19-22 of 28)\n // * `HHHHHHHH|HHHHHHHH|HHHHHHHH|HHHHHHHH`\n // * Page Sequence Number\n header[pageSequenceNumber] = view.getInt32(18, true);\n\n // Byte (23-26 of 28)\n // * `IIIIIIII|IIIIIIII|IIIIIIII|IIIIIIII`\n // * Page Checksum\n header[pageChecksum] = view.getInt32(22, true);\n\n // Byte (27 of 28)\n // * `JJJJJJJJ`: Number of page segments in the segment table\n const pageSegmentTableLength = data[26];\n header[length] = pageSegmentTableLength + 27;\n\n data = yield* codecParser[readRawData](header[length], readOffset); // read in the page segment table\n\n header[frameLength] = 0;\n header[pageSegmentTable] = [];\n header[pageSegmentBytes] = uint8Array.from(\n data[subarray](27, header[length]),\n );\n\n for (let i = 0, segmentLength = 0; i < pageSegmentTableLength; i++) {\n const segmentByte = header[pageSegmentBytes][i];\n\n header[frameLength] += segmentByte;\n segmentLength += segmentByte;\n\n if (segmentByte !== 0xff || i === pageSegmentTableLength - 1) {\n header[pageSegmentTable].push(segmentLength);\n segmentLength = 0;\n }\n }\n\n return new OggPageHeader(header);\n }\n\n /**\n * @private\n * Call OggPageHeader.getHeader(Array) to get instance\n */\n constructor(header) {\n headerStore.set(this, header);\n\n this[absoluteGranulePosition] = header[absoluteGranulePosition];\n this[isContinuedPacket] = header[isContinuedPacket];\n this[isFirstPage] = header[isFirstPage];\n this[isLastPage] = header[isLastPage];\n this[pageSegmentTable] = header[pageSegmentTable];\n this[pageSequenceNumber] = header[pageSequenceNumber];\n this[pageChecksum] = header[pageChecksum];\n this[streamSerialNumber] = header[streamSerialNumber];\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport { headerStore, frameStore } from \"../../globals.js\";\nimport {\n codecFrames,\n rawData,\n absoluteGranulePosition,\n crc32,\n duration,\n isContinuedPacket,\n isFirstPage,\n isLastPage,\n pageSequenceNumber,\n samples,\n streamSerialNumber,\n length,\n pageChecksum,\n frameLength,\n subarray,\n readRawData,\n getFrame,\n getHeader,\n} from \"../../constants.js\";\n\nimport Frame from \"../Frame.js\";\nimport OggPageHeader from \"./OggPageHeader.js\";\n\nexport default class OggPage extends Frame {\n static *[getFrame](codecParser, headerCache, readOffset) {\n const header = yield* OggPageHeader[getHeader](\n codecParser,\n headerCache,\n readOffset,\n );\n\n if (header) {\n const frameLengthValue = headerStore.get(header)[frameLength];\n const headerLength = headerStore.get(header)[length];\n const totalLength = headerLength + frameLengthValue;\n\n const rawDataValue = (yield* codecParser[readRawData](totalLength, 0))[\n subarray\n ](0, totalLength);\n\n const frame = rawDataValue[subarray](headerLength, totalLength);\n\n return new OggPage(header, frame, rawDataValue);\n } else {\n return null;\n }\n }\n\n constructor(header, frame, rawDataValue) {\n super(header, frame);\n\n frameStore.get(this)[length] = rawDataValue[length];\n\n this[codecFrames] = [];\n this[rawData] = rawDataValue;\n this[absoluteGranulePosition] = header[absoluteGranulePosition];\n this[crc32] = header[pageChecksum];\n this[duration] = 0;\n this[isContinuedPacket] = header[isContinuedPacket];\n this[isFirstPage] = header[isFirstPage];\n this[isLastPage] = header[isLastPage];\n this[pageSequenceNumber] = header[pageSequenceNumber];\n this[samples] = 0;\n this[streamSerialNumber] = header[streamSerialNumber];\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport { sampleRate, frameCount, frameSize } from \"../../constants.js\";\nimport CodecFrame from \"../CodecFrame.js\";\n\nexport default class OpusFrame extends CodecFrame {\n constructor(data, header) {\n super(\n header,\n data,\n ((header[frameSize] * header[frameCount]) / 1000) * header[sampleRate],\n );\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\n/*\nhttps://tools.ietf.org/html/rfc7845.html\n 0 1 2 3\n 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n| 'O' | 'p' | 'u' | 's' |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n| 'H' | 'e' | 'a' | 'd' |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n| Version = 1 | Channel Count | Pre-skip |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n| Input Sample Rate (Hz) |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n| Output Gain (Q7.8 in dB) | Mapping Family| |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ :\n| |\n: Optional Channel Mapping Table... :\n| |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\nLetter Length (bits) Description\nA 64 Magic Signature - OpusHead\nB 8 Version number - 00000001\nC 8 Output channel count (unsigned)\nD 16 Pre-skip (unsigned, little endian)\nE 32 Sample rate (unsigned, little endian)\nF 16 Output Gain (signed, little endian)\nG 8 Channel Mapping family (unsigned)\n\n// if(channel mapping !== 0)\nH 8 Stream count (unsigned)\nI 8 Coupled Stream Count (unsigned)\nJ 8*C Channel Mapping\n*/\n\nimport {\n rate48000,\n vorbisOpusChannelMapping,\n bitDepth,\n channelMode,\n sampleRate,\n channels,\n length,\n bandwidth,\n channelMappingFamily,\n channelMappingTable,\n coupledStreamCount,\n frameCount,\n frameSize,\n hasOpusPadding,\n inputSampleRate,\n isVbr,\n mode,\n outputGain,\n preSkip,\n streamCount,\n data,\n buffer,\n subarray,\n getHeader,\n setHeader,\n getHeaderFromUint8Array,\n uint8Array,\n dataView,\n} from \"../../constants.js\";\nimport { bytesToString } from \"../../utilities.js\";\n\nimport CodecHeader from \"../CodecHeader.js\";\n\n/* prettier-ignore */\nconst channelMappingFamilies = {\n 0b00000000: vorbisOpusChannelMapping.slice(0,2),\n /*\n 0: \"monophonic (mono)\"\n 1: \"stereo (left, right)\"\n */\n 0b00000001: vorbisOpusChannelMapping\n /*\n 0: \"monophonic (mono)\"\n 1: \"stereo (left, right)\"\n 2: \"linear surround (left, center, right)\"\n 3: \"quadraphonic (front left, front right, rear left, rear right)\"\n 4: \"5.0 surround (front left, front center, front right, rear left, rear right)\"\n 5: \"5.1 surround (front left, front center, front right, rear left, rear right, LFE)\"\n 6: \"6.1 surround (front left, front center, front right, side left, side right, rear center, LFE)\"\n 7: \"7.1 surround (front left, front center, front right, side left, side right, rear left, rear right, LFE)\"\n */\n // additional channel mappings are user defined\n};\n\nconst silkOnly = \"SILK-only\";\nconst celtOnly = \"CELT-only\";\nconst hybrid = \"Hybrid\";\n\nconst narrowBand = \"narrowband\";\nconst mediumBand = \"medium-band\";\nconst wideBand = \"wideband\";\nconst superWideBand = \"super-wideband\";\nconst fullBand = \"fullband\";\n\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// | config |s| c |\n// +-+-+-+-+-+-+-+-+\n// prettier-ignore\nconst configTable = {\n 0b00000000: { [mode]: silkOnly, [bandwidth]: narrowBand, [frameSize]: 10 },\n 0b00001000: { [mode]: silkOnly, [bandwidth]: narrowBand, [frameSize]: 20 },\n 0b00010000: { [mode]: silkOnly, [bandwidth]: narrowBand, [frameSize]: 40 },\n 0b00011000: { [mode]: silkOnly, [bandwidth]: narrowBand, [frameSize]: 60 },\n 0b00100000: { [mode]: silkOnly, [bandwidth]: mediumBand, [frameSize]: 10 },\n 0b00101000: { [mode]: silkOnly, [bandwidth]: mediumBand, [frameSize]: 20 },\n 0b00110000: { [mode]: silkOnly, [bandwidth]: mediumBand, [frameSize]: 40 },\n 0b00111000: { [mode]: silkOnly, [bandwidth]: mediumBand, [frameSize]: 60 },\n 0b01000000: { [mode]: silkOnly, [bandwidth]: wideBand, [frameSize]: 10 },\n 0b01001000: { [mode]: silkOnly, [bandwidth]: wideBand, [frameSize]: 20 },\n 0b01010000: { [mode]: silkOnly, [bandwidth]: wideBand, [frameSize]: 40 },\n 0b01011000: { [mode]: silkOnly, [bandwidth]: wideBand, [frameSize]: 60 },\n 0b01100000: { [mode]: hybrid, [bandwidth]: superWideBand, [frameSize]: 10 },\n 0b01101000: { [mode]: hybrid, [bandwidth]: superWideBand, [frameSize]: 20 },\n 0b01110000: { [mode]: hybrid, [bandwidth]: fullBand, [frameSize]: 10 },\n 0b01111000: { [mode]: hybrid, [bandwidth]: fullBand, [frameSize]: 20 },\n 0b10000000: { [mode]: celtOnly, [bandwidth]: narrowBand, [frameSize]: 2.5 },\n 0b10001000: { [mode]: celtOnly, [bandwidth]: narrowBand, [frameSize]: 5 },\n 0b10010000: { [mode]: celtOnly, [bandwidth]: narrowBand, [frameSize]: 10 },\n 0b10011000: { [mode]: celtOnly, [bandwidth]: narrowBand, [frameSize]: 20 },\n 0b10100000: { [mode]: celtOnly, [bandwidth]: wideBand, [frameSize]: 2.5 },\n 0b10101000: { [mode]: celtOnly, [bandwidth]: wideBand, [frameSize]: 5 },\n 0b10110000: { [mode]: celtOnly, [bandwidth]: wideBand, [frameSize]: 10 },\n 0b10111000: { [mode]: celtOnly, [bandwidth]: wideBand, [frameSize]: 20 },\n 0b11000000: { [mode]: celtOnly, [bandwidth]: superWideBand, [frameSize]: 2.5 },\n 0b11001000: { [mode]: celtOnly, [bandwidth]: superWideBand, [frameSize]: 5 },\n 0b11010000: { [mode]: celtOnly, [bandwidth]: superWideBand, [frameSize]: 10 },\n 0b11011000: { [mode]: celtOnly, [bandwidth]: superWideBand, [frameSize]: 20 },\n 0b11100000: { [mode]: celtOnly, [bandwidth]: fullBand, [frameSize]: 2.5 },\n 0b11101000: { [mode]: celtOnly, [bandwidth]: fullBand, [frameSize]: 5 },\n 0b11110000: { [mode]: celtOnly, [bandwidth]: fullBand, [frameSize]: 10 },\n 0b11111000: { [mode]: celtOnly, [bandwidth]: fullBand, [frameSize]: 20 },\n};\n\nexport default class OpusHeader extends CodecHeader {\n static [getHeaderFromUint8Array](dataValue, packetData, headerCache) {\n const header = {};\n\n // get length of header\n // Byte (10 of 19)\n // * `CCCCCCCC`: Channel Count\n header[channels] = dataValue[9];\n // Byte (19 of 19)\n // * `GGGGGGGG`: Channel Mapping Family\n header[channelMappingFamily] = dataValue[18];\n\n header[length] =\n header[channelMappingFamily] !== 0 ? 21 + header[channels] : 19;\n\n if (dataValue[length] < header[length])\n throw new Error(\"Out of data while inside an Ogg Page\");\n\n // Page Segment Bytes (1-2)\n // * `AAAAA...`: Packet config\n // * `.....B..`:\n // * `......CC`: Packet code\n const packetMode = packetData[0] & 0b00000011;\n const packetLength = packetMode === 3 ? 2 : 1;\n\n // Check header cache\n const key =\n bytesToString(dataValue[subarray](0, header[length])) +\n bytesToString(packetData[subarray](0, packetLength));\n const cachedHeader = headerCache[getHeader](key);\n\n if (cachedHeader) return new OpusHeader(cachedHeader);\n\n // Bytes (1-8 of 19): OpusHead - Magic Signature\n if (key.substr(0, 8) !== \"OpusHead\") {\n return null;\n }\n\n // Byte (9 of 19)\n // * `00000001`: Version number\n if (dataValue[8] !== 1) return null;\n\n header[data] = uint8Array.from(dataValue[subarray](0, header[length]));\n\n const view = new dataView(header[data][buffer]);\n\n header[bitDepth] = 16;\n\n // Byte (10 of 19)\n // * `CCCCCCCC`: Channel Count\n // set earlier to determine length\n\n // Byte (11-12 of 19)\n // * `DDDDDDDD|DDDDDDDD`: Pre skip\n header[preSkip] = view.getUint16(10, true);\n\n // Byte (13-16 of 19)\n // * `EEEEEEEE|EEEEEEEE|EEEEEEEE|EEEEEEEE`: Sample Rate\n header[inputSampleRate] = view.getUint32(12, true);\n // Opus is always decoded at 48kHz\n header[sampleRate] = rate48000;\n\n // Byte (17-18 of 19)\n // * `FFFFFFFF|FFFFFFFF`: Output Gain\n header[outputGain] = view.getInt16(16, true);\n\n // Byte (19 of 19)\n // * `GGGGGGGG`: Channel Mapping Family\n // set earlier to determine length\n if (header[channelMappingFamily] in channelMappingFamilies) {\n header[channelMode] =\n channelMappingFamilies[header[channelMappingFamily]][\n header[channels] - 1\n ];\n if (!header[channelMode]) return null;\n }\n\n if (header[channelMappingFamily] !== 0) {\n // * `HHHHHHHH`: Stream count\n header[streamCount] = dataValue[19];\n\n // * `IIIIIIII`: Coupled Stream count\n header[coupledStreamCount] = dataValue[20];\n\n // * `JJJJJJJJ|...` Channel Mapping table\n header[channelMappingTable] = [\n ...dataValue[subarray](21, header[channels] + 21),\n ];\n }\n\n const packetConfig = configTable[0b11111000 & packetData[0]];\n header[mode] = packetConfig[mode];\n header[bandwidth] = packetConfig[bandwidth];\n header[frameSize] = packetConfig[frameSize];\n\n // https://tools.ietf.org/html/rfc6716#appendix-B\n switch (packetMode) {\n case 0:\n // 0: 1 frame in the packet\n header[frameCount] = 1;\n break;\n case 1:\n // 1: 2 frames in the packet, each with equal compressed size\n case 2:\n // 2: 2 frames in the packet, with different compressed sizes\n header[frameCount] = 2;\n break;\n case 3:\n // 3: an arbitrary number of frames in the packet\n header[isVbr] = !!(0b10000000 & packetData[1]);\n header[hasOpusPadding] = !!(0b01000000 & packetData[1]);\n header[frameCount] = 0b00111111 & packetData[1];\n break;\n default:\n return null;\n }\n\n // set header cache\n {\n const {\n length,\n data: headerData,\n channelMappingFamily,\n ...codecUpdateFields\n } = header;\n\n headerCache[setHeader](key, header, codecUpdateFields);\n }\n\n return new OpusHeader(header);\n }\n\n /**\n * @private\n * Call OpusHeader.getHeader(Array) to get instance\n */\n constructor(header) {\n super(header);\n\n this[data] = header[data];\n this[bandwidth] = header[bandwidth];\n this[channelMappingFamily] = header[channelMappingFamily];\n this[channelMappingTable] = header[channelMappingTable];\n this[coupledStreamCount] = header[coupledStreamCount];\n this[frameCount] = header[frameCount];\n this[frameSize] = header[frameSize];\n this[hasOpusPadding] = header[hasOpusPadding];\n this[inputSampleRate] = header[inputSampleRate];\n this[isVbr] = header[isVbr];\n this[mode] = header[mode];\n this[outputGain] = header[outputGain];\n this[preSkip] = header[preSkip];\n this[streamCount] = header[streamCount];\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport { frameStore } from \"../../globals.js\";\nimport {\n codecFrames,\n data,\n pageSequenceNumber,\n codec,\n segments,\n logError,\n parseOggPage,\n enable,\n getHeaderFromUint8Array,\n} from \"../../constants.js\";\nimport Parser from \"../Parser.js\";\nimport OpusFrame from \"./OpusFrame.js\";\nimport OpusHeader from \"./OpusHeader.js\";\n\nexport default class OpusParser extends Parser {\n constructor(codecParser, headerCache, onCodec) {\n super(codecParser, headerCache);\n this.Frame = OpusFrame;\n this.Header = OpusHeader;\n\n onCodec(this[codec]);\n this._identificationHeader = null;\n }\n\n get [codec]() {\n return \"opus\";\n }\n\n /**\n * @todo implement continued page support\n */\n [parseOggPage](oggPage) {\n if (oggPage[pageSequenceNumber] === 0) {\n // Identification header\n\n this._headerCache[enable]();\n this._identificationHeader = oggPage[data];\n } else if (oggPage[pageSequenceNumber] === 1) {\n // OpusTags\n } else {\n oggPage[codecFrames] = frameStore\n .get(oggPage)\n [segments].map((segment) => {\n const header = OpusHeader[getHeaderFromUint8Array](\n this._identificationHeader,\n segment,\n this._headerCache,\n );\n\n if (header) return new OpusFrame(segment, header);\n\n this._codecParser[logError](\n \"Failed to parse Ogg Opus Header\",\n \"Not a valid Ogg Opus file\",\n );\n });\n }\n\n return oggPage;\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport CodecFrame from \"../CodecFrame.js\";\n\nexport default class VorbisFrame extends CodecFrame {\n constructor(data, header, samples) {\n super(header, data, samples);\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\n/*\n\n1 1) [packet_type] : 8 bit value\n2 2) 0x76, 0x6f, 0x72, 0x62, 0x69, 0x73: the characters ’v’,’o’,’r’,’b’,’i’,’s’ as six octets\n\nLetter bits Description\nA 8 Packet type\nB 48 Magic signature (vorbis)\nC 32 Version number\nD 8 Channels\nE 32 Sample rate\nF 32 Bitrate Maximum (signed)\nG 32 Bitrate Nominal (signed)\nH 32 Bitrate Minimum (signed)\nI 4 blocksize 1\nJ 4 blocksize 0\nK 1 Framing flag\n*/\n\nimport {\n vorbisOpusChannelMapping,\n bitDepth,\n channelMode,\n sampleRate,\n channels,\n length,\n bitrateMaximum,\n bitrateMinimum,\n bitrateNominal,\n blocksize0,\n blocksize1,\n data,\n vorbisComments,\n vorbisSetup,\n version,\n buffer,\n subarray,\n getHeader,\n setHeader,\n getHeaderFromUint8Array,\n uint8Array,\n dataView,\n} from \"../../constants.js\";\nimport { bytesToString } from \"../../utilities.js\";\n\nimport CodecHeader from \"../CodecHeader.js\";\n\nconst blockSizes = {\n // 0b0110: 64,\n // 0b0111: 128,\n // 0b1000: 256,\n // 0b1001: 512,\n // 0b1010: 1024,\n // 0b1011: 2048,\n // 0b1100: 4096,\n // 0b1101: 8192\n};\nfor (let i = 0; i < 8; i++) blockSizes[i + 6] = 2 ** (6 + i);\n\nexport default class VorbisHeader extends CodecHeader {\n static [getHeaderFromUint8Array](\n dataValue,\n headerCache,\n vorbisCommentsData,\n vorbisSetupData,\n ) {\n // Must be at least 30 bytes.\n if (dataValue[length] < 30)\n throw new Error(\"Out of data while inside an Ogg Page\");\n\n // Check header cache\n const key = bytesToString(dataValue[subarray](0, 30));\n const cachedHeader = headerCache[getHeader](key);\n if (cachedHeader) return new VorbisHeader(cachedHeader);\n\n const header = { [length]: 30 };\n\n // Bytes (1-7 of 30): /01vorbis - Magic Signature\n if (key.substr(0, 7) !== \"\\x01vorbis\") {\n return null;\n }\n\n header[data] = uint8Array.from(dataValue[subarray](0, 30));\n const view = new dataView(header[data][buffer]);\n\n // Byte (8-11 of 30)\n // * `CCCCCCCC|CCCCCCCC|CCCCCCCC|CCCCCCCC`: Version number\n header[version] = view.getUint32(7, true);\n if (header[version] !== 0) return null;\n\n // Byte (12 of 30)\n // * `DDDDDDDD`: Channel Count\n header[channels] = dataValue[11];\n header[channelMode] =\n vorbisOpusChannelMapping[header[channels] - 1] || \"application defined\";\n\n // Byte (13-16 of 30)\n // * `EEEEEEEE|EEEEEEEE|EEEEEEEE|EEEEEEEE`: Sample Rate\n header[sampleRate] = view.getUint32(12, true);\n\n // Byte (17-20 of 30)\n // * `FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF`: Bitrate Maximum\n header[bitrateMaximum] = view.getInt32(16, true);\n\n // Byte (21-24 of 30)\n // * `GGGGGGGG|GGGGGGGG|GGGGGGGG|GGGGGGGG`: Bitrate Nominal\n header[bitrateNominal] = view.getInt32(20, true);\n\n // Byte (25-28 of 30)\n // * `HHHHHHHH|HHHHHHHH|HHHHHHHH|HHHHHHHH`: Bitrate Minimum\n header[bitrateMinimum] = view.getInt32(24, true);\n\n // Byte (29 of 30)\n // * `IIII....` Blocksize 1\n // * `....JJJJ` Blocksize 0\n header[blocksize1] = blockSizes[(dataValue[28] & 0b11110000) >> 4];\n header[blocksize0] = blockSizes[dataValue[28] & 0b00001111];\n if (header[blocksize0] > header[blocksize1]) return null;\n\n // Byte (29 of 30)\n // * `00000001` Framing bit\n if (dataValue[29] !== 0x01) return null;\n\n header[bitDepth] = 32;\n header[vorbisSetup] = vorbisSetupData;\n header[vorbisComments] = vorbisCommentsData;\n\n {\n // set header cache\n const {\n length,\n data,\n version,\n vorbisSetup,\n vorbisComments,\n ...codecUpdateFields\n } = header;\n headerCache[setHeader](key, header, codecUpdateFields);\n }\n\n return new VorbisHeader(header);\n }\n\n /**\n * @private\n * Call VorbisHeader.getHeader(Array) to get instance\n */\n constructor(header) {\n super(header);\n\n this[bitrateMaximum] = header[bitrateMaximum];\n this[bitrateMinimum] = header[bitrateMinimum];\n this[bitrateNominal] = header[bitrateNominal];\n this[blocksize0] = header[blocksize0];\n this[blocksize1] = header[blocksize1];\n this[data] = header[data];\n this[vorbisComments] = header[vorbisComments];\n this[vorbisSetup] = header[vorbisSetup];\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport { frameStore } from \"../../globals.js\";\nimport { BitReader, reverse } from \"../../utilities.js\";\nimport {\n data,\n codec,\n blocksize0,\n blocksize1,\n codecFrames,\n segments,\n vorbis,\n logWarning,\n parseOggPage,\n enable,\n getHeaderFromUint8Array,\n} from \"../../constants.js\";\n\nimport Parser from \"../Parser.js\";\nimport VorbisFrame from \"./VorbisFrame.js\";\nimport VorbisHeader from \"./VorbisHeader.js\";\n\nexport default class VorbisParser extends Parser {\n constructor(codecParser, headerCache, onCodec) {\n super(codecParser, headerCache);\n this.Frame = VorbisFrame;\n\n onCodec(this[codec]);\n\n this._identificationHeader = null;\n this._setupComplete = false;\n\n this._prevBlockSize = null;\n }\n\n get [codec]() {\n return vorbis;\n }\n\n [parseOggPage](oggPage) {\n oggPage[codecFrames] = [];\n\n for (const oggPageSegment of frameStore.get(oggPage)[segments]) {\n if (oggPageSegment[0] === 1) {\n // Identification header\n\n this._headerCache[enable]();\n this._identificationHeader = oggPage[data];\n this._setupComplete = false;\n } else if (oggPageSegment[0] === 3) {\n // comment header\n\n this._vorbisComments = oggPageSegment;\n } else if (oggPageSegment[0] === 5) {\n // setup header\n\n this._vorbisSetup = oggPageSegment;\n this._mode = this._parseSetupHeader(oggPageSegment);\n this._setupComplete = true;\n } else if (this._setupComplete) {\n const header = VorbisHeader[getHeaderFromUint8Array](\n this._identificationHeader,\n this._headerCache,\n this._vorbisComments,\n this._vorbisSetup,\n );\n\n if (header) {\n oggPage[codecFrames].push(\n new VorbisFrame(\n oggPageSegment,\n header,\n this._getSamples(oggPageSegment, header),\n ),\n );\n } else {\n this._codecParser[logError](\n \"Failed to parse Ogg Vorbis Header\",\n \"Not a valid Ogg Vorbis file\",\n );\n }\n }\n }\n\n return oggPage;\n }\n\n _getSamples(segment, header) {\n const blockFlag =\n this._mode.blockFlags[(segment[0] >> 1) & this._mode.mask];\n\n const currentBlockSize = blockFlag\n ? header[blocksize1]\n : header[blocksize0];\n\n // data is not returned on the first frame, but is used to prime the decoder\n // https://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-590004\n const samplesValue =\n this._prevBlockSize === null\n ? 0\n : (this._prevBlockSize + currentBlockSize) / 4;\n\n this._prevBlockSize = currentBlockSize;\n\n return samplesValue;\n }\n\n // https://gitlab.xiph.org/xiph/liboggz/-/blob/master/src/liboggz/oggz_auto.c#L911\n // https://github.com/FFmpeg/FFmpeg/blob/master/libavcodec/vorbis_parser.c\n /*\n * This is the format of the mode data at the end of the packet for all\n * Vorbis Version 1 :\n *\n * [ 6:number_of_modes ]\n * [ 1:size | 16:window_type(0) | 16:transform_type(0) | 8:mapping ]\n * [ 1:size | 16:window_type(0) | 16:transform_type(0) | 8:mapping ]\n * [ 1:size | 16:window_type(0) | 16:transform_type(0) | 8:mapping ]\n * [ 1:framing(1) ]\n *\n * e.g.:\n *\n * MsB LsB\n * <-\n * 0 0 0 0 0 1 0 0\n * 0 0 1 0 0 0 0 0\n * 0 0 1 0 0 0 0 0\n * 0 0 1|0 0 0 0 0\n * 0 0 0 0|0|0 0 0\n * 0 0 0 0 0 0 0 0\n * 0 0 0 0|0 0 0 0\n * 0 0 0 0 0 0 0 0\n * 0 0 0 0|0 0 0 0\n * 0 0 0|1|0 0 0 0 |\n * 0 0 0 0 0 0 0 0 V\n * 0 0 0|0 0 0 0 0\n * 0 0 0 0 0 0 0 0\n * 0 0|1 0 0 0 0 0\n *\n * The simplest way to approach this is to start at the end\n * and read backwards to determine the mode configuration.\n *\n * liboggz and ffmpeg both use this method.\n */\n _parseSetupHeader(setup) {\n const bitReader = new BitReader(setup);\n const mode = {\n count: 0,\n blockFlags: [],\n };\n\n // sync with the framing bit\n while ((bitReader.read(1) & 0x01) !== 1) {}\n\n let modeBits;\n // search in reverse to parse out the mode entries\n // limit mode count to 63 so previous block flag will be in first packet byte\n while (mode.count < 64 && bitReader.position > 0) {\n reverse(bitReader.read(8)); // read mapping\n\n // 16 bits transform type, 16 bits window type, all values must be zero\n let currentByte = 0;\n while (bitReader.read(8) === 0x00 && currentByte++ < 3) {} // a non-zero value may indicate the end of the mode entries, or invalid data\n\n if (currentByte === 4) {\n // transform type and window type were all zeros\n modeBits = bitReader.read(7); // modeBits may need to be used in the next iteration if this is the last mode entry\n mode.blockFlags.unshift(modeBits & 0x01); // read and store mode number -> block flag\n bitReader.position += 6; // go back 6 bits so next iteration starts right after the block flag\n mode.count++;\n } else {\n // transform type and window type were not all zeros\n // check for mode count using previous iteration modeBits\n if (((reverse(modeBits) & 0b01111110) >> 1) + 1 !== mode.count) {\n this._codecParser[logWarning](\n \"vorbis derived mode count did not match actual mode count\",\n );\n }\n\n break;\n }\n }\n\n // xxxxxxxa packet type\n // xxxxxxbx mode count (number of mode count bits)\n // xxxxxcxx previous window flag\n // xxxxdxxx next window flag\n mode.mask = (1 << Math.log2(mode.count)) - 1;\n\n return mode;\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport { headerStore, frameStore } from \"../../globals.js\";\nimport { bytesToString, concatBuffers } from \"../../utilities.js\";\nimport {\n header,\n pageSequenceNumber,\n pageSegmentBytes,\n pageSegmentTable,\n codec,\n data,\n length,\n segments,\n subarray,\n vorbis,\n mapFrameStats,\n logWarning,\n fixedLengthFrameSync,\n parseFrame,\n parseOggPage,\n reset,\n uint8Array,\n isLastPage,\n streamSerialNumber,\n} from \"../../constants.js\";\n\nimport Parser from \"../../codecs/Parser.js\";\nimport OggPage from \"./OggPage.js\";\nimport OggPageHeader from \"./OggPageHeader.js\";\n\nimport FLACParser from \"../../codecs/flac/FLACParser.js\";\nimport OpusParser from \"../../codecs/opus/OpusParser.js\";\nimport VorbisParser from \"../../codecs/vorbis/VorbisParser.js\";\n\nclass OggStream {\n constructor(codecParser, headerCache, onCodec) {\n this._codecParser = codecParser;\n this._headerCache = headerCache;\n this._onCodec = onCodec;\n\n this._continuedPacket = new uint8Array();\n this._codec = null;\n this._isSupported = null;\n }\n\n get [codec]() {\n return this._codec || \"\";\n }\n\n _updateCodec(codec, Parser) {\n if (this._codec !== codec) {\n this._headerCache[reset]();\n this._parser = new Parser(\n this._codecParser,\n this._headerCache,\n this._onCodec,\n );\n this._codec = codec;\n }\n }\n\n _checkCodecSupport({ data }) {\n const idString = bytesToString(data[subarray](0, 8));\n\n switch (idString) {\n case \"fishead\\0\":\n return false; // ignore ogg skeleton packets\n case \"OpusHead\":\n this._updateCodec(\"opus\", OpusParser);\n return true;\n case /^\\x7fFLAC/.test(idString) && idString:\n this._updateCodec(\"flac\", FLACParser);\n return true;\n case /^\\x01vorbis/.test(idString) && idString:\n this._updateCodec(vorbis, VorbisParser);\n return true;\n default:\n return false;\n }\n }\n\n _checkPageSequenceNumber(oggPage) {\n if (\n oggPage[pageSequenceNumber] !== this._pageSequenceNumber + 1 &&\n this._pageSequenceNumber > 1 &&\n oggPage[pageSequenceNumber] > 1\n ) {\n this._codecParser[logWarning](\n \"Unexpected gap in Ogg Page Sequence Number.\",\n `Expected: ${this._pageSequenceNumber + 1}, Got: ${\n oggPage[pageSequenceNumber]\n }`,\n );\n }\n\n this._pageSequenceNumber = oggPage[pageSequenceNumber];\n }\n\n _parsePage(oggPage) {\n if (this._isSupported === null) {\n this._pageSequenceNumber = oggPage[pageSequenceNumber];\n this._isSupported = this._checkCodecSupport(oggPage);\n }\n\n this._checkPageSequenceNumber(oggPage);\n\n const oggPageStore = frameStore.get(oggPage);\n const headerData = headerStore.get(oggPageStore[header]);\n\n let offset = 0;\n oggPageStore[segments] = headerData[pageSegmentTable].map((segmentLength) =>\n oggPage[data][subarray](offset, (offset += segmentLength)),\n );\n\n // prepend any existing continued packet data\n if (this._continuedPacket[length]) {\n oggPageStore[segments][0] = concatBuffers(\n this._continuedPacket,\n oggPageStore[segments][0],\n );\n\n this._continuedPacket = new uint8Array();\n }\n\n // save any new continued packet data\n if (\n headerData[pageSegmentBytes][headerData[pageSegmentBytes][length] - 1] ===\n 0xff\n ) {\n this._continuedPacket = concatBuffers(\n this._continuedPacket,\n oggPageStore[segments].pop(),\n );\n }\n\n if (this._isSupported) {\n const frame = this._parser[parseOggPage](oggPage);\n this._codecParser[mapFrameStats](frame);\n\n return frame;\n } else {\n return oggPage;\n }\n }\n}\n\nexport default class OggParser extends Parser {\n constructor(codecParser, headerCache, onCodec) {\n super(codecParser, headerCache);\n\n this._onCodec = onCodec;\n this.Frame = OggPage;\n this.Header = OggPageHeader;\n\n this._streams = new Map();\n this._currentSerialNumber = null;\n }\n\n get [codec]() {\n const oggStream = this._streams.get(this._currentSerialNumber);\n\n return oggStream ? oggStream.codec : \"\";\n }\n\n *[parseFrame]() {\n const oggPage = yield* this[fixedLengthFrameSync](true);\n this._currentSerialNumber = oggPage[streamSerialNumber];\n\n let oggStream = this._streams.get(this._currentSerialNumber);\n if (!oggStream) {\n oggStream = new OggStream(\n this._codecParser,\n this._headerCache,\n this._onCodec,\n );\n this._streams.set(this._currentSerialNumber, oggStream);\n }\n\n if (oggPage[isLastPage]) this._streams.delete(this._currentSerialNumber);\n\n return oggStream._parsePage(oggPage);\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport { crc32Function, concatBuffers } from \"./utilities.js\";\nimport {\n header,\n sampleRate,\n bitrate,\n length,\n frameNumber,\n data,\n samples,\n codec,\n codecFrames,\n totalBytesOut,\n totalSamples,\n totalDuration,\n crc32,\n duration,\n subarray,\n readRawData,\n incrementRawData,\n mapCodecFrameStats,\n mapFrameStats,\n logWarning,\n logError,\n parseFrame,\n checkCodecUpdate,\n reset,\n} from \"./constants.js\";\nimport HeaderCache from \"./codecs/HeaderCache.js\";\nimport MPEGParser from \"./codecs/mpeg/MPEGParser.js\";\nimport AACParser from \"./codecs/aac/AACParser.js\";\nimport FLACParser from \"./codecs/flac/FLACParser.js\";\nimport OggParser from \"./containers/ogg/OggParser.js\";\n\nconst noOp = () => {};\n\nexport default class CodecParser {\n constructor(\n mimeType,\n {\n onCodec,\n onCodecHeader,\n onCodecUpdate,\n enableLogging = false,\n enableFrameCRC32 = true,\n } = {},\n ) {\n this._inputMimeType = mimeType;\n this._onCodec = onCodec || noOp;\n this._onCodecHeader = onCodecHeader || noOp;\n this._onCodecUpdate = onCodecUpdate;\n this._enableLogging = enableLogging;\n this._crc32 = enableFrameCRC32 ? crc32Function : noOp;\n\n this[reset]();\n }\n\n /**\n * @public\n * @returns The detected codec\n */\n get [codec]() {\n return this._parser ? this._parser[codec] : \"\";\n }\n\n [reset]() {\n this._headerCache = new HeaderCache(\n this._onCodecHeader,\n this._onCodecUpdate,\n );\n\n this._generator = this._getGenerator();\n this._generator.next();\n }\n\n /**\n * @public\n * @description Generator function that yields any buffered CodecFrames and resets the CodecParser\n * @returns {Iterable} Iterator that operates over the codec data.\n * @yields {CodecFrame|OggPage} Parsed codec or ogg page data\n */\n *flush() {\n this._flushing = true;\n\n for (let i = this._generator.next(); i.value; i = this._generator.next()) {\n yield i.value;\n }\n\n this._flushing = false;\n\n this[reset]();\n }\n\n /**\n * @public\n * @description Generator function takes in a Uint8Array of data and returns a CodecFrame from the data for each iteration\n * @param {Uint8Array} chunk Next chunk of codec data to read\n * @returns {Iterable} Iterator that operates over the codec data.\n * @yields {CodecFrame|OggPage} Parsed codec or ogg page data\n */\n *parseChunk(chunk) {\n for (\n let i = this._generator.next(chunk);\n i.value;\n i = this._generator.next()\n ) {\n yield i.value;\n }\n }\n\n /**\n * @public\n * @description Parses an entire file and returns all of the contained frames.\n * @param {Uint8Array} fileData Coded data to read\n * @returns {Array} CodecFrames\n */\n parseAll(fileData) {\n return [...this.parseChunk(fileData), ...this.flush()];\n }\n\n /**\n * @private\n */\n *_getGenerator() {\n if (this._inputMimeType.match(/aac/)) {\n this._parser = new AACParser(this, this._headerCache, this._onCodec);\n } else if (this._inputMimeType.match(/mpeg/)) {\n this._parser = new MPEGParser(this, this._headerCache, this._onCodec);\n } else if (this._inputMimeType.match(/flac/)) {\n this._parser = new FLACParser(this, this._headerCache, this._onCodec);\n } else if (this._inputMimeType.match(/ogg/)) {\n this._parser = new OggParser(this, this._headerCache, this._onCodec);\n } else {\n throw new Error(`Unsupported Codec ${mimeType}`);\n }\n\n this._frameNumber = 0;\n this._currentReadPosition = 0;\n this._totalBytesIn = 0;\n this._totalBytesOut = 0;\n this._totalSamples = 0;\n this._sampleRate = undefined;\n\n this._rawData = new Uint8Array(0);\n\n // start parsing out frames\n while (true) {\n const frame = yield* this._parser[parseFrame]();\n if (frame) yield frame;\n }\n }\n\n /**\n * @protected\n * @param {number} minSize Minimum bytes to have present in buffer\n * @returns {Uint8Array} rawData\n */\n *[readRawData](minSize = 0, readOffset = 0) {\n let rawData;\n\n while (this._rawData[length] <= minSize + readOffset) {\n rawData = yield;\n\n if (this._flushing) return this._rawData[subarray](readOffset);\n\n if (rawData) {\n this._totalBytesIn += rawData[length];\n this._rawData = concatBuffers(this._rawData, rawData);\n }\n }\n\n return this._rawData[subarray](readOffset);\n }\n\n /**\n * @protected\n * @param {number} increment Bytes to increment codec data\n */\n [incrementRawData](increment) {\n this._currentReadPosition += increment;\n this._rawData = this._rawData[subarray](increment);\n }\n\n /**\n * @protected\n */\n [mapCodecFrameStats](frame) {\n this._sampleRate = frame[header][sampleRate];\n\n frame[header][bitrate] =\n frame[duration] > 0\n ? Math.round(frame[data][length] / frame[duration]) * 8\n : 0;\n frame[frameNumber] = this._frameNumber++;\n frame[totalBytesOut] = this._totalBytesOut;\n frame[totalSamples] = this._totalSamples;\n frame[totalDuration] = (this._totalSamples / this._sampleRate) * 1000;\n frame[crc32] = this._crc32(frame[data]);\n\n this._headerCache[checkCodecUpdate](\n frame[header][bitrate],\n frame[totalDuration],\n );\n\n this._totalBytesOut += frame[data][length];\n this._totalSamples += frame[samples];\n }\n\n /**\n * @protected\n */\n [mapFrameStats](frame) {\n if (frame[codecFrames]) {\n // Ogg container\n frame[codecFrames].forEach((codecFrame) => {\n frame[duration] += codecFrame[duration];\n frame[samples] += codecFrame[samples];\n this[mapCodecFrameStats](codecFrame);\n });\n\n frame[totalSamples] = this._totalSamples;\n frame[totalDuration] =\n (this._totalSamples / this._sampleRate) * 1000 || 0;\n frame[totalBytesOut] = this._totalBytesOut;\n } else {\n this[mapCodecFrameStats](frame);\n }\n }\n\n /**\n * @private\n */\n _log(logger, messages) {\n if (this._enableLogging) {\n const stats = [\n `${codec}: ${this[codec]}`,\n `inputMimeType: ${this._inputMimeType}`,\n `readPosition: ${this._currentReadPosition}`,\n `totalBytesIn: ${this._totalBytesIn}`,\n `${totalBytesOut}: ${this._totalBytesOut}`,\n ];\n\n const width = Math.max(...stats.map((s) => s[length]));\n\n messages.push(\n `--stats--${\"-\".repeat(width - 9)}`,\n ...stats,\n \"-\".repeat(width),\n );\n\n logger(\n \"codec-parser\",\n messages.reduce((acc, message) => acc + \"\\n \" + message, \"\"),\n );\n }\n }\n\n /**\n * @protected\n */\n [logWarning](...messages) {\n this._log(console.warn, messages);\n }\n\n /**\n * @protected\n */\n [logError](...messages) {\n this._log(console.error, messages);\n }\n}\n","import CodecParser from \"./src/CodecParser.js\";\nimport * as constants from \"./src/constants.js\";\n\nexport default CodecParser;\n\nexport const absoluteGranulePosition = constants.absoluteGranulePosition;\nexport const bandwidth = constants.bandwidth;\nexport const bitDepth = constants.bitDepth;\nexport const bitrate = constants.bitrate;\nexport const bitrateMaximum = constants.bitrateMaximum;\nexport const bitrateMinimum = constants.bitrateMinimum;\nexport const bitrateNominal = constants.bitrateNominal;\nexport const buffer = constants.buffer;\nexport const bufferFullness = constants.bufferFullness;\nexport const codec = constants.codec;\nexport const codecFrames = constants.codecFrames;\nexport const coupledStreamCount = constants.coupledStreamCount;\nexport const crc = constants.crc;\nexport const crc16 = constants.crc16;\nexport const crc32 = constants.crc32;\nexport const data = constants.data;\nexport const description = constants.description;\nexport const duration = constants.duration;\nexport const emphasis = constants.emphasis;\nexport const hasOpusPadding = constants.hasOpusPadding;\nexport const header = constants.header;\nexport const isContinuedPacket = constants.isContinuedPacket;\nexport const isCopyrighted = constants.isCopyrighted;\nexport const isFirstPage = constants.isFirstPage;\nexport const isHome = constants.isHome;\nexport const isLastPage = constants.isLastPage;\nexport const isOriginal = constants.isOriginal;\nexport const isPrivate = constants.isPrivate;\nexport const isVbr = constants.isVbr;\nexport const layer = constants.layer;\nexport const length = constants.length;\nexport const mode = constants.mode;\nexport const modeExtension = constants.modeExtension;\nexport const mpeg = constants.mpeg;\nexport const mpegVersion = constants.mpegVersion;\nexport const numberAACFrames = constants.numberAACFrames;\nexport const outputGain = constants.outputGain;\nexport const preSkip = constants.preSkip;\nexport const profile = constants.profile;\nexport const protection = constants.protection;\nexport const rawData = constants.rawData;\nexport const segments = constants.segments;\nexport const subarray = constants.subarray;\nexport const version = constants.version;\nexport const vorbis = constants.vorbis;\nexport const vorbisComments = constants.vorbisComments;\nexport const vorbisSetup = constants.vorbisSetup;\nexport const blockingStrategy = constants.blockingStrategy;\nexport const blockSize = constants.blockSize;\nexport const blocksize0 = constants.blocksize0;\nexport const blocksize1 = constants.blocksize1;\nexport const channelMappingFamily = constants.channelMappingFamily;\nexport const channelMappingTable = constants.channelMappingTable;\nexport const channelMode = constants.channelMode;\nexport const channels = constants.channels;\nexport const copyrightId = constants.copyrightId;\nexport const copyrightIdStart = constants.copyrightIdStart;\nexport const frame = constants.frame;\nexport const frameCount = constants.frameCount;\nexport const frameLength = constants.frameLength;\nexport const frameNumber = constants.frameNumber;\nexport const framePadding = constants.framePadding;\nexport const frameSize = constants.frameSize;\nexport const inputSampleRate = constants.inputSampleRate;\nexport const pageChecksum = constants.pageChecksum;\nexport const pageSegmentTable = constants.pageSegmentTable;\nexport const pageSequenceNumber = constants.pageSequenceNumber;\nexport const sampleNumber = constants.sampleNumber;\nexport const sampleRate = constants.sampleRate;\nexport const samples = constants.samples;\nexport const streamCount = constants.streamCount;\nexport const streamInfo = constants.streamInfo;\nexport const streamSerialNumber = constants.streamSerialNumber;\nexport const streamStructureVersion = constants.streamStructureVersion;\nexport const totalBytesOut = constants.totalBytesOut;\nexport const totalDuration = constants.totalDuration;\nexport const totalSamples = constants.totalSamples;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.F = {};\n__webpack_require__.E = (chunkId) => {\n\tObject.keys(__webpack_require__.F).map((key) => {\n\t\t__webpack_require__.F[key](chunkId);\n\t});\n}","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames not based on template\n\tif (chunkId === 385) return \"icecast-metadata-player-1.17.3.common.min.js\";\n\t// return url for filenames based on template\n\treturn \"icecast-metadata-player-1.17.3.\" + {\"88\":\"mpeg\",\"398\":\"vorbis\",\"694\":\"opus\",\"731\":\"synaudio\",\"762\":\"mediasource\",\"993\":\"flac\"}[chunkId] + \".min.js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n__webpack_require__.F.j = (chunkId) => {\n\tif((!__webpack_require__.o(installedChunks, chunkId) || installedChunks[chunkId] === undefined) && true) {\n\t\tinstalledChunks[chunkId] = null;\n\t\tvar link = document.createElement('link');\n\n\t\tif (__webpack_require__.nc) {\n\t\t\tlink.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tlink.rel = \"prefetch\";\n\t\tlink.as = \"script\";\n\t\tlink.href = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\tdocument.head.appendChild(link);\n\t}\n};\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkIcecastMetadataPlayer\"] = self[\"webpackChunkIcecastMetadataPlayer\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.O(0, [792], () => {\n\t__webpack_require__.E(731);\n\t__webpack_require__.E(762);\n}, 5);","export const noOp = () => {};\nexport const p = new WeakMap();\n\nexport const state = {\n LOADING: \"loading\",\n PLAYING: \"playing\",\n STOPPING: \"stopping\",\n STOPPED: \"stopped\",\n RETRYING: \"retrying\",\n SWITCHING: \"switching\",\n};\n\nexport const event = {\n BUFFER: \"buffer\",\n PLAY: \"play\",\n PLAY_READY: \"playready\", // internal\n LOAD: \"load\",\n STREAM_START: \"streamstart\",\n STREAM: \"stream\",\n STREAM_END: \"streamend\",\n METADATA: \"metadata\",\n METADATA_ENQUEUE: \"metadataenqueue\",\n CODEC_UPDATE: \"codecupdate\",\n STOP: \"stop\",\n RETRY: \"retry\",\n RETRY_TIMEOUT: \"retrytimeout\",\n SWITCH: \"switch\",\n WARN: \"warn\",\n ERROR: \"error\",\n PLAYBACK_ERROR: \"playbackerror\",\n};\n\n// options\nexport const endpoints = Symbol();\nexport const endpointOrder = Symbol();\nexport const metadataTypes = Symbol();\nexport const playbackMethod = Symbol();\nexport const audioContext = Symbol();\nexport const audioElement = Symbol();\nexport const bufferLength = Symbol();\nexport const icyMetaInt = Symbol();\nexport const icyCharacterEncoding = Symbol();\nexport const icyDetectionTimeout = Symbol();\nexport const enableLogging = Symbol();\nexport const retryDelayRate = Symbol();\nexport const retryDelayMin = Symbol();\nexport const retryDelayMax = Symbol();\nexport const retryTimeout = Symbol();\nexport const enableCodecUpdate = Symbol();\nexport const authentication = Symbol();\n\n// methods\nexport const getNextEndpointGenerator = Symbol();\nexport const getOptions = Symbol();\nexport const fireEvent = Symbol();\nexport const attachAudioElement = Symbol();\nexport const shouldRetry = Symbol();\nexport const logError = Symbol();\n\n// variables\nexport const endpointGenerator = Symbol();\nexport const hasIcy = Symbol();\nexport const abortController = Symbol();\nexport const playerState = Symbol();\n\n// sync state\nexport const SYNCED = Symbol(\"synced\");\nexport const SYNCING = Symbol(\"syncing\");\nexport const PCM_SYNCED = Symbol(\"pcm_synced\");\nexport const NOT_SYNCED = Symbol(\"not_synced\");\n\nexport const concatBuffers = (buffers) => {\n const buffer = new Uint8Array(\n buffers.reduce((acc, buf) => acc + buf.length, 0),\n );\n\n buffers.reduce((offset, buf) => {\n buffer.set(buf, offset);\n return offset + buf.length;\n }, 0);\n\n return buffer;\n};\n","// support for Safari 13\n// https://stackoverflow.com/a/58209729/14911733\n\nexport default class EventTargetPolyfill {\n constructor() {\n this._listeners = [];\n }\n\n hasEventListener(type, listener) {\n return this._listeners.some(\n (item) => item.type === type && item.listener === listener,\n );\n }\n\n addEventListener(type, listener, options = {}) {\n if (!this.hasEventListener(type, listener)) {\n this._listeners.push({ type, listener, options });\n }\n // console.log(`${this}-listeners:`,this._listeners);\n return this;\n }\n\n removeEventListener(type, listener) {\n const index = this._listeners.findIndex(\n (item) => item.type === type && item.listener === listener,\n );\n if (index >= 0) this._listeners.splice(index, 1);\n return this;\n }\n\n removeEventListeners() {\n this._listeners = [];\n return this;\n }\n\n dispatchEvent(evt) {\n this._listeners\n .filter((item) => item.type === evt.type)\n .forEach((item) => {\n const {\n type,\n listener,\n options: { once },\n } = item;\n listener.call(this, evt);\n if (once === true) this.removeEventListener(type, listener);\n });\n return this;\n }\n}\n","/* Copyright 2020-2021 Ethan Halsall\n This file is part of icecast-metadata-js.\n\n icecast-metadata-js free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n icecast-metadata-js distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nexport default class Stats {\n constructor() {\n this._totalBytesRead = 0;\n this._streamBytesRead = 0;\n this._metadataLengthBytesRead = 0;\n this._metadataBytesRead = 0;\n\n this._currentBytesRemaining = 0;\n this._currentStreamBytesRemaining = 0;\n this._currentMetadataBytesRemaining = 0;\n }\n\n get stats() {\n return {\n totalBytesRead: this._totalBytesRead,\n streamBytesRead: this._streamBytesRead,\n metadataLengthBytesRead: this._metadataLengthBytesRead,\n metadataBytesRead: this._metadataBytesRead,\n currentBytesRemaining: this._currentBytesRemaining,\n currentStreamBytesRemaining: this._currentStreamBytesRemaining,\n currentMetadataBytesRemaining: this._currentMetadataBytesRemaining,\n };\n }\n\n set currentStreamBytesRemaining(bytes) {\n this._currentStreamBytesRemaining += bytes;\n }\n\n set currentMetadataBytesRemaining(bytes) {\n this._currentMetadataBytesRemaining = bytes;\n }\n\n addBytes(bytes) {\n this._totalBytesRead += bytes;\n this._currentBytesRemaining -= bytes;\n }\n\n addStreamBytes(bytes) {\n this._streamBytesRead += bytes;\n this._currentStreamBytesRemaining -= bytes;\n }\n\n addMetadataLengthBytes(bytes) {\n this._metadataLengthBytesRead += bytes;\n }\n\n addMetadataBytes(bytes) {\n this._metadataBytesRead += bytes;\n this._currentMetadataBytesRemaining -= bytes;\n }\n\n addCurrentBytesRemaining(bytes) {\n this._currentBytesRemaining += bytes;\n }\n}\n","/* Copyright 2020-2021 Ethan Halsall\n This file is part of icecast-metadata-js.\n\n icecast-metadata-js free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n icecast-metadata-js distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport Stats from \"./Stats.js\";\n\nconst noOp = () => {};\n\n/**\n * @description Passthrough parser\n * @protected\n * @see IcecastMetadataReader\n */\n\nexport default class MetadataParser {\n constructor(params) {\n this._remainingData = 0;\n this._currentPosition = 0;\n this._buffer = new Uint8Array(0);\n this._streamBuffer = [];\n this._streamBufferLength = 0;\n this._stats = new Stats();\n\n this._onStream = params.onStream || noOp;\n this._onMetadata = params.onMetadata || noOp;\n this._onMetadataFailed = params.onMetadataFailed || noOp;\n this._onError = params.onError || noOp;\n this._enableLogging = params.enableLogging || false;\n\n this._onStreamPromise = Promise.resolve();\n this._onMetadataPromise = Promise.resolve();\n this._generator = this._passThroughParser();\n this._generator.next();\n }\n\n *_passThroughParser() {\n this._remainingData = Infinity;\n while (true) {\n this._addStream(yield* this._getNextValue());\n yield* this._sendStream();\n }\n }\n\n static _concatBuffers(...buffers) {\n const length = buffers.reduce((acc, buf) => acc + buf.length, 0);\n\n return this._concatBuffersKnownLength(buffers, length);\n }\n\n static _concatBuffersKnownLength(buffers, length) {\n const buffer = new Uint8Array(length);\n\n buffers.reduce((offset, buf) => {\n buffer.set(buf, offset);\n return offset + buf.length;\n }, 0);\n\n return buffer;\n }\n\n *iterator(chunk) {\n for (\n let i = this._generator.next(chunk);\n i.value;\n i = this._generator.next()\n ) {\n yield i.value;\n }\n }\n\n readAll(chunk) {\n for (\n let i = this._generator.next(chunk);\n i.value;\n i = this._generator.next()\n ) {}\n }\n\n async *asyncIterator(chunk) {\n for (\n let i = this._generator.next(chunk);\n i.value;\n i = this._generator.next()\n ) {\n await this._onStreamPromise;\n await this._onMetadataPromise;\n yield i.value;\n }\n }\n\n async asyncReadAll(chunk) {\n for (\n let i = this._generator.next(chunk);\n i.value;\n i = this._generator.next()\n ) {\n await this._onStreamPromise;\n await this._onMetadataPromise;\n }\n }\n\n _logError(...messages) {\n if (this._enableLogging) {\n console.warn(\n \"icecast-metadata-js\",\n messages.reduce((acc, message) => acc + \"\\n \" + message, \"\"),\n );\n }\n this._onError(...messages);\n }\n\n _addStream(stream) {\n this._streamBuffer.push(stream);\n this._streamBufferLength += stream.length;\n }\n\n *_sendStream() {\n if (this._streamBuffer.length) {\n const stream = MetadataParser._concatBuffersKnownLength(\n this._streamBuffer,\n this._streamBufferLength,\n );\n this._streamBuffer = [];\n this._streamBufferLength = 0;\n\n this._stats.addStreamBytes(stream.length);\n\n const streamPayload = { stream, stats: this._stats.stats };\n\n this._onStreamPromise = this._onStream(streamPayload);\n yield streamPayload;\n }\n }\n\n *_sendMetadata(metadata) {\n yield* this._sendStream();\n\n const metadataPayload = {\n metadata,\n stats: this._stats.stats,\n };\n\n this._onMetadataPromise = this._onMetadata(metadataPayload);\n yield metadataPayload;\n }\n\n *_getNextValue(minLength = 0) {\n if (this._currentPosition === this._buffer.length) {\n this._buffer = yield* this._readData();\n this._currentPosition = 0;\n }\n\n while (this._buffer.length - this._currentPosition < minLength) {\n this._buffer = MetadataParser._concatBuffers(\n this._buffer,\n yield* this._readData(),\n );\n }\n\n const value = this._buffer.subarray(\n this._currentPosition,\n (minLength || this._remainingData) + this._currentPosition,\n );\n\n this._stats.addBytes(value.length);\n this._remainingData =\n value.length < this._remainingData\n ? this._remainingData - value.length\n : 0;\n\n this._currentPosition += value.length;\n\n return value;\n }\n\n *_readData() {\n yield* this._sendStream();\n\n let data;\n\n do {\n data = yield; // if out of data, accept new data in the .next() call\n } while (!data || data.length === 0);\n\n this._stats.addCurrentBytesRemaining(data.length);\n return data;\n }\n}\n","/* Copyright 2020-2021 Ethan Halsall\n This file is part of icecast-metadata-js.\n\n icecast-metadata-js free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n icecast-metadata-js distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport MetadataParser from \"./MetadataParser.js\";\n\n/**\n * @description Parses ICY metadata from an Icecast stream\n * @protected\n * @see IcecastMetadataReader\n */\n\nexport default class IcyMetadataParser extends MetadataParser {\n constructor({\n icyMetaInt,\n icyDetectionTimeout = 2000,\n icyCharacterEncoding = \"utf-8\",\n ...rest\n }) {\n super(rest);\n\n this._decoder = new globalThis.TextDecoder(icyCharacterEncoding);\n this._icyMetaInt = icyMetaInt;\n this._icyDetectionTimeout = icyDetectionTimeout;\n\n this._generator = this._icyParser();\n this._generator.next();\n }\n\n *_icyParser() {\n if (yield* this._hasIcyMetadata()) {\n do {\n this._remainingData = this._icyMetaInt;\n yield* this._getStream();\n yield* this._getMetadataLength();\n if (this._remainingData) yield* this._getMetadata();\n } while (true);\n }\n\n this._remainingData = Infinity;\n yield* this._getStream();\n }\n\n static parseIcyMetadata(metadataString) {\n /**\n * Metadata is a string of key='value' pairs delimited by a semicolon.\n * The string is a fixed length and any unused bytes at the end are 0x00.\n * i.e. \"StreamTitle='The Stream Title';StreamUrl='https://example.com';\\0\\0\\0\\0\\0\\0\"\n */\n\n const metadataRegex = /(?[^\\0]+?)='(?[^\\0]*?)(;$|';|'$|$)/;\n const metadata = {};\n\n // [{key: \"StreamTitle\", val: \"The Stream Title\"}, {key: \"StreamUrl\", val: \"https://example.com\"}]\n for (const metadataElement of metadataString.match(\n new RegExp(metadataRegex, \"g\"),\n ) || []) {\n const match = metadataElement.match(metadataRegex);\n if (match) metadata[match[\"groups\"][\"key\"]] = match[\"groups\"][\"val\"];\n }\n\n // {StreamTitle: \"The Stream Title\", StreamUrl: \"https://example.com\"}\n return metadata;\n }\n\n get icyMetaInt() {\n return this._icyMetaInt;\n }\n\n *_hasIcyMetadata() {\n if (this._icyMetaInt > 0) return true;\n if (!this._icyDetectionTimeout) return false;\n\n this._logError(\n \"Passed in Icy-MetaInt is invalid. Attempting to detect ICY Metadata.\",\n \"See https://github.com/eshaz/icecast-metadata-js for information on how to properly request ICY Metadata.\",\n );\n\n // prettier-ignore\n const METADATA_SEARCH = [null,83,116,114,101,97,109,84,105,116,108,101,61]; // StreamTitle=\n const startTime = Date.now();\n let metaInt = 0;\n\n while (startTime + this._icyDetectionTimeout > Date.now()) {\n this._buffer = MetadataParser._concatBuffers(\n this._buffer,\n yield* this._readData(),\n );\n\n // search for metadata\n detectMetadata: while (\n metaInt <\n this._buffer.length - METADATA_SEARCH.length\n ) {\n for (let i = 1; i < METADATA_SEARCH.length; i++) {\n if (this._buffer[i + metaInt] !== METADATA_SEARCH[i]) {\n metaInt++;\n continue detectMetadata;\n }\n }\n\n // found metadata\n // prettier-ignore\n this._logError(`Found ICY Metadata! Setting Icy-MetaInt to ${metaInt}.`);\n this._icyMetaInt = metaInt;\n\n return true;\n }\n }\n\n // prettier-ignore\n this._logError(\n \"ICY Metadata not detected, but continuing anyway. Audio errors will occur if there is ICY metadata.\",\n `Searched ${this._buffer.length} bytes for ${(Date.now() - startTime) / 1000} seconds.`,\n \"Try increasing the `icyDetectionTimeout` value if ICY metadata is present in the stream.\"\n );\n this._onMetadataFailed(\"icy\");\n\n return false;\n }\n\n *_getStream() {\n this._stats.currentStreamBytesRemaining = this._remainingData;\n\n while (this._remainingData) {\n this._addStream(yield* super._getNextValue());\n }\n }\n\n *_getMetadataLength() {\n this._remainingData = 1;\n\n do {\n this._remainingData = (yield* this._getNextValue())[0] * 16;\n } while (this._remainingData === 1);\n\n this._stats.addMetadataLengthBytes(1);\n }\n\n *_getMetadata() {\n this._stats.currentMetadataBytesRemaining = this._remainingData;\n\n const metadata = yield* this._getNextValue(this._remainingData);\n this._stats.addMetadataBytes(metadata.length);\n\n yield* this._sendMetadata(\n IcyMetadataParser.parseIcyMetadata(this._decoder.decode(metadata)),\n );\n }\n}\n","/* Copyright 2020-2021 Ethan Halsall\n This file is part of icecast-metadata-js.\n\n icecast-metadata-js free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n icecast-metadata-js distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport MetadataParser from \"./MetadataParser.js\";\n\n/**\n * @description Parses Ogg metadata from an Icecast stream\n * @protected\n * @see IcecastMetadataReader\n */\nexport default class OggMetadataParser extends MetadataParser {\n constructor(params) {\n super(params);\n\n this._decoder = new globalThis.TextDecoder(\"utf-8\");\n this._generator = this._oggParser();\n this._generator.next();\n this._isContinuePacket = false;\n }\n\n *_oggParser() {\n if (yield* this._hasOggPage()) {\n const codecMatcher = yield* this._identifyCodec();\n if (codecMatcher) {\n while (yield* this._hasOggPage()) {\n if (!this._isContinuePacket) yield* this._getMetadata(codecMatcher);\n yield* this._getStream();\n }\n }\n }\n\n this._remainingData = Infinity;\n yield* this._getStream();\n }\n\n _getUint32(data, offset = 0) {\n return new DataView(\n Uint8Array.from([...data.subarray(offset, offset + 4)]).buffer,\n ).getUint32(0, true);\n }\n\n _matchBytes(matchString, bytes) {\n return String.fromCharCode(...bytes).match(matchString);\n }\n\n *_hasOggPage() {\n // Bytes (1-4 of 28)\n // Frame sync (must equal OggS): `AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA`:\n // Byte (5 of 28) stream_structure_version\n // Byte (6 of 28)\n // * `00000...`: All zeros\n // * `.....C..`: (0 no, 1 yes) last page of logical bitstream (eos)\n // * `......D.`: (0 no, 1 yes) first page of logical bitstream (bos)\n // * `.......E`: (0 no, 1 yes) continued packet\n let syncBytes = [];\n while (syncBytes.length <= 65307) {\n // max ogg page size\n const bytes = yield* super._getNextValue(6); // Sync with Ogg page without sending stream data\n if (\n bytes[0] === 0x4f &&\n bytes[1] === 0x67 &&\n bytes[2] === 0x67 &&\n bytes[3] === 0x53 &&\n !(bytes[5] & 0b11111000)\n ) {\n this._isContinuePacket = bytes[5] & 0b00000001;\n this._currentPosition -= 6;\n this._remainingData += 6;\n this._stats._totalBytesRead -= 6;\n this._stats._currentBytesRemaining += 6;\n break;\n }\n // not synced, rewind to the next offset to continue syncing\n syncBytes.push(bytes[0]);\n\n this._currentPosition -= 5;\n this._stats._totalBytesRead -= 5;\n this._stats._currentBytesRemaining += 5;\n }\n\n if (syncBytes.length) this._addStream(Uint8Array.from(syncBytes));\n\n if (syncBytes.length > 65307) {\n this._logError(\n \"This stream is not an Ogg stream. No Ogg metadata will be returned.\",\n \"See https://github.com/eshaz/icecast-metadata-js for information on Ogg metadata.\",\n );\n this._onMetadataFailed(\"ogg\");\n return false;\n }\n\n const baseOggPage = yield* this._getNextValue(27);\n // Byte (27 of 28)\n // * `JJJJJJJJ`: Number of page segments in the segment table\n const oggPageSegments = yield* this._getNextValue(baseOggPage[26]);\n\n this._remainingData = oggPageSegments.reduce(\n (acc, octet) => acc + octet,\n 0,\n );\n return true;\n }\n\n *_identifyCodec() {\n const data = yield* this._getNextValue(8);\n\n yield* this._getStream();\n\n if (this._matchBytes(/\\x7fFLAC/, data.subarray(0, 5))) {\n return { regex: /^[\\x84|\\x04]/, length: 4 };\n } else if (this._matchBytes(/OpusHead/, data.subarray(0, 8))) {\n return { regex: /OpusTags/, length: 8 };\n } else if (this._matchBytes(/\\x01vorbis/, data.subarray(0, 7))) {\n return { regex: /\\x03vorbis/, length: 7 };\n }\n }\n\n *_getMetadata({ regex, length }) {\n if (this._matchBytes(regex, yield* this._getNextValue(length))) {\n yield* this._sendMetadata(yield* this._readVorbisComment());\n }\n }\n\n *_getStream() {\n while (this._remainingData) {\n yield* this._getNextValue();\n }\n }\n\n *_getNextValue(length) {\n const value = yield* super._getNextValue(length);\n\n this._addStream(value);\n return value;\n }\n\n *_readData() {\n const data = yield* super._readData();\n this._stats.currentStreamBytesRemaining = data.length;\n return data;\n }\n\n *_readVorbisComment() {\n /*\n 1) [vendor_length] = read an unsigned integer of 32 bits\n 2) [vendor_string] = read a UTF-8 vector as [vendor_length] octets\n 3) [user_comment_list_length] = read an unsigned integer of 32 bits\n 4) iterate [user_comment_list_length] times {\n 5) [length] = read an unsigned integer of 32 bits\n 6) this iteration's user comment = read a UTF-8 vector as [length] octets\n }\n 7) [framing_bit] = read a single bit as boolean\n 8) if ( [framing_bit] unset or end of packet ) then ERROR\n 9) done.\n */\n const vendorStringLength = this._getUint32(yield* this._getNextValue(4));\n this._stats.addMetadataBytes(4);\n\n const vendorString = this._decoder.decode(\n yield* this._getNextValue(vendorStringLength),\n );\n this._stats.addMetadataBytes(vendorStringLength);\n\n const commentListLength = this._getUint32(yield* this._getNextValue(4));\n this._stats.addMetadataBytes(4);\n\n const comments = [];\n for (let i = 0; i < commentListLength; i++) {\n const commentLength = yield* this._getNextValue(4);\n this._stats.addMetadataBytes(4);\n\n comments.push(yield* this._getNextValue(this._getUint32(commentLength)));\n this._stats.addMetadataBytes(comments[comments.length - 1].length);\n }\n\n this._stats.currentMetadataBytesRemaining = 0;\n\n return comments.reduce(\n (metadata, comment) => {\n const delimiter = comment.indexOf(0x3d);\n // prettier-ignore\n const key = String.fromCharCode(...comment.subarray(0, delimiter)).toUpperCase();\n const val = this._decoder.decode(comment.subarray(delimiter + 1));\n\n metadata[key] = metadata[key] ? `${metadata[key]}; ${val}` : val;\n return metadata;\n },\n { VENDOR_STRING: vendorString },\n );\n }\n}\n","/* Copyright 2020-2021 Ethan Halsall\n This file is part of icecast-metadata-js.\n\n icecast-metadata-js free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n icecast-metadata-js distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport IcyMetadataParser from \"./IcyMetadataParser.js\";\nimport OggMetadataParser from \"./OggMetadataParser.js\";\n\n/**\n * @description Parses ICY and Ogg metadata from an Icecast stream\n * @protected\n * @see IcecastMetadataReader\n */\n\nexport default class DualMetadataParser {\n constructor(params) {\n const { onStream, ...rest } = params;\n this._oggMetadataParser = new OggMetadataParser(params);\n this._icyMetadataParser = new IcyMetadataParser(rest);\n }\n\n get icyMetaInt() {\n return this._icyMetadataParser.icyMetaInt;\n }\n\n *iterator(chunk) {\n for (const value of this._icyMetadataParser.iterator(chunk)) {\n if (value.stream) {\n yield* this._oggMetadataParser.iterator(value.stream);\n } else {\n yield value;\n }\n }\n }\n\n readAll(chunk) {\n for (const value of this._icyMetadataParser.iterator(chunk)) {\n if (value.stream) {\n this._oggMetadataParser.readAll(value.stream);\n }\n }\n }\n\n async *asyncIterator(chunk) {\n for await (const value of this._icyMetadataParser.asyncIterator(chunk)) {\n if (value.stream) {\n for await (const oggValue of this._oggMetadataParser.asyncIterator(\n value.stream,\n )) {\n yield oggValue;\n }\n } else {\n yield value;\n }\n }\n }\n\n async asyncReadAll(chunk) {\n for await (const value of this._icyMetadataParser.iterator(chunk)) {\n if (value.stream) {\n await this._oggMetadataParser.asyncReadAll(value.stream);\n }\n }\n }\n}\n","/* Copyright 2020-2021 Ethan Halsall\n This file is part of icecast-metadata-js.\n\n icecast-metadata-js free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n icecast-metadata-js distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport MetadataParser from \"./MetadataParser/MetadataParser.js\";\nimport IcyMetadataParser from \"./MetadataParser/IcyMetadataParser.js\";\nimport OggMetadataParser from \"./MetadataParser/OggMetadataParser.js\";\nimport DualMetadataParser from \"./MetadataParser/DualMetadataParser.js\";\n\nexport default class IcecastMetadataReader {\n /**\n * @description Splits Icecast raw response into stream bytes and metadata key / value pairs.\n * @param {number} IcecastMetadataReader.icyMetaInt Interval in bytes of metadata updates returned by the Icecast server\n * @param {number} IcecastMetadataReader.icyCharacterEncoding Character encoding to use for ICY metadata (defaults to \"utf-8\")\n * @param {number} IcecastMetadataReader.icyDetectionTimeout Duration in milliseconds to search for metadata if icyMetaInt isn't passed in\n * @param {Array} IcecastMetadataReader.metadataTypes Types of metadata to capture: \"icy\" and/or \"ogg\"\n *\n * @callback onMetadata\n * @param {object} value Object containing Metadata and Statistics\n * @param {object} metadata Object containing the metadata received.\n * @param {string} [metadata.StreamTitle] (ICY) Title of the metadata update.\n * @param {string} [metadata.StreamUrl] (ICY) Url (usually album art) of the metadata update.\n * @param {string} [metadata.TITLE] (Ogg) Url Title of the metadata update.\n * @param {object} stats Object containing statistics on how many bytes were read and the current read position.\n *\n * @callback onStream\n * @param {object} value Object containing Stream data and Statistics\n * @param {Uint8Array} stream Object containing the stream buffer.\n * @param {object} stats Object containing statistics on how many bytes were read and the current read position.\n *\n * @callback onMetadataFailed Called when metadata detection has failed and no metadata will be returned\n * @param {string} metadataType Metadata type that failed (\"icy\" or \"ogg\")\n *\n * @callback onError Called when an error is encountered\n * @param {string} message Error message\n */\n constructor({ metadataTypes = [\"icy\"], ...rest } = {}) {\n const hasIcy = metadataTypes.includes(\"icy\");\n const hasOgg = metadataTypes.includes(\"ogg\");\n\n if (hasIcy && hasOgg) this._metadataParser = new DualMetadataParser(rest);\n else if (hasOgg) this._metadataParser = new OggMetadataParser(rest);\n else if (hasIcy) this._metadataParser = new IcyMetadataParser(rest);\n else this._metadataParser = new MetadataParser(rest);\n }\n\n /**\n * @description Parses an already decoded ICY metadata string into key value pairs.\n * @param {string} metadataString ICY formatted metadata string. (i.e. \"StreamTitle='A Title';\")\n * @returns {object} Parsed metadata key value pairs. (i.e. {StreamTitle: \"A Title\"})\n */\n static parseIcyMetadata(string) {\n return IcyMetadataParser.parseIcyMetadata(string);\n }\n\n /**\n * @description Gets the ICY metadata interval for this instance.\n * @returns {number} ICY metadata interval in bytes.\n */\n get icyMetaInt() {\n return this._metadataParser.icyMetaInt;\n }\n\n /**\n * @description Returns an iterator that yields stream or metadata.\n * @param {Uint8Array} chunk Next chunk of data to read\n * @returns {Iterator} Iterator that operates over a raw icecast response.\n * @yields {object} Object containing stream or metadata.\n */\n *iterator(chunk) {\n yield* this._metadataParser.iterator(chunk);\n }\n\n /**\n * @description Reads all data in the passed in chunk and calls the onStream and onMetadata callbacks.\n * @param {Uint8Array} chunk Next chunk of data to read\n */\n readAll(chunk) {\n this._metadataParser.readAll(chunk);\n }\n\n /**\n * @description Returns an async iterator that yields stream or metadata and awaits the onStream and onMetadata callbacks.\n * @param {Uint8Array} chunk Next chunk of data to read\n * @returns {IterableIterator} Iterator that operates over a raw icecast response.\n * @yields {object} Object containing stream or metadata.\n */\n async *asyncIterator(chunk) {\n return yield* this._metadataParser.asyncIterator(chunk);\n }\n\n /**\n * @description Reads all data in the chunk and awaits the onStream and onMetadata callbacks.\n * @param {Uint8Array} chunk Next chunk of data to read\n */\n async asyncReadAll(chunk) {\n return this._metadataParser.asyncReadAll(chunk);\n }\n}\n","/* Copyright 2020-2021 Ethan Halsall\n This file is part of icecast-metadata-js.\n\n icecast-metadata-js free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n icecast-metadata-js distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport IcecastMetadataReader from \"./IcecastMetadataReader.js\";\n\nconst noOp = () => {};\n\n/**\n * @description Browser ReadableStream wrapper for IcecastMetadataReader\n */\nexport default class IcecastReadableStream {\n /**\n * @param {ReadableStream} response ReadableStream for raw Icecast response data\n * @param {object} options Configuration options for IcecastMetadataReader\n * @see IcecastMetadataReader for information on the options parameter\n */\n constructor(response, { onStream = noOp, ...rest }) {\n let icecast;\n\n this._readableStream = new ReadableStream({\n async start(controller) {\n icecast = new IcecastMetadataReader({\n icyMetaInt: parseInt(response.headers.get(\"Icy-MetaInt\")),\n ...rest,\n onStream: async (value) => {\n controller.enqueue(value.stream);\n return onStream(value);\n },\n });\n\n for await (const chunk of IcecastReadableStream.asyncIterator(\n response.body,\n )) {\n await icecast.asyncReadAll(chunk);\n }\n\n controller.close();\n },\n });\n\n this._icecast = icecast;\n }\n\n /**\n * @returns Icecast Metadata Interval if it is present on this stream\n */\n get icyMetaInt() {\n return this._icecast.icyMetaInt;\n }\n\n /**\n * @returns The ReadableStream instance\n */\n get readableStream() {\n return this._readableStream;\n }\n\n /**\n * @description Starts reading from the response and processing stream and metadata.\n */\n async startReading() {\n try {\n for await (const i of IcecastReadableStream.asyncIterator(\n this._readableStream,\n )) {\n }\n } catch (e) {\n if (e.name !== \"AbortError\") throw e;\n }\n }\n\n /**\n * @description Wraps a ReadableStream as an Async Iterator.\n * @param {ReadableStream} readableStream ReadableStream to convert to AsyncIterator\n * @returns {Symbol.asyncIterator} Async Iterator that wraps the ReadableStream\n */\n static asyncIterator(readableStream) {\n const reader = readableStream.getReader();\n return {\n [Symbol.asyncIterator]: () => ({\n next: () => reader.read(),\n }),\n };\n }\n}\n","/* Copyright 2020-2021 Ethan Halsall\n This file is part of icecast-metadata-js.\n\n icecast-metadata-js free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n icecast-metadata-js distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nconst noOp = () => {};\n\nexport default class IcecastMetadataQueue {\n /**\n * @description Schedules updates up to the millisecond for Icecast Metadata from the response body of an Icecast stream mountpoint\n * @description The accuracy of metadata updates is a direct relationship of the icyMetaInt\n * @param {Object} IcecastMetadataQueue constructor parameter\n * @param {number} [IcecastMetadataQueue.icyBr] Bitrate of audio stream used to increase accuracy when to updating metadata\n * @param {onMetadataUpdate} [IcecastMetadataQueue.onMetadataUpdate] Callback executed when metadata is scheduled to update\n * @param {onMetadataEnqueue} [IcecastMetadataQueue.onMetadataEnqueue] Callback executed when metadata is enqueued\n * @param {boolean} [IcecastMetadataQueue.paused] Set to true to start the queue in a paused mode\n *\n * @callback onMetadataUpdate\n * @param {Object} metadata Object containing all metadata received.\n * @param {string} [metadata.StreamTitle] Title of the metadata update.\n * @param {string} [metadata.StreamUrl] Url (usually album art) of the metadata update.\n * @param {number} timestampOffset Total time buffered when the metadata was added\n * @param {number} timestamp Current time of the audio player when the metadata was added\n *\n * @callback onMetadataEnqueue\n * @param {Object} metadata Object containing all metadata received.\n * @param {string} [metadata.StreamTitle] Title of the metadata update.\n * @param {string} [metadata.StreamUrl] Url (usually album art) of the metadata update.\n * @param {number} timestampOffset Total time buffered when the metadata was added\n * @param {number} timestamp Current time of the audio player when the metadata was added\n *\n */\n constructor({\n icyBr,\n onMetadataUpdate = noOp,\n onMetadataEnqueue = noOp,\n paused = false,\n }) {\n this._icyBr = icyBr;\n this._onMetadataUpdate = onMetadataUpdate;\n this._onMetadataEnqueue = onMetadataEnqueue;\n this._initialPaused = paused;\n this._paused = paused;\n this._isInitialMetadata = true;\n this._pendingMetadata = [];\n this._metadataQueue = [];\n }\n\n /**\n * @description Returns the metadata queued for updates\n * @type {{metadata: string, time: number}[]} Queued metadata\n */\n get metadataQueue() {\n return this._metadataQueue.map(({ _timeoutId, ...rest }) => rest);\n }\n\n /**\n *\n * @param {object} metadata Metadata object returned from IcecastMetadataReader\n * @param {number} timestampOffset Total buffered audio in seconds\n * @param {number} [timestamp] Current time in the audio player\n */\n addMetadata({ metadata, stats }, timestampOffset, timestamp = 0) {\n /**\n * Metadata time is derived from the total number of stream bytes read\n * since the latest buffer input. The buffer offset should be the total\n * seconds of audio in the player buffer when the metadata was read.\n */\n timestamp += stats ? this.getTimeByBytes(stats.currentStreamPosition) : 0;\n\n const metadataPayload = {\n metadata,\n timestampOffset,\n timestamp,\n };\n\n this._paused\n ? this._pendingMetadata.push(metadataPayload)\n : this._enqueueMetadata(metadataPayload);\n }\n\n /**\n * @description Calculates audio stream length based on bitrate\n * @param {number} bytesRead Number of bytes\n * @type {number} Seconds\n */\n getTimeByBytes(bytesRead) {\n return this._icyBr ? bytesRead / (this._icyBr * 125) : 0;\n }\n\n /**\n * @description Starts the metadata queue if it was paused\n * @param {number} [timestamp] Current time of the audio player\n */\n startQueue(timestamp) {\n if (this._paused) {\n this._pendingMetadata.forEach((u) => {\n if (timestamp !== undefined) u.timestamp = timestamp;\n\n // remove any metadata that has already elapsed\n if (timestamp === undefined || u.timestampOffset >= u.timestamp)\n this._enqueueMetadata(u);\n });\n this._pendingMetadata = [];\n this._paused = false;\n }\n }\n\n /**\n * @description Clears all metadata updates and empties the queue\n */\n purgeMetadataQueue() {\n this._metadataQueue.forEach((i) => clearTimeout(i._timeoutId));\n this._metadataQueue = [];\n this._pendingMetadata = [];\n this._paused = this._initialPaused;\n this._isInitialMetadata = true;\n }\n\n _enqueueMetadata(payload) {\n this._metadataQueue.push(payload);\n\n this._onMetadataEnqueue(\n payload.metadata,\n payload.timestampOffset,\n payload.timestamp,\n );\n\n if (this._isInitialMetadata) {\n this._dequeueMetadata();\n this._isInitialMetadata = false;\n } else {\n payload._timeoutId = setTimeout(\n () => {\n this._dequeueMetadata();\n },\n (payload.timestampOffset - payload.timestamp) * 1000,\n ); // trigger timeout relative to play position\n }\n }\n\n _dequeueMetadata() {\n // purging the queue is an async operation, some timeouts may still be queued in the event loop _after_ the purge call has happened\n if (this._metadataQueue.length) {\n const { metadata, timestampOffset, timestamp } =\n this._metadataQueue.shift();\n this._onMetadataUpdate(metadata, timestampOffset, timestamp);\n }\n }\n}\n","import {\n audioContext,\n concatBuffers,\n event,\n state,\n fireEvent,\n SYNCED,\n PCM_SYNCED,\n SYNCING,\n NOT_SYNCED,\n noOp,\n} from \"./global.js\";\n\n// test if worker can spawn a worker for (i.e. everything but iOS)\nlet canSpawnWorker;\nconst spawnWorkerTest = new Worker(\n URL.createObjectURL(\n new Blob([\"self.onmessage = () => self.postMessage(!!self.Worker)\"], {\n type: \"text/javascript\",\n }),\n ),\n);\nspawnWorkerTest.onmessage = (r) => {\n canSpawnWorker = r.data;\n spawnWorkerTest.terminate();\n};\nspawnWorkerTest.postMessage(null);\n\nexport default class FrameQueue {\n constructor(icecast, player) {\n this.CRC_DURATION = 300000; // milliseconds to cache for crc syncing\n this.PCM_DURATION = 60000; // milliseconds to cache for pcm syncing\n\n this._icecast = icecast;\n this._player = player;\n\n this.initSync();\n this.initQueue();\n }\n\n initSync() {\n clearTimeout(this._syncTimeout);\n this._syncTimeout = null;\n this._syncTimeoutReason = null;\n this._crcSyncPending = true;\n\n this._syncQueue = [];\n this._syncQueueDuration = 0;\n\n this._synAudioResult = null;\n this._a = null;\n this._b = null;\n }\n\n initQueue() {\n this._queueIndex = 0;\n this._queueSamples = 0;\n this._queueSampleRate = 0;\n\n this._crcQueue = [];\n this._crcQueueDuration = 0;\n this._crcQueueIndexes = {};\n\n this._pcmQueue = [];\n this._pcmQueueDuration = 0;\n }\n\n get buffered() {\n return (\n this._queueSamples / this._queueSampleRate - this._player.currentTime || 0\n );\n }\n\n add(frame) {\n // crc queue\n const { crc32, duration, samples } = frame;\n this._queueSamples += samples;\n this._queueSampleRate = frame.header.sampleRate;\n\n this._crcQueue.push({ crc32, duration });\n this._crcQueueDuration += duration;\n\n // update queue index\n let indexes = this._crcQueueIndexes[crc32];\n if (!indexes) {\n indexes = [];\n this._crcQueueIndexes[crc32] = indexes;\n }\n indexes.push(this._queueIndex++);\n\n if (this._crcQueueDuration >= this.CRC_DURATION) {\n const { crc32, duration } = this._crcQueue.shift();\n this._crcQueueDuration -= duration;\n\n // remove the oldest index\n const indexes = this._crcQueueIndexes[crc32];\n indexes.shift();\n // remove the key if there are no indexes left\n if (!indexes.length) delete this._crcQueueIndexes[crc32];\n }\n\n // pcm queue\n this._pcmQueue.push(frame);\n this._pcmQueueDuration += duration;\n\n if (this._pcmQueueDuration >= this.PCM_DURATION) {\n this._pcmQueueDuration -= this._pcmQueue.shift().duration;\n }\n }\n\n addAll(frames) {\n frames.forEach((frame) => this.add(frame));\n }\n\n _addAllSyncQueue(frames) {\n for (const frame of frames) {\n this._syncQueueDuration += frame.duration;\n this._syncQueue.push(frame);\n }\n }\n\n /**\n *\n * @param {Array} frames\n */\n async sync(frames) {\n // stop syncing if the buffer runs out\n if (this._syncTimeout === null) {\n const currentBuffered = this.buffered;\n\n this._syncReject = noOp;\n this._syncTimeout = setTimeout(() => {\n this._syncTimeoutReason = `Buffer underrun after syncing for ${currentBuffered.toFixed(\n 2,\n )} seconds.`;\n this._syncReject(this._syncTimeoutReason);\n }, currentBuffered * 1000);\n }\n\n this._addAllSyncQueue(frames);\n\n return new Promise(async (resolve, reject) => {\n if (this._syncTimeoutReason !== null) reject(this._syncTimeoutReason);\n else this._syncReject = reject;\n\n let syncState;\n // try syncing using crc32 hashes (if the stream data matches exactly)\n if (this._crcSyncPending) syncState = this._crcSync();\n\n // try syncing using decoded audio and corelation (if audio data matches)\n if (!syncState) {\n this._crcSyncPending = false;\n syncState = await this._pcmSync();\n }\n\n // streams do not match (not synced)\n if (!syncState) reject(\"Old and new request do not match.\");\n else resolve(syncState);\n })\n .catch((e) => {\n if (\n this._icecast.state !== state.STOPPING &&\n this._icecast.state !== state.STOPPED\n )\n this._icecast[fireEvent](\n event.WARN,\n `Reconnected successfully after ${this._icecast.state}.`,\n \"Unable to sync old and new request.\",\n e,\n );\n\n const syncQueue = this._syncQueue;\n this.initSync();\n this.initQueue();\n return [syncQueue, NOT_SYNCED];\n })\n .then((syncState) => {\n if ([SYNCED, PCM_SYNCED].includes(syncState[1])) {\n this.initSync();\n }\n\n return syncState;\n });\n }\n\n /*\n Aligns the queue with a new incoming data by aligning the crc32 hashes \n and then returning only the frames that do not existing on the queue.\n \n old data | common data | new data\n (old connection) ------------------------|\n (new connection) |------------------>\n ^^^^^^^^^^^^^^ ^^^^\n (sync) (frames to return)\n */\n _crcSync() {\n // get all indexed matches for crc and check\n if (!this._syncQueue.length) return [[], SYNCING];\n\n const syncQueueStartIndex = 0;\n const syncQueueCrc = this._syncQueue[syncQueueStartIndex].crc32;\n const crcSyncPoints = this._crcQueueIndexes[syncQueueCrc];\n\n let matched, outOfFrames, syncPoint;\n\n if (crcSyncPoints) {\n align_queues: for (const absoluteSyncPoint of crcSyncPoints) {\n syncPoint =\n absoluteSyncPoint - (this._queueIndex - this._crcQueue.length);\n\n for (\n let i = syncQueueStartIndex;\n i < this._syncQueue.length && syncPoint + i < this._crcQueue.length;\n i++\n )\n if (this._crcQueue[syncPoint + i].crc32 !== this._syncQueue[i].crc32)\n continue align_queues; // failed to match\n\n outOfFrames =\n syncPoint + this._syncQueue.length <= this._crcQueue.length;\n matched = true;\n break; // full match\n }\n\n // have some overlapping frames, but none are new frames\n if (outOfFrames) return [[], SYNCING];\n\n if (matched) {\n const sliceIndex = this._crcQueue.length - syncPoint;\n // prettier-ignore\n this._icecast[fireEvent](\n event.WARN,\n `Reconnected successfully after ${this._icecast.state}.`,\n `Found ${sliceIndex} frames (${(this._crcQueue\n .slice(syncPoint)\n .reduce((acc, { duration }) => acc + duration, 0) / 1000).toFixed(3)} seconds) of overlapping audio data in new request.`,\n \"Synchronized old and new request.\"\n );\n\n return [this._syncQueue.slice(sliceIndex), SYNCED];\n }\n }\n }\n\n /*\n Syncs the old and new data using correlation between decoded audio.\n A new player will be constructed after this sync is completed.\n\n old data | common data | new data\n \n (time scale) -2 -1 0 +1 +2\n (old connection) -----------------------------|\n ^^^^^|^^^^^^^^^| |\n | sampleOffsetFromEnd buffered (metadataTimestamp)\n \n (time scale) -2 -1 0 +1 +2\n (new connection) |-----------|--->\n | ^^^^^^^^^^^^|^^^^\n delay syncLength\n */\n async _pcmSync() {\n try {\n const correlationSyncLength = 1; // seconds\n const initialGranularity = 16;\n\n const samplesToDuration = (samples, rate) => samples / rate;\n\n if (!this._synAudioResult) {\n let SynAudio;\n try {\n SynAudio = (\n await import(\n /* webpackChunkName: \"synaudio\", webpackPrefetch: true */\n \"synaudio\"\n )\n ).default;\n } catch (e) {\n this._icecast[fireEvent](\n event.WARN,\n \"Failed to synchronize old and new stream\",\n \"Missing `synaudio` dependency.\",\n );\n\n return;\n }\n\n const [pcmQueueDecoded, syncQueueDecoded, sampleRate] =\n await this._decodeQueues();\n\n const correlationSampleSize = sampleRate * correlationSyncLength;\n\n // more data is needed to meet the correlationSampleSize\n if (syncQueueDecoded.samplesDecoded <= correlationSampleSize)\n return [[], SYNCING];\n\n const synAudio = new SynAudio({\n correlationSampleSize,\n initialGranularity,\n });\n\n this._synAudioResult = await (canSpawnWorker\n ? synAudio.syncWorkerConcurrent(\n pcmQueueDecoded,\n syncQueueDecoded,\n Math.max(navigator.hardwareConcurrency - 1, 1),\n )\n : synAudio.syncWorker(pcmQueueDecoded, syncQueueDecoded));\n\n this._synAudioResult.offsetFromEnd = samplesToDuration(\n pcmQueueDecoded.samplesDecoded - this._synAudioResult.sampleOffset,\n sampleRate,\n ); // total queue samples decoded - sample offset (sampleOffset from end of buffer)\n }\n\n // anything lower than .5 is likely not synced, but it might sound better than some random sync point\n const { correlation, offsetFromEnd } = this._synAudioResult;\n\n let delay = (this.buffered - offsetFromEnd) * 1000; // if negative, sync is before playback position, positive, sync after playback position\n\n // more frames need to be cut than exist on the sync queue\n if (-delay > this._syncQueueDuration) return [[], SYNCING];\n\n const frameOverlap = 0;\n if (delay < 0) {\n // slice the sync frame with 'n' frame overlap and start immediately\n let sliceIndex = 0;\n for (\n let t = 0;\n sliceIndex < this._syncQueue.length - frameOverlap && t > delay;\n sliceIndex++\n )\n t -= this._syncQueue[sliceIndex].duration;\n\n this._syncQueue = this._syncQueue.slice(sliceIndex - frameOverlap);\n } else {\n // delay start with 'n' frame overlap\n for (let i = 0; i < frameOverlap && i < this._syncQueue.length; i++)\n delay -= this._syncQueue[i].duration;\n }\n\n // prettier-ignore\n this._icecast[fireEvent](\n event.WARN,\n `Reconnected successfully after ${this._icecast.state}.`,\n `Synchronized old and new request with ${(Math.round(correlation * 10000) / 100).toFixed(2)}% confidence.`\n );\n\n this.initQueue();\n return [this._syncQueue, PCM_SYNCED, delay];\n } catch {}\n }\n\n async _decodeQueues() {\n const decode = (queue, timeFromEnd) => {\n let sliceIndex = queue.length - 1;\n\n for (\n let duration = 0;\n duration < timeFromEnd && sliceIndex > 0;\n sliceIndex--\n )\n duration += queue[sliceIndex].duration;\n\n return this._icecast[audioContext].decodeAudioData(\n concatBuffers(queue.slice(sliceIndex).map(({ data }) => data)).buffer,\n );\n };\n\n [this._a, this._b] = await Promise.all([\n // decode the pcm queue only once, decode only up to twice the amount of buffered audio\n this._a ? this._a : decode(this._pcmQueue, this.buffered * 2000),\n decode(this._syncQueue, Infinity),\n ]);\n\n const getDecodedAudio = (decodedAudioData) => {\n const decoded = {\n channelData: [],\n samplesDecoded: decodedAudioData.length,\n };\n\n for (let i = 0; i < decodedAudioData.numberOfChannels; i++)\n decoded.channelData.push(\n Float32Array.from(decodedAudioData.getChannelData(i)),\n );\n\n return decoded;\n };\n\n return [\n getDecodedAudio(this._a),\n getDecodedAudio(this._b),\n this._a.sampleRate,\n ];\n }\n}\n","import {\n p,\n event,\n state,\n audioElement,\n bufferLength,\n SYNCED,\n NOT_SYNCED,\n} from \"../global.js\";\nimport FrameQueue from \"../FrameQueue.js\";\n\nexport default class Player {\n constructor(icecast, endpoint, inputMimeType, codec, codecHeader) {\n this._icecast = icecast;\n this._endpoint = endpoint;\n this._inputMimeType = inputMimeType;\n this._codec = codec;\n this._codecHeader = codecHeader;\n\n const instanceVariables = p.get(this._icecast);\n\n this._audioElement = instanceVariables[audioElement];\n this._bufferLength = instanceVariables[bufferLength];\n\n this._codecUpdateTimestamp = 0;\n this._codecUpdateOffset = 0;\n\n this._notSyncedHandler = () => {\n this.syncState = NOT_SYNCED;\n };\n }\n\n static parseMimeType(mimeType) {\n return mimeType.match(\n /^(?:application\\/|audio\\/|)(?[a-zA-Z]+)(?:$|;[ ]*codecs=(?:\\'|\\\")(?[a-zA-Z,]+)(?:\\'|\\\"))/,\n );\n }\n\n static canPlayType(codecChecker, mimeType, mapping) {\n const matches = Player.parseMimeType(mimeType);\n\n const checkCodecs = (codecs) =>\n codecs.reduce((acc, codec) => {\n if (acc === \"\") return \"\";\n\n const result = codecChecker(codec);\n\n if (!result) return \"\";\n if (result === \"maybe\" || acc === \"maybe\") return \"maybe\";\n if (result === true || result === \"probably\") return \"probably\";\n }, null);\n\n if (matches) {\n const { mime, codecs } = matches.groups;\n\n const mimeMapping = mapping && mapping[mime];\n\n // mapping is a raw codec\n if (!mimeMapping || Array.isArray(mimeMapping)) {\n return (\n checkCodecs(mimeMapping || [mimeType]) || // check with the codec\n checkCodecs([`audio/${mime}`]) // check as a raw mimetype\n );\n }\n\n // mapping ia a container\n if (typeof mimeMapping === \"object\") {\n if (codecs) {\n const mimeCodecs = codecs.split(\",\");\n\n // multiple codecs are not supported\n if (mimeCodecs.length > 1) return \"\";\n if (!mimeMapping[mimeCodecs[0]]) return \"\";\n\n return checkCodecs(mimeMapping[mimeCodecs[0]]);\n }\n // container exists in list but no codecs were specified\n return \"maybe\";\n }\n }\n\n // codec not in the list\n return \"\";\n }\n\n enablePlayButton(supportedSources) {\n // set the audio element an empty source to enable the play button\n this._audioElement.removeAttribute(\"src\");\n this._audioElement.srcObject = null;\n\n if (supportedSources.includes(\"mediasource\")) {\n // MediaSourcePlayer\n this._audioElement.src = URL.createObjectURL(new MediaSource());\n } else if (supportedSources.includes(\"webaudio\")) {\n this._mediaStream = new MediaStream();\n this._audioElement.srcObject = this._mediaStream;\n } else if (supportedSources.includes(\"html5\")) {\n // HTML5Player\n // mp3 32kbs silence\n this._audioElement.src =\n \"data:audio/mpeg;base64,//sQxAAABFgC/SCEYACCgB9AAAAAppppVCAHBAEIgBByw9WD5+J8ufwxiDED\" +\n \"sMfE+D4fwG/RUGCx6VO4awVxV3qDtQNPiXKnZUNSwKuUDR6IgaeoGg7Fg6pMQU1FMy4xMDCqqqqqqqr/+xL\" +\n \"EB4PAAAGkAAAAIAAANIAAAASqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\" +\n \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo=\";\n\n this._audioElement.loop = true;\n }\n }\n\n get syncStateUpdate() {\n return this._syncStatePromise;\n }\n\n get syncState() {\n return this._syncState;\n }\n\n set syncState(newState) {\n this._syncState = newState;\n\n if (this._syncStateResolve) this._syncStateResolve(newState);\n\n this._syncStatePromise = new Promise((resolve) => {\n this._syncStateResolve = resolve;\n });\n }\n\n /**\n * @abstract\n */\n get isSupported() {\n return false;\n }\n\n /**\n * @abstract\n */\n get isAudioPlayer() {\n return false;\n }\n\n /**\n * @interface\n */\n get metadataTimestamp() {\n return 0;\n }\n\n /**\n * @interface\n */\n get currentTime() {\n return 0;\n }\n\n get waiting() {\n return Promise.resolve();\n }\n\n get icecastMetadataQueue() {\n return this._icecastMetadataQueue;\n }\n\n set icecastMetadataQueue(icecastMetadataQueue) {\n this._icecastMetadataQueue = icecastMetadataQueue;\n }\n\n get codecUpdateQueue() {\n return this._codecUpdateQueue;\n }\n\n set codecUpdateQueue(codecUpdateQueue) {\n this._codecUpdateQueue = codecUpdateQueue;\n }\n\n get metadataQueue() {\n return this._icecastMetadataQueue\n ? this._icecastMetadataQueue.metadataQueue\n : [];\n }\n\n _startMetadataQueues() {\n this._icecastMetadataQueue.startQueue(this._metadataOffset);\n this._codecUpdateQueue.startQueue(this._metadataOffset);\n }\n\n /**\n * @abstract\n */\n async _init() {\n this.syncState = SYNCED;\n this.syncFrames = [];\n this.syncDelay = null;\n this._frameQueue = new FrameQueue(this._icecast, this);\n }\n\n /**\n * @abstract\n */\n async start(metadataOffset) {\n this._metadataOffset = metadataOffset;\n\n [event.RETRY, event.SWITCH].forEach((e) =>\n this._icecast.addEventListener(e, this._notSyncedHandler),\n );\n\n let resolve;\n const playing = new Promise((r) => {\n resolve = r;\n [state.PLAYING, state.STOPPING].forEach((s) =>\n this._icecast.addEventListener(s, resolve, { once: true }),\n );\n }).finally(() => {\n [state.PLAYING, state.STOPPING].forEach((s) =>\n this._icecast.removeEventListener(s, resolve),\n );\n });\n\n await playing;\n }\n\n /**\n * @abstract\n */\n async end() {\n [event.RETRY, event.SWITCH].forEach((e) =>\n this._icecast.removeEventListener(e, this._notSyncedHandler),\n );\n\n this._icecastMetadataQueue.purgeMetadataQueue();\n this._codecUpdateQueue.purgeMetadataQueue();\n }\n\n /**\n * @abstract\n */\n onStream(frames) {\n return frames;\n }\n\n /**\n * @abstract\n */\n onMetadata(metadata) {\n this._icecastMetadataQueue.addMetadata(\n metadata,\n this.metadataTimestamp,\n this.currentTime,\n );\n }\n\n /**\n * @abstract\n */\n onCodecUpdate(metadata, updateTimestamp) {\n const currentTime = this.currentTime;\n\n // add previous offset when reconnecting\n if (updateTimestamp < currentTime)\n this._codecUpdateOffset += this._codecUpdateTimestamp;\n\n this._codecUpdateTimestamp = updateTimestamp;\n\n this._codecUpdateQueue.addMetadata(\n { metadata },\n (updateTimestamp + this._codecUpdateOffset) / 1000,\n currentTime,\n );\n }\n}\n","import { state, event, fireEvent, NOT_SYNCED } from \"../global.js\";\nimport Player from \"./Player.js\";\n\nexport default class HTML5Player extends Player {\n constructor(icecast, endpoint) {\n super(icecast, endpoint);\n\n this._audioElement.crossOrigin = \"anonymous\";\n this._audioElement.loop = false;\n this._audioElement.preload = \"none\";\n\n this._icecast.addEventListener(event.STREAM_START, () => {\n if (!this._playReady) this.end();\n });\n\n this._init();\n }\n\n static canPlayType(mimeType) {\n if (!HTML5Player.isSupported) return \"\";\n\n return super.canPlayType((type) => new Audio().canPlayType(type), mimeType);\n }\n\n static get isSupported() {\n return Boolean(window.Audio);\n }\n\n static get name() {\n return \"html5\";\n }\n\n get isAudioPlayer() {\n return true;\n }\n\n get metadataTimestamp() {\n return this._frame\n ? (this._frame.totalDuration + this._metadataTimestampOffset) / 1000\n : 0;\n }\n\n get currentTime() {\n return (\n this._audioLoadedTimestamp &&\n (performance.now() - this._audioLoadedTimestamp) / 1000\n );\n }\n\n get waiting() {\n return new Promise((resolve) => {\n this._audioElement.addEventListener(\"waiting\", resolve, { once: true });\n });\n }\n\n async _init() {\n super._init();\n\n this._frame = null;\n this._audioLoadedTimestamp = 0;\n this._metadataTimestampOffset = 0;\n this._playReady = false;\n }\n\n async start(metadataOffset) {\n const playing = super.start(metadataOffset);\n\n this._metadataLoadedTimestamp = performance.now();\n this._audioElement.src = null;\n this._audioElement.srcObject = null;\n this._audioElement.src = this._endpoint;\n\n if (\n this._icecast.state !== state.STOPPING &&\n this._icecast.state !== state.STOPPED\n ) {\n this._audioElement.addEventListener(\n \"playing\",\n () => {\n this._audioLoadedTimestamp = performance.now();\n this._metadataTimestampOffset =\n performance.now() - this._metadataLoadedTimestamp;\n\n this._startMetadataQueues();\n this._icecast[fireEvent](event.PLAY);\n },\n { once: true },\n );\n\n this._icecast[fireEvent](event.PLAY_READY);\n this._playReady = true;\n }\n\n await playing;\n }\n\n async end() {\n super.end();\n\n this._audioElement.src = null;\n this._audioElement.srcObject = null;\n\n this._init();\n }\n\n onStream(frames) {\n this._frame = frames[frames.length - 1] || this._frame;\n\n if (this.syncState === NOT_SYNCED) {\n // syncing not implemented in html5 playback method\n this.syncState = NOT_SYNCED;\n }\n }\n}\n","import {\n state,\n event,\n fireEvent,\n concatBuffers,\n SYNCED,\n PCM_SYNCED,\n SYNCING,\n NOT_SYNCED,\n} from \"../global.js\";\nimport Player from \"./Player.js\";\n\nconst BUFFER = 5; // seconds of audio to store in SourceBuffer\nconst BUFFER_INTERVAL = 5; // seconds before removing from SourceBuffer\n\nexport default class MediaSourcePlayer extends Player {\n constructor(icecast, endpoint, inputMimeType, codec, codecHeader) {\n super(icecast, endpoint, inputMimeType, codec, codecHeader);\n\n this._MSEAudioWrapper = import(\n /* webpackChunkName: \"mediasource\", webpackPrefetch: true */\n \"mse-audio-wrapper\"\n );\n\n this._init();\n }\n\n static canPlayType(mimeType) {\n const mapping = {\n mpeg: ['audio/mp4;codecs=\"mp3\"'],\n aac: ['audio/mp4;codecs=\"mp4a.40.2\"'],\n aacp: ['audio/mp4;codecs=\"mp4a.40.2\"'],\n flac: ['audio/mp4;codecs=\"flac\"'],\n ogg: {\n flac: ['audio/mp4;codecs=\"flac\"'],\n opus: ['audio/mp4;codecs=\"opus\"', 'audio/webm;codecs=\"opus\"'],\n vorbis: ['audio/webm;codecs=\"vorbis\"'],\n },\n };\n\n if (!MediaSourcePlayer.isSupported) return \"\";\n\n if (MediaSource.isTypeSupported(mimeType)) return \"probably\";\n\n return super.canPlayType(MediaSource.isTypeSupported, mimeType, mapping);\n }\n\n static get isSupported() {\n return Boolean(window.MediaSource);\n }\n\n static get name() {\n return \"mediasource\";\n }\n\n get isAudioPlayer() {\n return true;\n }\n\n get metadataTimestamp() {\n return (\n (this._mediaSource &&\n this._mediaSource.sourceBuffers.length &&\n Math.max(\n // work-around for WEBM reporting a negative timestampOffset\n this._mediaSource.sourceBuffers[0].timestampOffset,\n this._mediaSource.sourceBuffers[0].buffered.length\n ? this._mediaSource.sourceBuffers[0].buffered.end(0)\n : 0,\n )) ||\n 0\n );\n }\n\n get currentTime() {\n return this._audioElement.currentTime;\n }\n\n get waiting() {\n return new Promise((resolve) => {\n this._audioElement.addEventListener(\"waiting\", resolve, { once: true });\n });\n }\n\n async _init() {\n super._init();\n\n this._sourceBufferQueue = [];\n this._playReady = false;\n this._processingLastPage = false;\n\n this._mediaSourceCreated = new Promise((resolve) => {\n this._mediaSourceCreatedNotify = resolve;\n });\n\n this._mediaSourceOpen = new Promise((resolve) => {\n this._mediaSourceOpenNotify = resolve;\n });\n\n this._addFrames = this._prepareMediaSource(\n this._inputMimeType,\n this._codec,\n );\n\n await this._mediaSourceOpen;\n }\n\n async start(metadataOffset) {\n const playing = super.start(metadataOffset);\n await this._mediaSourceCreated;\n await this._attachMediaSource();\n await playing;\n }\n\n async end() {\n super.end();\n\n await this._init();\n }\n\n async onStream(frames) {\n frames = frames.flatMap((frame) =>\n frame.codecFrames\n ? frame.codecFrames.map((codecFrame) => {\n codecFrame.isLastPage = frame.isLastPage;\n return codecFrame;\n })\n : frame,\n );\n\n if (frames.length) {\n switch (this.syncState) {\n case NOT_SYNCED:\n this._frameQueue.initSync();\n this.syncState = SYNCING;\n case SYNCING:\n [this.syncFrames, this.syncState, this.syncDelay] =\n await this._frameQueue.sync(frames);\n frames = this.syncFrames;\n }\n\n switch (this.syncState) {\n case PCM_SYNCED:\n break;\n case SYNCED:\n // when frames are present, we should already know the codec and have the mse audio mimetype determined\n await this._mediaSourceOpen;\n await this._addFrames(frames); // wait for the source buffer to be created\n\n this._frameQueue.addAll(frames);\n break;\n }\n }\n }\n\n _prepareMediaSource(inputMimeType, codec) {\n if (MediaSource.isTypeSupported(inputMimeType)) {\n // pass the audio directly to MSE\n this._createMediaSource(inputMimeType);\n\n return async (frames) =>\n this._appendSourceBuffer(concatBuffers(frames.map((f) => f.data)));\n }\n\n this._codecHeader\n .then((codecHeader) =>\n this._createMSEWrapper(inputMimeType, codec, codecHeader.channels),\n )\n .then(() => {\n this._createMediaSource(this._wrapper.mimeType);\n });\n\n return inputMimeType.match(/ogg/)\n ? async (codecFrames) => {\n let fragments = [];\n\n for await (const frame of codecFrames) {\n // handle new setup packet for continuous chain ogg vorbis streams\n if (this._processingLastPage !== frame.isLastPage) {\n if (frame.isLastPage) {\n this._processingLastPage = true;\n } else {\n await this._appendSourceBuffer(concatBuffers(fragments));\n fragments = [];\n\n const codecHeader = await this._codecHeader;\n await this._createMSEWrapper(\n inputMimeType,\n codec,\n codecHeader.channels,\n );\n\n this._processingLastPage = false;\n }\n }\n\n fragments.push(...this._wrapper.iterator([frame]));\n }\n\n await this._appendSourceBuffer(concatBuffers(fragments));\n }\n : async (codecFrames) =>\n this._appendSourceBuffer(\n concatBuffers([...this._wrapper.iterator(codecFrames)]),\n );\n }\n\n async _createMSEWrapper(inputMimeType, codec, channels) {\n // wrap the audio into fragments before passing to MSE\n this._wrapper = new (await this._MSEAudioWrapper).default(inputMimeType, {\n codec,\n preferredContainer: channels > 2 ? \"webm\" : \"fmp4\",\n });\n\n if (!MediaSource.isTypeSupported(this._wrapper.mimeType)) {\n this._icecast[fireEvent](\n event.PLAYBACK_ERROR,\n `Media Source Extensions API in your browser does not support ${inputMimeType} or ${this._wrapper.mimeType}.` +\n \"See: https://caniuse.com/mediasource and https://developer.mozilla.org/en-US/docs/Web/API/Media_Source_Extensions_API\",\n );\n }\n }\n\n _createMediaSource(mimeType) {\n this._mediaSource = new MediaSource();\n this._mediaSourceCreatedNotify();\n\n this._mediaSource.addEventListener(\n \"sourceopen\",\n () => {\n if (\n this._icecast.state !== state.STOPPED &&\n this._icecast.state !== state.STOPPING\n )\n this._mediaSource.addSourceBuffer(mimeType).mode = \"sequence\";\n this._sourceBufferRemoved = 0;\n this._mediaSourceOpenNotify();\n },\n {\n once: true,\n },\n );\n }\n\n async _attachMediaSource() {\n this._audioElement.loop = false;\n this._audioElement.src = URL.createObjectURL(this._mediaSource);\n await this._mediaSourceOpen;\n }\n\n async _waitForSourceBuffer() {\n return new Promise((resolve) => {\n const sourceBuffer = this._mediaSource.sourceBuffers[0];\n\n if (!sourceBuffer.updating) {\n resolve();\n } else {\n sourceBuffer.addEventListener(\"updateend\", resolve, {\n once: true,\n });\n }\n });\n }\n\n async _appendSourceBuffer(chunk) {\n this._icecast[fireEvent](event.STREAM, chunk);\n\n if (!this._mediaSource.sourceBuffers.length) {\n this._icecast[fireEvent](\n event.WARN,\n \"Attempting to append audio, but MediaSource has not been or is no longer initialized\",\n \"Please be sure that `detachAudioElement()` was called and awaited before reusing the element with a new IcecastMetadataPlayer instance\",\n );\n }\n\n if (\n this._icecast.state !== state.STOPPING &&\n this._mediaSource.sourceBuffers.length\n ) {\n this._sourceBufferQueue.push(chunk);\n\n try {\n while (this._sourceBufferQueue.length) {\n this._mediaSource.sourceBuffers[0].appendBuffer(\n this._sourceBufferQueue.shift(),\n );\n await this._waitForSourceBuffer();\n }\n } catch (e) {\n if (e.name !== \"QuotaExceededError\") throw e;\n }\n\n if (!this._playReady) {\n if (this._bufferLength <= this.metadataTimestamp) {\n this._audioElement.addEventListener(\n \"playing\",\n () => {\n this._startMetadataQueues();\n this._icecast[fireEvent](event.PLAY);\n },\n { once: true },\n );\n this._icecast[fireEvent](event.PLAY_READY);\n this._playReady = true;\n } else {\n this._icecast[fireEvent](event.BUFFER, this.metadataTimestamp);\n }\n }\n\n if (\n this._audioElement.currentTime > BUFFER + this._bufferLength &&\n this._sourceBufferRemoved + BUFFER_INTERVAL * 1000 < performance.now()\n ) {\n this._sourceBufferRemoved = performance.now();\n this._mediaSource.sourceBuffers[0].remove(\n 0,\n this._audioElement.currentTime - BUFFER + this._bufferLength,\n );\n await this._waitForSourceBuffer();\n }\n }\n }\n}\n","import {\n audioContext,\n event,\n state,\n SYNCED,\n PCM_SYNCED,\n SYNCING,\n NOT_SYNCED,\n fireEvent,\n} from \"../global.js\";\nimport Player from \"./Player.js\";\n\nexport default class WebAudioPlayer extends Player {\n constructor(icecast, endpoint, inputMimeType, codec, codecHeader) {\n super(icecast, endpoint, inputMimeType, codec, codecHeader);\n\n this._audioContext = icecast[audioContext];\n\n this._init();\n }\n\n static canPlayType(mimeType) {\n const mapping = {\n flac: [\"audio/flac\"],\n mpeg: [\"audio/mpeg\"],\n ogg: {\n flac: ['audio/ogg;codecs=\"flac\"'],\n opus: ['audio/ogg;codecs=\"opus\"'],\n vorbis: ['audio/ogg;codecs=\"vorbis\"'],\n },\n };\n\n if (!WebAudioPlayer.isSupported) return \"\";\n\n return super.canPlayType(\n (codec) =>\n codec === 'audio/ogg;codecs=\"opus\"' ||\n codec === 'audio/ogg;codecs=\"flac\"' ||\n codec === 'audio/ogg;codecs=\"vorbis\"' ||\n codec === \"audio/mpeg\" ||\n codec === \"audio/flac\",\n mimeType,\n mapping,\n );\n }\n\n static get isSupported() {\n return Boolean(\n window.WebAssembly &&\n (window.AudioContext || window.webkitAudioContext) &&\n window.MediaStream,\n );\n }\n\n static get name() {\n return \"webaudio\";\n }\n\n get isAudioPlayer() {\n return true;\n }\n\n get metadataTimestamp() {\n return this._currentTime / 1000;\n }\n\n get currentTime() {\n return (performance.now() - this._playbackStartTime) / 1000 || 0;\n }\n\n get waiting() {\n return this._waitingPromise;\n }\n\n _updateWaiting(duration) {\n this._bufferedDuration += duration;\n\n let durationTimeout;\n durationTimeout = setTimeout(() => {\n this._bufferedDuration -= duration;\n this._durationTimeouts.delete(durationTimeout);\n\n if (!this._durationTimeouts.size) this._notifyWaiting();\n }, this._bufferedDuration);\n\n this._durationTimeouts.add(durationTimeout);\n }\n\n _notifyWaiting() {\n if (this._waitingResolve) this._waitingResolve();\n\n this._waitingPromise = new Promise((resolve) => {\n this._waitingResolve = resolve;\n });\n }\n\n _resetWaiting() {\n if (this._durationTimeouts)\n this._durationTimeouts.forEach((id) => clearTimeout(id));\n\n this._durationTimeouts = new Set();\n this._bufferedDuration = 0;\n this._notifyWaiting();\n }\n\n async _createDecoder() {\n let DecoderClass;\n\n this._loadingDecoder = new Promise((resolve) => {\n this._decoderLoaded = resolve;\n });\n\n try {\n switch (this._codec) {\n case \"mpeg\":\n const { MPEGDecoderWebWorker } = await import(\n /* webpackChunkName: \"mpeg\" */ \"mpg123-decoder\"\n );\n DecoderClass = MPEGDecoderWebWorker;\n break;\n case \"opus\":\n const { OpusDecoderWebWorker } = await import(\n /* webpackChunkName: \"opus\" */ \"opus-decoder\"\n );\n DecoderClass = OpusDecoderWebWorker;\n break;\n case \"flac\":\n const { FLACDecoderWebWorker } = await import(\n /* webpackChunkName: \"flac\" */ \"@wasm-audio-decoders/flac\"\n );\n DecoderClass = FLACDecoderWebWorker;\n break;\n case \"vorbis\":\n const { OggVorbisDecoderWebWorker } = await import(\n /* webpackChunkName: \"vorbis\" */ \"@wasm-audio-decoders/ogg-vorbis\"\n );\n DecoderClass = OggVorbisDecoderWebWorker;\n break;\n }\n } catch (e) {\n this._icecast[fireEvent](\n event.PLAYBACK_ERROR,\n `Missing \\`webaudio-${this._codec}\\` dependency.`,\n `Unable to playback playback \\`${this._codec}\\` audio.`,\n );\n return;\n }\n\n if (DecoderClass) {\n const codecHeader = await this._codecHeader;\n this._decoderLoaded();\n this._wasmDecoder = new DecoderClass(codecHeader);\n } else {\n this._icecast[fireEvent](\n event.PLAYBACK_ERROR,\n \"Unsupported `webaudio` playback codec: \" + this._codec,\n );\n }\n }\n\n async _init() {\n super._init();\n\n this._currentTime = 0;\n this._decodedSample = 0;\n this._startSampleOffset = 0;\n this._sampleRate = 0;\n this._playbackStartTime = undefined;\n this._playReady = false;\n\n this._resetWaiting();\n\n this._playPromise = new Promise((resolve) => {\n this._playStart = resolve;\n });\n }\n\n async start(metadataOffset) {\n if (!this._wasmDecoder) await this._createDecoder();\n\n const playing = super.start(metadataOffset);\n this._playStart();\n await playing;\n }\n\n async end() {\n super.end();\n\n if (this._wasmDecoder) {\n this._wasmDecoder.terminate();\n this._wasmDecoder = null;\n }\n\n if (this._mediaStream) {\n // disconnect the currently playing media stream\n this._mediaStream.stream\n .getTracks()\n .forEach((track) => this._mediaStream.stream.removeTrack(track));\n }\n\n this._init();\n }\n\n async onStream(frames) {\n if (this._codec !== \"vorbis\") {\n frames = frames.flatMap((oggPage) => oggPage.codecFrames || oggPage);\n\n switch (this.syncState) {\n case NOT_SYNCED:\n this._frameQueue.initSync();\n this.syncState = SYNCING;\n case SYNCING:\n [this.syncFrames, this.syncState, this.syncDelay] =\n await this._frameQueue.sync(frames);\n frames = this.syncFrames;\n }\n }\n\n switch (this.syncState) {\n case PCM_SYNCED:\n break;\n case SYNCED:\n if (frames.length) {\n this._currentTime = frames[frames.length - 1].totalDuration;\n\n this._decodeAndPlay(frames);\n }\n }\n }\n\n async _decodeAndPlay(frames) {\n await this._loadingDecoder;\n\n if (this._wasmDecoder) {\n await this._wasmDecoder.ready;\n\n let decodePromise;\n\n if (this._codec === \"vorbis\") {\n decodePromise = this._wasmDecoder.decodeOggPages(frames);\n } else {\n decodePromise = this._wasmDecoder.decodeFrames(\n frames.map((f) => f.data),\n );\n this._frameQueue.addAll(frames);\n }\n\n decodePromise.then((decoded) => this._play(decoded));\n }\n }\n\n async _play({ channelData, samplesDecoded, sampleRate }) {\n await this._playPromise;\n\n if (\n this._icecast.state !== state.STOPPING &&\n this._icecast.state !== state.STOPPED &&\n samplesDecoded\n ) {\n this._icecast[fireEvent](event.STREAM, {\n channelData,\n samplesDecoded,\n sampleRate,\n });\n\n if (!this._sampleRate) {\n this._sampleRate = sampleRate;\n\n this._mediaStream = this._audioContext.createMediaStreamDestination();\n this._mediaStream.channelCount =\n this._audioContext.destination.maxChannelCount;\n\n this._audioElement.srcObject = this._mediaStream.stream; // triggers canplay event\n }\n\n const audioBuffer = this._audioContext.createBuffer(\n channelData.length,\n samplesDecoded,\n this._sampleRate,\n );\n\n channelData.forEach((channel, idx) =>\n audioBuffer.getChannelData(idx).set(channel),\n );\n\n const source = this._audioContext.createBufferSource();\n source.buffer = audioBuffer;\n source.connect(this._mediaStream);\n\n const scalingFactor = 100;\n const startSamples =\n this._decodedSample * scalingFactor + this._startSampleOffset;\n const audioContextSamples = Math.round(\n this._audioContext.currentTime * this._sampleRate * scalingFactor,\n );\n\n if (startSamples < audioContextSamples) {\n // audio context time starts incrementing immediately when it's created\n // offset needs to be accounted for to prevent overlapping sources\n this._startSampleOffset += audioContextSamples - startSamples;\n }\n\n source.start(startSamples / this._sampleRate / scalingFactor);\n\n this._updateWaiting((samplesDecoded / this._sampleRate) * 1000);\n\n if (!this._playReady) {\n if (this._bufferLength <= this.metadataTimestamp) {\n this._icecast[fireEvent](event.PLAY_READY);\n this._playbackStartTime = performance.now();\n\n this._startMetadataQueues();\n this._icecast[fireEvent](event.PLAY);\n this._playReady = true;\n } else {\n this._icecast[fireEvent](event.BUFFER, this.metadataTimestamp);\n }\n }\n\n this._decodedSample += samplesDecoded;\n }\n }\n}\n","import {\n IcecastMetadataQueue,\n IcecastReadableStream,\n} from \"icecast-metadata-js\";\nimport CodecParser from \"codec-parser\";\n\nimport {\n p,\n state,\n event,\n audioElement,\n enableLogging,\n enableCodecUpdate,\n endpointGenerator,\n metadataTypes,\n icyMetaInt,\n icyCharacterEncoding,\n icyDetectionTimeout,\n playbackMethod,\n fireEvent,\n hasIcy,\n abortController,\n playerState,\n SYNCED,\n PCM_SYNCED,\n SYNCING,\n NOT_SYNCED,\n noOp,\n authentication,\n} from \"./global.js\";\n\nimport Player from \"./players/Player.js\";\nimport HTML5Player from \"./players/HTML5Player.js\";\nimport MediaSourcePlayer from \"./players/MediaSourcePlayer.js\";\nimport WebAudioPlayer from \"./players/WebAudioPlayer.js\";\n\nexport default class PlayerFactory {\n constructor(icecast) {\n const instanceVariables = p.get(icecast);\n\n this._icecast = icecast;\n this._audioElement = instanceVariables[audioElement];\n this._enableLogging = instanceVariables[enableLogging];\n this._enableCodecUpdate = instanceVariables[enableCodecUpdate];\n\n this._playbackMethod = \"\";\n\n this._newMetadataQueues();\n this._player = new Player(this._icecast);\n this._player.icecastMetadataQueue = this._icecastMetadataQueue;\n this._player.codecUpdateQueue = this._codecUpdateQueue;\n this._player.enablePlayButton(PlayerFactory.supportedPlaybackMethods);\n\n this._unprocessedFrames = [];\n this._codecParser = undefined;\n this._inputMimeType = \"\";\n this._codec = \"\";\n\n this._syncPromise = Promise.resolve();\n this._syncCancel = noOp;\n }\n\n static get supportedPlaybackMethods() {\n return [MediaSourcePlayer, WebAudioPlayer, HTML5Player].map((player) =>\n player.isSupported ? player.name : \"\",\n );\n }\n\n static canPlayType(type) {\n return {\n mediasource: MediaSourcePlayer.canPlayType(type),\n html5: HTML5Player.canPlayType(type),\n webaudio: WebAudioPlayer.canPlayType(type),\n };\n }\n\n get endpoint() {\n return this._endpoint;\n }\n\n get player() {\n return this._player;\n }\n\n get playbackMethod() {\n return this._playbackMethod;\n }\n\n get icyMetaInt() {\n return (\n this._icecastReadableStream && this._icecastReadableStream.icyMetaInt\n );\n }\n\n async playStream() {\n return this.fetchStream()\n .then(async (res) => {\n this._icecast[fireEvent](event.STREAM_START);\n\n return this.readIcecastResponse(res).finally(() => {\n this._icecast[fireEvent](event.STREAM_END);\n });\n })\n .catch((e) => {\n if (this._icecast.state !== state.SWITCHING) throw e;\n });\n }\n\n async switchStream() {\n if (this._icecast.state !== state.PLAYING) {\n this._syncCancel();\n await this._syncPromise;\n }\n\n const instance = p.get(this._icecast);\n\n instance[playerState] = state.SWITCHING;\n instance[abortController].abort();\n instance[abortController] = new AbortController();\n }\n\n async fetchStream() {\n const instanceVariables = p.get(this._icecast);\n this._endpoint = instanceVariables[endpointGenerator].next().value;\n\n const headers = instanceVariables[hasIcy] ? { \"Icy-MetaData\": 1 } : {};\n headers[\"Range\"] = \"bytes=0-\";\n\n if (instanceVariables[authentication]) {\n const auth = instanceVariables[authentication];\n headers[\"Authorization\"] =\n \"Basic \" + btoa(auth.user + \":\" + auth.password);\n }\n\n const res = await fetch(this._endpoint, {\n method: \"GET\",\n headers,\n signal: instanceVariables[abortController].signal,\n });\n\n if (!res.ok) {\n const error = new Error(`${res.status} received from ${res.url}`);\n error.name = \"HTTP Response Error\";\n throw error;\n }\n\n return res;\n }\n\n async readIcecastResponse(res) {\n const inputMimeType = res.headers.get(\"content-type\");\n const instanceVariables = p.get(this._icecast);\n\n let onCodecHeader;\n const codecHeaderPromise = new Promise((resolve) => {\n onCodecHeader = resolve;\n });\n\n const codecPromise = new Promise((onCodec) => {\n this._codecParser = new CodecParser(inputMimeType, {\n onCodec,\n onCodecHeader,\n onCodecUpdate:\n this._enableCodecUpdate &&\n ((...args) => this._player.onCodecUpdate(...args)),\n enableLogging: this._enableLogging,\n });\n });\n\n this._icecastReadableStream = new IcecastReadableStream(res, {\n onMetadata: async (metadata) => {\n this._player.onMetadata(metadata);\n },\n onStream: async ({ stream }) => {\n this._icecast[fireEvent](event.STREAM, stream);\n\n const frames = [...this._codecParser.parseChunk(stream)];\n\n if (this._player.isAudioPlayer) {\n const appendedFrames = [...this._unprocessedFrames, ...frames];\n this._unprocessedFrames = [];\n\n await this._player.onStream(appendedFrames);\n } else {\n this._unprocessedFrames.push(...frames);\n }\n },\n onError: (...args) => this._icecast[fireEvent](event.WARN, ...args),\n metadataTypes: instanceVariables[metadataTypes],\n icyCharacterEncoding: instanceVariables[icyCharacterEncoding],\n icyDetectionTimeout: instanceVariables[icyDetectionTimeout],\n ...(instanceVariables[icyMetaInt]\n ? { icyMetaInt: instanceVariables[icyMetaInt] }\n : {}),\n });\n\n const icecastPromise = this._icecastReadableStream.startReading();\n const codec = await codecPromise;\n\n if (!this._player.isAudioPlayer) {\n [this._player, this._playbackMethod] = this._buildPlayer(\n inputMimeType,\n codec,\n codecHeaderPromise,\n );\n }\n\n if (this._player.syncState === SYNCED) {\n this._player.start();\n } else {\n await this._syncPlayer(inputMimeType, codec, codecHeaderPromise);\n }\n\n await icecastPromise;\n }\n\n async _syncPlayer(inputMimeType, codec, codecHeaderPromise) {\n let delayTimeoutId,\n canceled = false,\n playerStarted = false,\n complete;\n\n const oldPlayer = this._player;\n const oldIcecastMetadataQueue = this._player.icecastMetadataQueue;\n const oldCodecUpdateQueue = this._player.codecUpdateQueue;\n\n this._newMetadataQueues();\n // intercept all new metadata updates\n oldPlayer.icecastMetadataQueue = this._icecastMetadataQueue;\n oldPlayer.codecUpdateQueue = this._codecUpdateQueue;\n\n const startNewPlayer = () => {\n playerStarted = true;\n if (\n this._icecast.state !== state.STOPPING ||\n this._icecast.state !== state.STOPPED\n ) {\n oldPlayer.icecastMetadataQueue.purgeMetadataQueue();\n oldPlayer.codecUpdateQueue.purgeMetadataQueue();\n this._player\n .start(Math.max(0, oldPlayer.syncDelay / 1000))\n .then(() => oldPlayer.end())\n .then(complete);\n }\n };\n\n this._syncCancel = () => {\n canceled = true;\n\n this._icecastMetadataQueue.purgeMetadataQueue();\n this._codecUpdateQueue.purgeMetadataQueue();\n\n this._player.icecastMetadataQueue = oldIcecastMetadataQueue;\n this._player.codecUpdateQueue = oldCodecUpdateQueue;\n\n if (delayTimeoutId !== undefined && !playerStarted) {\n clearTimeout(delayTimeoutId);\n startNewPlayer();\n }\n };\n\n const handleSyncEvent = () => {\n return this._player.syncStateUpdate.then((syncState) => {\n if (canceled) complete();\n else\n switch (syncState) {\n case SYNCING:\n return handleSyncEvent();\n case SYNCED: // synced on crc32 hashes\n // put old queues back since audio data is crc synced\n this._icecastMetadataQueue.purgeMetadataQueue();\n this._codecUpdateQueue.purgeMetadataQueue();\n this._player.icecastMetadataQueue = oldIcecastMetadataQueue;\n this._player.codecUpdateQueue = oldCodecUpdateQueue;\n\n if (\n this._icecast.state !== state.STOPPING ||\n this._icecast.state !== state.STOPPED\n )\n this._icecast[playerState] = state.PLAYING;\n\n complete();\n break;\n case PCM_SYNCED:\n case NOT_SYNCED:\n // put old queues back so they can be purged when the player is ended\n oldPlayer.icecastMetadataQueue = oldIcecastMetadataQueue;\n oldPlayer.codecUpdateQueue = oldCodecUpdateQueue;\n\n [this._player, this._playbackMethod] = this._buildPlayer(\n inputMimeType,\n codec,\n codecHeaderPromise,\n );\n\n this._unprocessedFrames.push(...oldPlayer.syncFrames);\n\n // start player after delay or immediately\n delayTimeoutId = setTimeout(\n startNewPlayer,\n Math.max(oldPlayer.syncDelay, 0),\n );\n }\n });\n };\n\n let stoppingHandler;\n\n this._syncPromise = new Promise((resolve) => {\n complete = resolve;\n\n // cancel switch event if stop is called\n stoppingHandler = () => {\n this._syncCancel();\n complete();\n };\n\n this._icecast.addEventListener(state.STOPPING, stoppingHandler, {\n once: true,\n });\n\n handleSyncEvent();\n }).finally(() => {\n this._icecast.removeEventListener(state.STOPPING, stoppingHandler);\n });\n }\n\n _newMetadataQueues() {\n this._icecastMetadataQueue = new IcecastMetadataQueue({\n onMetadataUpdate: (...args) =>\n this._icecast[fireEvent](event.METADATA, ...args),\n onMetadataEnqueue: (...args) =>\n this._icecast[fireEvent](event.METADATA_ENQUEUE, ...args),\n paused: true,\n });\n\n this._codecUpdateQueue = new IcecastMetadataQueue({\n onMetadataUpdate: (...args) =>\n this._icecast[fireEvent](event.CODEC_UPDATE, ...args),\n paused: true,\n });\n }\n\n _buildPlayer(inputMimeType, codec, codecHeader) {\n // in order of preference\n const { [p.get(this._icecast)[playbackMethod]]: firstMethod, ...rest } = {\n mediasource: MediaSourcePlayer,\n webaudio: WebAudioPlayer,\n html5: HTML5Player,\n };\n\n let player, method;\n\n for (const Player of Object.values({ firstMethod, ...rest })) {\n const support = Player.canPlayType(`${inputMimeType};codecs=\"${codec}\"`);\n\n if (support === \"probably\" || support === \"maybe\") {\n method = Player.name;\n player = new Player(\n this._icecast,\n this._endpoint,\n inputMimeType,\n codec,\n codecHeader,\n );\n player.icecastMetadataQueue = this._icecastMetadataQueue;\n player.codecUpdateQueue = this._codecUpdateQueue;\n break;\n }\n }\n\n if (!player) {\n throw new Error(\n `Your browser does not support this audio codec ${inputMimeType}${\n codec && `;codecs=\"${codec}\"`\n }`,\n );\n }\n\n return [player, method];\n }\n}\n","/**\n * @license\n * @see https://github.com/eshaz/icecast-metadata-js\n * @copyright 2021-2024 Ethan Halsall\n * This file is part of icecast-metadata-player.\n *\n * icecast-metadata-player free software: you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * icecast-metadata-player distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program. If not, see \n */\n\nimport {\n p,\n noOp,\n state,\n event,\n // options,\n endpoints,\n metadataTypes,\n playbackMethod,\n audioContext,\n audioElement,\n bufferLength,\n icyMetaInt,\n icyCharacterEncoding,\n icyDetectionTimeout,\n enableLogging,\n enableCodecUpdate,\n retryDelayMin,\n retryDelayMax,\n retryDelayRate,\n endpointOrder,\n retryTimeout,\n authentication,\n // methods\n fireEvent,\n attachAudioElement,\n shouldRetry,\n logError,\n getOptions,\n getNextEndpointGenerator,\n // variables\n endpointGenerator,\n hasIcy,\n abortController,\n playerState,\n} from \"./global.js\";\n\nimport EventTargetPolyfill from \"./EventTargetPolyfill.js\";\nimport PlayerFactory from \"./PlayerFactory.js\";\n\nlet EventClass;\n\ntry {\n new window.EventTarget();\n EventClass = window.EventTarget;\n} catch {\n EventClass = EventTargetPolyfill;\n}\n\nconst playerFactory = Symbol();\nconst playerResetPromise = Symbol();\nconst events = Symbol();\n\nconst onAudioPause = Symbol();\nconst onAudioPlay = Symbol();\nconst onPlayReady = Symbol();\nconst onAudioError = Symbol();\nconst onAudioWaiting = Symbol();\n\nconst stopPlayback = Symbol();\nconst endPlayback = Symbol();\nconst retryAttempt = Symbol();\nconst retryTimeoutId = Symbol();\n\nexport default class IcecastMetadataPlayer extends EventClass {\n static *[getNextEndpointGenerator](instance) {\n while (true) {\n const currentEndpoints = p.get(instance)[endpoints];\n for (const endpoint of currentEndpoints) {\n yield endpoint;\n if (p.get(instance)[endpoints] !== currentEndpoints) break;\n }\n }\n }\n\n static [getOptions](urls, options, instance = {}) {\n const newOptions = {\n [endpoints]:\n (urls && (Array.isArray(urls) ? urls : [urls])) ?? instance[endpoints],\n [bufferLength]: options.bufferLength ?? instance[bufferLength] ?? 1,\n [icyMetaInt]: options.icyMetaInt ?? instance[icyMetaInt],\n [icyCharacterEncoding]:\n options.icyCharacterEncoding ?? instance[icyCharacterEncoding],\n [icyDetectionTimeout]:\n options.icyDetectionTimeout ?? instance[icyDetectionTimeout],\n [metadataTypes]: (options.metadataTypes ?? instance[metadataTypes]) || [\n \"icy\",\n ],\n [hasIcy]: (\n (options.metadataTypes ?? instance[metadataTypes]) || [\"icy\"]\n ).includes(\"icy\"),\n [enableLogging]:\n options.enableLogging ?? instance[enableLogging] ?? false,\n [enableCodecUpdate]: Boolean(\n options.enableCodecUpdate ??\n instance[enableCodecUpdate] ??\n options.onCodecUpdate,\n ),\n [endpointOrder]:\n options.endpointOrder ?? instance[endpointOrder] ?? \"ordered\",\n [retryDelayRate]:\n options.retryDelayRate ?? instance[retryDelayRate] ?? 0.1,\n [retryDelayMin]: options.retryDelayMin ?? instance[retryDelayMin] ?? 0.5,\n [retryDelayMax]: options.retryDelayMax ?? instance[retryDelayMax] ?? 2,\n [retryTimeout]: options.retryTimeout ?? instance[retryTimeout] ?? 30,\n [playbackMethod]:\n (options.playbackMethod ?? instance[playbackMethod]) || \"mediasource\",\n [authentication]: options.authentication ?? instance[authentication],\n };\n\n if (\n newOptions[endpoints] !== instance[endpoints] &&\n newOptions[endpointOrder] === \"random\"\n )\n newOptions[endpoints] = newOptions[endpoints].sort(\n () => 0.5 - Math.random(),\n );\n\n return newOptions;\n }\n\n /**\n * @constructor\n * @param {string|string[]} endpoint Endpoint(s) of the Icecast compatible stream\n * @param {object} options Options object\n * @param {HTMLAudioElement} options.audioElement Audio element to play the stream\n * @param {Array} options.metadataTypes Array of metadata types to parse\n * @param {number} options.bufferLength Seconds of audio to buffer before starting playback\n * @param {number} options.icyMetaInt ICY metadata interval\n * @param {string} options.icyCharacterEncoding Character encoding to use for ICY metadata (defaults to \"utf-8\")\n * @param {number} options.icyDetectionTimeout ICY metadata detection timeout\n * @param {string} options.endpointOrder Order that a stream endpoint will be chosen when multiple endpoints are passed in.\n * @param {number} options.retryTimeout Number of seconds to wait before giving up on retries\n * @param {number} options.retryDelayRate Percentage of seconds to increment after each retry (how quickly to increase the back-off)\n * @param {number} options.retryDelayMin Minimum number of seconds between retries (start of the exponential back-off curve)\n * @param {number} options.retryDelayMax Maximum number of seconds between retries (end of the exponential back-off curve)\n * @param {boolean} options.enableLogging Set to `true` to enable warning and error logging to the console\n * @param {string} options.playbackMethod Sets the preferred playback method (mediasource (default), html5, webaudio)\n *\n * @callback options.onMetadata Called with metadata when synchronized with the audio\n * @callback options.onMetadataEnqueue Called with metadata when discovered on the response\n * @callback options.onError Called with message(s) when a fallback or error condition is met\n * @callback options.onWarn Called with message(s) when a warning condition is met\n * @callback options.onPlay Called when the audio element begins playing\n * @callback options.onLoad Called when stream request is started\n * @callback options.onStreamStart Called when stream requests begins to return data\n * @callback options.onBuffer Called when the audio buffer is being filled\n * @callback options.onStream Called when stream data is sent to the audio element\n * @callback options.onStreamEnd Called when the stream request completes\n * @callback options.onStop Called when the stream is completely stopped and all cleanup operations are complete\n * @callback options.onRetry Called when a connection retry is attempted\n * @callback options.onRetryTimeout Called when connections attempts have timed out\n * @callback options.onSwitch Called when a switch event is triggered\n * @callback options.onCodecUpdate Called when the audio codec information has changed\n */\n constructor(urls, options = {}) {\n super();\n\n p.set(this, {\n // options\n [endpointGenerator]:\n IcecastMetadataPlayer[getNextEndpointGenerator](this),\n [audioElement]: options.audioElement || new Audio(),\n ...IcecastMetadataPlayer[getOptions](urls, options),\n // callbacks\n [events]: {\n [event.PLAY]: options.onPlay || noOp,\n [event.PLAY_READY]: noOp,\n [event.LOAD]: options.onLoad || noOp,\n [event.STREAM_START]: options.onStreamStart || noOp,\n [event.BUFFER]: options.onBuffer || noOp,\n [event.STREAM]: options.onStream || noOp,\n [event.STREAM_END]: options.onStreamEnd || noOp,\n [event.METADATA]: options.onMetadata || noOp,\n [event.METADATA_ENQUEUE]: options.onMetadataEnqueue || noOp,\n [event.CODEC_UPDATE]: options.onCodecUpdate || noOp,\n [event.STOP]: options.onStop || noOp,\n [event.RETRY]: options.onRetry || noOp,\n [event.RETRY_TIMEOUT]: options.onRetryTimeout || noOp,\n [event.SWITCH]: options.onSwitch || noOp,\n [event.WARN]: (...messages) => {\n this[logError](console.warn, options.onWarn, messages);\n },\n [event.ERROR]: (...messages) => {\n this[logError](console.error, options.onError, messages);\n },\n [event.PLAYBACK_ERROR]: (...messages) => {\n if (this.state !== state.RETRYING) {\n this[fireEvent](event.ERROR, ...messages);\n\n this.stop();\n } else {\n p.get(this)[endPlayback]();\n }\n },\n },\n // variables\n [endPlayback]: () => {\n clearTimeout(p.get(this)[retryTimeoutId]);\n this.removeEventListener(event.STREAM_START, p.get(this)[endPlayback]);\n p.get(this)[audioElement].removeEventListener(\n \"waiting\",\n p.get(this)[onAudioWaiting],\n );\n\n try {\n p.get(this)[audioElement].pause();\n } catch (e) {\n p.get(this)[onAudioError](e);\n }\n\n try {\n p.get(this)[playerResetPromise] = p\n .get(this)\n [playerFactory].player.end();\n } catch {}\n },\n // audio element event handlers\n [onAudioPlay]: () => {\n this.play();\n },\n [onAudioPause]: () => {\n this.stop();\n },\n [onAudioError]: (e) => {\n const errors = {\n 1: \" MEDIA_ERR_ABORTED The fetching of the associated resource was aborted by the user's request.\",\n 2: \" MEDIA_ERR_NETWORK Some kind of network error occurred which prevented the media from being successfully fetched, despite having previously been available.\",\n 3: \" MEDIA_ERR_DECODE Despite having previously been determined to be usable, an error occurred while trying to decode the media resource, resulting in an error.\",\n 4: \" MEDIA_ERR_SRC_NOT_SUPPORTED The associated resource or media provider object (such as a MediaStream) has been found to be unsuitable.\",\n 5: \" MEDIA_ERR_ENCRYPTED\",\n };\n\n const error = e?.target?.error || e;\n\n this[fireEvent](\n event.PLAYBACK_ERROR,\n \"The audio element encountered an error.\" +\n (errors[error?.code] || \"\"),\n );\n },\n [onPlayReady]: () => {\n const audio = p.get(this)[audioElement];\n\n if (\n this.state === state.LOADING ||\n (!audio.loop &&\n this.state !== state.STOPPING &&\n this.state !== state.STOPPED)\n ) {\n audio\n .play()\n .then(() => {\n this[playerState] = state.PLAYING;\n })\n .catch((e) => {\n this[fireEvent](event.PLAYBACK_ERROR, e, \"Playback failed.\");\n });\n }\n },\n [stopPlayback]: noOp,\n });\n\n this[attachAudioElement]();\n this[playerState] = state.STOPPED;\n\n p.get(this)[playerFactory] = new PlayerFactory(this);\n }\n\n /**\n * @description Checks for MediaSource, WebAudio, and HTML5 support for a given codec\n * @param {string} type Codec / mime-type to check\n * @returns {mediasource: string, webaudio: string, html5: string} Object indicating if the codec is supported by the playback method\n */\n static canPlayType(type) {\n return PlayerFactory.canPlayType(type);\n }\n\n /**\n * @returns {HTMLAudioElement} The audio element associated with this instance\n */\n get audioElement() {\n return p.get(this)[audioElement];\n }\n\n /**\n * @returns {AudioContext} Statically initialized internal AudioContext\n */\n get [audioContext]() {\n return IcecastMetadataPlayer.constructor[audioContext];\n }\n\n /**\n * @returns {string} Current endpoint that is being played\n */\n get endpoint() {\n return p.get(this)[playerFactory].endpoint;\n }\n\n /**\n * @returns {number} The ICY metadata interval in number of bytes for this instance\n */\n get icyMetaInt() {\n return p.get(this)[playerFactory].icyMetaInt;\n }\n\n /**\n * @returns {Array} Array of enqueued metadata objects in FILO order\n */\n get metadataQueue() {\n return p.get(this)[playerFactory].player.metadataQueue;\n }\n\n /**\n * @returns {string} The current state (\"loading\", \"playing\", \"stopping\", \"stopped\", \"retrying\", \"switching\")\n */\n get state() {\n return p.get(this)[playerState];\n }\n\n /**\n * @returns {string} The playback method (\"mediasource\", \"webaudio\", \"html5\")\n */\n get playbackMethod() {\n return p.get(this)[playerFactory].playbackMethod;\n }\n\n set [playerState](_state) {\n this.dispatchEvent(new CustomEvent(_state));\n p.get(this)[playerState] = _state;\n }\n\n [attachAudioElement]() {\n // audio events\n const audio = p.get(this)[audioElement];\n audio.addEventListener(\"pause\", p.get(this)[onAudioPause]);\n audio.addEventListener(\"play\", p.get(this)[onAudioPlay]);\n audio.addEventListener(\"error\", p.get(this)[onAudioError]);\n\n this.addEventListener(event.PLAY_READY, p.get(this)[onPlayReady]);\n }\n\n /**\n * @description Remove event listeners from the audio element and this instance and stops playback\n */\n async detachAudioElement() {\n const audio = p.get(this)[audioElement];\n audio.removeEventListener(\"pause\", p.get(this)[onAudioPause]);\n audio.removeEventListener(\"play\", p.get(this)[onAudioPlay]);\n audio.removeEventListener(\"error\", p.get(this)[onAudioError]);\n\n this.removeEventListener(event.PLAY_READY, p.get(this)[onPlayReady]);\n await this.stop();\n }\n\n /**\n * @description Plays the Icecast stream\n * @async Resolves when the audio element is playing\n */\n async play() {\n if (this.state === state.STOPPED) {\n const playing = new Promise((resolve) => {\n this.addEventListener(event.PLAY, resolve, { once: true });\n });\n\n const streamEnd = new Promise((resolve) => {\n this.addEventListener(event.STREAM_END, resolve, { once: true });\n });\n\n p.get(this)[abortController] = new AbortController();\n this[playerState] = state.LOADING;\n this[fireEvent](event.LOAD);\n\n // prettier-ignore\n const tryFetching = async () =>\n p.get(this)[playerFactory].playStream()\n .then(async () => {\n if (this.state === state.SWITCHING) {\n this[fireEvent](event.SWITCH);\n return tryFetching();\n } else if (\n this.state !== state.STOPPING &&\n this.state !== state.STOPPED\n ) {\n // wait for any remaining audio to play through\n await playing;\n await streamEnd;\n await p.get(this)[playerFactory].player.waiting;\n }\n })\n .catch(async (e) => {\n if (e && e.name !== \"AbortError\") {\n if (await this[shouldRetry](e)) {\n this[fireEvent](event.RETRY);\n return tryFetching();\n }\n\n p.get(this)[abortController].abort(); // stop fetch if is wasn't aborted\n\n if (\n this.state !== state.STOPPING &&\n this.state !== state.STOPPED\n ) {\n this[fireEvent](\n event.ERROR,\n e.message.match(/network|fetch|offline|codec/i) ? e : e.stack,\n e\n );\n }\n }\n });\n\n new Promise((resolve, reject) => {\n // stop any pending playback operation when stop is called\n p.get(this)[stopPlayback] = reject;\n\n tryFetching().then(resolve);\n })\n .catch((e) => {\n if (this.state !== state.STOPPING) throw e;\n })\n .finally(() => {\n p.get(this)[endPlayback]();\n\n this[fireEvent](event.STOP);\n this[playerState] = state.STOPPED;\n });\n\n await playing;\n }\n }\n\n /**\n * @description Stops playing the Icecast stream\n * @async Resolves when the icecast stream has stopped\n */\n async stop() {\n if (this.state !== state.STOPPED && this.state !== state.STOPPING) {\n this[playerState] = state.STOPPING;\n p.get(this)[abortController].abort();\n p.get(this)[stopPlayback]();\n\n await new Promise((resolve) => {\n this.addEventListener(event.STOP, resolve, { once: true });\n });\n }\n }\n\n /**\n * @description Switches the Icecast stream endpoint during playback\n * @async Resolves when playback begins from the new source\n */\n async switchEndpoint(newEndpoints, newOptions) {\n if (this.state !== state.STOPPED && this.state !== state.STOPPING) {\n const instance = p.get(this);\n Object.assign(\n instance,\n IcecastMetadataPlayer[getOptions](newEndpoints, newOptions, instance),\n );\n\n return instance[playerFactory].switchStream();\n }\n }\n\n async [shouldRetry](error) {\n if (p.get(this)[retryTimeout] === 0) return false;\n\n if (p.get(this)[playerState] === state.RETRYING) {\n // wait for retry interval\n await new Promise((resolve) => {\n this.addEventListener(state.STOPPING, resolve, { once: true });\n\n const delay = Math.min(\n p.get(this)[retryDelayMin] *\n 1000 *\n (p.get(this)[retryDelayRate] + 1) ** p.get(this)[retryAttempt]++,\n p.get(this)[retryDelayMax] * 1000,\n ); // exponential backoff\n\n setTimeout(\n () => {\n this.removeEventListener(state.STOPPING, resolve);\n resolve();\n },\n delay + delay * 0.3 * Math.random(),\n ); // jitter\n });\n\n // ensure the retry hasn't been cancelled while waiting\n return p.get(this)[playerState] === state.RETRYING;\n }\n\n if (\n p.get(this)[playerState] !== state.STOPPING &&\n p.get(this)[playerState] !== state.STOPPED &&\n (error.message.match(/network|fetch|offline|Error in body stream/i) ||\n error.name === \"HTTP Response Error\")\n ) {\n this[fireEvent](event.ERROR, error.name, error);\n this[playerState] = state.RETRYING;\n\n if (p.get(this)[hasIcy]) {\n this[fireEvent](\n event.WARN,\n \"This stream was requested with ICY metadata.\",\n 'If there is a CORS preflight failure, try removing \"icy\" from the metadataTypes option.',\n \"See https://github.com/eshaz/icecast-metadata-js#cors for more details.\",\n );\n }\n\n const audioWaiting = new Promise((resolve) => {\n p.get(this)[onAudioWaiting] = resolve;\n p.get(this)[audioElement].addEventListener(\n \"waiting\",\n p.get(this)[onAudioWaiting],\n {\n once: true,\n },\n );\n });\n\n // wait for whichever is longer, audio element waiting or retry timeout\n p.get(this)[retryTimeoutId] = setTimeout(\n () => {\n audioWaiting.then(() => {\n if (p.get(this)[playerState] === state.RETRYING) {\n this[fireEvent](event.RETRY_TIMEOUT);\n this.stop();\n }\n });\n },\n p.get(this)[retryTimeout] * 1000,\n );\n\n p.get(this)[retryAttempt] = 0;\n return true;\n }\n\n return false;\n }\n\n [fireEvent](event, ...args) {\n this.dispatchEvent(new CustomEvent(event, { detail: args }));\n p.get(this)[events][event](...args);\n }\n\n [logError](consoleFunction, callback, messages) {\n if (p.get(this)[enableLogging]) {\n consoleFunction(\n \"icecast-metadata-js\",\n messages.reduce((acc, message) => acc + \"\\n \" + message, \"\"),\n );\n }\n if (callback) callback(...messages);\n }\n}\n\nconst AudioContext = window.AudioContext || window.webkitAudioContext;\n\n// statically initialize audio context and start using a DOM event\nif (AudioContext && !IcecastMetadataPlayer.constructor[audioContext]) {\n IcecastMetadataPlayer.constructor[audioContext] = \"audio context pending\";\n\n const audioCtxErrorHandler = (e) => {\n console.error(\n \"icecast-metadata-js\",\n \"Failed to start the AudioContext. WebAudio playback will not be possible.\",\n e,\n );\n };\n\n // hack for iOS Audio element controls support\n // iOS will only enable AudioContext.resume() when called directly from a UI event\n // https://stackoverflow.com/questions/57510426\n const events = [\"touchstart\", \"touchend\", \"mousedown\", \"keydown\"];\n\n const unlock = () => {\n events.forEach((e) => document.removeEventListener(e, unlock));\n\n const audioCtx = new AudioContext({\n latencyHint: \"interactive\",\n });\n\n audioCtx.destination.channelCount = audioCtx.destination.maxChannelCount;\n\n audioCtx\n .resume()\n .then(() => {\n // hack for iOS to continue playing while locked\n audioCtx\n .createScriptProcessor(2 ** 14, 2, 2)\n .connect(audioCtx.destination);\n\n audioCtx.onstatechange = () => {\n if (audioCtx.state !== \"running\")\n audioCtx.resume().catch(audioCtxErrorHandler);\n };\n })\n .catch(audioCtxErrorHandler);\n\n IcecastMetadataPlayer.constructor[audioContext] = audioCtx;\n };\n\n events.forEach((e) => document.addEventListener(e, unlock));\n}\n"],"names":["deferred","inProgress","dataWebpackPrefix","symbol","Symbol","channelMappings","left","center","right","front","side","rear","map","x","flatMap","y","z","join","lfe","monophonic","stereo","surround","getChannelMapping","channelCount","mappings","vorbisOpusChannelMapping","rate48000","rate44100","rate32000","rate24000","rate22050","rate16000","rate8000","absoluteGranulePosition","bandwidth","bitDepth","bitrate","bitrateMaximum","bitrateMinimum","bitrateNominal","buffer","bufferFullness","codec","codecFrames","coupledStreamCount","crc","crc16","crc32","data","description","duration","emphasis","hasOpusPadding","header","isContinuedPacket","isCopyrighted","isFirstPage","isHome","isLastPage","isOriginal","isPrivate","isVbr","mode","modeExtension","mpeg","mpegVersion","numberAACFrames","outputGain","preSkip","profile","profileBits","protection","rawData","segments","subarray","version","vorbis","vorbisComments","vorbisSetup","block","blockingStrategy","blockingStrategyBits","blockSize","blocksize0","blocksize1","blockSizeBits","channel","channelMappingFamily","channelMappingTable","channelMode","channelModeBits","channels","copyright","copyrightId","copyrightIdStart","frameCount","frameLength","frameNumber","framePadding","frameSize","Rate","inputSampleRate","page","pageChecksum","pageSegmentBytes","pageSegmentTable","pageSequenceNumber","sample","sampleNumber","sampleRate","sampleRateBits","samples","stream","streamCount","streamInfo","streamSerialNumber","streamStructureVersion","total","totalBytesOut","totalDuration","totalSamples","readRawData","incrementRawData","mapCodecFrameStats","mapFrameStats","logWarning","syncFrame","fixedLengthFrameSync","getHeader","setHeader","getFrame","parseFrame","parseOggPage","checkCodecUpdate","enable","getHeaderFromUint8Array","checkFrameFooterCrc16","uint8Array","Uint8Array","dataView","DataView","reserved","bad","free","none","sixteenBitCRC","getCrcTable","crcTable","crcInitialValueFunction","crcFunction","byte","bit","crc8Table","b","flacCrc16Table","Uint16Array","crc32Table","Uint32Array","i","push","j","crc32Function","dataLength","crcChunkSize","concatBuffers","buffers","reduce","acc","buf","offset","set","bytesToString","bytes","String","fromCharCode","reverseTable","reverse","val","BitReader","constructor","this","_data","_pos","position","read","bits","Math","floor","HeaderCache","onCodecHeader","onCodecUpdate","_onCodecHeader","_onCodecUpdate","_isEnabled","_headerCache","Map","_codecUpdateData","WeakMap","_codecHeaderSent","_codecShouldUpdate","_bitrate","codecData","get","_currentHeader","key","_updateCurrentHeader","codecUpdateFields","headerStore","frameStore","Parser","codecParser","headerCache","_codecParser","frameData","Frame","ignoreNextFrame","_flushing","Header","headerValue","dataValue","CodecFrame","readOffset","frameLengthValue","samplesValue","super","unsynchronizationFlag","extendedHeaderFlag","experimentalFlag","footerPresent","ID3v2","getID3v2Header","CodecHeader","bitrateMatrix","calcBitrate","idx","interval","intervalOffset","bands","to31","layer12ModeExtensions","bitrateIndex","v2","v1","intensityStereo","msStereo","on","off","layer3ModeExtensions","layersValues","mpegVersionDescription","isoIec","mpegVersions","length","protectionValues","emphasisValues","channelModes","MPEGHeader","id3v2Header","cachedHeader","mpegVersionValues","layerBits","layerValues","MPEGFrame","frame","MPEGParser","onCodec","profileValues","sampleRates","channelModeValues","AACHeader","Object","assign","protectionBit","privateBit","bufferFullnessBits","audioSpecificConfig","setUint16","AACFrame","AACParser","FLACFrame","_getFrameFooterCrc16","expectedCrc16","actualCrc16","flacCrc16","streamInfoValue","getFromStreamInfo","blockingStrategyValues","blockSizeValues","sampleRateValues","channelAssignments","bitDepthValues","FLACHeader","_decodeUTF8Int","value","zeroMask","shift","codecParserStub","next","channelAssignment","decodedUtf8","crc8","FLACParser","_getNextFrameSyncOffset","secondByte","nextHeaderOffset","oggPage","_streamInfo","segment","filter","OggPageHeader","view","from","getBigInt64","getInt32","pageSegmentTableLength","segmentLength","segmentByte","OggPage","headerLength","totalLength","rawDataValue","OpusFrame","channelMappingFamilies","slice","silkOnly","celtOnly","hybrid","narrowBand","mediumBand","wideBand","superWideBand","fullBand","configTable","OpusHeader","packetData","Error","packetMode","packetLength","substr","getUint16","getUint32","getInt16","packetConfig","headerData","OpusParser","_identificationHeader","VorbisFrame","blockSizes","VorbisHeader","vorbisCommentsData","vorbisSetupData","VorbisParser","_setupComplete","_prevBlockSize","oggPageSegment","_vorbisComments","_vorbisSetup","_mode","_parseSetupHeader","_getSamples","logError","currentBlockSize","blockFlags","mask","setup","bitReader","count","modeBits","currentByte","unshift","log2","OggStream","_onCodec","_continuedPacket","_codec","_isSupported","_updateCodec","_parser","_checkCodecSupport","idString","test","_checkPageSequenceNumber","_pageSequenceNumber","_parsePage","oggPageStore","pop","OggParser","_streams","_currentSerialNumber","oggStream","delete","noOp","mimeType","enableLogging","enableFrameCRC32","_inputMimeType","_enableLogging","_crc32","_generator","_getGenerator","flush","parseChunk","chunk","parseAll","fileData","match","_frameNumber","_currentReadPosition","_totalBytesIn","_totalBytesOut","_totalSamples","_sampleRate","undefined","_rawData","minSize","increment","round","forEach","codecFrame","_log","logger","messages","stats","width","max","s","repeat","message","console","warn","error","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","keys","every","splice","r","F","E","chunkId","d","definition","o","defineProperty","enumerable","f","e","Promise","all","promises","u","g","globalThis","Function","window","obj","prop","prototype","hasOwnProperty","call","l","url","done","script","needAttach","scripts","document","getElementsByTagName","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","setTimeout","bind","type","target","head","appendChild","toStringTag","scriptUrl","importScripts","location","currentScript","replace","p","installedChunks","installedChunkData","promise","resolve","reject","errorType","realSrc","name","request","link","rel","as","href","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","id","chunkLoadingGlobal","self","state","LOADING","PLAYING","STOPPING","STOPPED","RETRYING","SWITCHING","BUFFER","PLAY","PLAY_READY","LOAD","STREAM_START","STREAM","STREAM_END","METADATA","METADATA_ENQUEUE","CODEC_UPDATE","STOP","RETRY","RETRY_TIMEOUT","SWITCH","WARN","ERROR","PLAYBACK_ERROR","endpoints","endpointOrder","metadataTypes","playbackMethod","audioContext","audioElement","bufferLength","icyMetaInt","icyCharacterEncoding","icyDetectionTimeout","retryDelayRate","retryDelayMin","retryDelayMax","retryTimeout","enableCodecUpdate","authentication","getNextEndpointGenerator","getOptions","fireEvent","attachAudioElement","shouldRetry","endpointGenerator","hasIcy","abortController","playerState","SYNCED","SYNCING","PCM_SYNCED","NOT_SYNCED","EventTargetPolyfill","_listeners","hasEventListener","listener","item","addEventListener","options","removeEventListener","index","findIndex","removeEventListeners","dispatchEvent","evt","once","Stats","_totalBytesRead","_streamBytesRead","_metadataLengthBytesRead","_metadataBytesRead","_currentBytesRemaining","_currentStreamBytesRemaining","_currentMetadataBytesRemaining","totalBytesRead","streamBytesRead","metadataLengthBytesRead","metadataBytesRead","currentBytesRemaining","currentStreamBytesRemaining","currentMetadataBytesRemaining","addBytes","addStreamBytes","addMetadataLengthBytes","addMetadataBytes","addCurrentBytesRemaining","MetadataParser","params","_remainingData","_currentPosition","_buffer","_streamBuffer","_streamBufferLength","_stats","_onStream","onStream","_onMetadata","onMetadata","_onMetadataFailed","onMetadataFailed","_onError","onError","_onStreamPromise","_onMetadataPromise","_passThroughParser","_addStream","_getNextValue","_sendStream","_concatBuffers","_concatBuffersKnownLength","iterator","readAll","asyncIterator","asyncReadAll","_logError","streamPayload","_sendMetadata","metadata","metadataPayload","minLength","_readData","IcyMetadataParser","rest","_decoder","TextDecoder","_icyMetaInt","_icyDetectionTimeout","_icyParser","_hasIcyMetadata","_getStream","_getMetadataLength","_getMetadata","parseIcyMetadata","metadataString","metadataRegex","metadataElement","RegExp","METADATA_SEARCH","startTime","Date","now","metaInt","detectMetadata","decode","OggMetadataParser","_oggParser","_isContinuePacket","_hasOggPage","codecMatcher","_identifyCodec","_getUint32","_matchBytes","matchString","syncBytes","baseOggPage","oggPageSegments","octet","regex","_readVorbisComment","vendorStringLength","vendorString","commentListLength","comments","commentLength","comment","delimiter","indexOf","toUpperCase","VENDOR_STRING","DualMetadataParser","_oggMetadataParser","_icyMetadataParser","oggValue","IcecastMetadataReader","includes","hasOgg","_metadataParser","string","IcecastReadableStream","response","icecast","_readableStream","ReadableStream","start","controller","parseInt","headers","async","enqueue","body","close","_icecast","readableStream","startReading","reader","getReader","IcecastMetadataQueue","icyBr","onMetadataUpdate","onMetadataEnqueue","paused","_icyBr","_onMetadataUpdate","_onMetadataEnqueue","_initialPaused","_paused","_isInitialMetadata","_pendingMetadata","_metadataQueue","metadataQueue","_timeoutId","addMetadata","timestampOffset","timestamp","getTimeByBytes","currentStreamPosition","_enqueueMetadata","bytesRead","startQueue","purgeMetadataQueue","payload","_dequeueMetadata","canSpawnWorker","spawnWorkerTest","Worker","URL","createObjectURL","Blob","onmessage","terminate","postMessage","FrameQueue","player","CRC_DURATION","PCM_DURATION","_player","initSync","initQueue","_syncTimeout","_syncTimeoutReason","_crcSyncPending","_syncQueue","_syncQueueDuration","_synAudioResult","_a","_b","_queueIndex","_queueSamples","_queueSampleRate","_crcQueue","_crcQueueDuration","_crcQueueIndexes","_pcmQueue","_pcmQueueDuration","buffered","currentTime","add","indexes","addAll","frames","_addAllSyncQueue","sync","currentBuffered","_syncReject","toFixed","syncState","_crcSync","_pcmSync","catch","syncQueue","then","syncQueueCrc","crcSyncPoints","matched","outOfFrames","syncPoint","align_queues","absoluteSyncPoint","sliceIndex","correlationSyncLength","initialGranularity","samplesToDuration","rate","SynAudio","default","pcmQueueDecoded","syncQueueDecoded","_decodeQueues","correlationSampleSize","samplesDecoded","synAudio","syncWorkerConcurrent","navigator","hardwareConcurrency","syncWorker","offsetFromEnd","sampleOffset","correlation","delay","frameOverlap","t","queue","timeFromEnd","decodeAudioData","getDecodedAudio","decodedAudioData","decoded","channelData","numberOfChannels","Float32Array","getChannelData","Player","endpoint","inputMimeType","codecHeader","_endpoint","_codecHeader","instanceVariables","_audioElement","_bufferLength","_codecUpdateTimestamp","_codecUpdateOffset","_notSyncedHandler","parseMimeType","canPlayType","codecChecker","mapping","matches","checkCodecs","codecs","mime","groups","mimeMapping","Array","isArray","mimeCodecs","split","enablePlayButton","supportedSources","removeAttribute","srcObject","MediaSource","_mediaStream","MediaStream","loop","syncStateUpdate","_syncStatePromise","_syncState","newState","_syncStateResolve","isSupported","isAudioPlayer","metadataTimestamp","waiting","icecastMetadataQueue","_icecastMetadataQueue","codecUpdateQueue","_codecUpdateQueue","_startMetadataQueues","_metadataOffset","_init","syncFrames","syncDelay","_frameQueue","metadataOffset","playing","finally","end","updateTimestamp","HTML5Player","crossOrigin","preload","_playReady","Audio","Boolean","_frame","_metadataTimestampOffset","_audioLoadedTimestamp","performance","_metadataLoadedTimestamp","MediaSourcePlayer","_MSEAudioWrapper","isTypeSupported","aac","aacp","flac","ogg","opus","_mediaSource","sourceBuffers","_sourceBufferQueue","_processingLastPage","_mediaSourceCreated","_mediaSourceCreatedNotify","_mediaSourceOpen","_mediaSourceOpenNotify","_addFrames","_prepareMediaSource","_attachMediaSource","_createMediaSource","_appendSourceBuffer","_createMSEWrapper","_wrapper","fragments","preferredContainer","addSourceBuffer","_sourceBufferRemoved","_waitForSourceBuffer","sourceBuffer","updating","appendBuffer","BUFFER_INTERVAL","remove","WebAudioPlayer","_audioContext","WebAssembly","AudioContext","webkitAudioContext","_currentTime","_playbackStartTime","_waitingPromise","_updateWaiting","durationTimeout","_bufferedDuration","_durationTimeouts","size","_notifyWaiting","_waitingResolve","_resetWaiting","Set","_createDecoder","DecoderClass","_loadingDecoder","_decoderLoaded","MPEGDecoderWebWorker","OpusDecoderWebWorker","FLACDecoderWebWorker","OggVorbisDecoderWebWorker","_wasmDecoder","_decodedSample","_startSampleOffset","_playPromise","_playStart","getTracks","track","removeTrack","_decodeAndPlay","decodePromise","ready","decodeOggPages","decodeFrames","_play","createMediaStreamDestination","destination","maxChannelCount","audioBuffer","createBuffer","source","createBufferSource","connect","scalingFactor","startSamples","audioContextSamples","PlayerFactory","_enableCodecUpdate","_playbackMethod","_newMetadataQueues","supportedPlaybackMethods","_unprocessedFrames","_syncPromise","_syncCancel","mediasource","html5","webaudio","_icecastReadableStream","playStream","fetchStream","res","readIcecastResponse","switchStream","instance","abort","AbortController","auth","btoa","user","password","fetch","method","signal","ok","status","codecHeaderPromise","codecPromise","args","appendedFrames","icecastPromise","_buildPlayer","_syncPlayer","delayTimeoutId","complete","canceled","playerStarted","oldPlayer","oldIcecastMetadataQueue","oldCodecUpdateQueue","startNewPlayer","handleSyncEvent","stoppingHandler","firstMethod","values","support","EventClass","EventTarget","playerFactory","playerResetPromise","events","onAudioPause","onAudioPlay","onPlayReady","onAudioError","onAudioWaiting","stopPlayback","endPlayback","retryAttempt","retryTimeoutId","IcecastMetadataPlayer","currentEndpoints","urls","newOptions","sort","random","onPlay","onLoad","onStreamStart","onBuffer","onStreamEnd","onStop","onRetry","onRetryTimeout","onSwitch","onWarn","stop","pause","play","code","audio","_state","CustomEvent","detachAudioElement","streamEnd","tryFetching","stack","switchEndpoint","newEndpoints","min","audioWaiting","detail","consoleFunction","callback","audioCtxErrorHandler","unlock","audioCtx","latencyHint","resume","createScriptProcessor","onstatechange"],"sourceRoot":""} \ No newline at end of file diff --git a/lib/icecast-metadata-player-1.17.3.mediasource.min.js b/lib/icecast-metadata-player-1.17.3.mediasource.min.js new file mode 100644 index 0000000..964803d --- /dev/null +++ b/lib/icecast-metadata-player-1.17.3.mediasource.min.js @@ -0,0 +1,22 @@ + +/*! + * Copyright 2021-2023 Ethan Halsall + * https://github.com/eshaz/icecast-metadata-js + * + * This file is part of icecast-metadata-player. + * + * icecast-metadata-player free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * icecast-metadata-player distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see + */ +"use strict";(self.webpackChunkIcecastMetadataPlayer=self.webpackChunkIcecastMetadataPlayer||[]).push([[762],{448:(t,e,n)=>{n.r(e),n.d(e,{default:()=>Z});var s=n(317);const i="webm",r="mp3",c="mp4a.40.2",h="flac",o="vorbis",a="opus",w="audio/",d=";codecs=",l=w+"mp4"+d,u=w+i+d,g="mse-audio-wrapper";class m{constructor({name:t,contents:e=[],children:n=[]}){this.t=t,this.i=e,this.h=n}static stringToByteArray(t){return[...t].map((t=>t.charCodeAt(0)))}static getFloat64(t){const e=new Uint8Array(8);return new DataView(e.buffer).setFloat64(0,t),e}static getUint64(t){const e=new Uint8Array(8);return new DataView(e.buffer).setBigUint64(0,BigInt(t)),e}static getUint32(t){const e=new Uint8Array(4);return new DataView(e.buffer).setUint32(0,t),e}static getUint16(t){const e=new Uint8Array(2);return new DataView(e.buffer).setUint16(0,t),e}static getInt16(t){const e=new Uint8Array(2);return new DataView(e.buffer).setInt16(0,t),e}static*flatten(t){for(const e of t)Array.isArray(e)?yield*m.flatten(e):yield e}get contents(){const t=new Uint8Array(this.length),e=this.o();let n=0;for(const s of m.flatten(e))"object"!=typeof s?(t[n]=s,n++):(t.set(s,n),n+=s.length);return t}get length(){return this.l()}o(){return[this.i,...this.h.map((t=>t.o()))]}l(){let t;return t=Array.isArray(this.i)?this.i.reduce(((t,e)=>t+(void 0===e.length?1:e.length)),0):void 0===this.i.length?1:this.i.length,t+this.h.reduce(((t,e)=>t+e.length),0)}addChild(t){this.h.push(t)}}class f extends m{constructor(t,{contents:e,children:n}={}){super({name:t,contents:e,children:n})}o(){return[...this.u,...m.stringToByteArray(this.t),...super.o()]}l(){return this.m||(this.m=4+this.t.length+super.l(),this.u=m.getUint32(this.m)),this.m}}class p extends m{constructor(t,{contents:e,tags:n}={}){super({name:t,contents:e,children:n})}static getLength(t){const e=m.getUint32(t);return e.every(((t,e,n)=>0===t&&(n[e]=128,!0))),e}o(){return[this.t,...this.u,...super.o()]}l(){if(!this.m){const t=super.l();this.u=p.getLength(t),this.m=1+t+this.u.length}return this.m}addTag(t){this.addChild(t)}}class y{constructor(t){this.p=t}getCodecBox(t){switch(this.p){case r:return this.getMp4a(t,107);case c:return this.getMp4a(t,64);case a:return this.getOpus(t);case h:return this.getFlaC(t)}}getOpus(t){return new f("Opus",{contents:[0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channels,0,t.bitDepth,0,0,0,0,f.getUint16(t.sampleRate),0,0],children:[new f("dOps",{contents:[0,t.channels,f.getUint16(t.preSkip),f.getUint32(t.inputSampleRate),f.getInt16(t.outputGain),t.channelMappingFamily,0!==t.channelMappingFamily?[t.streamCount,t.coupledStreamCount,t.channelMappingTable]:[]]})]})}getFlaC(t){return new f("fLaC",{contents:[0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channels,0,t.bitDepth,0,0,0,0,f.getUint16(t.sampleRate),0,0],children:[new f("dfLa",{contents:[0,0,0,0,...t.streamInfo||[128,0,0,34,f.getUint16(t.blockSize),f.getUint16(t.blockSize),0,0,0,0,0,0,f.getUint32(t.sampleRate<<12|t.channels<<8|t.bitDepth-1<<4),0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]})]})}getMp4a(t,e){const n=new p(4,{contents:[e,21,0,0,0,0,0,0,0,0,0,0,0]});return 64===e&&n.addTag(new p(5,{contents:t.audioSpecificConfig})),new f("mp4a",{contents:[0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channels,0,16,0,0,0,0,f.getUint16(t.sampleRate),0,0],children:[new f("esds",{contents:[0,0,0,0],children:[new p(3,{contents:[0,1,0],tags:[n,new p(6,{contents:2})]})]})]})}getInitializationSegment({header:t,samples:e}){return new m({children:[new f("ftyp",{contents:[f.stringToByteArray("iso5"),0,0,2,0,f.stringToByteArray("iso6mp41")]}),new f("moov",{children:[new f("mvhd",{contents:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,232,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2]}),new f("trak",{children:[new f("tkhd",{contents:[0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0]}),new f("mdia",{children:[new f("mdhd",{contents:[0,0,0,0,0,0,0,0,0,0,0,0,f.getUint32(t.sampleRate),0,0,0,0,85,196,0,0]}),new f("hdlr",{contents:[0,0,0,0,f.stringToByteArray("mhlr"),f.stringToByteArray("soun"),0,0,0,0,0,0,0,0,0,0,0,0,0]}),new f("minf",{children:[new f("stbl",{children:[new f("stsd",{contents:[0,0,0,0,0,0,0,1],children:[this.getCodecBox(t)]}),new f("stts",{contents:[0,0,0,0,0,0,0,0]}),new f("stsc",{contents:[0,0,0,0,0,0,0,0]}),new f("stsz",{contents:[0,0,0,0,0,0,0,0,0,0,0,0]}),new f("stco",{contents:[0,0,0,0,0,0,0,0]})]})]})]})]}),new f("mvex",{children:[new f("trex",{contents:[0,0,0,0,0,0,0,1,0,0,0,1,f.getUint32(e),0,0,0,0,0,0,0,0]})]})]})]}).contents}getSamplesPerFrame(t){return this.p===c?t.map((({data:t,header:e})=>f.getUint32(t.length-e.length))):t.map((({data:t})=>f.getUint32(t.length)))}getFrameData(t){return this.p===c?t.map((({data:t,header:e})=>t.subarray(e.length))):t.map((({data:t})=>t))}getMediaSegment(t){return new m({children:[new f("moof",{children:[new f("mfhd",{contents:[0,0,0,0,0,0,0,0]}),new f("traf",{children:[new f("tfhd",{contents:[0,2,0,0,0,0,0,1]}),new f("tfdt",{contents:[0,0,0,0,0,0,0,0]}),new f("trun",{contents:[0,0,2,1,f.getUint32(t.length),f.getUint32(92+4*t.length),...this.getSamplesPerFrame(t)]})]})]}),new f("mdat",{contents:this.getFrameData(t)})]}).contents}}const b=(...t)=>t.flatMap((t=>{const e=[];for(let n=t.length;n>=0;n-=255)e.push(n>=255?255:n);return e}));class U extends m{constructor(t,{contents:e,children:n,isUnknownLength:s=!1}={}){super({name:t,contents:e,children:n}),this.U=s}static getUintVariable(t){let e;if(t<127)e=[128|t];else if(t<16383)e=m.getUint16(t),e[0]|=64;else if(t<2097151)e=m.getUint32(t).subarray(1),e[0]|=32;else if(t<268435455)e=m.getUint32(t),e[0]|=16;else if(t<34359738367)e=m.getUint64(t).subarray(3),e[0]|=8;else if(t<4398046511103)e=m.getUint64(t).subarray(2),e[0]|=4;else if(t<562949953421311)e=m.getUint64(t).subarray(1),e[0]|=2;else if(t<72057594037927940)e=m.getUint64(t),e[0]|=1;else if("number"!=typeof t||isNaN(t))throw((...t)=>{console.error(g,t.reduce(((t,e)=>t+"\n "+e),""))})(`EBML Variable integer must be a number, instead received ${t}`),new Error(g+": Unable to encode WEBM");return e}o(){return[...this.t,...this.u,...super.o()]}l(){return this.m||(this.A=super.l(),this.u=this.U?[1,255,255,255,255,255,255,255]:U.getUintVariable(this.A),this.m=this.t.length+this.u.length+this.A),this.m}}const A=[225],C=[98,100],$=[159],_=[31,67,182,117],L=[86,170],v=[134],M=[99,162],S=[66,130],V=[66,133],F=[66,135],x=[26,69,223,163],B=[66,242],D=[66,243],k=[66,247],I=[66,134],O=[156],T=[21,73,169,102],z=[77,128],E=[181],N=[86,187],P=[24,83,128,103],R=[163],j=[231],W=[42,215,177],q=[174],G=[215],H=[22,84,174,107],J=[131],K=[115,197],Q=[87,65];class X{constructor(t){switch(t){case a:this.C="A_OPUS",this.$=t=>[new U(L,{contents:U.getUint32(Math.round(t.preSkip*this._))}),new U(N,{contents:U.getUint32(Math.round(3840*this._))}),new U(M,{contents:t.data})];break;case o:this.C="A_VORBIS",this.$=t=>[new U(M,{contents:[2,b(t.data,t.vorbisComments),t.data,t.vorbisComments,t.vorbisSetup]})]}}getInitializationSegment({header:t}){return this._=1e9/t.sampleRate,new m({children:[new U(x,{children:[new U(I,{contents:1}),new U(k,{contents:1}),new U(B,{contents:4}),new U(D,{contents:8}),new U(S,{contents:U.stringToByteArray(i)}),new U(F,{contents:4}),new U(V,{contents:2})]}),new U(P,{isUnknownLength:!0,children:[new U(T,{children:[new U(W,{contents:U.getUint32(Math.floor(this._))}),new U(z,{contents:U.stringToByteArray(g)}),new U(Q,{contents:U.stringToByteArray(g)})]}),new U(H,{children:[new U(q,{children:[new U(G,{contents:1}),new U(K,{contents:1}),new U(O,{contents:0}),new U(v,{contents:U.stringToByteArray(this.C)}),new U(J,{contents:2}),new U(A,{children:[new U($,{contents:t.channels}),new U(E,{contents:U.getFloat64(t.sampleRate)}),new U(C,{contents:t.bitDepth})]}),...this.$(t)]})]})]})]}).contents}getMediaSegment(t){const e=t[0].totalSamples;return new U(_,{children:[new U(j,{contents:U.getUintVariable(e)}),...t.map((({data:t,totalSamples:n})=>new U(R,{contents:[129,U.getInt16(n-e),128,t]})))]}).contents}}const Y=()=>{};class Z{constructor(t,e={}){this.L=t,this.PREFERRED_CONTAINER=e.preferredContainer||i,this.MIN_FRAMES=e.minFramesPerSegment||4,this.MAX_FRAMES=e.maxFramesPerSegment||50,this.MIN_FRAMES_LENGTH=e.minBytesPerSegment||1022,this.MAX_SAMPLES_PER_SEGMENT=1/0,this.v=e.onMimeType||Y,e.codec&&(this.M=this.S(e.codec),this.v(this.V)),this.F=[],this.B=new s.Ay(t,{onCodec:t=>{this.M=this.S(t),this.v(this.V)},onCodecUpdate:e.onCodecUpdate,enableLogging:e.enableLogging,enableFrameCRC32:!1})}get mimeType(){return this.V}get inputMimeType(){return this.L}*iterator(t){t.constructor===Uint8Array?yield*this.D([...this.B.parseChunk(t)].flatMap((t=>t.codecFrames||t))):Array.isArray(t)&&(yield*this.D(t))}*D(t){if(this.F.push(...t),this.F.length){const t=this.k();if(t.length){this.I||(this.I=!0,yield this.M.getInitializationSegment(t[0][0]));for(const e of t)yield this.M.getMediaSegment(e)}}}k(){const t=[[]];let e=t[0],n=0;for(const s of this.F)(e.length===this.MAX_FRAMES||n>=this.MAX_SAMPLES_PER_SEGMENT)&&(n=0,t.push(e=[])),e.push(s),n+=s.samples;return this.F=e.lengtht+e.data.length),0)\n*/\n\nexport default class ContainerElement {\n /**\n * @abstract\n * @description Container Object structure Abstract Class\n * @param {any} name Name of the object\n * @param {Array} [contents] Array of arrays or typed arrays, or a single number or typed array\n * @param {Array} [objects] Array of objects to insert into this object\n */\n constructor({ name, contents = [], children = [] }) {\n this._name = name;\n this._contents = contents;\n this._children = children;\n }\n\n /**\n * @description Converts a string to a byte array\n * @param {string} name String to convert\n * @returns {Uint8Array}\n */\n static stringToByteArray(name) {\n return [...name].map((char) => char.charCodeAt(0));\n }\n\n /**\n * @description Converts a JavaScript number to Uint32\n * @param {number} number Number to convert\n * @returns {Uint32}\n */\n static getFloat64(number) {\n const bytes = new Uint8Array(8);\n new DataView(bytes.buffer).setFloat64(0, number);\n return bytes;\n }\n\n /**\n * @description Converts a JavaScript number to Uint32\n * @param {number} number Number to convert\n * @returns {Uint32}\n */\n static getUint64(number) {\n const bytes = new Uint8Array(8);\n new DataView(bytes.buffer).setBigUint64(0, BigInt(number));\n return bytes;\n }\n\n /**\n * @description Converts a JavaScript number to Uint32\n * @param {number} number Number to convert\n * @returns {Uint32}\n */\n static getUint32(number) {\n const bytes = new Uint8Array(4);\n new DataView(bytes.buffer).setUint32(0, number);\n return bytes;\n }\n\n /**\n * @description Converts a JavaScript number to Uint16\n * @param {number} number Number to convert\n * @returns {Uint32}\n */\n static getUint16(number) {\n const bytes = new Uint8Array(2);\n new DataView(bytes.buffer).setUint16(0, number);\n return bytes;\n }\n\n /**\n * @description Converts a JavaScript number to Int16\n * @param {number} number Number to convert\n * @returns {Uint32}\n */\n static getInt16(number) {\n const bytes = new Uint8Array(2);\n new DataView(bytes.buffer).setInt16(0, number);\n return bytes;\n }\n\n static *flatten(array) {\n for (const item of array) {\n if (Array.isArray(item)) {\n yield* ContainerElement.flatten(item);\n } else {\n yield item;\n }\n }\n }\n\n /**\n * @returns {Uint8Array} Contents of this container element\n */\n get contents() {\n const buffer = new Uint8Array(this.length);\n const contents = this._buildContents();\n\n let offset = 0;\n\n for (const element of ContainerElement.flatten(contents)) {\n if (typeof element !== \"object\") {\n buffer[offset] = element;\n offset++;\n } else {\n buffer.set(element, offset);\n offset += element.length;\n }\n }\n\n return buffer;\n }\n\n /**\n * @returns {number} Length of this container element\n */\n get length() {\n return this._buildLength();\n }\n\n _buildContents() {\n return [\n this._contents,\n ...this._children.map((obj) => obj._buildContents()),\n ];\n }\n\n _buildLength() {\n let length;\n\n if (Array.isArray(this._contents)) {\n length = this._contents.reduce(\n (acc, val) => acc + (val.length === undefined ? 1 : val.length),\n 0,\n );\n } else {\n length = this._contents.length === undefined ? 1 : this._contents.length;\n }\n\n return length + this._children.reduce((acc, obj) => acc + obj.length, 0);\n }\n\n addChild(object) {\n this._children.push(object);\n }\n}\n","/* Copyright 2020-2021 Ethan Halsall\n \n This file is part of mse-audio-wrapper.\n \n mse-audio-wrapper is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n mse-audio-wrapper is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport ContainerElement from \"../ContainerElement.js\";\n\nexport default class Box extends ContainerElement {\n /**\n * @description ISO/IEC 14496-12 Part 12 ISO Base Media File Format Box\n * @param {string} name Name of the box (i.e. 'moov', 'moof', 'traf')\n * @param {object} params Object containing contents or child boxes\n * @param {Array} [params.contents] Array of bytes to insert into this box\n * @param {Array} [params.children] Array of child boxes to insert into this box\n */\n constructor(name, { contents, children } = {}) {\n super({ name, contents, children });\n }\n\n _buildContents() {\n return [\n ...this._lengthBytes,\n ...ContainerElement.stringToByteArray(this._name),\n ...super._buildContents(),\n ];\n }\n\n _buildLength() {\n if (!this._length) {\n // length bytes + name length + content length\n this._length = 4 + this._name.length + super._buildLength();\n this._lengthBytes = ContainerElement.getUint32(this._length);\n }\n\n return this._length;\n }\n}\n","/* Copyright 2020-2021 Ethan Halsall\n \n This file is part of mse-audio-wrapper.\n \n mse-audio-wrapper is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n mse-audio-wrapper is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport ContainerElement from \"../ContainerElement.js\";\n\nexport default class ESTag extends ContainerElement {\n constructor(tagNumber, { contents, tags } = {}) {\n super({ name: tagNumber, contents, children: tags });\n }\n\n static getLength(length) {\n const bytes = ContainerElement.getUint32(length);\n\n bytes.every((byte, i, array) => {\n if (byte === 0x00) {\n array[i] = 0x80;\n return true;\n }\n return false;\n });\n\n return bytes;\n }\n\n /**\n * @returns {Uint8Array} Contents of this stream descriptor tag\n */\n _buildContents() {\n return [this._name, ...this._lengthBytes, ...super._buildContents()];\n }\n\n _buildLength() {\n if (!this._length) {\n const length = super._buildLength();\n this._lengthBytes = ESTag.getLength(length);\n this._length = 1 + length + this._lengthBytes.length;\n }\n\n return this._length;\n }\n\n addTag(tag) {\n this.addChild(tag);\n }\n}\n","/* Copyright 2020-2021 Ethan Halsall\n \n This file is part of mse-audio-wrapper.\n \n mse-audio-wrapper is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n mse-audio-wrapper is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport { MP3, MP4A_40_2, FLAC, OPUS } from \"../../constants.js\";\n\nimport ContainerElement from \"../ContainerElement.js\";\nimport Box from \"./Box.js\";\nimport ESTag from \"./ESTag.js\";\n\n/**\n * @description Fragmented ISO Base Media File Format Builder is a class to\n * wrap codec frames in a MP4 container for streaming MP3 / AAC compatibility in Firefox.\n */\nexport default class ISOBMFFContainer {\n constructor(codec) {\n this._codec = codec;\n }\n\n getCodecBox(header) {\n /**\n * @description Codec mapping for `esds` box\n * https://stackoverflow.com/questions/3987850/mp4-atom-how-to-discriminate-the-audio-codec-is-it-aac-or-mp3\n * https://web.archive.org/web/20180312163039/http://mp4ra.org/object.html\n * 0x40 - MPEG-4 Audio\n * 0x6b - MPEG-1 Audio (MPEG-1 Layers 1, 2, and 3)\n * 0x69 - MPEG-2 Backward Compatible Audio (MPEG-2 Layers 1, 2, and 3)\n * 0x67 - MPEG-2 AAC LC\n */\n switch (this._codec) {\n case MP3:\n return this.getMp4a(header, 0x6b);\n case MP4A_40_2:\n return this.getMp4a(header, 0x40);\n case OPUS:\n return this.getOpus(header);\n case FLAC:\n return this.getFlaC(header);\n }\n }\n\n getOpus(header) {\n // https://opus-codec.org/docs/opus_in_isobmff.html\n return new Box(\"Opus\", {\n /* prettier-ignore */\n contents: [\n 0x00,0x00,0x00,0x00,0x00,0x00, // reserved\n 0x00,0x01, // data reference index\n 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // reserved\n 0x00,header.channels, // channel count\n 0x00,header.bitDepth, // PCM bitrate (16bit)\n 0x00,0x00, // predefined\n 0x00,0x00, // reserved\n Box.getUint16(header.sampleRate),0x00,0x00, // sample rate 16.16 fixed-point\n ],\n children: [\n new Box(\"dOps\", {\n /* prettier-ignore */\n contents: [0x00, // version\n header.channels, // output channel count\n Box.getUint16(header.preSkip), // pre skip\n Box.getUint32(header.inputSampleRate),// input sample rate\n Box.getInt16(header.outputGain), // output gain\n header.channelMappingFamily, // channel mapping family int(8)\n (header.channelMappingFamily !== 0 ? [\n header.streamCount,\n header.coupledStreamCount,\n header.channelMappingTable // channel mapping table\n ] : [])\n ],\n }),\n ],\n });\n }\n\n getFlaC(header) {\n // https://github.com/xiph/flac/blob/master/doc/isoflac.txt\n return new Box(\"fLaC\", {\n /* prettier-ignore */\n contents: [\n 0x00,0x00,0x00,0x00,0x00,0x00, // reserved\n 0x00,0x01, // data reference index\n 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // reserved\n 0x00,header.channels, // channel count\n 0x00,header.bitDepth, // PCM bitrate (16bit)\n 0x00,0x00, // predefined\n 0x00,0x00, // reserved\n Box.getUint16(header.sampleRate),0x00,0x00, // sample rate 16.16 fixed-point\n /*\n When the bitstream's native sample rate is greater\n than the maximum expressible value of 65535 Hz,\n the samplerate field shall hold the greatest\n expressible regular division of that rate. I.e.\n the samplerate field shall hold 48000.0 for\n native sample rates of 96 and 192 kHz. In the\n case of unusual sample rates which do not have\n an expressible regular division, the maximum value\n of 65535.0 Hz should be used.\n */\n ],\n children: [\n new Box(\"dfLa\", {\n /* prettier-ignore */\n contents: [\n 0x00, // version\n 0x00,0x00,0x00, // flags\n ...(header.streamInfo || [\n // * `A........` Last metadata block flag\n // * `.BBBBBBBB` BlockType\n 0x80, // last metadata block, stream info\n 0x00,0x00,0x22, // Length\n Box.getUint16(header.blockSize), // maximum block size\n Box.getUint16(header.blockSize), // minimum block size\n 0x00,0x00,0x00, // maximum frame size\n 0x00,0x00,0x00, // minimum frame size\n Box.getUint32((header.sampleRate << 12) | (header.channels << 8) | ((header.bitDepth - 1) << 4)), // 20bits sample rate, 3bits channels, 5bits bitDepth - 1\n 0x00,0x00,0x00,0x00, // total samples\n 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 // md5 of stream\n ])\n ],\n }),\n ],\n });\n }\n\n getMp4a(header, esdsCodec) {\n const streamDescriptorTag = new ESTag(4, {\n /* prettier-ignore */\n contents: [\n esdsCodec,\n 0x15, // stream type(6bits)=5 audio, flags(2bits)=1\n 0x00,0x00,0x00, // 24bit buffer size\n 0x00,0x00,0x00,0x00, // max bitrate\n 0x00,0x00,0x00,0x00, // avg bitrate\n ],\n });\n\n // mp4a.40.2\n if (esdsCodec === 0x40) {\n streamDescriptorTag.addTag(\n new ESTag(5, {\n contents: header.audioSpecificConfig,\n }),\n );\n }\n\n return new Box(\"mp4a\", {\n /* prettier-ignore */\n contents: [0x00,0x00,0x00,0x00,0x00,0x00, // reserved\n 0x00,0x01, // data reference index\n 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // reserved\n 0x00,header.channels, // channel count\n 0x00,0x10, // PCM bitrate (16bit)\n 0x00,0x00, // Compression ID\n 0x00,0x00, // Packet size\n Box.getUint16(header.sampleRate),0x00,0x00], // sample rate unsigned floating point\n children: [\n new Box(\"esds\", {\n contents: [0x00, 0x00, 0x00, 0x00],\n children: [\n new ESTag(3, {\n contents: [\n 0x00,\n 0x01, // ES_ID = 1\n 0x00, // flags etc = 0\n ],\n tags: [\n streamDescriptorTag,\n new ESTag(6, {\n contents: 0x02,\n }),\n ],\n }),\n ],\n }),\n ],\n });\n }\n\n /**\n * @param {Header} header Codec frame\n * @returns {Uint8Array} Filetype and Movie Box information for the codec\n */\n getInitializationSegment({ header, samples }) {\n return new ContainerElement({\n children: [\n new Box(\"ftyp\", {\n /* prettier-ignore */\n contents: [Box.stringToByteArray(\"iso5\"), // major brand\n 0x00,0x00,0x02,0x00, // minor version\n Box.stringToByteArray(\"iso6mp41\")], // compatible brands\n }),\n new Box(\"moov\", {\n children: [\n new Box(\"mvhd\", {\n /* prettier-ignore */\n contents: [0x00, // version\n 0x00,0x00,0x00, // flags\n 0x00,0x00,0x00,0x00, // creation time\n 0x00,0x00,0x00,0x00, // modification time\n 0x00,0x00,0x03,0xe8, // timescale\n 0x00,0x00,0x00,0x00, // duration\n 0x00,0x01,0x00,0x00, // rate\n 0x01,0x00, // volume\n 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // reserved\n 0x00,0x01,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, // a b u (matrix structure)\n 0x00,0x00,0x00,0x00, 0x00,0x01,0x00,0x00, 0x00,0x00,0x00,0x00, // c d v\n 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x40,0x00,0x00,0x00, // x y w\n 0x00,0x00,0x00,0x00, // preview time\n 0x00,0x00,0x00,0x00, // preview duration\n 0x00,0x00,0x00,0x00, // poster time\n 0x00,0x00,0x00,0x00, // selection time\n 0x00,0x00,0x00,0x00, // selection duration\n 0x00,0x00,0x00,0x00, // current time\n 0x00,0x00,0x00,0x02], // next track\n }),\n new Box(\"trak\", {\n children: [\n new Box(\"tkhd\", {\n /* prettier-ignore */\n contents: [0x00, // version\n 0x00,0x00,0x03, // flags (0x01 - track enabled, 0x02 - track in movie, 0x04 - track in preview, 0x08 - track in poster)\n 0x00,0x00,0x00,0x00, // creation time\n 0x00,0x00,0x00,0x00, // modification time\n 0x00,0x00,0x00,0x01, // track id\n 0x00,0x00,0x00,0x00, // reserved\n 0x00,0x00,0x00,0x00, // duration\n 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // reserved\n 0x00,0x00, // layer\n 0x00,0x01, // alternate group\n 0x01,0x00, // volume\n 0x00,0x00, // reserved\n 0x00,0x01,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, // a b u (matrix structure)\n 0x00,0x00,0x00,0x00, 0x00,0x01,0x00,0x00, 0x00,0x00,0x00,0x00, // c d v \n 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x40,0x00,0x00,0x00, // x y w\n 0x00,0x00,0x00,0x00, // track width\n 0x00,0x00,0x00,0x00], // track height\n }),\n new Box(\"mdia\", {\n children: [\n new Box(\"mdhd\", {\n /* prettier-ignore */\n contents: [0x00, // version\n 0x00,0x00,0x00, // flags\n 0x00,0x00,0x00,0x00, // creation time (in seconds since midnight, January 1, 1904)\n 0x00,0x00,0x00,0x00, // modification time\n Box.getUint32(header.sampleRate), // time scale\n 0x00,0x00,0x00,0x00, // duration\n 0x55,0xc4, // language\n 0x00,0x00], // quality\n }),\n new Box(\"hdlr\", {\n /* prettier-ignore */\n contents: [0x00, // version\n 0x00,0x00,0x00, // flags\n Box.stringToByteArray('mhlr'), // component type (mhlr, dhlr)\n Box.stringToByteArray('soun'), // component subtype (vide' for video data, 'soun' for sound data or ‘subt’ for subtitles)\n 0x00,0x00,0x00,0x00, // component manufacturer\n 0x00,0x00,0x00,0x00, // component flags\n 0x00,0x00,0x00,0x00, // component flags mask\n 0x00], // String that specifies the name of the component, terminated by a null character\n }),\n new Box(\"minf\", {\n children: [\n new Box(\"stbl\", {\n children: [\n new Box(\"stsd\", {\n // Sample description atom\n /* prettier-ignore */\n contents: [0x00, // version\n 0x00,0x00,0x00, // flags\n 0x00,0x00,0x00,0x01], // entry count\n children: [this.getCodecBox(header)],\n }),\n new Box(\"stts\", {\n // Time-to-sample atom\n /* prettier-ignore */\n contents: [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00],\n }),\n new Box(\"stsc\", {\n // Sample-to-chunk atom\n /* prettier-ignore */\n contents: [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00],\n }),\n new Box(\"stsz\", {\n // Sample Size atom\n /* prettier-ignore */\n contents: [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n 0x00,0x00,0x00,0x00],\n }),\n new Box(\"stco\", {\n // Chunk Offset atom\n /* prettier-ignore */\n contents: [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00],\n }),\n ],\n }),\n ],\n }),\n ],\n }),\n ],\n }),\n new Box(\"mvex\", {\n children: [\n new Box(\"trex\", {\n /* prettier-ignore */\n contents: [0x00,0x00,0x00,0x00, // flags\n 0x00,0x00,0x00,0x01, // track id\n 0x00,0x00,0x00,0x01, // default_sample_description_index\n Box.getUint32(samples), // default_sample_duration\n 0x00,0x00,0x00,0x00, // default_sample_size;\n 0x00,0x00,0x00,0x00], // default_sample_flags;\n }),\n ],\n }),\n ],\n }),\n ],\n }).contents;\n }\n\n getSamplesPerFrame(frames) {\n return this._codec === MP4A_40_2\n ? frames.map(({ data, header }) =>\n Box.getUint32(data.length - header.length),\n )\n : frames.map(({ data }) => Box.getUint32(data.length));\n }\n\n getFrameData(frames) {\n return this._codec === MP4A_40_2\n ? frames.map(({ data, header }) => data.subarray(header.length))\n : frames.map(({ data }) => data);\n }\n\n /**\n * @description Wraps codec frames into a Movie Fragment\n * @param {Array} frames Frames to contain in this Movie Fragment\n * @returns {Uint8Array} Movie Fragment containing the frames\n */\n getMediaSegment(frames) {\n return new ContainerElement({\n children: [\n new Box(\"moof\", {\n children: [\n new Box(\"mfhd\", {\n /* prettier-ignore */\n contents: [0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00], // sequence number\n }),\n new Box(\"traf\", {\n children: [\n new Box(\"tfhd\", {\n /* prettier-ignore */\n contents: [0x00, // version\n 0b00000010,0x00,0b00000000, // flags\n // * `AB|00000000|00CDE0FG`\n // * `A.|........|........` default-base-is-moof\n // * `.B|........|........` duration-is-empty\n // * `..|........|..C.....` default-sample-flags-present\n // * `..|........|...D....` default-sample-size-present\n // * `..|........|....E...` default-sample-duration-present\n // * `..|........|......F.` sample-description-index-present\n // * `..|........|.......G` base-data-offset-present\n 0x00,0x00,0x00,0x01], // track id\n }),\n new Box(\"tfdt\", {\n /* prettier-ignore */\n contents: [0x00, // version\n 0x00,0x00,0x00, // flags\n 0x00,0x00,0x00,0x00], // base media decode time\n }),\n new Box(\"trun\", {\n /* prettier-ignore */\n contents: [0x00, // version\n 0x00,0b0000010,0b00000001, // flags\n // * `ABCD|00000E0F`\n // * `A...|........` sample‐composition‐time‐offsets‐present\n // * `.B..|........` sample‐flags‐present\n // * `..C.|........` sample‐size‐present\n // * `...D|........` sample‐duration‐present\n // * `....|.....E..` first‐sample‐flags‐present\n // * `....|.......G` data-offset-present\n Box.getUint32(frames.length), // number of samples\n Box.getUint32(92 + frames.length * 4), // data offset\n ...this.getSamplesPerFrame(frames)], // samples size per frame\n }),\n ],\n }),\n ],\n }),\n new Box(\"mdat\", {\n contents: this.getFrameData(frames),\n }),\n ],\n }).contents;\n }\n}\n","/* Copyright 2020-2021 Ethan Halsall\n \n This file is part of mse-audio-wrapper.\n \n mse-audio-wrapper is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n mse-audio-wrapper is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport { MSE_AUDIO_WRAPPER } from \"./constants.js\";\n\nconst xiphLacing = (...buffers) =>\n buffers.flatMap((buffer) => {\n const lacing = [];\n for (let l = buffer.length; l >= 0; l -= 255) {\n lacing.push(l >= 255 ? 255 : l);\n }\n return lacing;\n });\n\nconst logError = (...messages) => {\n console.error(\n MSE_AUDIO_WRAPPER,\n messages.reduce((acc, message) => acc + \"\\n \" + message, \"\"),\n );\n};\n\nexport { logError, xiphLacing };\n","/* Copyright 2020-2021 Ethan Halsall\n \n This file is part of mse-audio-wrapper.\n \n mse-audio-wrapper is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n mse-audio-wrapper is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport { MSE_AUDIO_WRAPPER } from \"../../constants.js\";\nimport { logError } from \"../../utilities.js\";\n\nimport ContainerElement from \"../ContainerElement.js\";\n\nexport default class EBML extends ContainerElement {\n /**\n * @description Extensible Binary Meta Language element\n * @param {name} name ID of the EBML element\n * @param {object} params Object containing contents or children\n * @param {boolean} [isUnknownLength] Set to true to use the unknown length constant for EBML\n * @param {Array} [params.contents] Array of bytes to insert into this box\n * @param {Array} [params.children] Array of children to insert into this box\n */\n constructor(name, { contents, children, isUnknownLength = false } = {}) {\n super({ name, contents, children });\n\n this._isUnknownLength = isUnknownLength;\n }\n\n /**\n * @description Converts a JavaScript number into a variable length EBML integer\n * @param {number} number Number to convert\n */\n static getUintVariable(number) {\n let buffer;\n\n if (number < 0x7f) {\n buffer = [0b10000000 | number];\n } else if (number < 0x3fff) {\n buffer = ContainerElement.getUint16(number);\n buffer[0] |= 0b01000000;\n } else if (number < 0x1fffff) {\n buffer = ContainerElement.getUint32(number).subarray(1);\n buffer[0] |= 0b00100000;\n } else if (number < 0xfffffff) {\n buffer = ContainerElement.getUint32(number);\n buffer[0] |= 0b00010000;\n } else if (number < 0x7ffffffff) {\n buffer = ContainerElement.getUint64(number).subarray(3);\n buffer[0] |= 0b00001000;\n } else if (number < 0x3ffffffffff) {\n buffer = ContainerElement.getUint64(number).subarray(2);\n buffer[0] |= 0b00000100;\n } else if (number < 0x1ffffffffffff) {\n buffer = ContainerElement.getUint64(number).subarray(1);\n buffer[0] |= 0b00000010;\n } else if (number < 0xffffffffffffff) {\n buffer = ContainerElement.getUint64(number);\n buffer[0] |= 0b00000001;\n } else if (typeof number !== \"number\" || isNaN(number)) {\n logError(\n `EBML Variable integer must be a number, instead received ${number}`,\n );\n throw new Error(MSE_AUDIO_WRAPPER + \": Unable to encode WEBM\");\n }\n\n return buffer;\n }\n\n _buildContents() {\n return [...this._name, ...this._lengthBytes, ...super._buildContents()];\n }\n\n _buildLength() {\n if (!this._length) {\n this._contentLength = super._buildLength();\n this._lengthBytes = this._isUnknownLength\n ? [0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff] // unknown length constant\n : EBML.getUintVariable(this._contentLength);\n this._length =\n this._name.length + this._lengthBytes.length + this._contentLength;\n }\n\n return this._length;\n }\n}\n\n// https://tools.ietf.org/id/draft-lhomme-cellar-matroska-00.html\nexport const id = {\n AlphaMode: [0x53, 0xc0],\n AspectRatioType: [0x54, 0xb3],\n AttachedFile: [0x61, 0xa7],\n AttachmentLink: [0x74, 0x46],\n Attachments: [0x19, 0x41, 0xa4, 0x69],\n Audio: [0xe1],\n BitDepth: [0x62, 0x64],\n BitsPerChannel: [0x55, 0xb2],\n Block: [0xa1],\n BlockAddID: [0xee],\n BlockAdditional: [0xa5],\n BlockAdditions: [0x75, 0xa1],\n BlockDuration: [0x9b],\n BlockGroup: [0xa0],\n BlockMore: [0xa6],\n CbSubsamplingHorz: [0x55, 0xb5],\n CbSubsamplingVert: [0x55, 0xb6],\n Channels: [0x9f],\n ChapCountry: [0x43, 0x7e],\n ChapLanguage: [0x43, 0x7c],\n ChapProcess: [0x69, 0x44],\n ChapProcessCodecID: [0x69, 0x55],\n ChapProcessCommand: [0x69, 0x11],\n ChapProcessData: [0x69, 0x33],\n ChapProcessPrivate: [0x45, 0x0d],\n ChapProcessTime: [0x69, 0x22],\n ChapString: [0x85],\n ChapterAtom: [0xb6],\n ChapterDisplay: [0x80],\n ChapterFlagEnabled: [0x45, 0x98],\n ChapterFlagHidden: [0x98],\n ChapterPhysicalEquiv: [0x63, 0xc3],\n Chapters: [0x10, 0x43, 0xa7, 0x70],\n ChapterSegmentEditionUID: [0x6e, 0xbc],\n ChapterSegmentUID: [0x6e, 0x67],\n ChapterStringUID: [0x56, 0x54],\n ChapterTimeEnd: [0x92],\n ChapterTimeStart: [0x91],\n ChapterTrack: [0x8f],\n ChapterTrackNumber: [0x89],\n ChapterTranslate: [0x69, 0x24],\n ChapterTranslateCodec: [0x69, 0xbf],\n ChapterTranslateEditionUID: [0x69, 0xfc],\n ChapterTranslateID: [0x69, 0xa5],\n ChapterUID: [0x73, 0xc4],\n ChromaSitingHorz: [0x55, 0xb7],\n ChromaSitingVert: [0x55, 0xb8],\n ChromaSubsamplingHorz: [0x55, 0xb3],\n ChromaSubsamplingVert: [0x55, 0xb4],\n Cluster: [0x1f, 0x43, 0xb6, 0x75],\n CodecDecodeAll: [0xaa],\n CodecDelay: [0x56, 0xaa],\n CodecID: [0x86],\n CodecName: [0x25, 0x86, 0x88],\n CodecPrivate: [0x63, 0xa2],\n CodecState: [0xa4],\n Colour: [0x55, 0xb0],\n ColourSpace: [0x2e, 0xb5, 0x24],\n ContentCompAlgo: [0x42, 0x54],\n ContentCompression: [0x50, 0x34],\n ContentCompSettings: [0x42, 0x55],\n ContentEncAlgo: [0x47, 0xe1],\n ContentEncKeyID: [0x47, 0xe2],\n ContentEncoding: [0x62, 0x40],\n ContentEncodingOrder: [0x50, 0x31],\n ContentEncodings: [0x6d, 0x80],\n ContentEncodingScope: [0x50, 0x32],\n ContentEncodingType: [0x50, 0x33],\n ContentEncryption: [0x50, 0x35],\n ContentSigAlgo: [0x47, 0xe5],\n ContentSigHashAlgo: [0x47, 0xe6],\n ContentSigKeyID: [0x47, 0xe4],\n ContentSignature: [0x47, 0xe3],\n CRC32: [0xbf],\n CueBlockNumber: [0x53, 0x78],\n CueClusterPosition: [0xf1],\n CueCodecState: [0xea],\n CueDuration: [0xb2],\n CuePoint: [0xbb],\n CueReference: [0xdb],\n CueRefTime: [0x96],\n CueRelativePosition: [0xf0],\n Cues: [0x1c, 0x53, 0xbb, 0x6b],\n CueTime: [0xb3],\n CueTrack: [0xf7],\n CueTrackPositions: [0xb7],\n DateUTC: [0x44, 0x61],\n DefaultDecodedFieldDuration: [0x23, 0x4e, 0x7a],\n DefaultDuration: [0x23, 0xe3, 0x83],\n DiscardPadding: [0x75, 0xa2],\n DisplayHeight: [0x54, 0xba],\n DisplayUnit: [0x54, 0xb2],\n DisplayWidth: [0x54, 0xb0],\n DocType: [0x42, 0x82],\n DocTypeReadVersion: [0x42, 0x85],\n DocTypeVersion: [0x42, 0x87],\n Duration: [0x44, 0x89],\n EBML: [0x1a, 0x45, 0xdf, 0xa3],\n EBMLMaxIDLength: [0x42, 0xf2],\n EBMLMaxSizeLength: [0x42, 0xf3],\n EBMLReadVersion: [0x42, 0xf7],\n EBMLVersion: [0x42, 0x86],\n EditionEntry: [0x45, 0xb9],\n EditionFlagDefault: [0x45, 0xdb],\n EditionFlagHidden: [0x45, 0xbd],\n EditionFlagOrdered: [0x45, 0xdd],\n EditionUID: [0x45, 0xbc],\n FieldOrder: [0x9d],\n FileData: [0x46, 0x5c],\n FileDescription: [0x46, 0x7e],\n FileMimeType: [0x46, 0x60],\n FileName: [0x46, 0x6e],\n FileUID: [0x46, 0xae],\n FlagDefault: [0x88],\n FlagEnabled: [0xb9],\n FlagForced: [0x55, 0xaa],\n FlagInterlaced: [0x9a],\n FlagLacing: [0x9c],\n Info: [0x15, 0x49, 0xa9, 0x66],\n LaceNumber: [0xcc],\n Language: [0x22, 0xb5, 0x9c],\n LuminanceMax: [0x55, 0xd9],\n LuminanceMin: [0x55, 0xda],\n MasteringMetadata: [0x55, 0xd0],\n MatrixCoefficients: [0x55, 0xb1],\n MaxBlockAdditionID: [0x55, 0xee],\n MaxCache: [0x6d, 0xf8],\n MaxCLL: [0x55, 0xbc],\n MaxFALL: [0x55, 0xbd],\n MinCache: [0x6d, 0xe7],\n MuxingApp: [0x4d, 0x80],\n Name: [0x53, 0x6e],\n NextFilename: [0x3e, 0x83, 0xbb],\n NextUID: [0x3e, 0xb9, 0x23],\n OutputSamplingFrequency: [0x78, 0xb5],\n PixelCropBottom: [0x54, 0xaa],\n PixelCropLeft: [0x54, 0xcc],\n PixelCropRight: [0x54, 0xdd],\n PixelCropTop: [0x54, 0xbb],\n PixelHeight: [0xba],\n PixelWidth: [0xb0],\n Position: [0xa7],\n PrevFilename: [0x3c, 0x83, 0xab],\n PrevSize: [0xab],\n PrevUID: [0x3c, 0xb9, 0x23],\n Primaries: [0x55, 0xbb],\n PrimaryBChromaticityX: [0x55, 0xd5],\n PrimaryBChromaticityY: [0x55, 0xd6],\n PrimaryGChromaticityX: [0x55, 0xd3],\n PrimaryGChromaticityY: [0x55, 0xd4],\n PrimaryRChromaticityX: [0x55, 0xd1],\n PrimaryRChromaticityY: [0x55, 0xd2],\n Range: [0x55, 0xb9],\n ReferenceBlock: [0xfb],\n ReferencePriority: [0xfa],\n SamplingFrequency: [0xb5],\n Seek: [0x4d, 0xbb],\n SeekHead: [0x11, 0x4d, 0x9b, 0x74],\n SeekID: [0x53, 0xab],\n SeekPosition: [0x53, 0xac],\n SeekPreRoll: [0x56, 0xbb],\n Segment: [0x18, 0x53, 0x80, 0x67],\n SegmentFamily: [0x44, 0x44],\n SegmentFilename: [0x73, 0x84],\n SegmentUID: [0x73, 0xa4],\n SilentTrackNumber: [0x58, 0xd7],\n SilentTracks: [0x58, 0x54],\n SimpleBlock: [0xa3],\n SimpleTag: [0x67, 0xc8],\n Slices: [0x8e],\n StereoMode: [0x53, 0xb8],\n Tag: [0x73, 0x73],\n TagAttachmentUID: [0x63, 0xc6],\n TagBinary: [0x44, 0x85],\n TagChapterUID: [0x63, 0xc4],\n TagDefault: [0x44, 0x84],\n TagEditionUID: [0x63, 0xc9],\n TagLanguage: [0x44, 0x7a],\n TagName: [0x45, 0xa3],\n Tags: [0x12, 0x54, 0xc3, 0x67],\n TagString: [0x44, 0x87],\n TagTrackUID: [0x63, 0xc5],\n Targets: [0x63, 0xc0],\n TargetType: [0x63, 0xca],\n TargetTypeValue: [0x68, 0xca],\n Timestamp: [0xe7],\n TimestampScale: [0x2a, 0xd7, 0xb1],\n TimeSlice: [0xe8],\n Title: [0x7b, 0xa9],\n TrackCombinePlanes: [0xe3],\n TrackEntry: [0xae],\n TrackJoinBlocks: [0xe9],\n TrackJoinUID: [0xed],\n TrackNumber: [0xd7],\n TrackOperation: [0xe2],\n TrackOverlay: [0x6f, 0xab],\n TrackPlane: [0xe4],\n TrackPlaneType: [0xe6],\n TrackPlaneUID: [0xe5],\n Tracks: [0x16, 0x54, 0xae, 0x6b],\n TrackTranslate: [0x66, 0x24],\n TrackTranslateCodec: [0x66, 0xbf],\n TrackTranslateEditionUID: [0x66, 0xfc],\n TrackTranslateTrackID: [0x66, 0xa5],\n TrackType: [0x83],\n TrackUID: [0x73, 0xc5],\n TransferCharacteristics: [0x55, 0xba],\n Video: [0xe0],\n Void: [0xec],\n WhitePointChromaticityX: [0x55, 0xd7],\n WhitePointChromaticityY: [0x55, 0xd8],\n WritingApp: [0x57, 0x41],\n};\n","/* Copyright 2020-2021 Ethan Halsall\n \n This file is part of mse-audio-wrapper.\n \n mse-audio-wrapper is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n mse-audio-wrapper is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport { VORBIS, OPUS, WEBM, MSE_AUDIO_WRAPPER } from \"../../constants.js\";\nimport { xiphLacing } from \"../../utilities.js\";\n\nimport ContainerElement from \"../ContainerElement.js\";\nimport EBML, { id } from \"./EBML.js\";\n\nexport default class WEBMContainer {\n constructor(codec) {\n switch (codec) {\n case OPUS: {\n this._codecId = \"A_OPUS\";\n this._getCodecSpecificTrack = (header) => [\n new EBML(id.CodecDelay, {\n contents: EBML.getUint32(\n Math.round(header.preSkip * this._timestampScale),\n ),\n }), // OPUS codec delay\n new EBML(id.SeekPreRoll, {\n contents: EBML.getUint32(Math.round(3840 * this._timestampScale)),\n }), // OPUS seek preroll 80ms\n new EBML(id.CodecPrivate, { contents: header.data }), // OpusHead bytes\n ];\n break;\n }\n case VORBIS: {\n this._codecId = \"A_VORBIS\";\n this._getCodecSpecificTrack = (header) => [\n new EBML(id.CodecPrivate, {\n contents: [\n 0x02, // number of packets\n xiphLacing(header.data, header.vorbisComments),\n header.data,\n header.vorbisComments,\n header.vorbisSetup,\n ],\n }),\n ];\n break;\n }\n }\n }\n\n getInitializationSegment({ header }) {\n this._timestampScale = 1000000000 / header.sampleRate;\n\n return new ContainerElement({\n children: [\n new EBML(id.EBML, {\n children: [\n new EBML(id.EBMLVersion, { contents: 1 }),\n new EBML(id.EBMLReadVersion, { contents: 1 }),\n new EBML(id.EBMLMaxIDLength, { contents: 4 }),\n new EBML(id.EBMLMaxSizeLength, { contents: 8 }),\n new EBML(id.DocType, { contents: EBML.stringToByteArray(WEBM) }),\n new EBML(id.DocTypeVersion, { contents: 4 }),\n new EBML(id.DocTypeReadVersion, { contents: 2 }),\n ],\n }),\n new EBML(id.Segment, {\n isUnknownLength: true,\n children: [\n new EBML(id.Info, {\n children: [\n new EBML(id.TimestampScale, {\n contents: EBML.getUint32(\n Math.floor(this._timestampScale), // Base timestamps on sample rate vs. milliseconds https://www.matroska.org/technical/notes.html#timestamps\n ),\n }),\n new EBML(id.MuxingApp, {\n contents: EBML.stringToByteArray(MSE_AUDIO_WRAPPER),\n }),\n new EBML(id.WritingApp, {\n contents: EBML.stringToByteArray(MSE_AUDIO_WRAPPER),\n }),\n ],\n }),\n new EBML(id.Tracks, {\n children: [\n new EBML(id.TrackEntry, {\n children: [\n new EBML(id.TrackNumber, { contents: 0x01 }),\n new EBML(id.TrackUID, { contents: 0x01 }),\n new EBML(id.FlagLacing, { contents: 0x00 }),\n new EBML(id.CodecID, {\n contents: EBML.stringToByteArray(this._codecId),\n }),\n new EBML(id.TrackType, { contents: 0x02 }), // audio\n new EBML(id.Audio, {\n children: [\n new EBML(id.Channels, { contents: header.channels }),\n new EBML(id.SamplingFrequency, {\n contents: EBML.getFloat64(header.sampleRate),\n }),\n new EBML(id.BitDepth, { contents: header.bitDepth }),\n ],\n }),\n ...this._getCodecSpecificTrack(header),\n ],\n }),\n ],\n }),\n ],\n }),\n ],\n }).contents;\n }\n\n getMediaSegment(frames) {\n const offsetSamples = frames[0].totalSamples;\n\n return new EBML(id.Cluster, {\n children: [\n new EBML(id.Timestamp, {\n contents: EBML.getUintVariable(offsetSamples), // Absolute timecode of the cluster\n }),\n ...frames.map(\n ({ data, totalSamples }) =>\n new EBML(id.SimpleBlock, {\n contents: [\n 0x81, // track number\n EBML.getInt16(totalSamples - offsetSamples), // timestamp relative to cluster Int16\n 0x80, // No lacing\n data, // ogg page contents\n ],\n }),\n ),\n ],\n }).contents;\n }\n}\n","/* Copyright 2020-2021 Ethan Halsall\n \n This file is part of mse-audio-wrapper.\n \n mse-audio-wrapper is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n mse-audio-wrapper is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport CodecParser from \"codec-parser\";\n\nimport {\n WEBM,\n MP3,\n MP4A_40_2,\n FLAC,\n VORBIS,\n OPUS,\n AUDIO_MP4,\n AUDIO_WEBM,\n} from \"./constants.js\";\n\nimport ISOBMFFContainer from \"./containers/isobmff/ISOBMFFContainer.js\";\nimport WEBMContainer from \"./containers/webm/WEBMContainer.js\";\n\nconst noOp = () => {};\n\nexport default class MSEAudioWrapper {\n /**\n * @description Wraps audio data into media source API compatible containers\n * @param {string} mimeType Mimetype of the audio data to wrap\n * @param {string} options.codec Codec of the audio data to wrap\n * @param {object} options.preferredContainer Preferred audio container to output if multiple containers are available\n * @param {number} options.minBytesPerSegment Minimum number of bytes to process before returning a media segment\n * @param {number} options.minFramesPerSegment Minimum number of frames to process before returning a media segment\n * @param {number} options.minBytesPerSegment Minimum number of bytes to process before returning a media segment\n * @param {boolean} options.enableLogging Set to true to enable debug logging\n */\n constructor(mimeType, options = {}) {\n this._inputMimeType = mimeType;\n\n this.PREFERRED_CONTAINER = options.preferredContainer || WEBM;\n this.MIN_FRAMES = options.minFramesPerSegment || 4;\n this.MAX_FRAMES = options.maxFramesPerSegment || 50;\n this.MIN_FRAMES_LENGTH = options.minBytesPerSegment || 1022;\n this.MAX_SAMPLES_PER_SEGMENT = Infinity;\n\n this._onMimeType = options.onMimeType || noOp;\n\n if (options.codec) {\n this._container = this._getContainer(options.codec);\n this._onMimeType(this._mimeType);\n }\n\n this._frames = [];\n this._codecParser = new CodecParser(mimeType, {\n onCodec: (codec) => {\n this._container = this._getContainer(codec);\n this._onMimeType(this._mimeType);\n },\n onCodecUpdate: options.onCodecUpdate,\n enableLogging: options.enableLogging,\n enableFrameCRC32: false,\n });\n }\n\n /**\n * @public\n * @returns The mimetype being returned from MSEAudioWrapper\n */\n get mimeType() {\n return this._mimeType;\n }\n\n /**\n * @public\n * @returns The mimetype of the incoming audio data\n */\n get inputMimeType() {\n return this._inputMimeType;\n }\n\n /**\n * @public\n * @description Returns an iterator for the passed in codec data.\n * @param {Uint8Array | Array} chunk Next chunk of codec data to read\n * @returns {Iterator} Iterator that operates over the codec data.\n * @yields {Uint8Array} Movie Fragments containing codec frames\n */\n *iterator(chunk) {\n if (chunk.constructor === Uint8Array) {\n yield* this._processFrames(\n [...this._codecParser.parseChunk(chunk)].flatMap(\n (frame) => frame.codecFrames || frame,\n ),\n );\n } else if (Array.isArray(chunk)) {\n yield* this._processFrames(chunk);\n }\n }\n\n /**\n * @private\n */\n *_processFrames(frames) {\n this._frames.push(...frames);\n\n if (this._frames.length) {\n const groups = this._groupFrames();\n\n if (groups.length) {\n if (!this._sentInitialSegment) {\n this._sentInitialSegment = true;\n\n yield this._container.getInitializationSegment(groups[0][0]);\n }\n for (const frameGroup of groups) {\n yield this._container.getMediaSegment(frameGroup);\n }\n }\n }\n }\n\n /**\n * @private\n */\n _groupFrames() {\n const groups = [[]];\n let currentGroup = groups[0];\n let samples = 0;\n\n for (const frame of this._frames) {\n if (\n currentGroup.length === this.MAX_FRAMES ||\n samples >= this.MAX_SAMPLES_PER_SEGMENT\n ) {\n samples = 0;\n groups.push((currentGroup = [])); // create new group\n }\n\n currentGroup.push(frame);\n samples += frame.samples;\n }\n\n // store remaining frames\n this._frames =\n currentGroup.length < this.MIN_FRAMES ||\n currentGroup.reduce((acc, frame) => acc + frame.data.length, 0) <\n this.MIN_FRAMES_LENGTH\n ? groups.pop()\n : [];\n\n return groups;\n }\n\n /**\n * @private\n */\n _getContainer(codec) {\n switch (codec) {\n case \"mpeg\":\n this._mimeType = `${AUDIO_MP4}\"${MP3}\"`;\n return new ISOBMFFContainer(MP3);\n case \"aac\":\n this._mimeType = `${AUDIO_MP4}\"${MP4A_40_2}\"`;\n return new ISOBMFFContainer(MP4A_40_2);\n case \"flac\":\n this._mimeType = `${AUDIO_MP4}\"${FLAC}\"`;\n return new ISOBMFFContainer(FLAC);\n case \"vorbis\":\n this._mimeType = `${AUDIO_WEBM}\"${VORBIS}\"`;\n\n this.MAX_SAMPLES_PER_SEGMENT = 32767;\n return new WEBMContainer(VORBIS);\n case \"opus\":\n if (this.PREFERRED_CONTAINER === WEBM) {\n this._mimeType = `${AUDIO_WEBM}\"${OPUS}\"`;\n\n this.MAX_SAMPLES_PER_SEGMENT = 32767;\n return new WEBMContainer(OPUS);\n }\n this._mimeType = `${AUDIO_MP4}\"${OPUS}\"`;\n return new ISOBMFFContainer(OPUS);\n }\n }\n}\n"],"names":["WEBM","MP3","MP4A_40_2","FLAC","VORBIS","OPUS","audio","codecs","AUDIO_MP4","AUDIO_WEBM","MSE_AUDIO_WRAPPER","ContainerElement","constructor","name","contents","children","this","_name","_contents","_children","stringToByteArray","map","char","charCodeAt","getFloat64","number","bytes","Uint8Array","DataView","buffer","setFloat64","getUint64","setBigUint64","BigInt","getUint32","setUint32","getUint16","setUint16","getInt16","setInt16","flatten","array","item","Array","isArray","length","_buildContents","offset","element","set","_buildLength","obj","reduce","acc","val","undefined","addChild","object","push","Box","super","_lengthBytes","_length","ESTag","tagNumber","tags","getLength","every","byte","i","addTag","tag","ISOBMFFContainer","codec","_codec","getCodecBox","header","getMp4a","getOpus","getFlaC","channels","bitDepth","sampleRate","preSkip","inputSampleRate","outputGain","channelMappingFamily","streamCount","coupledStreamCount","channelMappingTable","streamInfo","blockSize","esdsCodec","streamDescriptorTag","audioSpecificConfig","getInitializationSegment","samples","getSamplesPerFrame","frames","data","getFrameData","subarray","getMediaSegment","xiphLacing","buffers","flatMap","lacing","l","EBML","isUnknownLength","_isUnknownLength","getUintVariable","isNaN","messages","console","error","message","logError","Error","_contentLength","id","WEBMContainer","_codecId","_getCodecSpecificTrack","Math","round","_timestampScale","vorbisComments","vorbisSetup","floor","offsetSamples","totalSamples","noOp","MSEAudioWrapper","mimeType","options","_inputMimeType","PREFERRED_CONTAINER","preferredContainer","MIN_FRAMES","minFramesPerSegment","MAX_FRAMES","maxFramesPerSegment","MIN_FRAMES_LENGTH","minBytesPerSegment","MAX_SAMPLES_PER_SEGMENT","Infinity","_onMimeType","onMimeType","_container","_getContainer","_mimeType","_frames","_codecParser","onCodec","onCodecUpdate","enableLogging","enableFrameCRC32","inputMimeType","iterator","chunk","_processFrames","parseChunk","frame","codecFrames","groups","_groupFrames","_sentInitialSegment","frameGroup","currentGroup","pop"],"sourceRoot":""} \ No newline at end of file diff --git a/lib/icecast-metadata-player-1.17.3.mpeg.min.js b/lib/icecast-metadata-player-1.17.3.mpeg.min.js new file mode 100644 index 0000000..c8dcaa6 Binary files /dev/null and b/lib/icecast-metadata-player-1.17.3.mpeg.min.js differ diff --git a/lib/icecast-metadata-player-1.17.3.mpeg.min.js.map b/lib/icecast-metadata-player-1.17.3.mpeg.min.js.map new file mode 100644 index 0000000..dedab7f --- /dev/null +++ b/lib/icecast-metadata-player-1.17.3.mpeg.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"icecast-metadata-player-1.17.3.mpeg.min.js","mappings":"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","sources":["webpack://IcecastMetadataPlayer/./node_modules/@eshaz/web-worker/cjs/browser.js","webpack://IcecastMetadataPlayer/./node_modules/mpg123-decoder/src/EmscriptenWasm.js","webpack://IcecastMetadataPlayer/./node_modules/mpg123-decoder/src/MPEGDecoder.js","webpack://IcecastMetadataPlayer/./node_modules/mpg123-decoder/src/MPEGDecoderWebWorker.js","webpack://IcecastMetadataPlayer/./node_modules/mpg123-decoder/index.js","webpack://IcecastMetadataPlayer/./node_modules/simple-yenc/dist/esm.js"],"sourcesContent":["/**\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nmodule.exports = Worker;","/* **************************************************\n * This file is auto-generated during the build process.\n * Any edits to this file will be overwritten.\n ****************************************************/\n\nexport default function EmscriptenWASM(WASMAudioDecoderCommon) {\nvar Module = Module;\n\nvar out = text => console.log(text);\n\nvar err = text => console.error(text);\n\nfunction ready() {}\n\nModule = {};\n\n/** @param {string|number=} what */ function abort(what) {\n throw what;\n}\n\nfor (var base64ReverseLookup = new Uint8Array(123), /*'z'+1*/ i = 25; i >= 0; --i) {\n base64ReverseLookup[48 + i] = 52 + i;\n base64ReverseLookup[65 + i] = i;\n base64ReverseLookup[97 + i] = 26 + i;\n}\n\nbase64ReverseLookup[43] = 62;\n\nbase64ReverseLookup[47] = 63;\n\n/** @noinline */ function base64Decode(b64) {\n var b1, b2, i = 0, j = 0, bLength = b64.length, output = new Uint8Array((bLength * 3 >> 2) - (b64[bLength - 2] == \"=\") - (b64[bLength - 1] == \"=\"));\n for (;i < bLength; i += 4, j += 3) {\n b1 = base64ReverseLookup[b64.charCodeAt(i + 1)];\n b2 = base64ReverseLookup[b64.charCodeAt(i + 2)];\n output[j] = base64ReverseLookup[b64.charCodeAt(i)] << 2 | b1 >> 4;\n output[j + 1] = b1 << 4 | b2 >> 2;\n output[j + 2] = b2 << 6 | base64ReverseLookup[b64.charCodeAt(i + 3)];\n }\n return output;\n}\n\nif (!EmscriptenWASM.wasm) Object.defineProperty(EmscriptenWASM, \"wasm\", {get: () => String.raw`dynEncode01d9cc1a928b\u0005f\u0014ïÛúí\u001c8ñõp;ºñ˜nnÆ\\E²þqõqû\u0000L’i\u0011—ø\u001dÝW‘fý±¹\u0001„_³qI£B1åøav\u0011Í^±‰[g·OKr.€å\"u0õ!\u0002þbM&²’EéV’×$\u001e:_\u001bÜ®\u0014ÿB„å\u0004ÁßvISò\u000fþ«}§¾fSœÔoÍ=}\u001d’wJ¹á\u0001HºWh6Ò\tš¬ö\bP•Øåcž\u001aÜ:í߸•XV\u0010÷µÖ!#ù\u0006I›¶Ö_\u001fIP°ó]s¡\u0000Ló‚\u000bø•ZˆŸNP\u000fn\u0001ªW•Æ\u000e²>€+7ø\u001f„—\u001afÀÿ\u001e8¯Wë¼®‚çóÌ)\u0011Oƒ¯«WÔ#\u001aÐmÒKí'ñ±´HøÉ$¼‚‘oÇ¿\u0007‹4ïŽ5èÖ&?:þêP‡!ù>\u0014\u0018Ëò4\"\u000f´’'­\u0019>õޓ{7ÚN³¦aΓü¿Þ#~;«¸ó\f¢«g\u001eeÈ®ƒ,ýÉ°Ž\u0007^¸Í#çßJ„†¾ºHBþøì,Ïð¦o…À\u0014¦erZ­¦Ät׫þ–)-2MÕÒ¾ž¼9\u0007tĊÒj¾ž¬äu~²+ìWC~AåÅ5\u001dF'\u001fDP';ޝå3}ph\u000e\t\\O/µïÞ?dی6Z‘êÞ;L&þSdz®·\u0005æb>\u0012AX\u000e³ÌŠoۘ&>E]”ðt\\\b;„zÃ7G¡ú?”“X ®™ôc獫jªC<\u0011ÊxçÆbØ,®_\u0019\fÕtŒ\u001e>Ë\u001a‚Ñ£\u0016ÖÇ?*ʼv…Â\f‚MËcý°±(ø\u0005îÂ2GkKêÀ’nÕ%à\u001c!œ\u0018v\u0006C).ôƒÞ.+j3à´\u0012C\u0014k€\u0005?Käj¯Ñ31“(7ó ëa_v›\u0006¿\u0014}\u001aƒúso±€ð> ñH¢3w¢çòxÈ\\í­°T;}\u0012=}D\u0007ï(ì\u0000fžGŠ$}­\u0018ç\f…Ð_\u0005\u0002ÓÏM:ûÜ\\\u001až#\u000f°ðõ\u001aѺSž§ž»Â«iÿS¹)\t꿓¯\u0004Ÿªo\u001a\u0016.ÅV‘M\u001e\u0010°+nS4\u0003Fhž™uròQ‘@‡hÈîÌÖ\u0007åÆw€Z€à\fòs“í·öu(ÞßP<îUà´P¢¬™‘$Ï)¯zö\u001cBY„4™KÉ\u0004Æï¦GªY\fÍj·\u0010o7\\ßèA\u0000”\u0019\u001c[3Ÿ\u0002·^\u0018”ÀӚHsÇ»0‘º\u0017+\u0004a<±ó)榞r7¨\u001c\u00052ìܓp\u0014mÁ)\n;*¢’Ãó\u001dhô|›,Sã3זv‡,ŒáçN›¦Qf¦ž|‡'_¶QL4…yææÆ{k\u000eªýF_èbn\u0005Ï0ŒVk‰rí\u0010ª¦ÕõÁšÌ\u0017\u0002º\u0000ÄÎK$»CWÿ¹ð$nôï\u000eõ^šbñâ.+G7ĺ-^œ\u0016dڂ¨é\u0016ë“;å9Ñ«¶\u001b¨Ï”Ò1q{\u0006%„–\u0011^ÿåoµ½8ZYq\u0012c]ɓ¸\u0003í<ÔF&ë]&ÝÒÍê†\u0004=d{ñJØÏ4ŽÁ':۞ÁÈo±×h¸ƒäL\\\u000bñóãv\u0014ï\u0003(jÖXb×#ô,36q;ÞÆ\u001fƒ··´w{\u0005\u0015N—Oè€ËwŒ@~Kh ™„äW۟Ç$•#¬\u0018\u000ešà‘ˆ•ÄíÏC|ãp\u001c\t\u0010A‚N1(Õ»\u001bzý\u0012å\u0007›&¿”\u001d)­c£m‚â'ÑmJMc²]/´^[\u0001Œi±P©Ü[ãí>š#2\u001e2þg‹\tò=}æ\fj;º”ämÝz¨_ÿŒ\u001dl̓)\\\u0016}•–èrâÌçËò{—…™™•”ô\u001b¿wgX\u0000›ö1ÐvEƒ–Wó½\f^Ö_Öó֘|¹\u0000s€((^ÎÇ÷\u0001×Ó®}&= \u0011×Hàößëö\u000eM\\|ÿ¾ÕX&›\u0018O2ä·Ð°S1¼=MVg¯$\nÌ4ý\u001f$¯ß=}œƒ? ž_Ýx7ڌ1\"\bÝãÅín¶“\u0010&@Žÿ‰×{39àrOX\u0006¿]‰ÐÇA›àq\u0004õgý±i‚Ôº5CJD’÷²Eßt\u0006V)\u0000d;= *\t’õ3\u0004dR.\u0003ÁkN©{2¯Ý¥.)¶{\u0017¹Äç\u000ft4}®ž\u0007|\u0013—N\u000b\"›\b…Y|\u0013¹@4ub^\u0011ê¤ÿ\u0019ÝìK½â\u0011ÈÕË\u001eé Z\"ۜ*w+åßò81ð\frÆ·\u0004ß,<ŠŸky\u0006D]\u0007áYÆQìì¦çŠ2üæÖu­¸‚ôÁAͶ±~<þ|¢\u0017(ÛéŒ\u001eVôee†L\u001có T'\u0003ŒúÝ1{–=}m„gɦ$2ä*|‚,‚¤/AÓ¨™bìv´Ú\u0019\"aþØòýJíª4-ˆG\\ú;‘b/\\\u000b‰î΢õ\u0001ï¶ù{J\"CCCC€\u001fÏ\n§\u000e\\“nµ+º#IyÅ[\u0003|\nŸ!K;Ù+rÀÀ§¢{\nâ\u0005™l®q\u0005CpêÅz{—whòÿnÓ?”\t¥–\u0007½4ûç\u0006\u0007½º{K\u0011ÿ\u001a*²Æ\u001e«…aç©\\\u001e†\n\u0004°ûÍ©+:f[¸%\u001aà\u000eEPÚ'ixí\u0011åÐñoñTåÜô¦ºÉ~؃î…ß\u00140¬¹\u0007Ë¥yôZÝ\\…\u0018‘òjWö\nªè+K>d̵:X“’ˈüÛ\u0006= ¼IÑ\nW\\Žøòn|,öËJ-9\u0017医;\u0007áÚ×?‚'Œp‰2\fØÄ9\fÃ=M\u001aÀa“+hz÷÷dýnýVˆÚY㹛)Þm•\u0019Š\tÆ[ôþ/f = vÿïµ\u0011\u000fO\\\u000bþ<Ž=}½'L>T\u0016TÕ\u0014·\u0007íçòv\u0007Üaï\u000ew_\u000e@q9¼¶·ëZ‹ë\u0001m\nUtêóÞP\u0006ø‚íð2Tö\u001fd{\tíD{ûµ\u0012\u0002ü‰æÄãAcßçæá!\tþ* \u0011q\u0003+\u001d×j»2g-\\dðe„ò\u00165·\u0019&I–ÜN®m’\u0003+\u000b>ý+¨w\u000b¨g­®,¿Ã!6\u0018>‡h­¦,¿¿!¶\u0017>Gh­Z\u0002Lù+\bs\u000b\bëfå¥jz9Ç\u0013¢êJá€tS­Tɒ\tÜ\u0001ãML½ÚÍQPM=}³1 ãøØh@\u000b)\u0015=}j\u000b\u0015NZ‹\u0011/´†å–Š‰Êøˆà‡2\\¶00{W~NÔÓ?Óÿœf±\u0006ˆþ¿u8Ÿ«\nLúœBØиН \u0006;׀\u0001Ž\u0015ö\u0010²ø;\u0016Î7*˜m&©LÆØEÌö\u0004ç\u0015ù8ØFØ鏮šbôç§V\u0005ˆp\u001e\n!1li³¡ÿ—ó¹é-Ç\u001büLºYÆü¬ô²nÁ\u0005„»—ø暣8–GÖªZn0؜^®ê\u00040oï\u0004=M›\u0003Ñ×\u0015˜F‚ÔP”\u0007{\\Ó[΋jÿœ{HcÜÕQÎ=Mzq;+E@,•Í7 •¨Õò\bã±³\u0014…«Ÿ»9ažP\u001f–g|¬\u0005ˆ%L\u000e‘­:£È­“$ìhîÕ½óW%­šˆqVÀ„4¸Íjp\u0015OÉR¨õXÌ|ðÀ\bE\u0015ÿÓ9ÄÞ¢DÇ\u0013̽=M2§XG¼ìp\u0007Ö¤^ çƒÉTÐ͟ŸŸ¨ ŽòA­Õñª©!²¦\u001c\bÕà ØÁzËw\u0010Ö×D\u0018{‡~#\\gxÕ±¤8nÆ\u0015\u0018Ö±šÔX½è¿§uÒ\u0006O\u0001ÃÓé_‹A»Æ=Mµ¢édW~‰ØÇ\\ÁKƵ‰Ö6p­€= Ä£d¯K= ›†p™Å\u001e6§\u001b\u0002̺$Ã\fšBü€ÞÀ\u0001+Ü\u0004[ur¾…\u0000;!HW2Ùq‘\u001fGW²\u0019&\u000f\u00102-Õ\u0006e\\úÈ\u0013ï|ºÉ„\u0018…}«b(\u0010’b©\u0002ý\u000bŠ|YŠðw3;\u0005\u0015%=M~\u001d °L—I̼ã\u0015KÌf\u0014•mtI\u000eåêä¦{\u0018\u0006¿p&y^MɽwGAÆo\u001bA£lépËc¾'\u001a·ÛñÌ$ê³\u0012™ü˜UޚY-ivªy´z\u0004þ\bÏC)FAÂá‰1‘ºÃg؉SBô¶fpÌñ\u0004ÆzçªÓßN.Uþy¿\u0018~?\u001fz=}Ù?±Ä•s#\u000eÖچ›§6‡ê\u0001„š7SΫ<’;ï÷ Á92Æ] ‰†å×ì0IPz\u0011\u000eÂ\u0018\u0012'oIý¨\u0018I…‚#¯¨*°¨˜ËQ©ÎT®O9µ£¹¸Ö¾­^»}؟J‰Yú1GÐ4ˆ6Q\u0005ÖàF=Mê„çA2Ê[†Åª”ÁՏT\tpbëÏ\u0018“Ÿ\u001c{‹6Û\u000b\u00167$S–Ù·Ÿ¬Inžt85\u0013ϨŠÂ\u0007Wùz²‹£#Q»ô(= 5ÌE\u0014\f¹+4’QHI´xJ%UŸ2¨NdbyUŸò\u0015¸…*“8\u0011µþ\u000eŒ¦SG\u0018¼=}y•õ›€·Ê¢ªŒÂðñÖÈ\u0019ä\u001cÁ[¢ æA¶È””ÌȜâöº\u001dGÚá\u0014Ûùq\u0017‹´éM׌\u0000†Ä\u0007\u0018B\u0016yFPñ”\u0007i>Ñâ\u0014֊›\u0016ŸD½š\u0018sՏä˜É^\u0004a'€·ØÏhÐ\u0018À¤€òç×ÊF8ÖÎÈTŸPyÒlx’Ïe¸tÔºÂæ4Íu֗È\u0011Éb6˜_wÈԖb´(w҄Âñ§ãÎ\u0011VqÕ²MeLLL hö&0N\u00195:\u001cž9ëKH[\u0002\u0000[œ\u0002\u0004=M“ŸoŠ”\u0017ð\u001eº÷T̲Ù]œ'Ó\u0017\u0016¨5bâ\"=M²\u0005et’\u0005CÕ±¤Úp\u00188c,\"¢áRh\f³\u001a©Þúv×wªo\fß=M1še.Ý=M\f\u001aÃó,üWåm›M\\«Y\u000b?\u0002ًãK*\u001a¡†Ñ\u0018_\u0010êH‹„û«Ïÿ5Ã¥â•wÑ#A&ûÌn©,š2„z6€Ü&—¿ô»ñ,'&ïgë\t+z\u0002o\u0019,ñ®ç|n&–¿T}Ì\u000e[’–ú=M‰36A›Eã°¬¤§f‘ýØF ýqÐ\u0003½ä‚9$Ç\u0010\u0003+ìÔ&ï‚E˜‚Rv¿íkq*\u0018:edzšÏLU ýMŠ\u001cÁ;#Áû\u001d\u0006Ý\u00060¿ª-â4©ñ\t«Äa61êmÁë^é‹\u0019£p´\u0007yæ&ÿ\u0006Ú§iáˀÿ\u001eHU@B„Ý\bùØ^¹~=M4³óyjòÃf#Y\u001bÌ~†FQ oQ€îêåmëª]\u001f)\u0007\u001bòüg)\u001fp)Ÿe\u0019òöMia<Ü*ç\u001aàø+J\u001c\u0019LÜ\u0017\t\u000eŠ¹®:+ˆäÕõ7éžþ1\u0015'Û¶Ñø7!X‘zHÓ0\u0003¢;$‹üß{w\u0005??ÁA\u000e\f\u0007«ÅP§Å¦¥¥¥¥ÅnËVd–=M\f\fœøqr\u001f£õC\u0003\u0002‡-z\u0001‘4Ü\u0006s<}¾áƒ\f~…\u001dÉ­+'¤\u000f¾r‹¯±\u0019°‚…>rã%òD¯Üv€coB\u0003\u000b~†rèí-®\u000b}ú,¦óݳ~oÿfqŸ¯M.ÅwE^:n³3c­:Ã3,æ=M$ì3k­<Ã4l.J¡=}\u001c_þñN½q½ˆ=}¦G:\u0016=Mqïý~¨úh\u000b,7¿¯õúùhÛ\u0003÷…²Ïya\u0003l\u00072Œ\u0005yeús%Þ:¯%ä\u00019]à\u0016D_÷M\tš-ê?&,\u0019ÞNj¯í|Èw'CbÁ„©%\u001ex^?\u0013Ó\u0001=M\fªTzrf·ã¦5Í3A¿|ÔwÊ&\u000eS\u0003=MœÁ~\t3Y\u001aÜrÁð\b\u0002ìl\u001dõz_\u0007 XݯgBj^}5Í(ùvqoqo\ngWáyñ¬ñBÍ\u0012S¡Ôì;3êiNª<Ú%Ÿ£%D%\\Á\u0012Øým*9aÒ\u0013ÃA\u001a\u0007q³\u001b$çK9\u001c\u0010ª\\1Pi ^úw\u0016ÂKç;ßò(K%^{’\u0003¯Ð­™d¤\u001dÙ\"å\u0019gß#é>¹²@¬£K×6A\u0013ÒüR\u0010i\u001bfªN\n®õ\u000e*\u001dïB\u001f8͙ê:\u001aÜ\u0014Ò|“Åo)?í=}oO-\u001f*˜òecÁ•Õ@qcSÄ\u0013\"=MèÜ\b\u0007ë\nmí]e|ekzh\u000b­\u0001òòQ\u000fȲ•‹\u0015å\u001f1Mû^\u0007 mK­ž\u0003Ÿç\u001c=}ªðkN­@\nt ôē1\u001b\u001aI¢*Ú\u0019 ÏKá¡Šü†\u001eƒ7’\"‹\u0005œ™dÌ\u001dMÖÖ»·96ø{„ú«Ô[\u0006T……¹\\\u0006\u0012}q+1ª\u00192…ßrlùþE\u0011ëSK•ü6Çyœ¢†ÎV= ¨ëªµJ‘Âh=MÎ!C¸ºN¨¯nî:)l¸ß\f®\tdÕ¯2Ŭ%涖$õ:¹žBûƒ»+\u001c³*3\"®4.®\u0003\u0002ܨ\u0016´//[\u001aã2 \u0002¥y]udÎ\u001e҆ÔObrn’0\u0000b\u0001û’H2!ª”í®þúܨ…@/2òß6ÍNRóÞ-çKW!vh±ÀUua\u0016¥Öäqö0N\u0000g¯·.N'v,ÀM0\u0018ýŽ­\u000bÅ\u0003Ý¡S9\u001aõ´ñà‚]\u0006¢\u000fßÌ_R¾v:'\u0004òéÓÌÖü‚Þ\u000f\u001dr¨r\u0001%õ›&óºTÆ\u0018ŠÀ\u0003š;E¼ÿ\t¥™eˉÊ9÷§´Ì^¢.ÿ\u0015%\u001b¹‡¸Hƃ,€®ë\u000bR#8x³¨Ž°7ԖÏ3D\u0000üiì\u001b\"ٞ/iˆ;±.áôP¯¦“´ýÊÌ\u0011\u0012æúøÞ½öî½0c\u0000óZõê#Ý\u0001[•\\:\u0014éo\u0012ď‘$iђÇþ\u0007H¹U\u0004ù86\u001a·üw9ÝK\u0019\u0001šFó§y„òM\u000eÙ(}ø\u000bŸ\u0005Y,ÁH‡\u0006H•x“œmzõ¹×½<‘)\u000bəTØ\bsÛ°çYS˜FŠgüǪ å\u0017\u0000Xªù³²E®\u0013xþ\u0010\u00025 jS¹¥õÐ\u000f'ÌÔý5\u0014VZ\u0017uò«\u000bµ¨ôÒ;\u001dND\t|ôSH\u0004\u001b:jÆ5ñ\u0000ÑB ï±\u001d\u0010)Xß\u0018õ0\")ӛ\u0019RF ÇU U)ߊ-T¢¥¤¸\u0007@•Dд+8å’%^öEå[5\u0015½ØYÂím\fԊ³W4¯¹=}Ø\u0017JÿàÁ\u001c¥ZVÔ«¸A¤Ò\u0017ýòÈӕÚx³ë®\bá&\u0006çvûâÑ7ü\u0010\u001bI\\Éaj]\u0007¡º1c6‹?\u0012ב’§)ñ\u0011ÇUµ\u0019?eÇT÷\u0010]Z}(¸:ÿ%‰gÙj(öXÕq\"®NÅJ,÷¹¶\u0004:@\\û\u0003èÉ1%zéðÊÑîÜÅ\fht[Á2­ÌL?YÔòüpg‚„j\u0010KºUÅð&’X\u0015ö¯§Ùi/ôÐ\u0003\u0004/\u0007Ï\u0019'ë!:\b= D_îôØo\u0000%êʹï¶Ô'µÜ]\u0001…\u001ek!¼É”l©÷Vuòw‘\u001c\u000b¥7÷w_0…ÎtaT­X=}›ÔÈËÊñ.óËWæRƒÀ,µâ˜h\u0014‡Jdê»íÀ= CupÏá±ú«»*…øó;F}^Ï\tÃ\u000b\"§Å(Ó?W½PÜÿ ᬌK\u0014¿úî\u001c\u001aۆµkß¾@w=M…ždí \u0011”»UíjɱZíÍý“[\u0000„Þ<ä\u0010\u001e#5ê\tÜ\fã\f\tä(t\u00061÷\u0012…0—¾8\u001c£û1Äy~\u001cjS±4£<ûµi ñ!•\u0018Ó\u001bù\u0015ԁ͐T¾óýf¡†øm@]9\u000bŠk2˜XIbjg\u0016\u0001\u0000Xƒ!I4°ÚËF°Ú'\u000bƒcQkÄ?ê\u0013½Æìj\n™\u001d20Å\u001e–ÚÒ·Øúi\nòò\u0019\u0007X8IÛQ\f0'×=}êÜU\u001d\u0019\u0007ƒ™4%ZÝÈÈåÚ·^I_IŸ]Å[\u001aR°lšÙ]¥·Kž!;-rÑ¥\u0003\u0017a$}É4˜eGjÖd\u000b1ß5ƒTr\u0016^úmÖ\u0004=}'vÂÄ/øü\u0017³^g\u0017§ú2\u0017†¬]Œˆ\u000euìÖÏÀ\u0004sÙö‡r•ªÀ‰Êœe¤!¸DŠ×æHâٚ™é\b蕓¸jå“\u0005ÙöJՊÙ9V§÷=}\u0005|å+GÝW#î>¢±X‡tÿëÕ)\u0012VùÖ}\núo5ÉXä'Í\u000fT2¸©x= •YYT“a¿‡ ý#\u001b™_bù™×/Œ·ì–G\u0005Ë\t=} ñybÀ\tŠN²\fž,]V%dµöú\"Þ\"‡y.GèP´\u0001'ȂÛϹ\t¾Â¥¹=}òÄ¥¹\u000bÕ#òStŠƒ¿Øä27ã‚àº\u0007˜õ»\u000båI\\ë+÷ÜÍ\u0015\u001aIG—aªPۏì\u001dQHiM&’8\b\f¥´Ø)¾c<¡\u001b¡~››ûK\u0015 ú÷Âr\u0007»#ahpâø¤Åyٚ\t‚#\u0019CðQ3sò\u00014­ç‰,áê\u000f0ÿsŸ^@äï= k\b\u001dr!¼>x%\u0006Ôý§dItë‚Å,-¤\u0017rzÅlê²\u00004xþÔí\u001c\u0017¡­[ž™Y[žŸäïô/à\u0001ýI\u0006ì\u0005g.‰ñÎ\u001aNåD‡nɤ·ù†ÞA©ëmė“G\u000bÀS\u0013N*,Û=M¤õc™íß {K•ß>ž7]ýŒºšBè@•»–ˆƒQÈ\u0006ɷ؛\f’dÉÃtøÖÍ(GԚ\u0018·7¶98Êcž£ÎbžµC@ ¡f¹…x1í¨hס“ø—\u0018T¦ '\u0005ïª$~¹áª\u0018Í\u0010ÒØS½ ÌñëI˜-6)o\u0018cÊÊú‚‹#™})\u0004jyó\u0001ˆvïdLïÙÉ\u0006¡2Ž\t¹Ä[Øñïsê\u0001´˜\u0014íˆ\u0004ªóKºæÒÉè#UòA½\u0011\u0011,±ç˜0\u001f\u0011ϨV%{ìz¿¢A‡!\u000fÙ)\u00110§9‡ß¢J´lnH¶Ä3ûÝ2÷Ti5YGò)Š[\u001e“\u0005h>É\u0000¾kö\u0019£XØÙ²Ï\u001d•O¼˜±ž±/\u0005\u0017¡RÊZíÁŸ¡ô$S\\N~«ú¼«pËâ°êZ\u0015ޟ'#K6ùj\u001cEê¼ó\u0001/\u000eÉY*¹¿\tɾäÒÀU¡â@ª—\u0001álë#Ù´má3+¥ŽP¾Š\u0000udˆjݾþi§66Gœ@+é2”\u0000x›@\u0007ðwˆ˜0\u0000éïj´\u000bÙ]•&6k{ˆ‹º\"Ò-\u00119vàOÚ֞üV¬¤¾·JÈ]f—Ì\u0019ê/â\u0018ç½dÌÍ\få„Ý­\\¿c€\u0019aÏU^\")mÆ«Å{›¯\u0011\u0005F\u0018ÊWÈM$\u0000§4\u001f篹±Üø™K¡ØäGãd\u001eä„Jû¦ÿ5g‰Á’¢|ú6¨žGK˜¹LrÝdTEùÙ³GδªÆ«—‚Ëú0’¿ÆBªìkÎ\u0006£ŒRˆ\u001fɂÆ\u0018ª HÆú\u001bð\\\u0014t‰žåVƒg½¬\u0015\u001aþø\u001d\u001dËB°ˆ\u0007Î?uQ¿Õ\u0002~\u0016#ö¢\u000b®èÙúÍ\u001bÑDIÆA,Ýòuw„sÏ6Xü\u0004\u000eh“~G…=M5ˆÛ÷y§ã‚1p\u000fȪÄá=MZ\u001dÒnŒÇš\u0018e\u001cèi\u001bðK6zž‰cA1¯ìôbϗõ4ŽÇN[\u000e9$t¿ö\"¤J«Ê23¡«Ë2©p’\u0016š›üVò6yÃ4¾(\u001d.\n†@´\u001edÑZ@®\u001eÄ\"”¥s\nCm\u000fŠK\n¯§úâ\u0014²\u001eÁ¶\u0013ʍMŸJŠOW@V§ˆ×Ü\u0000\t—\n\u0013ˑ2\u000e!n\\_\u0006¥ÿN\u0014Ñ*µž]\t0MI8ûl7£{}ñ¥\t¾r¬\u001f@ò\u00006V‰E_JÂÇ\u0015„?%ã\u0019&蓮Ní\u0014\u001eÿ‘';Zìóìbóá‰;\u0005†.5çu.ñÎÝ kMoMÏV-0Ùµ\u001d¿F5cg¢¢mm\u0007æa\u001c«éø~%0ƒ¯ÁôÃÙ\u001d&eã§CëlæsŒŽíËÐ\u0018ÈÇ:(ߗè@+£¸\u001f$Æ1ÿ.\u0017’®:\u000f\"€°˜†MN¹[D-1\u0015ËDZÞñ¸äÂ8\u001e*9\u001eÔ6Ñ/¿zû£O®\fp˜wÀ“\u0011= ¨ªP9RVƒ›3uÛ\u0002=}q\u0000',bil¾‡‚‰ñHU€Í,ánù}\u001d€–\u001a¾+v’Fµ8U\u0018¬o%Ûÿi\u0019@g,ƒc’ÏFŒk\u0005¥O\n(Iuފ—¢†ç;á”^h\tt\u0000\u0002K–ƒHbf$Ç¡‡\u001f\u000f\u001dûšŸ¸†ðËL Q\u0003ÎËôø!¦á媂œ¥îû=M•÷\u0000Ú9MÖÊ\u0003ò©Ò\u001b\t ^0JX¿tiÏî\u000f1RŸ¥ÀµfúžšR²ïá•l˜<±}f†%¤Ž'½FÉvˆ'Xó(ˆ\u0017ɔ‹ŽÓ˜\u0018ÎϞXÏLh\u0005\u0013\u0012\u0004w\u0011úJ8Õ¨PÈÆ×ÏpýǪˆXE¨Ç.X_\u0011\u001dE\u0017ŽÂ PˆÓ_!ð³Ëm[Pj…àè\u0005£\u0018@÷\u0015*øGAã¶å‡Þ=}]ט$Za‡”Ï®ÌhÖg­½àPÕñ\u000fÁr\tµþ%pø2ÓJµëÑOÂñ(ø\nÙ¶\u0007x{\u001cÉG\b;€ÊZèí†ì¾òß\u0007\u0013­¿\u001dÒeF\u000e~õ6Ôº{LPÒµRå؀—öiĸjfȚvp•À¹ü\u0000\u0017[Ÿ#«\"z‰‹ò[…Ľ\b&X%[u\u000b\u001dø= -·ÝÈ\u0004âP\\\u001e\bÉj©2µ{EÔ¡bTÖ\u001dí™0À¶\u000bêûË9öYíÄù¥Ìï7£ùU(Úïlœ‚:h\u0018·ál®$—‘Võô¼£‰jð=M\u0005ùµ|UhÂã²FKç¡£ùv\u001eb¿\u0016®\u0015\u0014¡ïy±+ӂofï\u001báQö\n7ZçؒbpۋÀ!>Å\u001b,ʗ$H†=M®› g/>½3›Ò\u0001Fò#¿Ç\u0006\u0010§;Ø$0c^³û$j=M\u000bÆ\u001b¼¤\u0011¾\ny\u0013\u0012=}qhz@41U?ã]t…]\u0000¢òïÁŠ«\u0005,‡ÄûÔ!!\u0000Tg7Öñ= !ʛ†£=}\n-9Ù\\Ž%ÙÐöã×ÿ[H-êä\u0013Â<®Þ=M¢½Þ¶÷5˒¸3Mr¼r™ÄŽØ)s ‹0ÓÉ\u00199^EH\u0007\u0013N\u000f.¹\ni\u0014\u000e’„åš\u0006©æ4\u0002q„µN1CÅ:aaõÛöy;®z¡úgŒ{G¾\u0013-ˆd$…¯ôŽ¯'Cö|9ª™gyZ&†³p#\njÑ)þ˜\n‚?UÅ\"\u001fd¾¶\u001b\u0010ÈÙ\u001d6\u0013Ž5e\u00163×î3×\u000f)–*Ê\u0010|\u001b\u0005\u0014\u0010×\u0015.ú9a¾\u0006\u001e€ÿ›ÄN^¿ÞÙ3$4vÜ{ß\u00066$¡\u0015i¦ð^S= fÊbÆc£÷\u001e> ìî¦0¾*Z¢A\u0001\tâv)\\\fŸ_ÿoF0ÒÔ8©4. ×´\u0014ù͇¸Aiàí¤>¯ô?\u0012ÆHè=}O˜ÚE{\u0005Çô‡V¾\u000fgHšÙ‰u\u0003\n}^\u0006ðQ\u001eÙ\u0016óÉ\u0007£åê\u0003†\u001f\u0010O̾Šxd*“p÷'I\u001dPï\u0004mNšÉáŸïbÞý¹g\t\u001b’\u0002¹3Yº<¿\u0004\u001eC|ån‰z\u0007\u001cô÷£Å¹c\u0004qÍ嘝1º3®™÷‰ü|å×\u001a3=MùYƒ@Ê$¡—Ô‡Õk)Òþº’Ñþaa\u0018d8ëfË$[ŒÒþù\u0017Dç°\u000bW\"½îŠö3ÿÖ|±MïY\bÈ\u001aŒ\"ûᐅø\u00151â_W5\u0019\u001e\u0011¼îºå\u0011ýô=MyC Pd!\b2\u0005íµ²{öðè-ú¥ŽÊ©ô3§ù\u001e1?=}\u001ežA\u0003d(+Ú¢æ')äE\bÄ\u000e{\u0003\u0013´îÑ+¯¬²çÂE^§Ï¸ï\u0006~L„Œö«²ãvêHê8ª2©HÉ~E\\\b>n§¯¬²7é8cSN‘œ\u001eNy@¡³Ë\f³\nüÁÓæ_ö¬ò(÷^Yh€ÙÖw]!ÐP>¶2þj\u001600#ûTׇÑÅ2P—\u0004o\u001f,˃Ößµèo\u0015\n\u0007ˆˆ7Çâ\u0005\"»³9/ÔT=}°O68ž\u001dµ¢ŽŒ9®;è=}M*ÄÅR¦äÎoôì#—\u0010<\u001bÖêžÔ×ÒÍÎTX0<\u001b–z\nz×KÆÖn\u0005ܚÕ\u001c¬ó)è\u001c°!þù¨<1a*3³KÔÙ\u0016\u000eò=M¤Õ&ì\u001bÀÛ¸ø\u000e\u0002]\f‚J\u0002Ø«È;+Á*„/YoÅãÏ]'3Ş“ÕÄ·1Þ)´ÜCìéh«>¿:v‹Rð¸l/“é\n\u0016Ҁè–ÄDZÄçÐ9ž]1Û+\u0014\u0019^\u0016Ý.{Kª\u001b¸áÖ\u0004¡ŸX¥ç\u0000INJ= _š‘\u0018\u001d¹v‰UÜ \ns›\u0002ý³2x½eòù’¿\u0017cµåW£\tÀ\fŸÀ\u0015<§£R“rÌB,¾5«u(-\u0012(xvÌ=}\fÀ|N§\u001eœ#j\u0005.Çl¥–¬õ\u0003E..\fyÂ~?öÛ?­…dÁŒ«ß£Ó\u001f…âZ\u0005Ÿ\u001e‰\bMÉùä¬V\u001c\u000eqođ=}礹ÛОqy)%l\u00051¾Ê\u0012\u001bU\u0019¬§\u0018Ôcq¨YZ~›“ª1„jFvÞŽŸòQÔÉOú冟j½ð\u0000ۙõÜ\u0015#Wž{êÃ\u0012_l= v±?3þŠ·§¢q\u001cšž…$þ,œõm4N\tx_ñ?î=MN‘Y\u001bB0\u0005\u0006¦\u0019íRÀ\u000e\u0015\u0014U\t= Y>O1]|”G#•i\u001e÷ì¢\u0006Êí,\u0007Llkà[“‚UŒ\\’N=M¨]Õ†F\u00182³W[Äñ\u000bs*;çï9y‡p­¼Gߝ\u0007ŸÝkQŸ¶3Pj3H3d¥;åÄf!=}j¢f\f‚ï\u000f_;ݽñX\u001a.GæX®{í£û\u001fݯþ\tՄ\u0006\u0017o¸\u0013\u0010T$—³øf\u0005¦ð%=}yºd²cH\u0017Œ):9\u0004ºé%\u0015\u0012L\u0001àØÏ´¸âQúžŒ1œ‰\u001cú\u0019½4åúFü}ë«èîÖú}\u0017ùr•èd)Û\u0006\u0006­‰­\u0012ûH1c¯÷Qù#By£uFº\u0002ȋÊΟ¿Àð72¨= \u0015cQ\\é\u0006ñ]¹\nÈ/”ï__!ޝRש|Èw{tfšºãœ\\è($\u0015‹®?‹ç\u0012_G\u0004ÓKËëmÓ\u000b7+§\u0018òšÆåN\tªö¬¶.^\u0019³g\u0003\u001bð\"”—7£\u000eám?\u0007åM¬ÿ7\f\u0004§)ómÍm=}|$ç(Á)(œê6«‚g³UvÀÅ­Z(víï\u0007d­\u0007\u0015á\u000b\u0013œk:k‡°© ÄÂÊÃ=M&ÇU÷\u001a~µ|8?˜Ã\u001eÍùž²éßÞ\f½/ø~\u000bM~\u0001\u0006Xkç|ÛF%LÈÀfpÛÍúºÂ íç]À­ÊW\u001dšÊÝ|wÑu#é+M µaZT‚ê×AœV“j¿wÐ#Ñ[_xõ“Ê’Ìð\u0016Û •œ÷ˆ)3mé¢Ôd\u001cqé¸2,ÙÂD~± ý½å\n\u0018«¡Qº/:.(ûÛ\n\u000e\u000f\u0000na\u001cҞ3\tÊ­¼'RÞEþêŸ0Ù\\g\u0016#µ,TíŸìicZ9¨À–U¬B{L˜Q$\tqÙÚ+\n(s…¤ƒ™rg$l¸cöÁEOŽI2 žÙùÔç:Ð;ü£Zk¾G@y¨Ä\u0005Æ\u0012*’“n6ç\u0006BIceƒäã3]u'Ú\bŒx°\"ÜÉWlD¬6Ÿ¹¡gq\u000eàÙ^TÔDŠ: ‚º–¿S\u0011þ4\"ŒBÔn\u0006ð¥ü­mï!¥¨Âh¡J”å̉չ“µ\u001bSôàIó \u001a = 0\u0005FñðºÛ1ž\u0000¹{µælô5fœð\u0019?þ~Í#¥8xX\u0007Vx0Í\u0014Fu_\fga â%\u0005¢^îõ\u0010[jd\u000f#‰a\u0000¢B+Ã^Ýh;\u0002ЌEq6€û÷Z3U\u001aÒ£9En\u0018\u0011ˆ%Ý\bùf= 0¢à<ßEÅγÒ\u000bŽïó„\u001aŽ\u0006\u0016|KÁVUŒpºŒ•5ûb‹^¦òìCÙs„¥á”í¤IŠYÌ\u001eúOSv\b\t.ý‚…\u0010ˆÿ³]%Ù'§¤°ÿÆ=M--Z…µ.ãN³\u0011Á•+ë\u0005â´Az5ڔORÒù8üx\u0004ßR/6üÉç“^£T‡¾Ó£-X´NVä¸ùÈTkÍcï3‹$\u0017ôۓ³:QV3B\t\u00188³2U¶){ßÉ »»ë¹\b§éG:Ÿ\\›¡[ª\u0002x˜dµ„oĦî\u001cÝcrÄÓb\u000b{vùoÎý\u001e˜..¦éqõŸš0±ëq{l\u0016xÀ\u0011Ú8G±æ0ò{•gA…¿¼~¢\u0000+IÇýŒ8­³[Ã)ƒ0åbyï=}±º\\\fý\u0013Ô¨×'Ý2ŸIàK+ee>”Mø/;mÃ̔0$–\u0014R„rênûr\u000fâØb’ö½\tc@€›Œ»r…Ë›?¶¤…˜Á6f\u0003ÉWäЯö- mýÍ\u001døÎ\u000b»@7ë^Îsi˜\n\u0016Í4Æ®íø]ãƒ\u001dmÛA{{¹ñ\u0006¸oZôtìÁB\u0002\u0014\u001c‚îy¤¨¡kUV\n_z«JFò\u0003\u0012\b‡\u001aÈ]Ì^ÚPÅ\u001e[Ö\u0013\u0011&6\u001e=M^F=M\u001e¡\u0003SÔóœsO§ƒB€ƒ‚ˆ÷aZû3å~ÑÓMUV\u0013ý#+®þj“éLÏä]Ñ\u0013ù⪠zX\u000b\u001dô(nÄ~Ôr;\u0006s˜.×&\t0Ǔ¸NDnw\u0006\u0010.7’P)×ÃÈ*qŽÙÀŽ%9Pð_w\u001cz\u0015A\u0002¹ßh°…1ý\u0017‚ñ~hT\u0002\u000b]Gõî”\u0011m:•\u001cßÚC¬OFE_3§?ˆÝ«Y©È[•e&\u0004T^[ì‡ÆXS—é= \u000f©Õ\u0005>!Ÿ¤èµH=}(v¾ö”<²Ø^*˜Ì®U¶\u0015^=}ŸÀúZh#§#¹ìšµ1÷&ÔX<¬¼†ŠŠŠÂï\u0015\u000f瀀\u0014¬?S\u0013ã+/Ò¼k‘\u0016\u000fv'$sÙ|ÒÐ[6Ö'H#ƒâgÊ\u0013¹­d²&oz\t^b;\u0005Z+E\u0007G†$~&ý‘è\u0003†FS?\u0003¨–)/1,Ò7?[·Ã£üc¹–.¦%¬¦%['r\u0011Òè{=M—Ñ},p¨á+‚i¤é°;6>c®¦À–z§Ò“”\u001axlƒÐºS­\u00128LÕfR0\u0017;\u00049vÄ;%<{ýuôÔúãiòûÝ(ËÙ\u0001\t¡€$thЛŒcô\u0002 \u0007\u0006RÑÆ\u0010¿\u0006Ò]Y¸ƒº\u00045\u0004.¢\t\u0006{4\u001câUh-㶡œ¾\u0016\u001cT€Y\u0012-…l÷/óÆô\u0016œçl¦ óM[\u001a¾àÈ\u0010an\u0001r‘ @,Â\u001bÄ5o–Ù”§\"å{\u0016ÌÖJ¸ÂuݦKw…Ä©èói¾–\u000bé=MS\u0002­ûHý[\u000bn°Á~³ù[Ì\u0006è#ÁEª¬òv¦\u001b°„@äl–“™]\b’3Œ\u0012\u000bÐßmÔ)\u0002\u0005÷(á£\u0014\n8ß֊70ãnÝ\u0001Y/rN±mç¬r$ŒJëà\u0004=Mê\nX’&¹[\u001dx¥\u0010)Y#q\u0002½ë_\u0012~= ’ƒ\u0006ìdÄ>\u0010í\u0016%S¼ƒg\u0013= ¤¿‡¹c\"éíe>ÿYIÇèá‡\u0006}ÅBº‡^›6d0ѕ»p( |òçä\u000b\u0011œŒ‰ûª»=}&zû–\\˜\u0010\u0005†\u001c¬/\u000eMçؐ\"êɍµq)“®$_¦¯ú#+h¦+³qٜSó(%¢± Í«ßºmù0ÞppùÁs•à»[xµ›ï…ÄðAƒ¤‘\u0019¯·âÂY~º·ùKnñ'Zî\u0012͋èÚ¿\t\"«ˆ}\u0006“‹×$*‚èė“xe½Çt\u001f£ùnó9\u000fŸ–t\t\u0013S0õé.\"µQ–êâ*\u0010/CuÖåŽpiÖ\u001a\u001dӍuúÎÜ\u0010Ɵ\f¡\u000f_\u001aí\u0000Û¦éù9¤Yb}³%e\u000e:’'\u0001\u000e³‡¸ä²£\u0003fÚÂJAÚΪ’'œKyĤNŽCÙS:M¥Œ:ÏUîa\u001eö†ãAX¿pW¼(Üê¥\u0006ð9;Gg\u001f³“Tä\u001cDq.ö@¼Kú®«v\"È \u0017M~Økz\f\u0010\u000fòývG«šM³ÆMžî³ÎcH\u0003öŸ£]¯Ñ#*\b\n\u0011é†ñÎVÀg³ïu\fÞ|*ή8»ì\u0019ñº~!é}\u0004¿˜­wìÍдÈÛs„Di7\u000eízº/]°íµUõ2éòj \u001b²?ËWJFN˜ÁFÌn\u001bÎÞDôß\u0004&p[h\u0016\u001781Ò~\u0002?.Æäó+G-\u0006†ž½7J›rÅ.’k5Ũ}\u001d%RϾ´LɯßMW\u001f\u0011®bÎ¥Ï4÷¢\n³«,­ª\u000e>‰tÛ\u0017Žv\u0011¹¨ö\u0001PÞ1êMê:\u001b÷sã&@QM+šøÄ,ħÄ3¦§$2sßu|×qi\u001d\u0015Èq= gûÿöÞ½i\fhÃjA’ù\u0004Ã,ø«a[³\u0015%\bÛ»)å_ûþÈ×-\u001døÚBS©±L¡M%¼@Önjg\u001c²= \u0006O= Œ\u0018óߏJR¤ªêmÿÏdº\u0018jXÛþ]åfÊ<à<†™1ô^êù±„ÛH‚ÈàeP•µSà†%XûjÍå¶4\u000eÇ[¸#¥ÖW\f»_q\u0016\u0003D€[Æ¿\u0012ñÚâQÿ³“\u0004è¨x\n\u0010\u0017DLj\"ˆu\u0004¸WV½¨¨\u000b4å\tJ1v#Ï9Ž•I-i\f\u0003\u0014\u0010¹\u0011»Å–iãNêÿ¿Ù©^¢”,щëӅÙ3Ú\u0001\u0012ök\u0014…ØÍÌÈ×µHدxX©•'dɉ\bíy³ì;hœÌòSœî\t\bŽ¥{í\u0015L1¦æ@B7Jün ¥|C¯¦\u0015f=M«m\n€ß¨.D5Jfµ·µeÄ\u0004–´{í^c\u0014™û­ü/S‘\u00185 ƒè\u0001\u0002¡\u0006f_›ý—\u0015Zmþ\u0007{-â\u0017\u0007\u0010í5\f‰àß཭\u0001ð8?\u0004>\u0006ØÏ\u0014=M\u0017]\be\\V !SÙs*Qr\u0010'\u0007åuÞ\u00015\u001f\u0011#eYR‚o˜ ¬È9Ò8nä\u0013oØL¸âZ]ː槣1\u0017Ö§\u001c\u0001ö8Š\u0005͗HtZoW^\u001b´oü€?¬³å\u0019eŸ¾–?Ü6=}\u001e“-£õéè†È$ࣿ­Ó—‘ó¯Ðf3¸\u0010CV¸QÄÔnÆV´\t•H\u0001\u0017J\u0007´ÔO\u0018Î\u001e+IwÓòHkŸ\u0004¢9«pêÛ®?pv—0ž]ÿþµúµA1QûÎ\u001dƒz\u0002¶\u001a˜¢\u0007²Ïi\u0006nW=}¥ÿäºú³6@˜Y1ý},¤þ㙽\"\u0012çböCꎕ5ýe7ê‡:ˆ+L¸qO<ñDŠËL”Dœ¸ï\u0000æ\u0016Q¢x‰e©íïøʾ~(/~Ž2s†$<\u0019ûö!Ëϸ$R…÷™£øù2'ì=MÙSÑÝv™rU0©/‰mó\u0015ƒ.Â[A~^\u0011‘=M#Å\u0013yuíóÓ\u001bt>Ž)\u0019¤ô˜Ék¡@ð\u0019b@x¦ÀD¸.²Ôã ñù»îIEZµ\u0019û×T\u001b}jÆ2ú«\u001a\u001d Ô+»4ÿ\u001cœUÃâjí†\u0016z\u0016³\u0003÷\u0016æcý\u0001Ê\u001aê”\u001eè\u0017\u001dþ«KkYŸ*éj.ê\u0016\u001déšwÛ¢5…O1\u000bÎ(œxaX3Ö\fÉ \u000e‘òæ6h©y_Ž·¬dP\u0019…Œ¬\u0013\u00148ÀËM.ŽÝv•aÌ)5Æjãï\u0016/ƒ!VæT\u0007†äa=M&{BS!œs~‡2z“ª\u000b\u0006\u0016<Â\nÓ\u0010Ǹ2,/h’<ë¶ÐB\"ÿ-è\u0016®\u001cÅò2T\u0006\tüVñ\u000b6}ýÙ\u0002=}Z}‘?U.6á9úY²ŒZ¢îð\u0017'\u000b\u0011沁¹ˆ\u0019VAсȩí\tќ+\u000f\t»c£T\u0002–ô\u0003ÈïS\bÎ7s²\u001bT•æ\u001dA\u0010öO}A«b§öÑÒú¿6CDil1\u0011,QG­o\u001f>뮃{G«1|\"-5\u001eƪ!|ëbcƒC-*ôþ\u0003…{·…*/|?ý£/*È©\u0001|*0!m‚{‡\u0007\u0019~öe\u001a= z·†Ìx÷ÛX…!r›™ŒZRf¿V–à„*¬\u0005ª ÆСA­~¬ –«0\u001a|S…vh³Ä\u0004‡*4!ìøΈ\u0015’=MC\u0016\u0002Â|çï\u0016ëòDŽËíQ|\u0012醯†Õ\u0014öÕðh'¥Àx|§r5\u0014Ó¸\u0012Rӂ¡\u001fàÆ:ä䴘DßnǦ 'í*sÀ‡™= ö”\u000346q\u0012È\u0014‹üì_Ñõ¾±óã]Áå_ßm|= šR…ËûNIVXQA,\f~-§Rfq\u0014J:Þ=}Ú\u0002H\u0019)d”¨\u0003 &2Ú\u000f7nÆ\u0010÷¶ÊÓú‘%ûBðÚI= k¾\u0018Ч^\u0010¨«‡xEz\u0001|H61\u001d§ce\u0017†L_\u0007]s™ŠPúÏ\u001dRm8Ž™2÷ÊZ¨\tÄû«vzÌ]-‡A¸æ,Í@]\u0019ûôÐ\u0007\f\u0019k\u001eƒTod»^\u0005XTÀ/Š\u000e³»\u0012±÷íˆXÞÛ¥§z’º ùÅ\u0000þ\u0007Û|\u001e7Råè}à\u000eañ8ìÓ „0ÏÃÆ{GÏ\u001d\u0018²€¢[ì²´_­G\u0003RŸg\fÉàïôz\u0007×Y9¸­\u0000Fƒj¦\u001b§±çú€‹\u001f\u0015Ö!“ö\u0003\u0015-®¶hRëHäRÊ9J«õ™p¥Y\f0\t\u0015\u001f\\s Ë^©Q» :,\u0007™= ÿ”PQ\u0004Ó\u0003xhVGP)CN^òÁR4H4QD©\u001e\u0013Å\u0004²˜Ê\u001aÁQê¼\f/ÉÂðê\u0017–{–H¸\u0017•\u001e›fÔ±Wò\\„•mŀ½\u0010·€2,\u0016•o¶Òõņˆ\u0004\u0014sÃèf„<9Vcp¦íjf£íCÐÏ\u000b4>2­sÐqÂDŽÊxw![û²’Ö@5K̶ý= Y\t‰Q>_ïˆ%FÊ£©»®>Úãã\u0010߶¤[á‡$[ŠpÞ\u0015IäN5=M\u001bvµQ\u001d²\u0010’ÌŽ÷@]Cbj½\u0004I\u0004‡hüñ/àôNî¹=M-iþ\"„#\u0007ˆ›¶\u0007jÊ£w{\u0010¶þ湛1AS«_¿9ý\bP{= wšÂ{Ç4\u0018ƒo'\u0017¨Ú–U~œÐ¡bµY\u0006\u0005l\u0000¥H¤@0ÝèÔ0¬ÙoŸxh­ßï¥D]­´}Id\u0010ó–'ŽÎ\u0017+‘fLÑá_\tÞflãHw”D/\u0011¿V•\u0002·\u00178Gð&\u0002¼x€É?…¢a6Š•Áµ¾\u001e¤£Œ@p@ £„¿¾HœY[˜²ŽiÎ2‰®ô;=}ƒRvé#/”áºÓŸí¸ôœ\"k_Þ©\u0010ÝX:¹_mv>WÿPz£qü\u0005z\u0000Ê(jÂÌ-ï#\u001d*ƒƒ\u0015zs¹¹ôÞ4y\u0004_…ÕÍí›\u001fwÌ\u0010ËìWpÖô±=}\u0001è þñe\u0005\u0011hAÞ5î\u0019ý€˜èM)\\|„8þÍÎ\u0011\u0000?ñ\u001cnRáÕ6\u0018¤¬éù*»ýhj֒ý$+J»\u0000k‹\u0012F~pã\u0005;2é’æÞ§sŠÛý”9ˆ¶WäÑ]²$¬4eŠs$æX\t@:H¹V\u0014Õ\t®*ß.FšîEÛþs\u0011m×·!éWr‡Ž}m\u0001K!#?\u0010áÜl˅\u0014¼fOu°ÐØ#%-4å\u001fåQHìà]ú\u0012À^bÅÛ¸ÙÉh…šE®í¥/î:òÇîXðBàƒ»ò£85^n\u0006º{›Aoc\u001eÕ\u0017õA…¬Mñ\"ú\u001fPmô\u00194’û+ûËù\u0017™#êëX„Ð_Ã\u0016ÖªÚ¿—žT4ɛ+ŸêøiAËHÒk\u00130IQ\u001fJ\u0001Tà­í¶…(_Q\bë\u001dzqï‡1\b\\\u000e\t®ü|âÝZã.S]\u0002iŸçÇ\\†±·³\f©\u001cûá9)³c‚S•æ‹ªô­Ì9H\u001b‹]ñ\u0011k\u0017/TcŸK°N¤\u0005p\t¿›I£Ãåõœ\u0016q#5Ó¿(ìO\u0016ð\u0019eÕo2ý€?÷©ž\u0011<F%›e=}A¡×\u001cª\u0006Ï!)ã\u001a\f± ;@ã°²e\u0013üG” µƒd)\u0017ÊT½rxsK*Ÿ\u001ewH¾çá\u0007\u001eªo.«DÆ£—túP\u000ee–êr€®G-\u0001éº³aW©è\u0016û}–½2\u000bT2—\u0011Š\u0014éò\u0001mÔ­ð\\–@2@Ô¢ÚµjXh¢¯ÞM\u001fã‰À\b9\"ä\u0011Ë\u0000¢#ÞáÍmN­\u000b›ƒe~!cÊéä\u0014Ää\u0005\u0014¾]\u0010\t0s6^r\u0006\u00009ùE¯2±B[:&b\u001eèÍ5/”¨à<Û-Mü\u0011)9Î;c ·w\u001eq§’ÊOO\u0018*\b…èÿ~Äӎ²¨ËvŒTˉBö(;#Ü= \u0005ªv®:¸zŽ€°õVlÖ4HïÊ\u0006qÅAøê*Q?Ûd]j¨4?ȇT7+ƙ\t긴daà~\u0018†\u0017ξ,»\u001bú/ü·WÔ-W\u0003Ö7£¬\u0003ˆ²»Êb¤…\u0006¨Cچ5œÂG\u0000\u0007Á™Ó&)\u0012l—qï¼\u001d\u000bé~@4ã\u001e¸t¬-?Œºn¢Ÿ\u0003Ô@fBB\u0018?¸\"ɬ\u00043L5·¢\u0000åZô…ð.\\‡^y¡Ž>¦¸œ¦ h岕¦\u000e$ª~?²Z£Í—NÊ\u0004>Q\u001a›çG\u0005¢Ý\u001a\u001cÙ\u0006A\u001d•€h‰=}èÙaJ’ÿ\u001f±(\u0007œð\u00030J^Ú§cët= 3Mu×TB5zõ4›´@ŽmÜþbôçÀù\u0012ei¬ó\u001b3È\u0015y\u0005\t‰=}ò[ÄâVlnMU{\u000b$S©L5¸B{dðkœQå÷\b;4\bÄ\u001fR.\u0002²Ð›»Òíí¾a±l8=}²ý(åf26ݹ·G5QeÜ\b›G\u001b+Ä&-RÞ̑ñ勂ö4úï/…oøO\u0013\u000eà²ô>:)„r[Ž= \"~õï\u001d%—ºÀL¼fc\u001b͎±}ö·t—µ,\u0013?ø\u0019AKíŠ=M\u0013³e¾…ÊmM—\u0015 \bUˆ\u00117Ù\u001a®¨d¼^\u001bk”Åù\bÕ½shæ\bi¢•,ûF~‡F‰\u0002AŠV3­¥?IGFƒ\u001ež\u000e\u001cÌHP3u¢sX¥Íþæü¯(i\bعÂPXéH»®b\u0006\u0010.þÐô)2°=}0ûl¥X–/swèÁ^9Q;“uþ_ÎZå\u0004\u0012ë$«ã®ú¨\u0019üGx\u0010i\\YÐ_2sŸ¹oH|d8\u001e×\u000b\u000fíÀ tQB.äl6Ÿ‚l\u0005d\u001b½øÀ¿köuÀ\u0010͞ÿßïµåmÄÖ÷i<,\tÆ\u0003é¬*B\n\u0014\u0010?Fí}.Pj)MìÆÜ+§Ô2g¿Y³Uv§°Ž²fÃg-1Æ#AðJ× PxaVˆ“\u000bQÙÀµËо\u0011R\u00185kú\u0012I>ÉêȧÖtM˜‰Õ/IÏ#«ÈZµg\n\u0000~3º—¤É®YM\u0016Ý\u000e‚=M,h¿ï $—’:Áw\u000f̪\u001e0\u001aœ²êà \u0011„n=MM—Ž\u0007\\\u000f-Öï\u001fE›'–\u000e²&ó‰†ì–ŽÁ4÷\b÷éÃ<ݨ菋*椓‰\u0002\u0016ibö¼¢Ò84q\u001f•i—¾E;Sê\u0013ñPcÞ[\u0001\fe­†Ë¬;i\u0012\u001b\u0013,×\u001e¾¾x/§‰Õؚ\u0002Ö4¬Õ\bÊ^%œ½zÒ\f\u0013\\«)¼á\u001eþ@†j¾ˆÍ¤À<=}SK¿mÌgB}Ô䓤\u0019¸×[%#\b\u00033W<¾4࿵IÐYÜ@v\u0001ˆSíoì 0œ\u001fg€z}\u0007\u0018²ðZ@m32\u0015Ÿ¸øÖ¾î\u000b‚Ðît->¢/hí‘&ƒ\u0017]ü'U掷=}\u00191¾ðûÍÝsGPtçdÐ9S\u0012毌\u001aø^\\ó1»¡º!Íì}c-©\u0019£(\f(:sR¨ñ…ÙJsª¾Ï5Žÿ¦w6®X>%ƒ.0Ö;Í\u0013‚\\’\b ¾xX\u00149dÅ\"Ž»GÌ\u001a\u0003{ú\nZúEd´U±Õsӓ½\u0006\u0014µohW©Foâ¹|\u0000cp•¨––=}¡iv¦8+üÉ\u0003§¨\bR‚\u0001ÀCN(|“8\u001fN($Nx0&ß\u000f†úuZ>¢™ð\u0007bÈö\b\\ºÓ=}¨&¢þY—\u0006ì©$}}€ø \u001a\u001d»\u0001\u0002äR= \fñíJ\\w)î9°Ì[HïÉþîRÉáJë»2Äá7Žgvï\u0016\u0007\u001e4\u0007:¤²Ì\u0010s\u0007\u0013ÀŸ\"-¼Ø\u001a\u000e'{ó\u001cÑ\u000eר\u0002@ß!Ǻ\u0017@)IÙÙÅU1½þý’\u000b‘= §dÜâž'÷µÒØà„·’ê¹ãùÄãiÑ=}ß\bB\"t:ÒÐ\"/¶«U¿6˜Òú\u0015…\tX¤\u000bÀ@iÌqzÔ*‘h„Ԑ¹—¬8¢\u0015(§Q¨œÏ8¶N\u0011ÃßRÿ¼Äë҇kí %>nøÇEƒá¤Þ\u0001Y]‡)·Š‰ vÓ7(îo\b?’^B)\u00140͚~銸NA#‘Ña\u001cq–?ö\u00161Óþ\u0012¿–w‘t€\u0001?Á‚Û-¿Ín±{€\u0014Š·¯\u0019›ùäඬ2c›^\u0003ãðS*‘É\u0005*‘\tD€¥}‘âƒ^ºAÝf\u0015ð•mgÑ\u0006LÐû×öÇk\\àÌ$ý”‹ yX^&\u0000ÿµÛ\u0013\u0012V|\u00032¯|;òð\t®^|.ÍíŠs\u001aQ×ER¨@]/ÚcL\u0016ýC¯\u0000õãВ÷74®ÈÐSãÒÅó\u0013$\få©H›~ \u0019¨h7j£/c-·ãˆ\u001c\u0000JËJí.-‡/=M \u0018ÑÒ\u00032u¹A„É\u001b™LÄ­”';ÌN…Ds4H]t$8\u001b²GþÛ\u001e‘6ۊ¥³3ÐCpmØ\u0014©„™¥&\u0019\u0019P\u000etû(©ÈU'(\u001fõ\u0010“GN÷h!P\u0000Á)-’\u000bâØ\u0001☉ XM ×d1Õä{‘@=M:=}òBT\u0002B½S“É\u0017öÅ\u0003Ņí\u0001/$u\u0011“–A=Mš0ƒÝ:BqÙm\u000fƒ5:¾œüAð&ùš‡dÇf\f¬þ©ý\u0003»²u–ƒMԙFs\u0006Ÿ¤\u0000\\6Uf;õäV]Èø¢\u0003HՆwR¾…CÜ'‘2P\"Ï3\u0011pæì´Á1¯P\u0005ÔPøÿ\u0002Ó–žÿå\\L、¹\u0017\u0007\u00160x\u0006>ß2*\u0013X5\u000eƒ3vgƹx±¡ñ¬bÂäò÷N\u0013\u0006ñWm?\u001fÀí\u001c\u0017ânߤ˜\u0014\f\"\u0003,´ÿEøy\u0018»Fž‹ÚýE„ÕFêБÕ&cÔ\u001eËvkÈ\u000fÒTŠÍWÂƬC—§¦oïp¥ËZ\u000f»†ƒfuˆ ò¥”°\u0015dâ\u0019€\fAféQ\u001c•’5Ù˾/±R\u0015\u0018\t\bÃ>uBÂÎ'*p³ë%\u000bK\u0013y IºY5= #r>‹4Ɗ\bDh§1=}›\t\u0019ðÌ;›†jomü÷êÒ1Üêr\u0006baÒwé₮;º(½uw\u0003ëZŽŸcô\fký‘©g\u0007ó¢«z]\u000b1‡\u001b—\u0017Tz&Ÿ\u001b\u0006j}\u000e)°es’>q\u0007¨öÊ\u0001Ua§Ÿ¤+žå<\u0002uԕìc?—[+Çï:,¿4\u0007‘= \"\u0017\u0001ÚÜK3ä>H¨\u00104X҂cg\u0013| mð@^cmFÿ]Ø\\9‡eˆà0ÿn‘Ê—þ\u0013tË\u0006\u0016\u000f§À[\u0012sZSÂNŒùfõª³±˜óÁ4ÆøIol‰ÎUVt[ª²=M^˵\u000fRAÿÈH@ÓA\b÷̶_x\u0004ɼã“\u0010ïtêæ@_xò®–\u0001|\f¢8]hå:흄´\"G2(à¦ûù݇\u001eÅq\u001cÓôÊÌ¿úq\u0016\u000b½&\u0017âÀgU\u0004\tï·ÑÿëF2Œ\u0006|LŒ’#²)\u0015€u@.¿mÅ\u0005\u0006eýè­4Îì²\u0013í×\u001cÒ/U·c£\u0001þ^«)\u0015Ü\u000e>†±\u0005Qâ¤ùR†0Z\u000fÁ¢€ªlÞh°\"¥)\u0015؎V\\r&äµbôð%WÎQæoº®Þ«\u0015Œû3\u0010\u00023ÈÙ34½í\u000b\u0017”¬— §\u0000\u0014¶z;,ò‘ÎLÐâtv\u0003\u0019x-„[­¤(©¯±7ûÌ{šÈ\u0016K6¼®Ý÷*bWãPüÃñìµROÛñ·*ÝgK;18×zjÞA쁬Îi*;\u0011\u0019\\ç\u0014®P÷2¡\u000bÝ\u000e“™ç\"xô9~‚b2\u0001\u0007\f$Í\u001bâ\u000bŒ2Ÿ´YUì\nãŽhöäÞbGBÏ\u0014Œˆ\u0019’E\\œ\u001bgÎÐ÷³Â}6Çÿ\u0014qÛ\u000fGfu¢¯µÐ\u0013Åc×ë\u0001{wú\"›c]Òï/\u0005ó|\u0000•€Åy\u0017Pâªuê\u001cµù˜Ë¸!£\fomSc\u001cºB×w\u0013\u001fw‰žoÅÎI\u0016<Ìð¼TŸ«·o¯†“‡d̔€(Ù¼~”\n™Ð¥¤\u000fT8oœSˆžYú/$]Ձ>Äõ¬\u000b(\u000bÅmnC–\u0011¤\u0019G&˜\fùʽ\u001c›Š\u0016†\u000f‘þ\u001e\u0006B@\"\"du9»ŠÇom)a¸(e&Šr\u000e¹\nqï;t–c\u001dk•tªàȧ·\u0019+ÑwÊ=MSŸ!à\u00156P™þ\u0006ȍúv¥‰\\AÐ\u0014‚ª$_n÷f?¦Vê€%\u0003ö;³F^Ç­=Mñì\f¡ö»«K3ÿþ\u001d\u001bf=}\fq6Àó?q¹ìÇ\fëõŠ\u0017~s\bõ\u001b\u001e †r¤\u0010Ѿþ‡opѲ\b\bÀw€‰›ATÆv;*53¨8É«ë°$d3{oì@¤žµ’¼–˜¿X­;ð¨Ë\u001fíuQYèêE®é\u00018ã±¥âPãDUKæ8¼¼M\u0000V‘4WDõž\"ÒGíùT{\"\u0002É1$\u0013\u000fçú’N‚\u001d mÍÉ#6§¿†ë+6vÕħ\u0007I”ê\n$º·‡8z\u0003C½½¡\u00071?Àä\u0018\bD\u001bSºÍ9Š¦ƒƒÓî1\u0012GCo5w]\u000f€\nDØ𕔟2T¤¡…öÏ;þY¬Ò§¶pyia\u0007hôü¥È9袃Þ2\u000bBb›Qœâ|ŒR]\u000eL\f\u0017¡;^Å\u0014\u0014HÁl¶Ý\u000eÍ\u000e¾L7\"Ä\u0007Dç¥cp“%¼²° £Kcù):b£$ÑJ-£+¶òÞvÂ\u001f¦õ‘¨FS¶¡›éJºü\u001d\u000e¹ûD÷W·“U¯= ý÷ûG¨t¨cžkf{AÔz7ê\u001fïúÍ鼤»óì:fšÈv¤ßR]>èê ñVMR…U3±&\u0001å6\u0006\u0006ìM¡\u001fø}\u0016&VA\u001aS9·ª÷poös\u0010ƒÁ…hyM,r—AÙ9‹Å¡\u0003Û\\ÙÓ㷝NÕMOêÏ+f\u0016\u0001\u000f\u0003ô9*ċ\u001d=}ø¾È\"×w\u000bcÆ\u0016\u001fª6]šÓ߇_F›\u0014¼B<\"ô$\u001b1ë›Û÷¿µ+©›lÙ®ú ´(Ìv:²¨ÉÐ\u0002×\u0017F‹ë¸\u0000\u0015÷€b óš½ie¦2zîTrȀ¯ò¸°wƒê½Ö\u0003i¼ÃޙoY\u0006š2Û\u0000K5+9OÃXç\n4#ú$ã2+¡k\u001b¯,¡Sã2Bª‰G¡[à¶G¼ÆÜõá\u0006³”ÌÈdÑsºœ\\ÚàS@¹;\u0000÷1@)²¹35Ò¡Ê\u0018Ø\u001b\u0001N%s=}\u0004“\u0018r(Êł6þ¯[dòŽ´+…\u001esÀ“Ç(î-°2Ä»Ã\u0002\u000baÈ\u0014\u0002ËóM~6Ì9èñ9\u000eÀ+\u0000Ç­&\u0012¢Àµ·’–kªÃ‚\"Ô7%7g™P\fÜۅòÿ\u0002‰ÄåËM!ۜÒM\u001f\u0019H±lˆÎ= ]ŽÖÙڑñršåTÓXV\fk\"•µiÌ\u001d?Þ\u0012®×ïª;^”ˆ{\u0001É\u00071\u0012\u0004ÿ\u0014\bë\u0014ZtO—ìR\u0016N–>ªú‚g9ÌÓn¼ø\u0015\u0001ô\u0003r=}= îó\u0004ü\u001e®Ö<×x›>dJ,”?žâ\u001e\u0007™pS§¿¯&b\u0010Èûo®w\u0005\b›„\u0015Š9«¾C)>Y5\u0012í¡ \"0i\u001f´šçã\u0002\u001eƒ¡ÏIïF\u001f„)ökdCë£þë\u0002††ÀGÄ´\u0002hVóĤü&€\u001d‡,{ª£*‚$[¿\f¥e…g€^ž_Z Œø=M¤|}æJ\u0004(DP\b¯Ë¿¯7¸ˆó–eOÌ?NøÙCžÏáp\u001ag_áðoýy:’44-!më ¤®rû÷‘&ÎzÃ(·Ð™XÍÌÀ,Š'Þ\n€Û×÷BJãB>ò G…Üǂ\u0011¸­™,FFž®‰8+Ñõ½ÝË\u001d…¼Î*¢gcI- ‹ø4¼ÿ>8\u0006ì\u0005\u000f'ÊN\u000b¸¯\b)\"5à´Ç\fi·Ý<àäC°&çI—¤æù=}Îü­Nè½\f¾[ÄÇp4œU\u0006á¿ë‹ÿ\u0014#Ùòg┈܎\bo͉»5@²¡Å9=}ÿ\u000b\u000b\u0014fj\u0002Ç-\u001fʞÌGß$[m5*\u0015:¶\u0014Sô¤À¼±ß¨öé\tSF\byw›Q\fÔU\u0010<Àdô ]\u0018gâqâƒÑÍH×^ZÒDw\u001el\u000b?K•eA,yêç_tr¬´’ršL\u000e±Ï‰Õi¾= —Uu‰)WqH»TܾjØ\u0003¹^«ÁJ*Ü­¬÷­+-\\\u0013öŠÌ҃\u0015ó\u0002~ayý€5„²ó\u001a6…h\"Ç÷Å\u0002èʡ黊a†»ú÷Îéh\u0001\u001d=M÷Œhû\u0011¥W\u000b;\u001cÓÅÐÑÅdêOT\u001f\u0007].:֍ë|JÛ·gßmÓ]…(= \u00036\u0013\u0014†ˆFÁD\u0004]ü?ú4øbjY E9íë|é†hwYŒŒ8,¾u\u0005¦”z\u000bÝÕ\u001c\u000bˆ\u001brGL¬­±síé\u0011&öä\u001a\u0004íŒu8\u001c£zù\"4^xk\u0002@ j¹õˆtm)iŒŒ3Ïê\u0012£œŒîÁCF>ƒ^?¿½yq]ºMõž\u0014õLÈŒH÷\u0005]¶›ùG÷ø²¶…¯T\u000bTÜÔn®ë§9Nˆq\u0003qmQ\u0001nÌ\u001f\u0016í\u0013ðº5À(^ôÎ-Á½-ñ8É\"{µ\u0001\fьºû0÷uÚ̔5€§\bà”ÑÖÜøm\u000f†HHkadš!\u0016\u0000\b—\u00132A>TO=MTV\u0003Šü²ýr·ï2#þ\u0000øŸ´\u001dä ø\u0003;¸ìÝ2ZꦚÔf\u000ff¶¸LF†¿Öù¨<áDó¥NŸ˜,\u0001ÿÄù9…Äi\u0010YRU,×çF¶kî!‡&+ȹ¸6×ÅP\t¤ªÅÝ1ûEÙf¿;V,E÷ß^:k[\u0015!F’\u001d4'³ñ«ßÚß\u001cø¦u¡@ì2Ù¾\u000fýæ:¤\u0012A·ˆöSF\u0018ÇÎÑÝ®—ˈ¡uÄpG)\u0007mȍ\t~² \u001e†L¼ë”¸+H‚xðºLr²Ýê\u0002½ºn€©Ç$Knme?ÈÊ‚Ýp\u001cO\u0018S(b™«!™YÐC¾¯¶u!˜ñ¹›ë)O¤A¹£«0Hª–kÏÖsל‚˜}Ä^ݲÝN&XµœÜðzµs\u0000÷\u001c÷Dòêé\u0002Å?¹q\u001cGÄ;—újül¸\u0001îoîõ\u0011\u0002\n™_nžÁR’\\ä'z\füL^°¬ ¿lõ\u0014ϋ4Ä݋Bj-´CÆW6ÂW\u0005!8Ð=}m×EÈ?/‘pâՖ%À²µ¤ÁX»íÅ\u001f\u0010´fôX¾Ã8\u0011#ΞÞH£\u0007\u0015´ –IMOF\u0018\u0015\u0018Dó\u0016¨Ïf\u0000=Mmézä:6æܐ\u0010À^\týPÕ+\u001a–7!£gePXÌÄÈRÞ\u0010\n–ÌòLF÷8ɾfà¾;sžZÑ%ÃýÙ\u0014¹&;L \u001fQK8—¾2§x•,9\u0007»]Ë\u0017\u001aãa†V\u0016>ñ”U(\b\u001df)ݱmÐâ¸?º¶HïíUHMoôWɌó½\u0003;\u000e\u0010í< ‰Pùq؏á\u00146t ¨—ÎãZJ†d1Ä]Žï}½\u0012çšÞ´TÅuèð4\nPW µ%Å·\u0001ý²»»\u0015>˜pËGiÕ6\u0005£+DóÑoBÊ\u001f\u0002wŽ\u0006°Å\u0006¼Ü\t‘ÑÊØ¢4—\u0015ó‚Q{î(I£¶˜ˆa$§Ÿ°¿ÂÐY\"[s€…RÅDwµ©à3ä{Z4E\u00173Ejðñ)ó\u0004è+•ÀoȊ¯Û±9ÔY&t\u000e“Úþ5\u0011¡ŸYBE\u0006O\u0007I“ÃuL¶n{\u0014Kr×GjÁ\u001b\u001e”>Og.¿\u000eÖ\u000fHŸ¨ij\u0011JæWµpÌBóãÚE{éÙ;eÄ\\\f–âxÝPXSnf\u0002¦\u001f1‰ö\u001eVIV°µ{®u¢~~Æ= 5ÆR=}\u0002\u0011ÍÓáB°÷–\u0014púL|?ôÐòk°\u0014ÖÃlúJâniAyìã”ÚVGŒ(Ÿ --‚=MÌ\u0003âÜy4\u001f%–\u0010V݅¾ÌÒ®RÙÖOTøŒÃ\u001f\u001a¹H‚Q_[‰Íg\u000b9ñwcd¤8ÑOyt}EY–Æãhxî4YҐܕ³:YDÒ'²\u001f\tŠH9DW\fDHºâÉlº@ß.’(Ë·Á\u000fTkEÏýª\b\nHáÕE\u001aQ&\\YåJ@þkЈAÒâ\t\u001a9fµH.Qï娬A4„\u0013õ’Ãi„\u0016¸Ò\u001d®AªT}¥„½rZ†fæ\u0012ê\u001e\u0014º8Ë\býº/SnñàÌ\u0006A\u0014Û¼˜ö= Kh’?\u0019ÌFjQL\fkCÌFF\u000føV¦¿D;+:ê\u0003ÒªW‹¾üy³Û–Å\u0012*YH*‚fÁ'_Š\u001eFÒ丑Yïî\fV¸AÁ\f\u001bʃ\u001eZçóŒ)ÃE2¯ü“>m3•n°sh+þ\u0019¦Gdæôí°0¦°Xəëà\u0003pëhÆþ0¨¾•{K\u0017\u001e}Ðȵ«‘b\u0015J„¾äÏea\u001fÿ=MHµ= ²ÔT\u0005\u0013S!¤'úeï\u0010„±(0Ê¡Î^ĤMnLIÊnš…½ÅpÄàRûxT™ó\u0004ÈҒñ{!ö\u0017É_\u0006€Õ\u0011©b:ÈsÔ£†šEª6£\f–Þ¨-¾\u0005šxÄ»=}^y¶ÓqmùF°’\u001d\u001b—Ì!\u0011¨tóY¡£@=}\u0019= àc%\u000fK[Ӑ”E‰ˆE„¢±üß:\u00062)\u0015Åçx\u001cA[„úN­Vñ>‹n£íð\u000f= PJ¸“¹^¤‰DHÊÊ\f$Ï78°t嬮ƒóGPTbã½j‰‰Ø\b°›EgÆ\u001e«\u0010–=M&\u000e\u0013\u0010#˜AÚÉNJk\u0004¾Ïòæ¡\"¢A䏍ª—= ÿüõü\u001e>µL’¯ÙæQ<È/º\u0014c\u0004éná=}|IX\u0000þ\u000fì¨#]ª\u0001ãk\u0019Kçuʞƒ^\u0000;\u000e*و\tž×֛Ú\u00041¾™\u0019!™Ë›B¢¡³rY@xIÂ}%3»ð!’i˜êÈË;\fÉsV«\u0012\u00119ÿA\u001c\u0015Ž\u0003\u0017 Ü\u000b_j\u000fQòAð.[?“‚¤­mßnŠ§\u0002 ’cKb=œU.Ãó›ƒ\u001e(\u0013\u001bk\u000bD¨­6_­\u001fP£<Ø\"¶ƒKš†s\u001e×ñü\t¤“‡nNjBÚZV5M9øY\u0014\u0006¡ÆK4ù’\u0005¾“\u001eÈڛ­úg2ƒ›Y‰ †uÂ=}4årº~öÒІ}\u000bçšM°‡|4p\u001d\u0017ÒáýgØý\\\u0017ëݜÞ= L\"\u0002pP(mt‚´¬iYo–S€í\u0007‘\u0012ˆMŒ^Zp!í×Hk›WH›ŽÒ3f\u0010ÞØ\u001cëÏ@áTã:n«@Z\u0000æ|Þ§R¾6„š\u000em*j\u001bœº•>\u001aëÔ\u001fZQ=}k\u000f_~#‚T'\u0012g\u001f+…Ì‘\u0017m1–M©¤!pú\u0011¥*SM¢9VBnïT7H´sð.k\u001d{>\u0004Eqi\f Ð\u001a%ÔaĚ;š\u0004\u0017Ôr¨\u0015exøy\u0017š…ì™\u001fu¢×ëc\u001d˜JõOv-MmۉŸ´«\u0012˜MÑÿT³\u0017Ñ+±}\u0007\u0018=M\"œÐ²Ì=MÕÐê—&›\u0018dÉFˆXa{žÓ’ð™ú»dÓÙý.\u0019;‚\nxMº\u0001™l€»Ï.…æםWa­HŽTŠ´‘¯þË=M®¿¸aj\u001b–ï=}…ôEVÕŽ+Žý§â¿8Ü¿çÖº\u0005‰­\"ð\u0011/ý{CÖò4«rϾ_³\b\u0007ÿFx\f˜è»}\u0004ð=}Êq\n\u00144ÿ¾ö\\óE¯\u0005(5!ÌÞ3Û\u000b[Š\u00113©#ºëùà\u0007u“\u00195·®³Ÿ70ÞCžªºv\u001a\u0015-(J4ç\u001a\u001c\u001eëHŸ\u0010~Ϭþn—£_—£,&žnyUÓJ؝'3„\u0010î|ã'\u0019H\u0018~s)Îd©^ªvùو’^/¼íí\"1Ï,B†u¦cµüîšG\u001fCÜ\u0010CÌ3Ùê\u0016ìðEŸÌ\u001a\u0000\u0003VI,Š©ŒödÎn[£\u0018\u0006“&øÖ¹$j\u0013Nn_ŽÛ^$”Ÿë\u0019¡YñƒDä\u0016¸Y|°4IÁ‡ã\u0012Rû´Ó“\u0017z*@í’tœ\u001c,\u001c-€æS{b;$\u0003é@>\u0014.rœ‘$?ñr*íÚ*7 Dçî˜[_\u000b\u0013Â1Ä}„/ª\u0016\u0001Lä-ìä­ë\u0011K?“ë\u001aÂ\u0012¡·-bH3l³‚ç…áV\u001a©\t°êæÍ\u0016s™\u0019dêw°ž\u0004…0X>ۅø-ÀšÃ´×xèfž\f$6V¤}5„ˆ= o\u000b§à\u001eý\u001a>eiäÔÈ¥±=M§œJ„v¡äö¶=MÅПŒbÂ-¸\u001dãSì·îÎ\u000b‘AU¢Ç\\X•Ï¬Ù\u0011[Ÿ«ëÐØo¿\u001b\"z7‘þƒà\u0004\u000béþÈ\u0004!²RëQn\\ˆ„$«·‹©B_£Ñfô‰”%-¤ÒE\u0018*’)·$œ<°'¤.fåâ\f)¾\u0015'¤À.Q\"Ü*>\u0014«±\u001e¤›;øóCÁ6óóúí\u0010…óSè(ŒM·D,}éXÒ\u001bñ\u0006Êÿ€U0©°eÿ¿#µÍš­[=MnUgdYž›öJ\u0018d’ç¿^X´ñ|¨³eèÔ&=M³Hýyóä@ƒp¯ûÒõª2¬C¸»\u001d²©c\u0007ØъCj¼,Døj§‹5pí³ÃTM±nÚÀZ\u0016›Tà‘= ‰\u001b#ê\bð˜'ðÉïÃ$¹\u0017ÓA\u00198,×G%\boS]\u001ds€å†&i°ŸºF\u0012§ÖÒ\u001bS\u000bæ\u0014à4Ëå‡÷ÇT« TqÕ@Íl®LEG5(=M¨ËWF¾ˆ:´×4·\u0011!P\u0005¹1üÁ–åk°}Ì-n'Ûã¦\u0019\u0019Âr\u0003çTºíd\u0017¯ÓàÌ)\u0015 \u0004h\u0006æoӑ£IÏ~ùW(¯$ÊÏ5Ñ+•|®fÍˆ\u0003¬ÄE\\å\u0016°´õ?kŽscø6ÆS±cú±°¼«öø}ã2\u001fæ\u000bø‘\u001aå'»³»º\u0015ŒàŠ\u0010ì´n\u0002\bk £hþL^\u0015@JÑS#s¡œ‘\u0010Ê6µ\u0005”\u0003³\n5j\u000b\u0015œ\u0012Jüg= ß“ÁÿƒüÕ&Ø\u001b{ó<ßé\f’´C5Sö’F\u0002Z\u001bÆëâ·[E\u0018\u0016ÖxOؚØV¤ÏÅÔ\tÈÛòMÅ_j\u001f\u0010/\u0017µî%9VœK\fq¤Å7OJÀI‰5“h\u000f\u0007fhÖ\u0003ŸMF©\nK?\u0001¬0ð:Ë\u000f}Ðz¢gì¾BÛ1\u0005kžõà…Tñ8')ÂÙܕN\u001bU\u001e ynd¤\f\u0018zrvš:#…\"\u001bœ«Žï(\u0005“çKü]Kä\u0000céÏ\u000e*™ì]ú¾Ë”Q\u001b[÷Î\u001a$ó‰,\u0017Å=}î1]d\u0011úì\u0004ÌZžp_biï\u0005tø\u0002;@÷‡µªâ%r;µ«\u001e\u00005XŒý\f™\u001d³Cj”•©´\u0011Æ\u000fFuü\u000f'¬\u0012Źœ\u001f¬M6ãä€&¬¶ÄLöû\u0002«\u0017%ÎÕª\u000fCøÿ’TA!­^+\u0002“ãœïÓY£ëÜ1HÈã^M/ó¥r쉤b€ñþ\u001dˆFl#¹Bøс߫%Â\u001dF=M†¥m\u0013Ü\u001c~Ÿ~Žz«âó\u0003¦50æn'=Mån?.8\u0017“6\u0005n3\u001a\u001a)‚\u0003ŒIÛ\fL¯\t03=}saaÊ\b\u000e\u0006o¯Ï\u001cŒÈDó\u0002N2lˆÎa\fN€FEèôâ\u001eÿ%\u00063÷\u001fä®O‚Í\u0012)Bí„Ÿ\u000b|~26= =M\u001eè»b\u0011ŽœJhr>‰øM?AoË]Ù\u001f‡z_̅]\u0002¤ø/t\u001dP¢çH=M8c9]vëF؇3NÁ'ÁÅÀ)³€\u001b¬6)ìL–û\u0007:jÀtª™žUçËHžî§7;Ûbòpl\u0007F(úB/;è= „3ѾÿêՂr–\u0007_b—ÎÌ\\˽ØáÉ1*¥,41\u001fåY<€\u0010“Á“q=}ЫQíç<ºÚsÝ\u000fÜH4³«‹­„ü\u0005\u0015b?(q= ¥íÇk;YŒ•{â6ä_û[ÚY!«.¨Ü}Ԃd´ìÎQú^¹ÖzYFo£÷„W\u0004Ù:fpÝÍ\"Û@ÒùÚÛÓ\u0007žÌڇÀ¸ê\u0001û^Au\u0011ÛhT>!/2\u001ecðfN…užQ%‚\u0003\b¯·*¿ïî%ܕû½]­ä‡öì£#ïD<‰ÛØ}HSä“Ã_¾”·LMߨ}a¡¢”g·RE\"\u001fʾO3•\u0010˜À±»jžüÈå\b\u0016Q¸N¤ªžþS~\"\u0015kÅã\\\u001b¥¦?‰ÄÞcT.­\u001f¤\b½z€)ªK\nwÝx\u001d¼àÅç^vv\u0004+Őù(ôýh£\"–\u0019‚Öb—g]ý‡²;z1«AŠçk©Õ8ª\u001edî*®?\u0006ñ\u000bD.f­öù?S\u000f1‹¨žE‰‰C\tJÝ·yC& ‘Ž¯\fÒ)\u0016­}\u000fþ\u00103®Ç7¹šã¯N\"ØR®~TWM»ß\u0013b{Ü\u001cKv¾ÁôÁMóÁý÷vQxD8Ù\u0013\u0007¾·\u0015ÉØ\u0004K»59^\u000f~\u0012IæÈfc§\u000eÜ°·Ä9Ùé\u001b¥ëõä4ùïS¬'8:>‘5ŒEÆþҊA\u000fTñÿß/”ÍŒ\u001aÄÅsÔBy.&Ü\u0006Fa\n¯•.(ݍg0®U…*̗ˆRÈuæÚï1LaôÅLæxÔ5ê°Ñu‘Oô‘Ï_‘Ϩ= D˜ZD¨¼³Vï‘'T5l߇?—R5Æ\u0012Tm†Sm®÷~öµçJF\u0010IÆ7Qh+G¶\u0012IÆÕÖ¹³\u0012ø‡v˜è5\u0012ç%\u0003Œ“fï×R%ílØuÿãµ\fÉ­ä\u001b\"A\u000b™Ÿ!Û\u0016¨\u000f%ø8H0\u0006±\u001c“©fFá_ÈsÃ~%ëªJN·\u0004l‹ƒ¥õ\u000fã†\u0012öÈrÅ,yaóœ*/\u00073}(cQ\u0007x™wۗ\u0004cçñ£<\u0001NŸf\u001a¾93F4¹\u001eÞâÁ!Yý&r#õv\u0012\"±\fa#®\\±’•ÆÈ+?5°ÎЌ4É\"@‚˜ü·\fóÓ®:Á3ðc­®ù8¦¤t)¨àË°Ð\u0003蓃,mXn—\u001d²ôY\u0010;µ\u0003©\u00039€m•¾PÜuŽÖ„\u001a\f‰76˜·mnb¸\u0005âÊ*&â¹ü'õt%9Õ/\u0004|‡Qio\f‡\u000e8Sàx$\"\u0015\u001c÷oï8=}[û¬ž\u0006æbT-ŠU\u0018\bt|ÚGò³µz\u000f÷2ú0y&¢°Ýeë/²¾<¡eƼ€ÌûìB¹Ï²^£\u001c™T™\u0007Úzuž¨¥Wس'\u00174s\u000bmUë\u0012†ÝÀâ5†•dhé©NYO \u0018{\u0015Û ó\u0010ÿ̈DŒÀ'á6ÿת“œ“Læoʾ\\>U²9òˆà¤ÑÞæoʺ9òØÇ\\žÐbÏ¨\u0010*ëö\u0001¢¤LD©‰,\u0011\b\u000fT\u0004Ċ¿_?\u0016p°å´a‰GÒ cÂq\u001d\u001bÌф35À‘yÁÉ©Wď¼\u001eÔOš+ 6O4j!I¨>뵔–Õcÿ¨gðVh¶ïۘó™\u0000\u0003Å?ñæ:\u0016;ðÜÓqY\"Ù69ûn<ƒ\u0004iã±\tEܜ‡\u001b±‘]âï[ãûÛ\u001f¥ù{^á]&\fEä›+âdv¹öüû:]\u001c\u001d[á]ÎñÚ:ö@\"0)\u0017\u0003;U\u0007n+Ûâ;\u0014µ7͎2‹;õŒºOá>5Û°Ó{Nô«&µW•q•†q\u0013§p\u0015²\u0003ç÷Me—tÝíFéú²jW®-å¥=M\t\u001cù˟\u001bsƒâ3G5a­“–é{”â=M[酨B\\S+C+¬7xåÎ\u001d Øޅo+”ˆÂH,Û\u0013b'ýswæ»\u001a¤!\\­Íþ\u001f\u00162\\™áu9¼\u0007€\t;Ÿ±QæëüIu† \\>£¬ŠÑ5zxFæ³\u0000#Ô\u0004m™4!/-tx\u0007Óy\u0016¶0$&õô¡Š\u0017+Vz›Fž}­<<\u001eTQ¯ÌÚ®â\u0019*³4ÒîUû_l˦°0MH\b“w¿SB¯\u0013ßÎñ]\u001fÄ~\u0016\u000eOÃے= '¬™Þˆ¹\u001eÈ\u0004CPÿÇØ?›Éyš´Î= 5i–q\u000føû”ܪˆ¡7Å{ÄÔ%\u0003\u0012÷[«Ÿ\u001a’3 \u00161\u001dÓnÎ\u000f¡Z\t®˜Z-!¸Ô0X»à>êoYü¹š\u001bÇ= h¹ãñ°½UsG@©3ËÇ~\u0012*w:áȼ(¡ÔoÍ\u000eÈ\u0010J¸ÕIê¸f°Ã=}\u0010Ø­Ü7ì \u0014\bR¨š 'Uý&ÌN\u0013á|™y¾ŠP £®\u0017\u0007ç#\u0016bÔ§³ö9\u0010cpŽ\u0001Š‹\u0006TғMªqQš\u0018¯ö«5\tDãd&ú\u001epá\u001coó귍½5›\u0002iim\n·:ÿ3\u001a·\u001bŽ=M«“á1]R\u0019$1G—õ0¤yƒ™\u0002/ÈyÒYŒ*\u001c\u0018p2šÙÈâR\u0002ŠXBÅ\u001b^\u001aÁä\u000ff[ÜðS…Ê9è\u0003{BŽ5¼0ŽA¡Ê(\u0003ODi××C\u0014zõ®ü‹\u0012!~\u0015\u000eÞxÐ$pP\u0001 \u0001wågþRJ5õQçf#õI¸ûG”ø.Áá\u0011I\u0000pÍN\fÃ/1&ž&q~¶è­(M\u0011ž\u0006b\u0002¦î”í\u000eÞ£ñ\u0016kÜÔ\u0004bM;éÆ\u0013ÓÕjD|\u0007Î_†R6k…U6[Îwð\u0014‡.¸É3\u0017*Ž«ž'¨âqw5o\u0019åA.ECJÝ>(IF¦{\"|>p‘S_äŽß§=}\u0018²h©Ï°£\u0000\u0006å„îêÔñ]©-ŠM<æo£ÆÐÑ);ŒG:|GŠ¯¦¼ìS\u0017\u0015Ùo†Ã3ùõ¯‡\u000eË¾cYÂ÷Y©­\u0006‡Ãï„Ù²Þí0ð¿›ß\u0002Tù¾P\u0006‡¢ÊhÈª9݂bÜa‹ìÇSeSVçëX5ç×Ï\u0011q\u00189šÆwnH˜=M”@äBAr°ÿ\u0003Öù‹ÁS”Ómą¸ð²Æ\u000eŸÕm\bÇ10\u0003\"1ˆ(\u0011¢ »ï©ª\u00058sD·û˜™œ\u0013,Yj«¿\u0003«ø[Ý択¿#Ûfë‡ýbÿIVvW6´˜~sá#—g}QêC¢º\u0005®1\u0016î©MŽ%©ŽÖï#*Y3ò90pó÷^\u001d®Ë“W\n9¾q\u000fO¼kx$ôÇßÞÞVî:+~EɃ\u0019î=Mþ\u001e\\FŠ¸ÞÜk_…Œ4ØùñÉBNÝ\u0005‘wÝrš= hÀ,w+\u0007Ÿ\u0000ŸZAÃ㖢aÉ÷«^\u001csÍùƒ2âœS!èð“\"™.TY—¤-u\u0007«ƒ\"\u0018û21…o/M„«tÞЎ9G¿Ü ý*n=}ëÁÁ=M¹Š{‰\u000f?wI‚¸ RÕµºŠF¹0\u0013Cz¹Êô@²\n±æ9}\u0002J¼£q\u0005í‹ïI}Wär¬\tÄí\u001f¡{ë62€\u0012NTý©T²B\u0007\u0001h­Í•ùlŒ\u001as¾\u0016nÍó_åLe'x>)ΰ{6frû£\u001c'$—X ‹\u0018¬2atïO¯S\u0018bO®:+Щ\"7gÔWî\bÈ0FF·É…W®Ÿ€\u0016u?©G¤~+§¸9:®9³5¦?ãZ;åß\nšsVYƀ—\u0018I±°}Ê\u0005=M”YäѶ­-šR²=}¬Íãg\\óM+[Û\u0001jZ\u0006Á¢³#\u001a¦oDZØÄ\u0013\u0014Œé:0V…\u0004{êë_fÅxԮϳ/4Ä\n\u00156ÎJ‚\u0019ÿg~ø™†…Ý•åP׆ËÍd>BP|#o\u0015 méýUÀ*\u0001]ôŠ\u0019Þ¨\bœ*\u0001Ã\u0012»ÊèŒ# ‰ˆ]æ6rl$ad›ÊyÒoÄÂðÏ:mcáÎ[za<¢™ªh^¼*AÉ9.‘ \u000fÎäη80®qTVðäúÖ¤Š¦Ì\u0019êC=M\u001f=}Õ#\u0001•ØÒ¾dCFôßUxç\u0017\u0002ݤ?÷Tû~’jÖ °Î\u0001ÃStÐá \u0000/v#\n\u0004'c\"4q3ìÿ{¶ßv^Îò‰\u0019òÉ:¯\u0002kþ3\u001d]Òz燗Мë'ÝgC½Ôö?èðËïzS(\u000e½ÞíÙOÝMæ\bêQ\u0002ºúᗇÑû°î‰±©}Óö™ÃGÜ)'= \\«plÑK©²š\u001ajÁ¾~ÙÄQb\u0013›W4O\u000fuó8ðDr»LΫî.Ôé/?m5F\u000fiÃÂqÛ~³¤OºJ<Ȫòj*kñl€gm̀\\‘·Ü_þ'¬\u0004vç+\u00009Ÿç9´\u0015\u0015e\u001d\u0007ÿêN\u0007!Öµ™ßτWf˜Ä9Œ½ô5D™”ôCöt>± À\u0017\u0013ôÔÁ2<ø\u0002…da–xªÃþñ± ®Õ©\u0012ð®Þ8þ\u0013롹dÕå#\u0004w±E†%í\u0003bZ\u0006\u000f×M\b?Šð¤ \u001fä\u001cº\u0005…= Òtžº—s?ékn´³\u0003Ž«\u001f4P\n¿vž\u0017LK-Ù\u0005õ²@'\u000fÁ®NoÔ¥mÔ%4ÆÑ\u0006”\t’ߦ GA¨þ%p¢{²nôgaÑ_\u001cºî\u0003–’nô'ê\"a!,O\u0014k±?¦ü\u0006§\u000fCwÙüíp\u0007ȾlfWkguZüï@¨\u0013K\u0000©\u0005ýÞ{>Îe ãg\u001fç¸ÂËç³\u0014@šÊ\u0012䏗¹}\u0003¸¹ªA§¹aÔ ž\u001f\u0018*Ãj”P趔 Ç¶À7RëÄÊ\u0007’×Æd|ܼ—×Úu\n%l\u0015;a\u0000‚gݎò®Us¤áð\u001c¹ay®\u0015ɽ–CŽâÖûmœa\u001d-æóóVs2ép»(K?)^p¼&a™e?ø\u001d\nûx¿IËCVz\fC\"ôp¦/;:d\u001dÈUR\u0007Ÿ—Á¤µÚ G›èËÇS\u0006…oa€ñðá!wN5\u000bÑ\t\u000f\u001eü·üÂ\b¯\"áQØlܐou—\u001b\b+fQ°öÀ\u001eb:e=}\u0005¯üùoÙù©ô\u001eyɆ\f‘|Î\u0019¯¬N8†v_OÅÖbD: N+—)Ĕ\u0000\u001a¥ö)†Í\ndÑw\u0012\u0007úÈÐúPӍ k\u001f¦Ì.|1½¼îâ\u0019û¯Š\u0019FN0kÑm\\Z\fÓ'öÐu#*1·‡MÕ\u0000\u001e1 †Ûõ‰¡V›\u001aî´®\t\\\t¦\\Ófß\u0000\u0017\u0011‡[Æ!C´áG}G.„í‡ù~{¾e\u0007˜.†…9æ;á1֏A°ì§™= ñØîÁŽMÞï‘c@ep‘’©° r³ø= \u0007\u001d0žpÔ½1\u0012hÁ„VðÛÚò&–£+]4†êÅÙ\f= ìZ \u001a˜ïpþc5œ\u001c\u001c\"àióî/§\u001eaü›[4\\æ±e\f¹â\u0005¸\u001fÐ\u000eñQ;YhE‚Ä&\u0012ÝßàÒñdÍ5\u001bd…bgiU\u001b ¸ƒ?NƒŽ†‰õeSoÄK\t/ažm\u0016½ýµSJöµ‰æƒÚ“E9‰PJMÑ\n°n\u001c哪môâÚ¶sÚXx¼~\u0012\u001d\u000b† í\t?B\u0011ïÒÚ«öçéÂCOMYMà\u0007„_\u0019¸&ZçÁž.h¨sÜÚö”ç%ÎǔŮv2”å\u0002²Î6\u001f˜\u0019>\u001b”%L”\u000bAÍl0Î&\b',ˆË×•ƒÃ¨\u001aN\u001dö$*|\u0007§+<€89\u0010\u0006]\u0011$vbÎ6X\u0018†P¾ëûH†Iú*aH\u00178\\{虎\u0003†ç4j\u0018ø¾„Ö쑱\u0014ÈUpõ\u0003gò\nÅécÀ³\u0013‘ìÇ4­VåÇPdTtu\u001b›\u001f_üz†‡\u00105ôïYú˜0!ˆ@ÊY\u0006»¥ÅÙ6„Å’¯\u0005è/vÚ.‚c…•…•õªy\u0012û»–T¾KýÙ¸$«ï\fi%Æ\u0014u¤QGšƒâ6—82\u0011ê\"þ\u0006ÖѼøu(L’ÆÆ0•µ\u001f»'­/D\n؞XpÝ2ÃÚÀú\u0017ë\u0007ðøâÀc½EÊê\u000böÞ\u0014QYêâ$ä±±f£ÌÃs+f\b!ò\u000bшå\trùZ\u0017“Üˆƒ\u0007BÅõ-©V®ÄcÜ\u0018ƒö\u001f‹þq¦\u001c° qa5֙†öQÙéMÒg\u0002˜ìSU?dZAŒ­z\u0000¹çÙСꋆ¡ …DyŸë6ø…1%›+r,_ß\tðY([ô \u0019ъ߼úž\u0012%s\u000788skh5]FnùbÞâ\u0015i”wå=}ëOœ6£‘4\u0006?v\u001eÏʐúÅßdŽµ¦}GUð\n!™÷mèã= Ïr¥9\u0002^Áã‚O²lWÚÏ\u0012¸eéX 0%ʕ3C³±´\u0010R¡\u0004I›J˜y\u0010\\&^!Lo\u001b=}\u0006!^|Y²(ü\u0019Ôy±*ŒšTµÝ\"ƒ\u0010dàsÅö\u000b}]«‘U¦\u0013æ/–¸Ï|ˆ=MÒÑY(g-õw= R\b\u001a=Msøƒw(1Ÿf\u0016A€%šxèÄ\u0004ï/ÿ÷í½½tƒ'¯\u000e²×\u0011^‹~ý¤e8I²¸6f\u001c9:¢îwétýÝç&ûïÁ·\u000eƒ\u0007½b\u000b¿b‹,j*õò$®z/*ê#f\u001f9= \u000eqé¾].\u0012Š5í†\u0004\\\u0018ß\u00055Ï9÷\u0005ÿy»Ä‹\u001bþŸëù,DR\u001a¢\u0012GgŸÙ\u0001ÞÏyN1:ø[[—}¯’#Cz}¢¾þÎô¦\u0011²A\u0006m®«‹óÆc7{U3= cc\u0017æ\bµœŒÈVŸó¾(Ó·÷w.,z\t£8Š‡lÙ®\u0018¹Ÿ£‘RÈ|Vÿëò-MŠÖÜ\u0015\nÅPD\u0006ÇrÑ%\u001bt–Àç3£º\u0004kOð\b„p±¼2uØJÂ\u001cï°jæû\u0003ܶ_ï=M’\n‘Þœ„}‰Â\u000b\u0004TG;¥5@Où\u0014ùr9\bl}/ëZê¡uÍË÷@±¤_ð/—úmš5eÏ(čÔs“\u0016ó\u0006ÁÔÚÞ\u0000!v©¸ÖrêãôíõDùE°j[v\u000b‡4énû–\u0019g֜\u0003\"n.SëFÃßi »¶}™ƒ›”æaë>AÛé \u0002bɑˆ&xahB\fΙ©FFê\bt뻓 =MàhA˜€|\u0019Ø÷\u00197Æú¯Ò\u0019%´=}\u001cæ@´Ÿ-¥ë&\u000e“&ÞF(,h\u0015^\f~\f\u0001Bê\u0002¢\u000f”.G¦\u0017= Fž—Õ\u0012g_7ßÒL.é>\u001b°zû\u0004˜^n¡’…Õãõ’\u0011Wèg›ŽÊ›\u001fgð¸è\u000f\u0013w¿o\u001b\u000f©Ë1×UEOO¾\bI\f\u0011™˜)_º3PꯧŽ1†c\nÐU3D„ñj°$å§\u0006(;=M»é\u0007go6Ɇ¡ª¤öî/¢Å¸$\u0016_Ú²&Bšì= «›= “®§=}ÌÖ¿bݔjð;Ÿß’~ó^ç2“\u000e]…wóƒÞ-êWöí\u0002›\u00165´YD\u0006NçÛ¶\u0013EíŠ\u001a¼;U\u001b5?8\u0018\u0004£ÉÎ\u001ccfÄã!°3>ðm—µe\u0000þIAlr6՞ï£X^‰ÅS\u00145fV^m‘\u001f#EÅ3¤<$j±ncºÓq‘wÄúJÖ\n6Øò\u0015\u0007“÷Úxg‡= z¨#°\\»ÓV“\u0017\u0003‡¬Iv\u0017þ‡¨\tå‡ òÏY‘\u0017¢\t‘o¹›ô\u0010Ÿò-•\u0010\u0018\u0001ü˜Žjòê\u0006\u0014ÓSOèª-\u0004½OߗÂ;ö7—÷ w_ìM\u0002bƒ\u001cÖßwßTKC¶a\u001cw4\u0010à\u001b6\u0015™\u0014æ×\u000bN|÷É\u000f*\u0016=}ys@F±Õ\"5Ÿ¶lõcûv\u001b‡Ÿb||=}‡\u0019'ˆ °/5b£\u0017Ò= •×\u000e.\u001f3wL\f~¦\u000b^¿= B/\u0014\b#笙ãÑ]c(\u0011[(Q÷Uy×¾ûÅ\u0003ôLšÑ\u000eV\u000f°û\u000306à´ÑçôŸ]»¬îªÛX\\v9\u001cîšCÁ ]\u001då‹5“d®D £;Nm€éÓ£].>ƒ3±äˆ^2'.Ê\")&6]\u000e\u0003é=Mjß®ýíñfùFw\u0006«\u001b³7á«\u0013\u000ft\u0010ícFOâ%”8bã|Öy\u001cKíŸpFï\baH^[Ò·*i\u0003\u0018àŒ\u001dL'‹°lhBy><+u=Mž~ˆ\u001b•I\u0005=M\u000f‰=}½\tèÿ\u0007\u0014=MŒ¿3}‡Jµ<4c“o,®„G¸S\u0002U\u0002Š€ž¿\u0015!I…}Þ\u0011¼åú\u0006˜Ë6çáXâ(\u001aÄB\u001b_CâTšÙÙI·¡ŠAE)ÍI…w\u0003ÆÇ;ö%¹ó\u0000Ú¬û•ƒC?\u0016¹=}¿+Do1Ó)”‡}\u0014ÒÄ*G£<Ë\u0004¤\u0005]\u0017\u0002qêª\u0017\f*N,¹¢î\b_ç¥\u0012Dø°¢³FÊ*tò\"|×3Š.,\u000fœ´÷¶aa\u0007kNòÛe¬õ@µÃº\u0007n= r¤œ#FWÛ;{ôÏ[ÚlôÊ^Ž\bÿüñÞ\u001fäÓ#)RÓ°üð>tŸ§É\u0010ŸHRżêÈoý+þ§ýÕqÚ霈\u0002BÃrŸO\u0019'«\b³]\u0010Í\u0002€\u0005Y}=}mL¿\u0010)§\u0017ßsVó·\u0005ƽ\u0000UBÔoð\fmPŒîð¡&\"mÍ\u001e¹áÒëdCY)\u001dz Ÿ?èc£&íu\u001e\u001e¨^YÄÓ£7\u0019Ê~L=}{·\ttP\u001cã\u0005b˜”´˜¬\u0015‚LfþH¬=MÆ£/VR-Mߦ£‹t\u000bVB<[\u001bvM\u0002y;ñùï\b&¥\t[2§\u001e\u000e§97ñî!é’h2Û8dÅD2ò1ÿgš#t&4k\u0011t%H¶ñÏ\u001e\u0013š÷}‘ãÖo\u0000\u0018–\u0013t\u0005Ӂ\u001d#¾ÉË\u00048›Ç8ó7kÆñíšß.†s.Ìvćå‡}&›¹RËê\u0017'úøÌ\u000b¼éы¹^\u0007±R ”w\u0011Χüx“®7G7›}¿\u001eËr—\u000b±\u0003x8‘Ä¡v¿‹¹;JO½±ÿ¢Ho¬¤ÂÙocÛ>u?Iµ:nN\u0019ÏA넲º\f8ÛòBޑ\u0015’Z¬ÁQò¿j@ó¾O\u000e¥öºÒö\u0014Ç¡ç‘ʼfʁÀŒ_1i\u0010X­\tä…\u000bEu\u00004µ‡!\u0019ëdéŽñ92B¥oFâ…\u001d\u0000MÓIF‡}ëÇ9<’ü\u0005t'¼r\"n\u0015$u]Îa\u0010›;ž\u0014o)z–\t ©ªÂ\u000bÁ[M²úÓº2vBM¦m_t´YÇ\u000b3\nBä>‰ykC%|œ¯æ£x8ã/d-íz%¤q\"J-Rò©\u001båkMUå\u001ct÷Xçðs\u001aºAÙJzÆ»~^„à‡w²SÎÄØÿÈŁ=}Ö\u0010Çѹ ‹\u000eP5*ô’ƒ‰^Sëx´›Åàþ„ËLXÏΘÀòÊUÑ0XÄHÁÒoQ÷ԙHؾ(œL½ZÕ´hõÔDSGê¨ð'vª=} žÌbØÕ©°ñL„Q÷Õ¾´—\"èD_V¯\u001a„r.®MEô\tmìð\u0017\tU\u0003Èü‘eyoÄ!¹=}&Þ#š4B‚\t_ïžO!ªüV-~\u0018\u0006cå²Z\u0015Œ= …mYî\u0015º†=}O\u001e\u0017'.4\u0010j6úç?(úg\b¬]ä’\u0015ݱœ¤Å(“¢§7µrP\u0018eÉàˆ×ŤïW»0ï˜\u0007!ÒÉ i?RQ\u001d[,Vp\u001c\u0001«S±{æL\u001eæ(M'hXêËM‰pöf\u0014QÝ»ìǨ4qè~Û«@Äúôúï\bü‘¯\u0017ìlŠ‹\bȯ=}=}[™NÐ.ŸÂ©´Ï”Ï\u0017@Ж¥=M\u0014føù¦ºÙ€'§I\u0003wZI9\nsCMA\u0018\u0001ߋšœ\u0004c¯K53æ5YRÝ5£üÇõÑI%OM±4pg£îozkƒ\u0012I]\u0019ۘa£€˜^ëÝò@Òéª{:âëJ$\u0015I뉭ýšA>î\u0015\u0005\b·h\"Lm·ð1šH\u0007„¹êL÷c\b\bRœ·\u001f‚†:‚ÉÆN:Œ­o\bN‰;‚(Þð5CäßK“=MiüÇlOHRӘ\u001d\u000b/\t£l‹^\u0002Ö3rŒ\n¡žæ— l\u001cj½ï‘\u000f.'›proí\u0003øcc•¥-O~cw\t{YjoÆðÐ#ˆ\u0000O–:øÕ\u0004Z&J­\fI¡ñɼ\u001d·er\bT¹GŽÞùÑ3–Sï;un\u0011í õu z \u000b©=Mí‰Bo´EÕ#áà\u0013 î\u000b6\u000eéÝ+aÔï~©\u0002z©,8Éí«nZñŸæåüh:T\u001eå¼êå´cz¹Oç厾\u0003ò®\u000f\tÂ¢<Ñ®ß_ îœ\u0000ۚÉØ­ñ\u000f\n1~ñ]³\u000bb{âÝÃ;ü\u0002’\u001fO¤@ÙNM¢°ª’Ì/añ\u001f;K6µPR\u0010çHŠ\u0018#Ã\u0001¾\u0007K\bA]k8^œ\u001f÷@h\u0003T‚ý\nP‰\u0007›×î´m4Nߏ¤\u0013‰f¨r<ý\u001c™·&\u0014ž–0Ô~Ž‰9§¹SÂh-\u0012\tÎC±{Uƒ\t\tOq‡òO3œï(Ò\tí,t;G¦f\u001eZŽŸcn±àû\u0017%žþÍw,«~XÏÐØow€þÿy¼m\u0013SkՄ\u0017RôêЄÀù¶€_Lj«f\u001d\u0005/|âx]ã/·øí¼èî*Îë€\u0006\u0018؄PÖNa¯YÌré{Z¼èo\u001a\u001a°&4ק¶ØÔ¿!+!I\u0017þ×\u0018Ӟ\u0000h™ÈzXLT¾Q\u001e)šP,d~:Ot¯ñ-g~\u0013&Œa ×ÁÁ¨=MdÑËlh•t\u001eÕG×VäàØÀ=}Æ1\u0013@êDP-gnd©€\u001c*]ô˜6Ü ‚Öx6_Àš:%ñßíjúnIñkîEcÂzï~9¯Å\u0005¬GÃ\\øòOm\u0013ö[ôV>S‘ A=}iq\u0013µà€Î…¥÷£†âg]Üe\u001amcæ¸h˜FÄîˆÖÑkÅ\u0010‹fèç#\u0011\"æ§GÇ\u0004‘öUi¹pÄ\u001bÚÓ«P¸*Ç\u0015T ²\u0019Èqٙ\u001fÇ@‡×ŒÄ?·Í\u0002yŽ?~‹ÿ®ó.Ò­= „Û\u0006ãu3ÚÀ°\u000fäÅÒU W̲¾t²\u0010\u0005(•µÙÍàÀú¸Òz\u0003ÞVÄìrÁӝHQ\u0010\u001fSÜ2ðZsXÀËsÝ@Â:|#ÅêwÍØxŒd\u0011\u0018Õ;uƝ\u0002«ª¦/ãÄ\u0003ÓGðwiÉ\u001b㊗iŒ„­²Ò\u0004Ø֝ø\u0016ÑÎ8ÒÁ\\ä;»7Õ8ÑnØÉðX×0XLԜ»¨Øb\u0018ع°×´Ê\bÕ£ ï‘s¹&§@÷\u0015ÎÉ\u0006haxð˜\u000e\f‘iJV՚ºAÖ®h½òŸyí¦\u0006˜¤Ç)=}'ëòS \u0014C#ó„*êðUÑî˜ÏzèF¨‡\u0011Ô\u0005~€\u0016”Ú™w×ë7hš[Ù èN^ü\u001a\u0012I\u001d»\u0011Ì\u001eJI:¼'’¥5Iùh£~\u0019—è9“<Š5ð¼C.O“Ž=}Öó,$Ñ:rjµÍ»‰s\u001c»”\u0002+vʤ\u001fU\u0013“„ž¿ò…b«)Mý\u0006Š¤\u0003xSëHi²AÚ\u0011¹\u001dÇΉ$š×Á¼\u001f\u001c÷S«ÒZ= ÏÉôwµ|êh»;‘\u000b(Î×\u0014eŸw?Ëüåæð\u0018\b÷Ã1ÜفÐn_Ô¯¨rS-öRUñ×W∵P\u000eµÐ\u000f«Ä4øÎ\u0014Z´\u001e·¡»CìVŸàdn?Ê+\u0015÷ˆ3YÖpaeq(oÂÞÑe~‹\u001c9’,d-åa›½UÂÇ\u000e¾Óº4\u0000½C\u001a\u001eêÐ+͹S&25q“Q+lÁ@™\u001eD¼›žÞÜw҈å¯\u0010ô\u001dq&¢\u0019–ïZi¥–\u0019ɶ…\u001aM’–¤\u0003ŠÈà2ºQÛ]\u0007x/‹]uióÇ~_Ôª_ÔM\\MUTœg—–ºElÆà7rïMÈö_4䉉\u001f³òRÈéI @ý”¥ê\u0013z2h¬º%n~%niñ@Ár_å®v\f\u0007¹\f8“Ë‹°¶^çlhn\u001a5,Åð\u0012ý•Â=M\u0010ÿ«Kx7\u0006\u001e}\t•÷á!1|\n¾\u0016€h3ù#wpX´&«H\u001dÃ+aëåü&î7Ý\t>mÆÞ/w\u0011=}Á\u0016B\u0007œ|üMÛ¦âìaš‚‘Å\u0012àçJæ«øâÍÚó^žPAý\u0019CÚðé\u0001ð#ÑÜ\u000fâøÄÒ°Œ½‚ÔÀG]N\u00027\u000bÑÁþˆ6c+¸\u001b\u0003(z%²×\u001bQ1ôZˆ[m…]oâ¯ò1”1\tÒ\u0019àûÒ\u0003J¤Ž~ў¸fÎZpâÅ#\u001c£Q£,\u001dêöê\u0017¡énHÀd)á•ÎJ\\¨¬hÊü\\OÇSZ\f/ž|Fi\u0006´Ÿ@:¡ÃüG¹[ú×⣈\n\bý\u000fýè \u000e®þÖ† ­¶^K\u0002äëτ:§T~\u00047_8à>…Ç·–¥¹&\fí†#Cˆ\u0016³Š³æ:–gDT:\u0016‘4qg\u0014Ù\u000f= \u0003Ó×Ï¢›N‹­°fѪ\u0011ݧ¦Ú¬ƒÅ5Kò»,8ó\u000b\u001bRCw˜”!\u0010¢=MY\u001dã\nQ¥=}H\u0003“c\u001eä\u0014ú½¯–Bç÷šVi\u00108ÚpML@V̧ò];Óö˜R@Ëw4éjõÎÚ»w\u0012ƒÂé—Ê\u0001Œ\u0014ÚNÍo4Éς\u0010鿈\u0002J\u001d÷¼msAº_Ð0<××C)e¼“H«fœ\u0000š5Py:+P5¸¹\f\u0015ƒ{ðR±»ÂÁyF,=Mñv54÷‹!hrv{\u0005%/\u0016øh\u0000 Ú\b8ò—ѯ¯¡¾\u0012\n\u0015”qtWd¥û/–óÒ\u0013ÿ\u001e=}Š£&œ\u0010Æ/–AJ\u0011Ié5Cr;â~p8VeÚ= èÀ,B|xPÇL,\u0005Ÿ&¶6Mðw|¨LF«Gv\u0000Z<23ÛyOvÙ±ÿx‚¤œfË2NRÁ]\u0017ÈSwÄËZ–íB(âÏ,\u0010¯‘¼LÀ¼\u001fwˆŽ&€sñð,¦ZR¸ÄaGdá¬qŽ\u001dR»ï½ªP¹\u0014ƒ¬'\u0002­÷Ù\b%No%U–¹>Ôg¦nÚ^n¿I\u0001%é\u0005\b‰\"<›Ö\u000bu°ZÝø…æ«\u0014ìâ–ßöÞÛ8ê;UX)ªPHåg¶{\u00193V›µû\f.˜a|¿frù÷Á\u0014Î\u000e\u001bƒ’ѯ߸ڠ\tª]!ß\u0003Á±âˆ \u000b™‹%½z\u000e:Ž)•ö[ۗ¡8ÄMR4D3\u001dì}(å\u0011N\bH¯ŠÙÁ­ô•<ôykÀÇ\u0012—–Ì\u0002¸â9\u0006+€\u001eÅEž\u0016f6íÔ'–1\u0018\u0007\u0016à¶ß\\áR\t=}J$+¦€\u001eäÕÝQ}n~³ì\u0007t,úÔÄ@dý4n$u(Ãk\u0012¸*ƒ½¢¹\u000bW†‘­ñ\u0016,ß\u001e¿ÿ]\u0010ªä~iÅk{Þ\u0012Q\u000f:’YÂt„÷¸Óž\u000fãpu\u0016£Sï/[\u0005H:Ñ=MŒ7ž¬ÃŸ\u001b£²§L™Q\u001a\u0010b\u0001觼3\t\u001d3¨¿\n¥Z)´áŽ‰Ë9ª\u0003NW\u0014¥H ˌ‰nYùp|äã\te¹\u000f\u000eà\t­F\b½jAP˜+ˆ±+y†fëÉ\u001a¹ÚÉ:;¢ïökÄdçíàcñô\u0013ñ¦sîï\u0002¦\u0005å!À‹0\u001fë\u0011\u0001-Ôr,k—7j qŠGn’ˆ\u000b9‚SCýû\u001bëEs\u0011“Å\u0007ÅÑ\u0006äï\u0002òM@€@]—ëktØD«è¦]ìä¿ù\u0010Í\u0000|ŸgWä}Òø\u0007?\u0011·#l@¾ˆ¶h¢²•ˆ\tèÀ\fC¼!\u000fÈüØìû\nâ×ÓÖ•ÐW¼û!‚@Œkü”ÿ8^Ê\u0014¬Q\u0018Ø¿_Ô\u000e=}W\u0014@:]߃=}9ãØÍU\u000f\u0007Žkµ2(;\u0018ÿ)ØÅÚ¡\u0011ê\u0018x\u0006X$Õ¸\u0011þ×2á(Õ¡Eò\u000bòY]™D\u0002Qt½èv\u001eY%=Mö¹d‡èŒ\u0005OÚNìÈo\u001aÏ\u0003©SŠñ—ÈÎüU ‰= ?ž\u0003ÿ]\u0019zÔcŠËè[¶\u0013Æ°W5\u0004û>wo\u0006!rY´¤[}Ú\u0007s\u0004+=}‡ùx\u0005(½?qå[$–K´yœo\u0007nwþ¦·€—C´\u0007­’§m\u0018Ã_‘֝\u0015\u001f®ˆZ¥\u001a3]\u001c\u0016N¥ø€\u0017™M\u0018ײ¨o\u0000sÎÂàµ5-\u000fz\u001c°o7­ÀgíøÝ¢çÐûûOª„?\u0002û­ÏÔâ\u0017*P8—/\u000fL\fú3éµS²\u001e—8c7Ôw\\ž“v gØÒð›üÒeͨNA»ˆõØ9ÈÉ\u001auQƒ&¢„ÞÜ\u0010LPšNú\u001a9{Èw|‡!ق\u000fÿ/>OÍGFÚ ÚWҏË\u000fŽWŠŸiWê'\u0006Dà>À€#ÜRÀŠË(\\6i \u0006\u0014>™Ei>i³M\u0005Põ–ª\tßa u6À\u0019\u00176\u0007™á™›´Ñu\u001fÁëFÙðƒÇú«9=}cXΕt·dä\u001f+•A<ô½úÃ\u0006˜Åə+0y\f9Þ\u0001ഗ_p\u001bbôx\u0006³ƒ\u0011Ä3Ù\u00110³”âj\u0014BŠGý‰ÊqÐܽ\u001fs‹\\´°\u0007\u0007­’\f\b”°K–0?æQ\u0017TÞI K¹3å‰!p¶ŒLQ›\u0015±ÞŽ¶Ì\u001b?1:ÎÙ¤§õa¢‡ñn›°\"ª\u0014à±BdynmªÒ¢;uQ(m µ5w‹ÕÊËسÄ\u0013aG˜ë´.o\u0006ºönÖ(‘òé\u0013™LµŽXƒé»z\u0002\u0013{ã^V1҆À§î„P:ä\u0011gRF5»®+“È’\u00147\u001a¢A\u000fî÷-\"QÕku‘\u0012·ã;lv7FÝB¦ç‡Ÿ'¾Q?\u0014%1ÈsöSÞþ\u0012³î¬”?ž\u0012\u0006 Dùß\u0007¡%ÚÍ/³yWøç¸ €W5 ÐèDïvÒ:b\u001c®±‹Áóc»„\"_mäÿI\u001eP'ªŠŽœ\fõi\u0019j«­R˜L”½¾oÓTC½mV*TªÎ«XQ!oY½_[\b\u0002Â\u0011‡\u001fn­êÖ\u0019þ\u0010kÒutÌé€5°v\u0006“T}ex—G\u0017Hzȹ2ÈÞ\u0001\u0012¿¶Kz\u0015\u0005\u0007·\u0013\f<úD!ÒXj°©Âà\u0005݁g\u001ae—$N×oí­–\"hÿޝ¸é»\u0013™–Llýì¥~ÙK\u0014Ãw!æ‰øu\b\u0018îÉâ“\tç\u0003þ§I1¬ùs.yƒ6ò\u0003é‰Íb\u001b\"½3À#= FR Ãѐ‘@\u0005˜f8¢lÇ\u0004Ÿ@\u001eU3u¼‰ÂÛí }\u0017™y1~\u0011\u0019F2ˆ\u0000¸O6\u0018M\u001c¤Ü\u0006©Fëìɹc¯´5DÇ\u0017\u0010r–yA¦n_¼šøY£F\u0011ó&#\u0015\u0012\n\u0011\u0010:Ä\u0016º;]ü&’Žµ…ä[ui5f+FÝd\u000e\n„œ%–§>±\"\u001düÄýeÊ{j]$\u0004äy¸±ÑÓIÖì}kVímÁŤ²Âyn\u0001€zg£¿;;(Œð½\u0006\u0016­kªše\u0010ͦ‹SB\u0011\u0013\b\u0010Î\u0007ž‰Âú'Ï5µ³üéõ…w³\tm[©F¶\u0011ðÕP\u0016A#lÎ+= Çcoy™MÜ= ›ðÙ[w|9o*›}HðŒV¯œp€D\u0006ˆ\u0006ÅÿÝ6= óœòiž\nø~Ê¥¢mÑ¡ÉÂu&zWŽýـ\u0017I{.‘\u001f\u000eÞñ‹8\u0011zhST2ÞÏ\u001eòê&[ù ø϶ê\u0004XT1\nâÙp+ UàL:0hw\u0002³6\u0015l\\K‹å±öÿ±n‹÷øʦ4s{.;\tú\u001eÔ)5HnBê)Fn55‡´\b¶”Å¥\u001c¶ßÌ(\u0003\u000e\u0001T\u0007íÓÓrM´gUf­N&Æ\u0016jˆòwÖ6pl\u0002¡^r­†Ò™»Ô‘R¾%\u00037¥†µAŽ~ùú\u001e/3Í\"ÅÊ¡HD\u0010\u001fot…¢\u0017\u0007xJúvø&VðdP=}\u0019ŽÖY»E¾t.tŠaŠ’Ó~C‚\u0001XíôƒèJ(ùØ·j#lv-×]$ÏÚ[J†à\u0017©xºý:©ßY\u0013 \\ˆxáN= «U\u0004H)vð\u001a»\f\u0007†óíCÇ¥\u0011\u0012­½\t~Í^K\u000bÀõñûNü^k®BR^\u0001½žY^ýŒaì\u0017ßÐ¥APMSóáÄB™zx \u0017ûjŒ)òA\u0018\u001a\bÔ\u0007Ô?Ås(\u001f\u0011\u0012M«°riàŸ°$R/†¦>ˆ\u00079¿ã\u0000…²û;!\u001fkNß\u0019].¿ÛÙï»ÄÎamQ2û·\"ÈF܁.w†æøÀE\u0000ËÙéRCèsOU7eÖaôû\u0007‹\u0012\u001a(˛²%\u001b²ÕTýû>\u0004ºÙ{= ©áÇ\u001a\u0012\u000f¨\u0006ð\u001eÉf0½ç‹\u0010Üå\u0015\u001ed*·Ó÷òÉêìÉã\u0016hQ3ؽ÷vì\u0007,÷mr—(\u0001~²L3˜\u0018çÀ\u000f\u0011ª’ê§fM\u0013\u0011öv\fI§©ršrªr™r©ò™ò©òšòö˜Ö\u000fQSÉ͕@ówBÈ2è¨SȲ٨ßȲۨïȒíw$®\\\u000bàâ\u0005šÄ\u0003\u0011gÜ\u001a®l‘a\u001ad„àp6*= =}\u0017½«\u0013=}³= E„\u001c?U¡o\u0013=}–è²1= \u0011ø‹zçZäú‡ç²Á\u001c¯°ú4U¡%ö‹¦= %°úpÓi…ç’›= ÍÃi„U!+^!Æ\u000e°¶ìê\\f½„ô«\u0010H½ô\f…\u001fqå\u0015eA‹\u0019J“Uúá\"RQ·ä¼½Ù(¿¼\t=}iKssÊ°\\&¸§¾—\u0000\u001cDðÅ:â“ì\u0010tb˜²íUI’§J2Our®Ô\u000eCŠgÃC­§ÞC¿Þ¾°\u0016\u0000²§Œ}@÷àÀC€ÑŒ\u0006\u001e¡Ôè\u0015tE×ÞÑ̡ۛêCõzX7+$vš†š®ƒ5k&Ýùï8H=}Ÿ\u001c§=}\u000bà_§ÞâÚ½Yé?\nòÝ'=}â~!鑗«ß¨ò¡†i\f»HJ\u0016\u0014€e™v\"‚Äí¢\\֜QK§s…é¥Ï¹‚W³ lI\"4sup™ë æ\tÀ:u]¯nä—û¾Â¨ôXbÔ-VFåÍí²\u0000_¡o€©é‚+T‚ê×Aœ6¸ªpâdߛBZƒ{˜\u0002BÓÿ<ï=Mk\u0006‹í‰ÏmlåeoäµPµ£ùØEY)uZ = ZvÓý\u000b–3¹ÃN‡‹Ó\u0019ë/¤!áôð_ƒør¦\u0007¨þÝS„áÚl,!ûñ¨6š¯Œ”Wµ\fÕ)\u0011Ѭáèàɦz\u001f«\f~­Û;T\u0019q\u000b\u0004íY’ìi\u0018ú\\\u0017YêïBNð¶PÉK\u0011Ieóƒx}x=MŸkõN°¾+-°\fä¯z=Mb§fˆWFu\u0002:#\u000f= ÃêÛY†1´\u0016ý\u001b.Wi\u001erÅ= uªo»@\u001f\u0018b‹4Œ\u001fúGlT\u0004}Á„t\\\b¢„8è„´C³4·\u001a«'•\u0005cüÜá£Ü‘\b,\u0002Ì\u000by\u0001âJæS\u001eYô·9Qœô­\u0010•\u001aNœ4óá\t±#Yº8‡)¿\u0011³Q¾\u000b¦Ar4\\J«ä^væÔ^Áé}·\u000bA\u0001\u001e\u000f,ËÞô\u0007Vb\n\u000b$®B\u000f%kÂé?o°B\b/êcvá¦W›²°§xc\u001bT\tm²&JhÎ\u000e´ŸYa¸ÁfRÜÐ^E\u0002Ó3\u0016jB{,Kæ¯Ï\u0015Bá=MjN_a<;\u0007!G/¸\u001døߍ“íÞЭ= À\bœðÏê)Š,÷Ÿ&´(Q•\u0018\u0013ã2ÿ\tÚvš6æ\u000f= d+&4ÈlXå%¨6\u001fÅåi‰'YS»VMJòÍ\u0019z´ÿÃ=}ÞÃ¥QóP³Ÿ\u0010(j•Út½dœ}!·\u000b¨b\u0004€ñՋ\u0017JÏ&(ýëÖ39Âkv¿©¾Ù|;2*¶¿H\u001aM\u000fçZ¾ó˜?;\u0006bŽd\u001fÂ\u0004±ÎÃ7¼@ô\u0007\tð= u\u0003¿=M§ùJV¿L•Þ\u00181ñ'ܘŒQæ?=}Ïb©ˆià2’eÖ´›ûŽà PL‡©\"ay\u0002¿O/’kún¢ml\u0017ˆLÕ\u0005ÝÀ8 \tB\u000e𦿻ÝmÖ³+ÿWF¢ n·39íL¡Çoúd\\÷¨þ¹Á<&\u001eD2@Çϐ\\\u0007Í®y·\u0006r\u0000‘«z¹nÝ\u0014!*Z…\u0013qض§Æ\u0018L\u0010­—Fó\"\nÂ= fbÄó\u001bÕç\f‹9= …Cíë\u001c›tÄïDAis=M‚÷Lýhˆ\u000eï†c[Áç\u001bú@Èn^ÜæCI”íŒr\u001av(WgҊ÷R݄õúK™\u001aËá>j]¸!\u0001Ó\\\u0007ÏS¼Ø€SÛ ¦îj¥\u001c\u001br‹‡\u001ce„[•¾…HõOhß^›’č\u001fLçã-/n¾[0\u0003¶Ýÿ&PÂûB\u0001I\u001e띝º8Ðü\u0000W\u0003\u0010p¸RÇÎ9\u0012;¶mö*¬grcbµ–‡5\u0016í:Í.Ë}n¯J/\u0000>=MßÑtEQFM·€’»|\fTÓ²Ø:W¦¡&Kk7¿™ço˜øk˜üː\u0001X$qà\tòñuÁþ·!•jQüÊ\u001f»þÈ\u0000V·F±\u0012Tñ\u0010S\u0011\u0010vÜï¹õ\u001a’ö¦”ʲ¿ ’vÈ7Ç\nxÐ=}\f\u0018£Æ¸xa\fl˜òҔéõá$cƸÃVHRθ®Ð#±\\»\u0011ýVºØ¨2.I–Gœ©wöõH˜9ó½Ê\u0004eò£Æ<¿Ð\u0017Žo,xýO¿\u0011~8\u0018\u0012ÍʁµÃÃ3Ð##øL6ˆÑԈ†¯ 0’—\u000fÀX«C–Ì݆/\u0013Õê\u001fSBKÆ¡kY1ÛZçÚþØہ\u000e oõú\u0006™!Iïpê5kïì[ùg. ˜5Gœ±{g!@gm×ÍvüÍVî›K^\u0013ý‘MÄÇAÛD‹r\u000bÓó‘üTæ\u0005\u0013\u0013\u001aÙrŒ]¢HÀÉ!Dëi£?ÇØ)·\u000fgW]€%³’¢\u0003\u0013\f\u0006æ…áÞ2é½AÂ!­2f>=}Ú= \u001bNßä3;wj¼¯¶\"Ȥˆ·¥ÿÈµø–RÉÉ×Áh4\u0010 \u0000è€ ¨Òjv£„ÅŒrð\u0014ÐXa\u0004*i‚\u0016î@áþþTšUé¡ù\u0001vË{E{=Mb'¯}²“qcõG-¼È\u0002\u0017üþÌmüº±QÁޚ\u000eiÒW˜\\e\u0001ËÑÝP5\u000ei@Ι\u0003ź\u00170)\u001bÖÂ\u0002\b#– X×\f 1’öÕ»ÚN¡Ðu)Çç€K'i\\\u0015¡gÚǝÛG×JD­ÍÈó½rˆÈ\u0017~\u0015ëì-ó+ˆ\u0005ηßë\u001d˜VÕaZxMPA.\"0¦®â…~\u000eÝ\u0000#5\b\u0005ôùÁ-ùþe•ÿâp?‰\nÓ{¼«•z\u0003”UõRø^\u000b¹DÎÑÇ0ÆwíÖ¼i\u0018K_}\u0004G¸\u0018¹ÓÐdö9\u0019,(Æûá;$U\u001dÖÝ\u0002ãºV˸Cu\u001dùf&©n\f4h0\\qÀ\u0013ÛM\u0005[‘Ôz«³L5ÃG\\ÇÐʏjN¬q\u0001\\1\u001eÝáÐ@¼JŽ>fvèûnýgŸ\u0017\u0016òtæ˜3Й:Q±]\u0011鼫eÄW؈(d5ãÙMWQ\fKžîƒ\"õq\u0015ïW5êӐÇ۟d\u0015ڍ‡Ú\u0015\u0014\bò‰mÆ͋¶G\u001b,¾Ã$¹þ5|cJꬾË+\u0002K˜¡N§\"ÚÅ4Ž·#Ìü¦ÖR¾Æ\u0006Ø0JÓ²#û:c\"WÕàEm4\u001aÁôø!¨Êº8M®Ü†3Ù^º²ŽF´F´F´F´F´\u0017¿SØW€¶¼Fe\b\u0011„qØ|eÄÔÇUÄ6¸VÀøyz§˜š¢ÝÖI$ðT§T¬•k\u0010» ‡LœÖ€-~=}Ä×¾]\u001bñBm¶³\ta9H|ù\u0003{zV´GFTNE†\u000bFvpkPýa•\u0001ÃñÇdZb1Y~1^αfÖ\u0011cL‘_4Qa€Q^hÑC°îì\"ª‹HxÇÇ\u0013t:}³Ï+ µÞ˂<÷°\u0003ˆ–K8ƒ3ŽZKp‚¯–X¡“ÅY\u0017\u0003²~( SF4„OƋó)ù8¯UR-‹/..\u00044–³x\u0004°J\u0016Ԃ¿Ö\u0013OümFþï€áÀ\u0005\u001e\u0011Ô¶ÁVD®\u00022·R\u001e¢\u0019!K!mìßÌtþÑ8[EZÙt\u0018ÕE—ÉZ\u0010•¹Z8ÑZÈÑc¨ÑYPQfpQc ‘h´‘g¤\u0011= l\u0011[Ö±b¦1d¾1Yrqeªñ[—ÁcOAgӁZc\u0001^û¡= õ¡eM!^½!cý}!Z­¡aõ\u0001Y«gÁ_jq= †\u0011h°ù‚#\\ãÁg^\u0011ä(}ü”f\nìpêwt¤;\u0005§üKA‚ß¿¼\u0012\u000biÈw\u0011]©:~\u0003q\\ !÷'C^.Qg]º~Cñg&‘bøa¡TkñBj÷\u0002éö75”ZîAd=}‘%\u001269\u0001Xõ]§­Vbý\u001b,³\u0011dOø½kD‡7égÀݼïz\u0011!ù¿éa\u000f]úì:Q éïë]\u000bwŸUýá¼Xólk\tÅØ?%nˆ\u0015 ñSX\u000bÿ» %û›Ê֒\nPxòLni\u0015S\u001bßø\fèq'9\u0005¥S!Ò!a1¡bZÑ]âh\u0001= T„˵Ùw˜\u001c\u0012F7ñlZ‹,*(\u0006Ã\u0014!ñô©gō‚ÝÆt!4üÔk\u0016ÓK¡n,Ó5bŠSœT˜\u0010M\u0001wÍ\u0004Š­ý~½l'\u0013w\u001e³l$“,Y\n\u0007\u0007f\b\u0004ž„›U°;gô#Ö3!–³$ü”\n§Vò¸úkò\u0006îq\u0005ÎuþF1\u0001\u00161úވp»GpëÇl›ön÷wo7kk¶mÿ¶p\u0007\u0016nw—ogVm\u0013WpwQ#ŠÖ~!_Lz\u0006>f9‚'í$²<1\u0013ï´+9\u0015$øì3óv«Ò=}oÏ}‰-\nn~J‚\u0006N!<Âàk~ŽÅhœøÅ2ÞIÄ\u001féVP‹=}²+ë x2:'²ì=MmrR¹\fݶ)òm\u000b\fL\u0014)º\u000b\f\f\f\f\f‘\u0004BÜ×¥Áv’RoO¸–|’4Ò?M€\u0001<ŽàËÄoC\u00102ÌOÁ—\\ÕÖ¸&xçx¶vs¶,Æ~PW“í¿ü‡ˆPiÄw\u0014VG\u0013A€\u0013ÒÅó¡ÈS,—˜= \u000b{Oƒ¡ìŠ\u0014,= åþ@Ž$…LÁÁøƒr‘$,ŒD\u0010¶1R\u0018nQ¢çÀŸ'\u00122hÂÞ \u0010ðÁ‹\u0012ùÔtÓö=M²â€*ª\u0001ü'\\©ªYY,èbSဧÚÃwV?ÀÔxV¿rԁÁP•×¥rаxÒÊV]GbªÈñ:UÈGÓYr·Ä@Íjl‹@©\u0000¦…¶= ’œ©¬\u000bDÏeÂ=M\u0011Æ\u0006ö\u0006Ç¢uU~ñþÚ\u00051kXmñÒäw°¢Ì$ænü‡\b\u000e㱌Á\u001bó~d­\u0011˜e\u0004|\u000brÏeî¾\u0004$¹ˆÆ×Åц´×¾·\bRç¯N×Ó\u0017˜K\u0017XÏRʨ\u0019Ù\u0013%\u001d\të<\nòžŸ¿a: õa'uaDÊá—\\\u0006Ïî°c]åQB“÷\u000füü '\u0005…µ=M“Ìnù×1;Ge\u0006bN\u0001\u0007 <Ñà\nJ\n\f=Mc§Ž\u001f(‡4a3þ\u000f\u001e쏠×A^\u001c¥ÔÉò\u001fcö^\f%¦¾ …ªìä¤D|ªà_„ÆfG5aàÉ܃žºÜCó‚\u001e\u001fg¸KzVdëD(¥šª}ÎéÊ£\u001e”Q\u0019m£ú\u000e˜Dl$Dď·T§Ñe—êÄ/U^\u0013J~q¡å&\u0010\"„‰«Ýyš]nz\u0014zð€¼S\u0015ZÈ\t*Å\u0007'ð\ba\tJ\u000e¨µZJ ª\u0007†¶•BÄ_\u0001„êPT;÷&•Ð)&õpšf¤ŽŸ´n¯û®“J\u000b‡~wVZª;@J\u0003‚&¥-Œ\u001fh\u0000ŽAE´vd= ­O\u001e\u0014§Ÿ6ÑÚN»;Çô(´1”S>ÐF‘³’ñ‡\u000f’µ3¨®Q\u0016ʃH Ê‘óè¹äeþnŒž\u0014û\u0003Ä=}\\Ek\n»swR#¾ô°þO\u0017)“ßeþ×ϝ–õH™ï–»ÜÊrÑ\u001fÕýë+°N\b—q»ŸÌ\u0018Œö\u0006\u0016·nK¢…zĕò\u0006–ÇŽ¸ÅÇ\\,\u0006¶ÇÖ²©øÇ.°Ì\t¬-.®­y;]Z9\táÐ{Ä\u0003\u001bwrs>Ú­\u0013qzio@_yª4f·À2ٖY?_=M¦ãúRÕä\t'n&îÉ\u0005Ÿ‘\u0014|œ¡Wµ§ÑܼŸn\u0017\u0017™‘Tnhøå9\u000e<æ‹V\u0004 éν+}ö‘^¡$p*\\ti\u0007\u001aK_‡DNÀ¢:E¡ë²—ò‚â´\u0014§Uÿ#„˜Úðü6]-flI®#̈cíT{\\ËÂaÖa¬—\u001fXX·x­dÓ+–=M#Œ}=MTG oLP¿«ru÷jwZDùÀxÐØI'ÌÒ¿-O\u0019“^-Z¡+ôKìîKp\u001f\u0017·¼Uû¼Å6[À´,væÉ#ÀǶÐ\u0015©\u001a£V2‡]Œ\b\u0017h\u0002̽\u000evŸ†\u0001P×jVÂRU7Ȅf\u001f\u0011T|\u0017ÀX= Ì\u0006†ÙplKH#³Ô¬²úCTä \u00118\u000f¥ÒSÈ,Çÿ*ø@f(\u001a\u000eu¾þ\u0012 æ‘\u0001‰Q\u0003Âõ7AV»=M\u001d\u001f\u001f™ýýçNI½–\u0003°ËùuP›š¯Z›Í\u0007.Y{ì)~)„‰6º³\u001bd\u001b2zz‡­ÌÓ7ÜÛä>²¥¬ã\u0012›~!Ær¾Ns¢L!°\fܘrg\u0014Îj93gT\u0003Àüf»\u0017EκQ}@B$S\u0014kPi—¿\u0013}·Å¨Ý\u0006¡ÀLÝЋô«I\u000f ×´ùv \bÕÇFÇz ·Æ\bRl<ò_ÀÎñcÍå8>\u000f\u0012gw!°«óB\u0018Ož¨“L\u0007÷4Ê=Mt\n#̽Å~G!H*ð‚\u0004+$‡b3Vš¶Åd­ÛÂ\u0002§úÖSð}¨’óÂ\f}”Që\u0018Væ<ÄçW:n•O,WŸ<öW\u001bS\\<ûÐVÑíÂE7 ³r(ñRŠ4tÉ\n÷DLîø\u001eÝ(I=Mˆ»2L§\u001bSu\u0004<ÈP»î\u0015ó ¦IÝhû֊p¸óªE¥¤Q…ž$! Êñ‡;Ã=} Iò\u0014û\u0016›\u001feª…¥6&²Zæ\"a\u0018vóêØ&=M\u001a“mœŠNó´tÞ[Ú÷\u001fƒ¢\u001c\u001e––\u0013ðjî= 'þ‘hCýÍ\u0000xf!Ր\u0006b= ô‹÷b\u001c~ÁX=}ߝŒ–×\u001fÆm£ˆŽä= ï·\b…\u0002õ†À®›\u0005i\u0012)\u0005š¡x[Š\u0007.\tý;Òv¢!dÁ[*\bæ?:•rhñÆvŠŽY\u001a‘üUq¨UŸ\u0016žqØù/¨¼\u001a}\u000b— ¯Q\u0013û¶a\u0014\u001bÜuD9øh\b\tðÂ\u001b·è­\u0018Y=M= È\u0001,\u001bTà\u0015g¼R'ŒnñÒ\u0004ñ¤í\u001e¨ªEÏ\u00193gª˜mãþ\u0015$Ȫ\bûKøá- \u0010i'9?§À\u0012Óûö™Î±ó¦åµò³žÃ¶Òß|Xä•$¬iÃ\fîÂU\u001f\n\u001bLK~È|è«Ê\u0015dJ\bŽ¾vÉiÊh*\u0018\u0015Ь¶ ¿!ЫßÔ÷_\u0014Yʶd@\u000bPUžJ!\u0016’ï؟\u0001XôüQ\u0018S\u001dvǺ$e:|“ç\u001f˜\u0004À«(\fí\u0012ƒîtú\u0016¦4±ÃŸŠþѸp”BZ@HËí«\u0007’àÕ[T™!\u0018ü֝®jlJǗIðwAhad\t8cÏh‘c\u000eòÆÇý¦vl7žö~ï«2\u0015§Ù¦¡\u000e¶\u0002=M¥\u0004!\b¾ôµxÊHÅp\u0002„˜˜­\u0018¿Ø_^'^\u000e\u001aŒËw\bzY=M^ãEæºP}\u0007m¼!ì›\\ Ònðüà\u0002œQ6fË\u0012–i.uaª[ښjà\u000büXd!\\\u001c\u0002%ŸÑp¿\f\u0007Ó¦ûï9øvò] b%¹= \u00114¯â¸\f÷\u0018XYÈÁxrÔW\u0007yì¤Ò=Mû±\\ßEbeúsì%ÖÚ+ ßíÎjÐrì2M¹R}ŠµYԜTR« sîöù\nU«Ýà9\u0010Ó¸þX®ö¸\t\u0006¼ÒD£>s„= \u000b\\½\fPÜ#”\u0019\u0004f\u0001ÜȽ÷9¤\u00158\b¯t¤f¼‰®sT±\bDnL¦¸š¯HJ\u0010z\u001b±ûЇêzú_*Gõlé•RÑO°iSÉþÇáÇå†qp<Ã_Ô¡Š¯\u000eU\u001ad±ZLÑu6\tÓ\u0010þ.Ô@ëœÔÆ®•ZMåxžˆ†å\u0017þJײť= Ã|\u0002£.­Ä5ž ýµ¸¢DŠÃA§½#\u0017š·\u0010úÎ= Øˆ\u001f\u0000\u0001¾Ø\u0014žŸm\u0004N[p\u0011ã\u0018Ve´\"Ñ8iØÈãeX¨g½\u000f\u000f›Œ= \\†D;¾x©S\u0004ÇÞ iÉø¸T1ÚEqι¦ýþÉ°\u0016\u0019ãÇèhJ\u0010éÑ(¸YÄ,f\u0002‹˜˜°ÙžÕx”\u0019—ô›˜ÊØ×^@\u000e#L×ìËXœÁØéòÐò¼\bkj(9w}”´^¨Ü2\u001a+³Ï‹åÌÅ+¿%+\\Ño!c;\t7j\u0013[jx\u0013™ùÿûÒ\u001b\u0013{[á¾iMœÐý–i·ç¹Þ}’zæŸ>Fù¯°¦CzêjH\u0001^Ñû\u0001¨q… Å‰G™3™\u0013yVŬ\u0005µäÇ óœ%\u001bܹÊÝOÀYõºÎe\u001fsš”\u001d\u0010áþi·'ÔôÆ\u0018\u0006 nÎ\u0018\u001bډ4…øw²¸¯\t§Ôì̘&«Ð…É\u0016ç~\u0007Ô^= ÷µ\\Í>jÃ(%¸ l\u0001•qÌ켔ó\"üÅd@\u0018*t&I\u00163kÉȀPÌÿ÷\u0018›ó\u0013:‰Þ(ºª“¹ðÅ\u0010„Û‡ÃÀ\fËpgšöúVÚmÁZ1Ò\n0jS\u001aÃ܈j)¸&’KŸ\u0018bØF2ÚýFØ(Ř<‡uîW\u001bXŠ3(\u0010÷bŠ\u000fýÊԆðِ½6ÐP\u001bYU°ºÈ×ͯ8Õ\"Îp\u0004DY¹Ö\u001as¹T¤}%|à…(;ØkôzǓ7u¡˜“ÖI}òØJÐ.cW\u0002ºX\u001fª†0öóù®|WAqC­ûž2ž6o“}ô݈‡#&YuRÜÃTFÕçŽjC*\f\u000bˆ\u001aNÀ\u001b.+-nØ(¬.à-nMJ‰\u0014‰”\u000fRMX\tIÅçIRï\u0002¶±#Æ\u0017\"â8ômM€6\\m\u0006¶F©\u000e\u001c<Ì2P×t\u0012Àµ×žÆxpE´—#%˜\n—è'Ò\u0005\u0001¨…~\t´Ø\\œz´íÍå}#ý\u001eíµÍ\u0015©–ìíkÈ´\u0001ÓÂ,©\t\u0014ƽƒ\u001aºF¬ƒºÉníïµ.uÏNë^0\"sÃâÖݯƒ!ÆgHûùÄX­M#êZ\u0018~®\u0003ċâQÇä\u0018™“\u001e¹HÖÆfl,áщ\u000e\fØfþĘ́&Ý'rÍMugù¹\u0000²VKWíZR\u001e”\\ּ᭠#HE&þ©Ó}\t,Ö\u0007ÚW8e€¹\nÚ|¸NGeˆýi/Wý\u0011{\\™\u000f¼(Ü@Ÿá]ÆÐBå6\u001bšo(ô/„,ÉdÖ­‰ÑéÞl)\u0010¾\u0004ÇíÃъªòŠí¯HJ\u000b\u0011,\u001b\u001a» ı\u00017\u0000±Î·\u0007îßøX­\u0006£\u0007[ƒÖ\fŸ\u000f£ŽÖcDEÓ⋵9´ÓxR1À@wµˆ•¤É\fG–w¢piÑÑN|µrE&†D\u0011=}M\u001f/¯h̒°YͲ¸³ìé‰ïJ‰ý¯Sǵ̘¿ÌUüָГ\u000fÑƊÀ1¯¾‘\u0016=M|ScV\u0003íÁG\u0006$’ºÞ·sT\u001c¸-Œ\u001a;\u001c•€½Í•\u0012V¹mV:Â\u0017†)}ƒÕ\u0002\"T][*\u001c&±\u0015¬¼Ñ\u0001À…'!è^+\u0004˜\u0012‡ŸUÅÌx, [?ãÌ\u001f….ÐpÞú?hX½W1 \u0002ã&üfX´p)\u0011ӕÆÁ·*,Í\u0015ÍÍ»\u0006¨\u0001Ýp\u0004ôÉj°¹¬p\u0013h\u0001\u0011“Ròž= 5\u001a¥jËrWê\u0007–¦\u001e|´'‰]‚¸¿ðÿX%Ôjçc\u0007\u00060Ãbz\t¶bȈ\u000b·ç\b\u0004Øs:î#:/o•Í×Üp\tL]Š”Ïß*g\u0007\u0007)M¡¢ãy‰IËדðÛÕ\u001f\u000f\u0002\u0016l\u001bß´‰Œ’u\\͑J¨ˆ“+±\u0007cÄ3‰e\\rü,4‚b¶c= ”\u0007ßBU‰|iÖ¨\u0015áËè\u001d€8\u0012Pôq,Ñ|TÇr‰³¤‘›I[ÐôÜãËs\u0013|\u0016úa\u0012{œ\u000eU8RÌÉc³¨DNÐ)‘qø˜R\\Lكã\u000b”yŽn[ ]o¥b‡õM’š\u001c‰Ü\u0001aììt˜I\büßâ÷´(æ\u0005\u000fÏ\u001céX<8jû^ZÏ.02´\u0011ªÖv¾ïïÞ¼\u0002 šÆ·>U·UÑÆĸ\u0001\u0001%NU\u0014ÃbñÝV¥O7ó“\u001fôÌDÄ#×4%º¯ò\u0000\u0015®ÜªÍÊ\u0006Ê\u0017+íQˆcÕ^Ìv©ÚRv}eòíÇ}=}Ç\u0012– ä\n¡´V\u0003Îv½\u001f8}1ŒÔÌ\n\"ã\u0014¸pôֈj= Ÿï3µqËr™Ý܇ï\u0000ŸðÐ á&we鉪¶.©”,aòK>Îo–xõe†Cÿ\u0013Ðé\u0001,ìÄMm÷ |ê†\u0003ÎÆÝï\u0005\u0004“’=}\"\tG&up\b´%™JM›Ïáøù\u0016™Ï\b0,\u0002ê7§\"v‰~gYZØ{ƕ]\u001c13GM¦\u0003Û¤\u001bO1= £‘¼\u0004b“Žœ~Ý¿¿rÏsH\u001bå\u001c)d\"3,†\u0007|\\ë\u0004S\u0010•ý¹\u000b\u0017ƒÇFZì\u0003\u001a’|xë)isæµ\nêC\u0003ˆÇl§\u0000irºÓ‰aXß\n¥KÏfWP¯ãês²ÑþÑßÿ™f\u0012\u0007zû¿ºÝrÉ\f\u0010Çì±êüC\u0001A˜ô†c|ÄÇé\tªqv΍Âõ?ñB©†@„m\bw\u0006=MSòTvِӤ»bƒû-ÐÀFŽFòÝÿ_ß¡¸–Ã_—\u0015”+ún\u001f9ƒ×ËPH¦Òa:‹‡€$MVw‚y”4èàÕj\u001d\u0019\u000e [®ý\u001f´°}\u0006I'ùéJÿÑÁ§où\u0015Žº¥ÖJÝëÐ)†\u0000£\u001aq:™Í'oؒX•ÊÃÕÛn†\nÝçö\u0013I‡Š!]X8¤Ï­aÿ9Š½8'Ëu\\Á=}«ÇãOíZ˜¯ó@¬tû¥\t€ÀVî˜=M\u0002\u0014u6\u0010֍­\u0017\"K• †¦ŠÕ+$Mü[Y·^\u0010Ó³æõÅ\u0006¯Ô¹Ê†8…L½8d.À\tœ‘r÷Z\u0012\u0014b\b\u0017N\u0017GT¡W\u0019ôT~«ë8՛S¼ZÇHÖËc‚Ÿˆ›Ñáesϲ\u001fë1êÀW\\kô?q³\u0017 3Ø$hñ\u0002¾\u0003!ÏWČöƒ+·O4ûŒ–žC\\ªÝ\u000fï¸mXëNÚ$\u0006®ªØ\foYc“/Øö4ê?ñW¾±ë&H<ç'TGÄ«ÝÛ'à(­Á/aJˆILAFûÚbY2߯BUíEî)Ô\u0005r™†‡—5Ҕðê|å<Æ(›%È1»y¦ð\u0003>é±E\u000bQ±Dæ‚v6éuWvYpÏ£].,\u001eÑÂq9“šPÞ3ÂéQ\b¢á\fcKÑ\u0017¸Öœ\u0013à\u0015TØÌ0tøé!×\tO¬ÿú¯¶´íºr\u001e9𰃳º~èW\tÒ¾Š×õÛXïâ1x\fgü\u001fb÷wuÏ/Ž¥ê†4°•Õ\u0012Ú̎?D\u0000\u0015ʜo†\u001fG/ÞÝ\u0003î¸\u000eÔ\u0007è\u001d£‹\u0014T\u001b$á\u0005Qa¤$øã\t|9>cý%ŠYhç¶-qP†o™¦ü\u0000v•F–*ÏððVìZ4ºµ\u0004^ˆ\u0016ŠÄ9RV\fÚ\u0018¾0›Œ$\\é|UøD$P˵ѱ瞘\u0000ìÛè«ôç­¿ŒÊ€ÞÔÇ\u001eèë1\u0018ëˆ\u0016\u0004oh\u000eè7\u0015ÊZYc\u0001&<£ß\fc‚óI¡×öê¹vl{í\u000b\u0000+\u0001E=Mr/\u0016Oãn¾Ç»ˆÕŸ\u0010‚0^ø\u0018>âÉ­n®ßR+íG§¡)!P\u0013bñ~îXb\t-C¿û°k\nlm®¸Ëè(\u0006¾–Ê\u001f”#è£ÎØ\"šSÂ7fe\u001bLM”Vk±*w[¦ëz\\e–\u000e;í“ÅOZ°»Ùç×qHwçíu\u0018gZ*óè”Ô(·\u0002”f›g}¬óÂ\fÒQ™X¿í˜VíëÿD Ôu\u001be‹¨7”WÎ\u000eZ\u0000—ÃÎ;:ŒÂÒäL\u0004NhIjh+ÖÑ\u000f4ã”Åþ,èDSü¬4k\\D'+1~LDËs#(¥\u0011[ð\fB¶pÏ X 樸Ã$zÕ[Â]\u0014€©áݏ¤Ê\u0002õ\u0018ꇰ̝äRÆWÏ\"\b]\u001bxyu\u0000\u000e£œelÉ\u0011ŽÇ¶®Íd‘¸s\u0004”\u0016\\›m®¢ôI\u0017ðÖR½\u00012ÏY[+P+—q¾f‡\u0015‰0@\u0016z\u0019U#îl\u0005Ûé¼\u0019StŽ3÷LÊÕ :B8Ã\u0002]ðãÏAÒx\u001e\u000eÕDÀL´\u0002ÑðqG¡vÑèÃ\u0018§<¾æ+i©ÑÂéí…xbçç£Bؓ¼xF£×·3Œ\u0000ÖŜ7Ϻ¹¹¹'IfÖÔ QÀoÆzß\u0014ߋ̺h\u0019o\u001d¸Ø…äÑŽZ¼\u001c\u0000¡´úìL vÇw»ÇT:WdH‘”í°Šß°ªº'\u0014õ¯vGe\u0002«-IâDžòÇØ\u0015€€x7¤ iHl8§ì\u001e½@Ã(¡‚ö˜%þ¨[L~䜈<¾™oš×\u0000˜¢a\u0003\u001arN[“\u001d<öDš«¨µ&p–NM\u001dîy3©Á'w¬€2ɱ—€\u0006T_Ѳ-ç£[Wb1OoÞ4\u001fC«w\u0005Wo\"-#“y\fHÑ\f¤e’\u0018\u001b¯þ°\u0007ˆŒ†_M°äƒlŒC‰ò87µŒDœt®üâKøzäS9«\u001f¾¦‘&~^H¸˜\u0004üƒà>\u001a”ÿØX¨Vÿ…1¸HBw/ó\"-æ£\\\u0003\u0010H–°ž]°\u0003\brTžÝ±-â£Eé-ÓÉÕ|ð\u001fU\fÅ¥oSŒÜFƒù6©¾Ð„ ‡\t;}’O“\u001f*¦˜\u0001\u0004K«ÞvJÆT”éüwOT\u0019‰X…= gmM\u0010ã“\u0012\u0012TLÚd¤ \u0016(£\u00157x'\\M\u001aèõ\u0017õ\u0018kž¯Üät¿®ˆ(€Êړy6hV6.Zžü;\u0004Õ¥\u0016éüƒà¾\u001a.løÒÈ\u000f¹ƒ¾\u0017¥T\u0010“‹&®y¥ÿ\u001aæ\u0000°à¡æQW= Œ\u0006…rç®c‚kM\u001a¾b<–§6œ¤=}4ç= çƒ\u001b€\u001a“yc”ž †0ŠØÊ~´¨Ý_ªBiÇ?\u001a†z¼u\\‡;¢Hí®€z\u0000vßÂ[ÃÔeÏb˜[D\u0000î69§Ô©\u0004vM\u001a®4Ì\u0018€7Ÿ¦ïÈ%Ã\f\fÁ\b£d\u0002Ð÷“49óê,o¿í¼­\f„óDST´-èƒÞ®\u0004Tð—\b›ü-0©©·À>\u001d®y\u0005¿*Ö%˜ûÕ\u0003”̶:„ÜM羞-\"“4ÞÆÔ:TEØ\u001bÕ±u6×ïôC,ÞÂ[ó}œ®Ìä‰Ä\u0014̊§\u0017\u0004«Þ¾ý>0õ§ ª¶à%+¶Ò„Ë;\u0003þ¶F‰@ÈÀØP\u0016èhQmŠT­ì▇!ð-ŽX\u001b|¸pIėkvö«ÃÖ\u001e2\n¾#zäƒ\"XÕ=MÉë'fL/†“\bŽ‚÷m²\u0007‹Q%1ˆ5\u0005tªUIO>¨!= Cž-æ£[ƒÃ\"X%•a´\u001dÞÎ3\u0013\\€(ý«ÞŽ¯Ø«X\u001cçO¢vÁ²\u0001žx'kMPáƒAAâ\u0016lf\u0010ÇOг|EÉð®c‚uM\u001a._\u0012ÌGÁÊ= ‘ð¤\u0010ÿ”\u001e\u0013mð,\u0002Â⣶B¥•š‘ÂÇс‚ÚMkyò[S]âðTïo\u00122\u001cœt^\u001f\u0013©\u0001[õè.±ˆ\u0017\u0007\u000e\u0003\nì0¥Ó\fS)¾“M£y¥'OH\fOÆR5I\u0001Ç\u001e̯Újç®c‚ómÞ.\u0010—·Â»2u=M‰:ˆi\u0012®Ø{•q\u0003\"0æLU“«A\u0016fH(G3±K,ùv\u000bÂ[#\u0004ûÀ³€Éy•šJ>Ä \u0013mî,\u0012Â[KŽ\u0010·APÛ\u0018×ÎËƝɘ\u0001l\u0007{+«Þ.ÇW°;‘ï”Ç'vo\u0011€ßö\fÂëN°\u0010K\u0014gr\u000e\u0006ï~ž\u001dÕ\u001eR\n¾…©¶ÞÃ\u0016Ê7Ԝ‘À]Ä(@\u0006…Ìð®c‚÷mÞ®\u0010Òí\u0016>\u0018Wp7³…ÌhIv\u001cR\n.lÇG©8Ào~Ɵ= WÞW\u0015,Ï|¥z3\n.[óÞÎq*N´›vÑbĕ\u0012Z£évÜ$\u001e)\u001aƒT9\u0016ïÀ³À\u000fº¯Ô—†d#⏂õ=M\u001c)høsÜÓ-•Vx¬uSè\u000böAí\u001a\u0002bÛ#\u001f= KÌÊìÒÆ\u0003Áj§ZDÐ×\u0010\u0013Ú¿â1ï×Ë-Ñ$\u0012VâÅåW˜;C&bë–á´Š>M—]\u0007èi²à\u00041ð\u0016)ƒ\u001bŸ¨h\u0003Ÿ¶ŽXpY?áÃ*ñõ©F\fC/\u0012¢RN\u0001&ڋ‰‚ÕÒc]OC=M¹ßøˆP\b\u001c(¿\u0014›楠\u001fÅ\u001aš\u0018N,\u0000T]¬\u0003ùŒø§ §ó= ¯ø\u0019LÜ<æô?S¬\u0003oÁ–\u0004ldhùÀ¹t6#lCª¾\\‹\u001d\u0004Ãô˜\u0013_?\u0006ÅÌ= T.tKHÞ¾\u001aîv²tA43nZâ&ÅH÷)¿Yyõ”Ø|ÇݓªÔ§·ÛS0\u0001\u0019ŽyÃ&–;8w\u001bÎÃÿ¡\u0003ÿ¬H°îz=}xZV\u0014%{Ð\u0012Ðëƒ Þ\u000eæ“²‘ñöSQ}P#Ì£\u000f®\\C\u001a’†oòcªÂC*\n’\u0016ÁÒ,\\‹yëD·ÐÊpj\nE¼~\"HÑ%{ã)÷->¯\u001dCˆy¿ssx\u001cX= «\u001cÿ¶<‰Æ̸.à5\u001ef\u0017,Ý.¤jên[?áÃJÈ¢ªh0jÔsäœDÓí>³ï\u001d‹‰‚¿q\u00134‡z\u001fè\u0003ð–\u0002‡&= Õۋyª–í†ÿóé¬Ô† vÆ8Áœím\u0012\u0007;É¡a5ÜSÒ#¿Š£\u0004a7ñy3©ðI¢ŠgNÈ©ƒ\u0017ºÍíY‹y8gí h?ªÛh–xˆEŽXyj\u0007A+Å©\u0006q\u001e@M6Ӗ¶@XBj‡\u001f©Œ. Oƒ:\u001dˆ§P\u0017XXrt&’À©Þ.¶v<¦\u000b{è¾ÔO؏\u0016m‡ámÞ.q÷Ë\u000e%Á…¥ =MÄê\u0016ZC)÷-k\u000eF½Aì\u0003q§D‡eL€\u0004Û>[\u000fC\u0013–XgâžÄ\u0003wgCÄ>,ÞÂ[—‰ÑvÍ\u000f|öuÃ&d\u0000\u0007M\u001e}ä3\t\n\u0000>{ò&–\u0017«ÎC)\u001cÓ\u0001ü6©\u001fwB5zòƒÂ/T^Z&v!\u0010\u001c)N\u0004À<—ïíl\u0018Eš]…ßM–¨yäC\u0001ñÉRÞn¡ì·–\u00163x‡ðmîM<\u0016\u001e¥Üvž[Ç縼ë3¢&ÀöÀ½\u000bºXåcZßÛ\u001aí\u001eøù(¡y™ñ÷\u001dÙ\u001d)Ù>}~‰\n\t{\t\u0004ùÙÞÛaÙÛ\u001aøiÍä®\u0000ÝÔܚ‹à –À—\u0000Ëqbå¿ûàÑ\u0019ž\u0017[ëSµ\f˞׼H\\˜¢ãH‰PÊïV&H«$ÓjÔvu›wÖhx¡ÞP>”¹8•è\u0012·ú= EìA¼0Õ%Ç9ub\u0015Ê[4ç\u0010áJî;±ï»…\n\u001f–ÿJÆS“¬=}\u000eò‘e\u000eô@‰µ\tåÛªÕ+\bv5Šfëÿá=Më#s7ÑؘÁ}‡\u000eÆJx2¥‡ÈW&wW×N‘™¿\u0010U÷+­\"\u000fÕ\u0011=Mb’·Šÿ¯ š\u0011Žš[¨\u0001|O何ižÐý/qYO$3\f\u001d¬ÞãOØSmfàø‰K”älÿ-ùÌ¢÷út= !g\u0014= ÂÁ¦½AŽÌ§Ž_ì¸\u001d2ÄÁ¢õ¢\u001b{Å~‚F¡ù,A\u0014€x\u0012é©óaÅz¦e'\u0001žF5ÝÜcà9!kPà,‰‚5d®lî\u001dPÓK\u001e\u0000ó\\a:Ñ= y}°\u001eqŸ\u0012\u0013è]ùsÐsʶ3á„\u0006>h¨\u001eOÒ]\fV\u001fñ¬·¹½l&Ԙ¯|WSó\u0014ž5Š!ퟕ—a4ZÞ%°\u0006º7ØA¯÷n½VÇ@³ðï\n*\u0001f\u0019âޅU6ry~›­arEª%<§n#‹\u0018=}Š \u001bÙÀ£æ¡ö\u0014$’J=M|MUr©Ôr~“ú\u0011\u0004ž{j\fg¢Ì^B‚³¦€‰CC\f°ŒŠ\u0007j=}Ž\u001f7~ƒk÷ï\u001a€—ö»o6‘_Í9ð•nzO\u000e‹\u0007~¬\u0006…XY¢\u0018³‰³9œ= \nR!4\u0004;;5ŸÃXB»É†Y|~Ü!^PlÇ|a&¡@\u001f°äÌVº138¥:žfÝ%?v\u001bŽJÛôθû1sY£{tͦ=}lNãÐ\u0003ër}\ff¶˜\u000e‹Át\u0004ǚ|âí\u0016\u001dF«\u000fϔ\u0015|À\u0016ˆ´\u001aN4÷B\u000f^‘\u000f\u0010LP½õ‡Î¢êë4\u001a.ô×D³Ñ;Sj3x\u001a\u000bSîÁÕ\u0014çv\u0016žµÂK¿Í†R¡ÀK>bÿ=} j’\u0006u5lª!¤¾‰· dJ¢‘&žVÀþ\u001dÝ=}Á¡l¼Ô¤:Û´Xë1\u0013¥ä0\u0000ŸçzÆLY¼\u0007›åxÑð+³¼\t.\u001a\u001f¥xæþȑÊ\u0013t,§\u0007\u001d³Cy-ô˜ D)ÅïºouÚ$¥pLÔ\u0019ìcÎÒm\u0012æl™>Ÿ\u0011–90À\u001eïÅ8f^™\u0016ãÏÑJ™U\u0006gŸ(a¶\u0013[¦\u001fC¥Vq= #8\u000e[\u0007?q\u0003—¹‘U\u0003L‡0J\"2nÊR╔ÏÙj\bä\u0011>ØÛ¢X’\nRmèz“KEC•¡Õ1G5—h[Â\u001dK—Â\f|†÷¨«\u00140i\u00073\u001b¶¾\u0018ñȉàRü*ý\n›4p€¼Õês=}\u001em7\u0001\u0000#”AôošJ\"\u0007ÇZ¤ñ\fÉl[‹Ì±\u0012E;v%ãtƒPúЎq ”;ñ•î¢mæz¥°%ûšåúvDс «\tXÝà\u0014֒¶n$²—(E‰wšaJg]5¦¹SÒöñ†:Çh‚\u001d÷ƒ»£1\u0006£Np\fœv\u0000\u0004ô±\u0001Öv NXÊ?\u0019èè„\u0007»†3A\u0006.ûú“ãöè‰X7\u001cHtù^s˜‰#Eî\u001f ¦‘0Ëâp‰3\u000b½&rCÑZ²³Óq0x\u0019SÑ\u0006ˆø扩|gÖ@o\f×\"æØSõcdœ\f‡ç°ë\u0017—Ûè¬ü\u0011?7€ª¾õ³= µ‚vº™p¿-}èPLÌOúREº²Î\u0002õ\u00025¥$¨VõBâ;c‰\u0005Xa&Ÿ¤ÿ[ê«û5\u0011¿£ÉI\u0002Ÿ\u0004TAÎ+¾È/\u001a[ääg÷\u001b\u0002\u001ek\u0017p\u0003ûC-B\"\nÿ\u0000¾ÿ¦æ,êám<˜¢\u000b=}fÜbFS§|ÒÞ\u0011Ç&\u001c4¿\u0005\f¥óñwg€\\\u0018\u0011‚¾¥\fX2·\u0017É<\u0001\u0000nwhPj8WôÞæL­ðñ\u000b„Î\b×ñs¡hNç\u0001¥G:4gøô<\u001c±—‰Úò|ç£Dø\n\"\u0015cràˊh\u001b;°\u0017MWTŸ=MßH§9×ì¤c¾×¬h•\nFyLÈ\u0017E(Ÿì«œFªU¥PÌ­}q\u0006—ŽA(€Ì¹ó½?Pk\u0006Obދ„±\u0012Éq¯<\nu¸7§ÿØÈñhö»¾È2Ý\u0007-\u001e\u0016Lúºöñ–\"¼(âNÃ7 Œ>#ۊ\u0003°!V\u0015îÔ\nD‰—·dP\u0019\u000bژ\u001fÌƇ\u0003ä›G¹×À\u0013;sðyTz\\g®\u001f\u0015\u0016{bÆTVWwÄ?ÈÜ\fµFì\u0001¥\u0011_ªÀ¤\u0005æ1]7zê\u00146ŸŒ\u0019Ÿøf®—Ý\u0017Xž¤Ìè1Ô\u001cpXò˜>ύ\u0013COßêÊV\u0002Ð\u0004Cq/¬%ԇ\u0005/°ÑLµ™[Þ×3¡×÷šMÌì¡ÕÃghÅ%å£Ýái\u0011¦H˜Ýk+Ö[pÆÇ-D/û\nÑg\b\u001a%â\u0004œÓ£+/]8|<ëâ4\u0013iō×B\u0000Jê»}! ;°ýž]è\u0012ñ7q¨Ÿq\u0013çÕBbp ûî\u0001lÕÂý\u001bŸˆÒPJÀÙý°ïߺ—\fÄʅ\ngF\u0000@HE´F´F4\u0010FtD6‚‘ÉÕ«N˜ØˆL“¨±M\u001dS:¬…-A¬”íïÞpœîÁXÔëÿ¸…= YE\u0003ÇÀõåq\u0018èÆ8\u001b§*¶ªXÄ\u000b¡-ì^l°Ù‹•\u0012Mš”q#iƒn›vOVú xj=M„®ºHöbÛ-³[ö̊Îv3Ñ̤õN¤vÁsôõèáf¡¢÷G(³\u0016à\u0011OϘxæmþ“2¯¶ªâ¶7­dìšòÿ°\u0011ͺokPÁs»\b´žc^È\u0007=}Cƒ’‡…\u000e\u001f\u001d½uíüSEŠÒei\b\u0004\\­4°'\u0013ó\u0006SuGîËM¯R>*œz³96¡‘\u0012\u0003S_¾e\u000bP= ŒOmaÁw\u0014­«Ìû‹]í\b—ü+¥¢Œ?›ÖV£Ï= œüƒ“û\u001e¦*6n¼N\u0002$\t&ïlû‚\u0013\u001e\u000f¨CŒ5ÒÏãÉð†\u0005\u000bÖÖ¡“ˆ\u001d·±ýLg¾±ù¿\u000f0²\u000f\u0005Uúh¤*J2ÀÜ»ª”¿.‹Ê®‘Lèçí°å\u0015þ«\u0007x°¹Å—€û…ªza\u001b÷ð$’„Óª¹\u0000û:'Asr|ˆaÓ\u001e\u0004·AË1uÁŠ‡Í›\u0014\u0010]NŠ|Úv¨bÇ= \u0013¦FïU2’’V\"$xœj‘¶\u001edÑ\u0018/+H&ž¨Òždƒ†Ê2šÉ\u001aII\t\u0001P\u001bRìA¡ð¸½\u001c8Ƽââ·sùÓ÷ó©Ð¹ó©Z•Ç[}JÁ\u001aV²\u001aö€zÜ-É¿=MPi.èÒ\u0012LkïK\u0015”˜\b\u0001ï³3Y;~Áû\f\u001fÇÿ”˜ÚYôä\f\u001fY;~Ptw=}¿ÇŠ4&y1q\nÜí\u0004éiié¡Ì\b\"óÖpª°¼\u0000xÀ}½ 6;Ðèݞ\u001b èy1Âf“¥%Ù½BÅø.×y1ñãÙ\u0001/GòÑý\u0006$¯E²L½mÌð\u00011É ˜\u0003!\u0003Žt”= €pÐpâøf/€\u0010ñ&?8\u0018ØY™y¹i©\td®?P\u00116X›ØÖ»ÊJÌ-T‘\\{§Ouf\u0003ŒO~ô•Z8K$ÇÜyúR{ße¢Z’\\þ]À\u0010yȽ‚™¶1ÐùS2\"\u0014«[\u0014Pcx'÷ˆI@>×,l?t£Ù‡üÿ;ÿ—hÑlÙë![!\tÚî\u001b\u001bb_]êäŠëôŠìàJë°\bRÕ¢Uk\bÒ}\u0018½lV¢\u0000\u0000\u0002W¡€Õ:Ð,Öb¶Ø\u0014Òa¯\u0019_\u000f\u00192+p=MþD䄹çҚæ7w¬\u001bW ‡\"àù\u0016231[\u0015Êÿöî½^Å7ø˜Áì`});\n\nvar HEAP8, HEAP16, HEAP32, HEAPU8, HEAPU16, HEAPU32, HEAPF32, HEAPF64, wasmMemory;\n\nfunction updateMemoryViews() {\n var b = wasmMemory.buffer;\n HEAP8 = new Int8Array(b);\n HEAP16 = new Int16Array(b);\n HEAPU8 = new Uint8Array(b);\n HEAPU16 = new Uint16Array(b);\n HEAP32 = new Int32Array(b);\n HEAPU32 = new Uint32Array(b);\n HEAPF32 = new Float32Array(b);\n HEAPF64 = new Float64Array(b);\n}\n\n/** @type {function(...*):?} */ function _INT123_compat_close() {\n abort(\"missing function: INT123_compat_close\");\n}\n\n_INT123_compat_close.stub = true;\n\nvar _emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num);\n\nvar abortOnCannotGrowMemory = requestedSize => {\n abort(\"OOM\");\n};\n\nvar _emscripten_resize_heap = requestedSize => {\n var oldSize = HEAPU8.length;\n requestedSize >>>= 0;\n abortOnCannotGrowMemory(requestedSize);\n};\n\nvar UTF8Decoder = new TextDecoder(\"utf8\");\n\n/**\n * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the\n * emscripten HEAP, returns a copy of that string as a Javascript String object.\n *\n * @param {number} ptr\n * @param {number=} maxBytesToRead - An optional length that specifies the\n * maximum number of bytes to read. You can omit this parameter to scan the\n * string until the first 0 byte. If maxBytesToRead is passed, and the string\n * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the\n * string will cut short at that byte index (i.e. maxBytesToRead will not\n * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing\n * frequent uses of UTF8ToString() with and without maxBytesToRead may throw\n * JS JIT optimizations off, so it is worth to consider consistently using one\n * @return {string}\n */ var UTF8ToString = (ptr, maxBytesToRead) => {\n if (!ptr) return \"\";\n var maxPtr = ptr + maxBytesToRead;\n for (var end = ptr; !(end >= maxPtr) && HEAPU8[end]; ) ++end;\n return UTF8Decoder.decode(HEAPU8.subarray(ptr, end));\n};\n\nvar SYSCALLS = {\n varargs: undefined,\n get() {\n var ret = HEAP32[((+SYSCALLS.varargs) >> 2)];\n SYSCALLS.varargs += 4;\n return ret;\n },\n getp() {\n return SYSCALLS.get();\n },\n getStr(ptr) {\n var ret = UTF8ToString(ptr);\n return ret;\n }\n};\n\nvar _fd_close = fd => 52;\n\nvar _fd_read = (fd, iov, iovcnt, pnum) => 52;\n\nvar convertI32PairToI53Checked = (lo, hi) => ((hi + 2097152) >>> 0 < 4194305 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN;\n\nfunction _fd_seek(fd, offset_low, offset_high, whence, newOffset) {\n var offset = convertI32PairToI53Checked(offset_low, offset_high);\n return 70;\n}\n\nvar printCharBuffers = [ null, [], [] ];\n\n/**\n * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given\n * array that contains uint8 values, returns a copy of that string as a\n * Javascript String object.\n * heapOrArray is either a regular array, or a JavaScript typed array view.\n * @param {number} idx\n * @param {number=} maxBytesToRead\n * @return {string}\n */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => {\n var endIdx = idx + maxBytesToRead;\n var endPtr = idx;\n while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr;\n return UTF8Decoder.decode(heapOrArray.buffer ? heapOrArray.subarray(idx, endPtr) : new Uint8Array(heapOrArray.slice(idx, endPtr)));\n};\n\nvar printChar = (stream, curr) => {\n var buffer = printCharBuffers[stream];\n if (curr === 0 || curr === 10) {\n (stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0));\n buffer.length = 0;\n } else {\n buffer.push(curr);\n }\n};\n\nvar _fd_write = (fd, iov, iovcnt, pnum) => {\n var num = 0;\n for (var i = 0; i < iovcnt; i++) {\n var ptr = HEAPU32[((iov) >> 2)];\n var len = HEAPU32[(((iov) + (4)) >> 2)];\n iov += 8;\n for (var j = 0; j < len; j++) {\n printChar(fd, HEAPU8[ptr + j]);\n }\n num += len;\n }\n HEAPU32[((pnum) >> 2)] = num;\n return 0;\n};\n\nvar wasmImports = {\n /** @export */ a: _INT123_compat_close,\n /** @export */ b: _emscripten_memcpy_js,\n /** @export */ f: _emscripten_resize_heap,\n /** @export */ d: _fd_close,\n /** @export */ c: _fd_read,\n /** @export */ g: _fd_seek,\n /** @export */ e: _fd_write\n};\n\nfunction initRuntime(wasmExports) {\n wasmExports[\"i\"]();\n}\n\nvar imports = {\n \"a\": wasmImports\n};\n\nvar _malloc, _free, _mpeg_frame_decoder_create, _mpeg_decoder_feed, _mpeg_decoder_read, _mpeg_frame_decoder_destroy;\n\n\nthis.setModule = (data) => {\n WASMAudioDecoderCommon.setModule(EmscriptenWASM, data);\n};\n\nthis.getModule = () =>\n WASMAudioDecoderCommon.getModule(EmscriptenWASM);\n\nthis.instantiate = () => {\n this.getModule().then((wasm) => WebAssembly.instantiate(wasm, imports)).then((instance) => {\n const wasmExports = instance.exports;\n _malloc = wasmExports[\"j\"];\n _free = wasmExports[\"k\"];\n _mpeg_frame_decoder_create = wasmExports[\"m\"];\n _mpeg_decoder_feed = wasmExports[\"n\"];\n _mpeg_decoder_read = wasmExports[\"o\"];\n _mpeg_frame_decoder_destroy = wasmExports[\"p\"];\n wasmMemory = wasmExports[\"h\"];\n updateMemoryViews();\n initRuntime(wasmExports);\n ready();\n});\n\nthis.ready = new Promise(resolve => {\n ready = resolve;\n}).then(() => {\n this.HEAP = wasmMemory.buffer;\n this.malloc = _malloc;\n this.free = _free;\n this.mpeg_decoder_feed = _mpeg_decoder_feed;\n this.mpeg_decoder_read = _mpeg_decoder_read;\n this.mpeg_frame_decoder_create = _mpeg_frame_decoder_create;\n this.mpeg_frame_decoder_destroy = _mpeg_frame_decoder_destroy;\n});\nreturn this;\n}}","import { WASMAudioDecoderCommon } from \"@wasm-audio-decoders/common\";\n\nimport EmscriptenWASM from \"./EmscriptenWasm.js\";\n\nexport default function MPEGDecoder(options = {}) {\n // injects dependencies when running as a web worker\n // async\n this._init = () => {\n return new this._WASMAudioDecoderCommon()\n .instantiate(this._EmscriptenWASM, this._module)\n .then((common) => {\n this._common = common;\n\n this._sampleRate = 0;\n this._inputBytes = 0;\n this._outputSamples = 0;\n this._frameNumber = 0;\n\n this._input = this._common.allocateTypedArray(\n this._inputSize,\n Uint8Array,\n );\n\n this._output = this._common.allocateTypedArray(\n this._outputSize,\n Float32Array,\n );\n\n const decoderPtr = this._common.allocateTypedArray(1, Uint32Array);\n this._samplesDecodedPtr = this._common.allocateTypedArray(\n 1,\n Uint32Array,\n );\n this._sampleRatePtr = this._common.allocateTypedArray(1, Uint32Array);\n this._errorStringPtr = this._common.allocateTypedArray(1, Uint32Array);\n\n const error = this._common.wasm.mpeg_frame_decoder_create(\n decoderPtr.ptr,\n options.enableGapless === false ? 0 : 1, // default to enabled\n );\n\n if (error) {\n throw Error(this._getErrorMessage(error));\n }\n\n this._decoder = decoderPtr.buf[0];\n });\n };\n\n Object.defineProperty(this, \"ready\", {\n enumerable: true,\n get: () => this._ready,\n });\n\n this._getErrorMessage = (error) =>\n error + \" \" + this._common.codeToString(this._errorStringPtr.buf[0]);\n\n // async\n this.reset = () => {\n this.free();\n return this._init();\n };\n\n this.free = () => {\n this._common.wasm.mpeg_frame_decoder_destroy(this._decoder);\n this._common.wasm.free(this._decoder);\n\n this._common.free();\n };\n\n this.decode = (data) => {\n let output = [],\n errors = [],\n samples = 0;\n\n if (!(data instanceof Uint8Array))\n throw Error(\n \"Data to decode must be Uint8Array. Instead got \" + typeof data,\n );\n\n feed: for (\n let dataOffset = 0, dataChunkLength = 0;\n dataOffset < data.length;\n dataOffset += dataChunkLength\n ) {\n const dataChunk = data.subarray(dataOffset, this._input.len + dataOffset);\n dataChunkLength = dataChunk.length;\n this._inputBytes += dataChunkLength;\n\n this._input.buf.set(dataChunk);\n\n // feed data in chunks as large as the input buffer\n let error = this._common.wasm.mpeg_decoder_feed(\n this._decoder,\n this._input.ptr,\n dataChunkLength,\n );\n\n if (error === -10) {\n continue feed; // MPG123_NEED_MORE\n }\n\n // decode data in chunks as large as the input buffer\n read: while (true) {\n this._samplesDecodedPtr.buf[0] = 0;\n\n error = this._common.wasm.mpeg_decoder_read(\n this._decoder,\n this._output.ptr,\n this._output.len,\n this._samplesDecodedPtr.ptr,\n this._sampleRatePtr.ptr,\n this._errorStringPtr.ptr,\n );\n\n const samplesDecoded = this._samplesDecodedPtr.buf[0];\n this._outputSamples += samplesDecoded;\n\n if (samplesDecoded) {\n samples += samplesDecoded;\n output.push([\n this._output.buf.slice(0, samplesDecoded),\n this._output.buf.slice(samplesDecoded, samplesDecoded * 2),\n ]);\n }\n\n if (error == -11) {\n continue read; // MPG123_NEW_FORMAT, usually the start of a new stream\n } else if (error === -10) {\n continue feed; // MPG123_NEED_MORE\n } else if (error) {\n const message = this._getErrorMessage(error);\n console.error(\"mpg123-decoder: \" + message);\n\n this._common.addError(\n errors,\n message,\n 0,\n this._frameNumber,\n this._inputBytes,\n this._outputSamples,\n );\n }\n }\n }\n\n return this._WASMAudioDecoderCommon.getDecodedAudioMultiChannel(\n errors,\n output,\n 2,\n samples,\n this._sampleRatePtr.buf[0],\n );\n };\n\n this.decodeFrame = (mpegFrame) => {\n const decoded = this.decode(mpegFrame);\n this._frameNumber++;\n return decoded;\n };\n\n this.decodeFrames = (mpegFrames) => {\n let output = [],\n errors = [],\n samples = 0,\n i = 0;\n\n while (i < mpegFrames.length) {\n const decoded = this.decodeFrame(mpegFrames[i++]);\n\n output.push(decoded.channelData);\n errors = errors.concat(decoded.errors);\n samples += decoded.samplesDecoded;\n }\n\n return this._WASMAudioDecoderCommon.getDecodedAudioMultiChannel(\n errors,\n output,\n 2,\n samples,\n this._sampleRatePtr.buf[0],\n );\n };\n\n // constructor\n\n // injects dependencies when running as a web worker\n this._isWebWorker = MPEGDecoder.isWebWorker;\n this._WASMAudioDecoderCommon =\n MPEGDecoder.WASMAudioDecoderCommon || WASMAudioDecoderCommon;\n this._EmscriptenWASM = MPEGDecoder.EmscriptenWASM || EmscriptenWASM;\n this._module = MPEGDecoder.module;\n\n this._inputSize = 2 ** 16;\n this._outputSize = 2889 * 16 * 2;\n\n this._ready = this._init();\n\n return this;\n}\n","import { WASMAudioDecoderWorker } from \"@wasm-audio-decoders/common\";\nimport EmscriptenWASM from \"./EmscriptenWasm.js\";\nimport MPEGDecoder from \"./MPEGDecoder.js\";\n\nexport default class MPEGDecoderWebWorker extends WASMAudioDecoderWorker {\n constructor(options) {\n super(options, \"mpg123-decoder\", MPEGDecoder, EmscriptenWASM);\n }\n\n async decode(data) {\n return this.postToDecoder(\"decode\", data);\n }\n\n async decodeFrame(data) {\n return this.postToDecoder(\"decodeFrame\", data);\n }\n\n async decodeFrames(data) {\n return this.postToDecoder(\"decodeFrames\", data);\n }\n}\n","import MPEGDecoder from \"./src/MPEGDecoder.js\";\nimport MPEGDecoderWebWorker from \"./src/MPEGDecoderWebWorker.js\";\nimport { assignNames } from \"@wasm-audio-decoders/common\";\n\nassignNames(MPEGDecoder, \"MPEGDecoder\");\nassignNames(MPEGDecoderWebWorker, \"MPEGDecoderWebWorker\");\n\nexport { MPEGDecoder, MPEGDecoderWebWorker };\n","const t=(t,n=4294967295,e=79764919)=>{const r=new Int32Array(256);let o,s,i,c=n;for(o=0;o<256;o++){for(i=o<<24,s=8;s>0;--s)i=2147483648&i?i<<1^e:i<<1;r[o]=i}for(o=0;o>24^t[o])];return c},n=t=>{const n=[];for(const e of t){let t=(e+42)%256;0===t||10===t||13===t||61===t?n.push(\"=\"+String.fromCharCode((t+64)%256)):n.push(String.fromCharCode(t))}return n.join(\"\")},e=(n,e=t)=>{const r=t=>new Uint8Array(t.length/2).map(((n,e)=>parseInt(t.substring(2*e,2*(e+1)),16))),o=t=>r(t)[0],s=new Map;[,8364,,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,,381,,,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,,382,376].forEach(((t,n)=>s.set(t,n)));const i=new Uint8Array(n.length);let c,a,l,f=!1,g=0,h=42,p=n.length>13&&\"dynEncode\"===n.substring(0,9),u=0;p&&(u=11,a=o(n.substring(9,u)),a<=1&&(u+=2,h=o(n.substring(11,u))),1===a&&(u+=8,l=(t=>new DataView(r(t).buffer).getInt32(0,!0))(n.substring(13,u))));const d=256-h;for(let t=u;t255){const t=s.get(c);t&&(c=t+127)}f&&(f=!1,c-=64),i[g++]=c0?c+d:c-h}else f=!0;const m=i.subarray(0,g);if(p&&1===a){const t=e(m);if(t!==l){const n=\"Decode failed crc32 validation\";throw console.error(\"`simple-yenc`\\n\",n+\"\\n\",\"Expected: \"+l+\"; Got: \"+t+\"\\n\",\"Visit https://github.com/eshaz/simple-yenc for more information\"),Error(n)}}return m},r=(n,e='\"',r=t,o)=>{const s=(t,n)=>(t%n+n)%n,i=(t,n)=>n.push(String.fromCharCode(61,(t+64)%256)),c=t=>t.map((t=>t.toString(16).padStart(2,\"0\")));let a,l,f=[],g=1/0,h=Array(256).fill(0);if('\"'===e?(l=[0,8,9,10,11,12,13,34,92,61],a=t=>0===t||8===t||9===t||10===t||11===t||12===t||13===t||34===t||92===t||61===t):\"'\"===e?(l=[0,8,9,10,11,12,13,39,92,61],a=t=>0===t||8===t||9===t||10===t||11===t||12===t||13===t||39===t||92===t||61===t):\"`\"===e&&(l=[13,61,96],f=[7,205,231],a=(t,n)=>13===t||36===t&&123===n||61===t||92===t&&(85===n||117===n)||96===t),void 0===o){o=0;for(let t=0;t{const n=new Uint8Array(4);return new DataView(n.buffer).setInt32(0,t,!0),[...n]})(r(n)))];for(let t=0;tt.replace(/[\\\\]/g,\"\\\\\\\\\").replace(/[`]/g,\"\\\\`\").replace(/\\${/g,\"\\\\${\");export{t as crc32,e as decode,r as dynamicEncode,n as encode,o as stringify};\n"],"names":["module","exports","Worker","EmscriptenWASM","WASMAudioDecoderCommon","HEAPU8","HEAPU32","wasmMemory","out","text","console","log","err","error","ready","abort","what","base64ReverseLookup","Uint8Array","i","_INT123_compat_close","wasm","Object","defineProperty","get","String","raw","stub","UTF8Decoder","TextDecoder","printCharBuffers","printChar","stream","curr","buffer","heapOrArray","idx","maxBytesToRead","endIdx","endPtr","decode","subarray","slice","UTF8ArrayToString","length","push","wasmImports","a","b","dest","src","num","copyWithin","f","requestedSize","d","fd","c","iov","iovcnt","pnum","g","offset_low","offset_high","whence","newOffset","e","ptr","len","j","_malloc","_free","_mpeg_frame_decoder_create","_mpeg_decoder_feed","_mpeg_decoder_read","_mpeg_frame_decoder_destroy","imports","this","setModule","data","getModule","instantiate","then","WebAssembly","instance","wasmExports","Int8Array","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","initRuntime","Promise","resolve","HEAP","malloc","free","mpeg_decoder_feed","mpeg_decoder_read","mpeg_frame_decoder_create","mpeg_frame_decoder_destroy","MPEGDecoder","options","_init","_WASMAudioDecoderCommon","_EmscriptenWASM","_module","common","_common","_sampleRate","_inputBytes","_outputSamples","_frameNumber","_input","allocateTypedArray","_inputSize","_output","_outputSize","decoderPtr","_samplesDecodedPtr","_sampleRatePtr","_errorStringPtr","enableGapless","Error","_getErrorMessage","_decoder","buf","enumerable","_ready","codeToString","reset","output","errors","samples","feed","dataOffset","dataChunkLength","dataChunk","set","samplesDecoded","message","addError","getDecodedAudioMultiChannel","decodeFrame","mpegFrame","decoded","decodeFrames","mpegFrames","channelData","concat","_isWebWorker","isWebWorker","MPEGDecoderWebWorker","WASMAudioDecoderWorker","constructor","super","postToDecoder","t","n","r","o","s","map","parseInt","substring","Map","forEach","l","h","p","u","DataView","getInt32","charCodeAt","m"],"sourceRoot":""} \ No newline at end of file diff --git a/lib/icecast-metadata-player-1.17.3.opus.min.js b/lib/icecast-metadata-player-1.17.3.opus.min.js new file mode 100644 index 0000000..d80ec3e Binary files /dev/null and b/lib/icecast-metadata-player-1.17.3.opus.min.js differ diff --git a/lib/icecast-metadata-player-1.17.3.opus.min.js.map b/lib/icecast-metadata-player-1.17.3.opus.min.js.map new file mode 100644 index 0000000..71259de --- /dev/null +++ b/lib/icecast-metadata-player-1.17.3.opus.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"icecast-metadata-player-1.17.3.opus.min.js","mappings":"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","sources":["webpack://IcecastMetadataPlayer/./node_modules/@eshaz/web-worker/cjs/browser.js","webpack://IcecastMetadataPlayer/./node_modules/opus-decoder/src/EmscriptenWasm.js","webpack://IcecastMetadataPlayer/./node_modules/opus-decoder/src/OpusDecoder.js","webpack://IcecastMetadataPlayer/./node_modules/opus-decoder/src/OpusDecoderWebWorker.js","webpack://IcecastMetadataPlayer/./node_modules/opus-decoder/index.js","webpack://IcecastMetadataPlayer/./node_modules/simple-yenc/dist/esm.js"],"sourcesContent":["/**\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nmodule.exports = Worker;","/* **************************************************\n * This file is auto-generated during the build process.\n * Any edits to this file will be overwritten.\n ****************************************************/\n\nexport default function EmscriptenWASM(WASMAudioDecoderCommon) {\nvar Module = Module;\n\nfunction ready() {}\n\nModule = {};\n\n/** @param {string|number=} what */ function abort(what) {\n throw what;\n}\n\nfor (var base64ReverseLookup = new Uint8Array(123), /*'z'+1*/ i = 25; i >= 0; --i) {\n base64ReverseLookup[48 + i] = 52 + i;\n base64ReverseLookup[65 + i] = i;\n base64ReverseLookup[97 + i] = 26 + i;\n}\n\nbase64ReverseLookup[43] = 62;\n\nbase64ReverseLookup[47] = 63;\n\n/** @noinline */ function base64Decode(b64) {\n var b1, b2, i = 0, j = 0, bLength = b64.length, output = new Uint8Array((bLength * 3 >> 2) - (b64[bLength - 2] == \"=\") - (b64[bLength - 1] == \"=\"));\n for (;i < bLength; i += 4, j += 3) {\n b1 = base64ReverseLookup[b64.charCodeAt(i + 1)];\n b2 = base64ReverseLookup[b64.charCodeAt(i + 2)];\n output[j] = base64ReverseLookup[b64.charCodeAt(i)] << 2 | b1 >> 4;\n output[j + 1] = b1 << 4 | b2 >> 2;\n output[j + 2] = b2 << 6 | base64ReverseLookup[b64.charCodeAt(i + 3)];\n }\n return output;\n}\n\nif (!EmscriptenWASM.wasm) Object.defineProperty(EmscriptenWASM, \"wasm\", {get: () => String.raw`dynEncode01a36c6f98c8\u00173ø%yã¯#6ïI\u0001Øh€¼ÿ-^\u0001\u0003º\u001a*:8‘ÖJÒ#Á(¶3\fùs\u0002Õ\u0002ÿ\u0003›\u0016§£Ÿ/.*[v²¯\\\u0001õz\u0004ºÜá»(’oBM×å ÊvmË1±ˆIü(\u0002&Øb?\u00150˜=MáPðxA%TÔΞ\u000e=} c×0ÓPùœN:Ê\u0016£\u000b̆ӱæQ•ñҒ¥M_ªqA\u00141k\u0014ð\u0011¹¥ÊŒÇ@6u§­k¿Ä9Ó²ŠFÒà\u0006(A£c\u001e£ \u0000)ìTÆ=M\u0004]+àaåÅBñcȼ\u0019{±!›Õ\u0010Õ_ò#²ƒßá'֛«ñ†\u0006Û.òƒ¿á(h›¯Äò´ýÏ\u0014\u0011” ÆB\\0¬\u000fE¸\u000e?s*iê9)~QÄ\u001aõÿ6+º·=M”l½\u001dUÀƒ«¥$´ª\u0005FÏó\t÷¨M/‰§=}\u0006WÃs¥FÈ$9»PsH0Ç3»P®Wq\u000böCðé~¥\u0010Ö}¸\u000b:taãž/±©Ý\u000b\u0017×sôd™‡v[<á\u000eëŸx[ôÿ„\u001d0bñR\u0014\u000fºƒÊ½j\u0014–\u001bËz•h\u0002q¹˜J\u000e›•\"Ò\f'*¤0‹Ó34Þ¯‘rÑöv[B/\u001c¨\u001f¿ê9!†ïr÷²\u001bÇn5ɓME€\u0018k”5Ú?7ڃk,–*ždÔörÏk4\u001f\u000fœ\u001b\u001cVáÔ†ÕÖÝjoooožaúˆ¼l—^Û=}MQ\u001dï˜]½ßQ²lÂù[gŸ=M9\t~“êÃŸ3\u001b¨¨Ó 9ñ\u001fgGze\t¹©ulfÙ\t|¯Sà¦oÌt\u000f= ¶zÈ<÷ÿñ•ºßÏ×h]9Í©:–#Dãø»­3LeÙ\t˜¯\u0013\b©[¿)hÓ¯fó¦\u001bÛæþ?p9\nV\u000e…ïȁ“nÊ\u0000á$˵¥Ö\u0012%Ú1Érn:fӯ温պ£¬ó+\u001a ”\u000b|\u001e;ýoô:*W(©Jÿ+vOÄb7<\u000bא­ßëÙ\t[)o\u001fU89~ÚÇ3€ˆ\u000eÍ¿\u0017”\u0002\u0007V¡N¢&¿\u0002švlG‚ЕäÝk©&M6»\u0000¡ƒ˜6!^\u000f°©€äÞÔû›\fÏ\u0007\u0000vÚÃBÆL¿\u0006,\u000fY\u0010+\u0005ÏÇj\u001dàìL£¡Rñƒ¤…ekX\\ÍyF= \u001d1X1ªhýQ^úd\u0005ç@!G\n¥\u000f\u0000\u001aÑ)°\u0013+w±\f\u000eyÅIOiǵ;gR#ó¨'%âfº£P\u0011¾\u0000S\bÃã[¥Eýcœ&0\u0003\u0001›\u000fv¢‘\\G„\u0011ˆ-ÌÏù\u0011Ù¡ÜpSX-\u001cUQ\u0011Ï <ăJ#iƒ\"Ú<Ùo;ðúÙ¡Ú6i¹“\u0010|#òm·\u0017ÝßÝYÐÓ\t= ë$‹}¥‹Ö\nq_.ľ³}–Êðÿ\u0003X\u0005i·xKQQK=MÎK\u001dÚ8ÏR«ø钳M[§ÍôÛ§\u0006@\u00024åÁË¿Ç(=M\u0001ð2¦ù\u0000Í\u0018\u001dè\u0015\fÃÊÃ\n\u001fË'Çe\u0015Ü\u000f3£<ü\u0004¨Üš&lw\"‹j5i–,¤–›{ŸöÞØ~OcÒWØ®æ„Ϧë\u001e\u001bJòªéøX¦±n\u0011«rüÆ»g/\u0010Ò\tðlzd²‰IªÎ~¨\u001bÖ\u0000j=Mv0ª¬¢“©Aí~DøÝõU•\u0010±nø+møFÛæiáFU'\u0012ª³'ø^%šnp\u0004Â\u001bû\u0000d)\"~ßVÔÒY…¿gò}Q7\u0017\"Ìæ]Â\u0007º¯eFZ\b0í\u0000î\u0012v˜ ídcœ§ª^\u0012i\\Ò\tqÖáϕ¿û·Ã\u0010dý©Ä\fîŒ-|7Ñ{\u0004à~‹\bUr\u0012ÂVƯ£ª/wYÒF\u001b'˜,\fnÃæŒV¶\u0003óc‘yçiØç7µe$Š\u0000É~)\b&òûô$d1G5‘Sê=M@= ƒ\u0016ӏçÓ\u0006^=}Q²™U¾µ:ã7ç4ÿît3?\u0011Âv\u0018s›º\u0012ïÿ\nð€ëA¨ 4e\u0013\\WÓXÉ2¾Àlf«#¬pªÔHê5\u0013_Ìî\u0011r³\u0016—é\u0015ļ\u0016áˆõ“,=}ËÖ\u0003õ7Â= = T\tq\u001aãM\u0016aѤÖ)_;©T\u001c$¢¡k\"׊b¢\"l‚ë­}žåëí\"ÐDã:Ԉo5{\u0001ϑªæ6Nnû?=M)~9Î* ä‡@­Ä\u0004k¨c$ne&^3ÕÔ/\u0006Vì§\"ñ†\u00191Ô¯»—3Hæ}oTÏ{Ë\u001e’Z= jùÔòó¡\u000b6_DÒKM÷ÞwÙ.tR\u0017c£ŠŒI‚!\u0005f\u0019”\u0007\u0019uWw¶YYT»°\u0000I ·®\u001cD=M5ß®“ÆhÙðí=M¨þ­¹§«ùïËԅtëY̜ìnÉ\u0003‚Ô~eó”ó\u0012Ì\níef\u001d»1öýÆì\u0006ôu)Àê±tõ¸pŸ\f\u000bK\u000b*\u001d›ÄÕ;ñßé;\u001b•{OtÑü;å\u001apñރSØo¬\u0005\u00169<{\u0013Ž\u0006\tÛS¼\u001cSúë!Ä,(s³U™Ê­Õ£õ5ɵ-û©^ܝëã¶SÃC%(–%^}†3ùIã4}\u0011ý¼|\n^눺šhÜ*ßÓ{ðÕ¥r\u0007í¬Øz´cTd!\\¼á0%ãôw\u001f¡\u000fAGi\u001e´à/X®¤ƒk¯þ\u0016K\u0004²\u0013ρ\u0004:ÛÑý€P\u0010Hõ\u0007·_™Šrʾ²îrÈO¸û8u=}\u000fð\u000f衸8—ÐÑØQˆR‚5y)P/¿\u001b!5ÇZ’#lõ;4°0­œÅ\u0005ɱR\u000fµòòÁ†ˆ{±«W¯üý²\u0010!™¥ú\u0014\u0019\u000f¯•×\u0001U1¼{\u0016”gÏ\fTïìÑîu´&…i\u0017FÀ7z\u0013ÅÐ÷HÁ†ª–˜T÷°s©ãÞC\u000bu€½™\u000bPðìô“»Y$í\u0018Ì?ËŽÜ*=Mq¤àþ“?ðN\\ë݌§Ñ‡dñ+´ä°iyß̓zp´(õ¦Lvçš\u000e»P~áÆí\u0006nĊÇ:Ñ\u0016= Ž˜×k—\u000b¤\u0015\u0001\u000f\u0006Oæ\u0004~ٶώ¦?¨¾Uh,a[SäÅP,æu«Nè\u000bÆÝýI<€Ç}\u0003:«3;·Õ\u0000= ·@kj;@#G:ÓWÚ\u001f\u0018µ\u0006!­[>Y\u0006\u0007ÂyXגvF?êÀædø!¿ñ’\u0007°×\u0010_o3¥\u001f)fŽÇ(LÝÙª±~O÷M\u0013{^=M…uØ]§6áÊc$ŏT@„\f{õ†I=M{÷¼d\tÛ\u0006³=}8—>³LlÊUÕ\u0018\bŒˆ\u001dmí(kx\u001f¾ý;çZÇâùŒÀ+·\u001c\u0005@Xª™¥Š’\u001b¡ò ‡Fš@¨¾\th¤Øf\u001eüЉ¬\u0010v;­R\u001cÐíM\u0010j\u0011\\Èìë¦\fæz-K’{|xÐJt’<‚aóñ/·}µ½þæF®|´h\u0011_Å ÂQ†ƒ%<‹Ê\u0010Ù\u000eg2(e3ß/¡òm6Y/‘= s72ƒ‚õr7\u0000x\u0011¡Iuh\u0019zY\u0003_1nf>\u0001©Uc|†zõ\u0017\u0010‘¥g¸¢™}ÛOÕ‚Uéñ!%@Âíç\u0005\u000e¥ßm¹v9ôÈÚ+›QÒ\u001ccÏ?\u001c'À4c£%%àAÛ'.¯«¸Q¸¶0dܒSŠ³î\u000b†C\u000e\u0005£÷Ý%$ô\u0002¼pÄ\u000b:¹(hLd¯<#hö1X3˜\u0006\u0001\u001f›•\u0007³¢ÏÅØèÐø委²Íú¡Œ.¨Kqϸeÿ’¾H\u001d¯æîÎÜ\u00047³\u0018u= †q/<ý\\ió\u0018Lñ$w£Gѹzÿôí©¶¦EØزH€Y“7RöŽ\u001cÇNœ„“ðBA\u0017˜Æ§8ÿ\b&.\u0003\u0012ði?\u0000\u0005°†v°¶ìcøø¤ähá= D\u001aW×m†clÜê<ô|­p7<#lïsV\u001e\u0016Ê°ä3*Œ\u00015ÞH‰ñ]Þ\u001aû5šGòqw,\u001cuhõÁuJ¸vJ?HËL*Ç,w\u0016ðB5Œ6Tœ=}\u0002ó’íB×WîyM\nÒÂ̱\u0002[¿mœ)Ži°­M\n¡Íãe§(‡¤7Ž\u00108m}ô= Þw^\u000b›\u0019kF#™].âÂ'à\u0002œ6\"7Ÿ”ª¢Ã*¾\u0013\u001b\t¾\u0006à·Uó…Ý71\\gÒ«k\u0002\u0013®ÿun\u0014\fÑH[[˜1Î3.'5à·Ëƒßu™CLB\u0006\u000eԚ\u0010g\u0010î­ïÖa\u0018äèûV3š_×Ï扎vOqaçU\u0013Z<•-KsZù~©\\\u0005!ˆ¼¾^͕ô2^?\u0019Ÿ*…\\šÓRG…\u0001+\u0014lÑ)\u0013ÀØËDÝ\u0002f|]\\ŠxÂ\u001aŒŒ\u0019ý$4ðÛþ\u0016œw¸„\u00069G\u000f\u001d˜Ð ý\u000eA·¶¶\u0012vpZºüX@@™ø\u001bp\t4z‰\u001e&‘•²Âj3\u001eÉ·=Må\u001e¯Š= ’’v¾–g\u0018U\u0010R¨Wdª­/x\u0006\u0006·+–,ae*1ù¦v\u0002Îl\n^\u0017\u0015mºò\u000b¦Ó”\"@×¥sŽô#ù  ;\u0001Êr[B\u0005¢êµ‹-œ [a\u0017|>\u0002…]ê6¢JHX΀Ò\u0017@:{\u0011\u0019=}qá!Í̳K¡ \"A=Mä\u0005‘= °\u0016z…ÞÆç*1z^5ºbπÈ*mŒZUíí \u0013ÅÐᴔ\u0000çÏã)Ž{\u0004ÜĽ\n8‰ApG\u001e× ¬·F¼EÌ1å9Úb—n”X&>\u0002\f÷ÿ\u001bÉ\u0011~1$5@қa,\u0010”à‡¢'¹„Ðÿy2ûL•¯×Vã\u0016ñ\u0011éÊ^sY8éí\u0016Í,Š\u0015FŠìQ•Ö§ )[Ç9)Æ,3өμ= ¸k@‹ÄʐÖH7¨Å9ywІ¢W\u0010BĨ)*\u0005Ó\u001a/Û#:÷¤†%ÛK\u0005u3f\u0016@¿\u0011Z(M=M°/ \u0007}‹à‚PC¡OCÿîòE\u000b?¥Æ±G(´\u0014MùcpÁ0¶YE$›$IH®ô¼ÚXr§pþkÞå%€\u0013…\u0011ˆ>֙\u0005Ún  ºó\u0019Ø@ˆýµÐú-\u0006\u0016²ø\u0003\\ø?L©}˜]Nõql€ÅiÑ3χƒ³ì¥Ú½\u0006vëýô3?r+¬Áõ¥â4Û¥\u0000\b)H¤ë}‹ºŠ…æ\u0017Q´*\u0003Ã8¡x\u001c(ð\u0006ª=M\b=}¶wªf4¯ŸŽ\u000fF†R!\"µö\u0013\u0013·\\˜VêT)jâßm€8¨Û\u001dM¬”¥úãc‘F\u0006ÁÏr\u0005HŠ•\u0004•Ö¢8\u000b[á¦c\u0017@¡JÍûv\n\u000b\f\u0004T\u0012b!r€~{%u·Û\u001fû3pC0¦wnP/{³¹™½ \u001f\fÞs•³¡‘å5!\u001eÜ\u0014\u001af\u001d\u001a^¦³Ó\"ì¼QÌ\u001eƒ\u001a¦kš™\u001fú5µ-ðøD\u0002¿h6õ\u001d„È þ©ªV‚àÍà©\u0016×ãG\b߬H#þhïd\u001fiÊàÕ\\“-´°”3Tê¼Eû¤ .[fL\u000e¡€JüŒ,ÉKîë\u0015B”F³.Z”€*\u001dÌE¨V^„\n¯ªf#º“uºY)êÜ£\bPñf×Z\u000e\tIº\u0002æ2\u0007ÞÆÔU\u0019Ǟx4\"BU®¯R”€Ðú\u001c֌:\fô·\feAAlD,[O€ò0bÁ¡)\u0005{Ãuánò\\ a?Ála\u001cÇPæÌ+’ê°\u0000?„yw\u0019\u0006íÑî.Ùã›\u0013•‡ë3;\u001d+@ü\u000bŸ>Õ= î}1‚™võQ%n<_¸FÆï!šZµ‰Ñã}¡Ÿ\"ÉS°É'íÔ\u0005¶¶)\u0017Þ\u0005\u0013•Òü;?ž\u0003í÷LäIá¨\u0014H0Ô#ÁB§#†J½¢=}\u0011\u0016\"\u001aÉØ\\?rÚÃp®2\u0007‚q(=MYƒ¯—hµ ¥x\u00024ôË_·—\u00052ögÉXP\u001c/_ÇF|˾ÿfêÛ*Ó2Ž\u0000\u0013q¸Ó†®»“•\fc\u001eþšë™ÝSÛ\u001d¹\nr„Š\bÞ¤®žQb.Ÿ‚‘©6®\u00038W\n³‚\u0011Ågz¦\u0005Û*‹*\u0016ºYb\u001e’Y,—ÒZð\u0002$æ\u000e͸oíÁ˜hóÃdrö #°ñŒ0ŽÌ^k؂â\\̐ºå\u0000u\u001bm™›„ó‚nÏxÂA5Ákm…W,™iÖ\u0005L4aavwŸ¹”Ç°=M3ªë09WTÓ­¤Éný€ö§\u000b:Î\u0002â-\u0014™ž* bÀi­%‚º²Ü֙Š±žbÝÏ\tÏna\u001d«èŒ\nêÕw®ç§ƒ…·Áœz\u0000\u000e„\u0002~\tûµ/<4ǬÕf¢†P{½}Ù\u000b®Ï—I ä1’Áœb= Ðg\u0014çM$7G\f=}”sd¹Pš\u001e»ì2U©ŸB¿\u0004eM–&%T\u001e\n•5´iâgeú\u0013eù'†ú\u0017¾\"Ie$ðW‘´K*\u0014¼”ÚE\u0004‘=M\u0000T\t\f\u0000\u0015àýoC½7Äf*±²ýÔ\u000fLBÞûGW\u0001 ‰ô õ¥s\u0001Ï\u0002Ä\u0002ûnüvšw\u001c¢]Š×›0LþQiÅK¿\u000f¬ÇŒÀ¤¬/ˆ´õ\t4tµ…b—\u0002U,¢‹2\u001f¬\u0001 Ätp‡påkJ\u001cÌ\u000fD·É7æýD\u000b8ªüM—ÀL—bÝå?‡;¤$€‚Â1½\\iJfÙèŽôœA»—ýMÝC…‚u\u001f\u001aü)˜ÏUx}\u0002ê\u0019ßj¡4x¢âê䈯±%§^\u0003¸©\u0019ïÂõ\u0014¡´ÃÌã\u000bq\u000e§‰è&\u001f¾Þ\u0015\u0002°®\u000e÷\u0003á]9•´F\u0014ñ ‰Ý3+c¾ë60\\¹”þ\u00177ú=MÑyŽÿ-)F¿ˆÑF¤2Ù­ÂgÍ=}2ÈH麟?é.š½\u0003=MORèàl;U¸/wØs¯”£à±›:7p“©\f\u0006:®¡˜ZLá*wE‡#vSh\u001bd\u0016\u0018䪥JNóq¯BîÅó¡J™VA\u0005•v\u0014e7¿Á,´¦@\b0\u001dPôRC5aÚç\u0002\u0014¸\\·ˆ}x¡r6Ïpoÿ÷Á›Õ«„G•_…Ü7Šd\u0001q–\u0015šé³wJϯ3\u0014\u0013Ë |FKcȊ¡Š´ˆ›‘+/͎N4Jðø\u0000VnÛ·ø= ¸\u001b«A,¬˜*=}óo@ڀ¿ö»–b\u001f=MAö\u0012\u001e\u0019f_ú³ï¢ÓѢЉÌJt\u0005S\u001eò²ŽLI>Ix—'\u001eáκ…°»\u0002â=MC¼\u0010Vé\u001d^>Ý\u0006’¹V9§ãÉ-Ð|\u001b£CÖËÜ­ùC\u0005t[\nFg7WÚlÂ\u001d³\u0003ä¯Õsü÷±,d›%¤\u0019Ê\u0015Òzjª\bGI®®&)AeQÞÈÇ.\u001aúƒ\b:V\u0010Ž$—Éí\u0006ø\u001dß󦲰Po{±\u001d]Êv,N\u001cXå¸P8Ý_#12·\f\u000e›u\",†\u0006Æ\u0003\f4bà\"¡\u001f\u001e&Úª‘\fGÊz§§\\üݽgò6Ñ&{àc‹iÓɯf»5‚[ \u000e=}#ÿ¼\\\u0004ëe}²¾~ªi~™ÆœÓa§\u0018N‡@væ\u00194L’’\u0006­l…ì=}Y°EQÆÈ©™Ž8÷_d*8\u001cM×ÿÐÉ\u0014‚øa=M­\u001b³«5nm'±Šö\u0006q\\±/+â!4g\u001b‚,TN»ø P©0}[•zñ”–\u001aZ†ÿèr–)\u0004¦EÏ;N¡ß$= ¢a‘ÛÁÔdº\u000e®Ñ;Xò\\tIþ…}ƒT\u0005¾grGu<ï rB‰œ¯‘Õ}—P•\u0015ÞîãB=}iÓ5\u0006ÀÁ)•Y‚.½‹Ãqó ÓS«N¡\u000fµaܙT,BžÊõd'’~²h\f%t“üõÀíÖzô\u0006\u0016\u0001{D\u0017W\u0000\u0013Àþ=M\u0010\u0000\f«.v·õžâñÉe‚6eR¾”fšµh¾ñ¼“¶zõñè\u001a”LLRY˙\"&Åãz{èý4LÄ.\u001aH¬41~È\fdPîÏ\u0002À¼ð\u0000lröø\u0006*¿\u000epÇÃiz.aá^¹î/’\u0012u ?a£e±lzZÚ>\\¦\u0010ê= ²Hõs‘\u0013ßÔ1/ô= F¨e´B{¸ŒÛ­ºÇû\u0016f©U8grÉ\u00194â\t²À\u0000¾Ï\b+Â\u001a€§¹ò˜@Yƪ´+\u001d\u0002‚±õ1½Ê'·³ó¯¼ô{\t…\u0007€1ç£Ü½~ííÍñ\u0004Fû”{M\u001b\\Îî\u0007Ö5h¼\u0005L+ˆ;Âf4Rs³++ôp¥\\±(KR{0ãÏýñÍ;&e¤\u0019»ïí\u001d\u00169ø\u0003l€-Eî†\u0011¦§â•\u0002z{´ÈDÔ¬\u001cÌ@ìCÖt\u0000Hv¹\u0004é\u0007³ûé#= 1\u001eH/10€ûÍX¬!‹L\u0017&Ì[(Ì£¸©äh´|®g”û4Œ×½Y~#¹øÿ'÷J\b×dF4¸T…†\u001a÷ ¥£b\u0017‹ÏŒç܌\u0004þMªúSOÅú\u0014r0\u0003p‹ÛG\u0004¯µ]LU³Í—ÝH<äO³Åúª\"\u0014Nðå\b+/±\u0018#Ѹ£¼Ä/ž\u0003]»ÀÎ0¾ôË́DͽIæÇÀöàHÂ=Mæk\u0015é+ê\u0018évË|à”Å.UK\nôF˜1c§\u0010Ô+Έ\u0001܈‚¤¦•\u0012$\u0005îP7ä¼ÕJ\u0016>ëC¸¬KX»N\u001d8\u001bü\u0011Ð\u0019À­\u000fG2¥g>ž}‚r°ùÊ\u0017™æ.¨ä¸Š´&ÈW‡„ûŽ…q‡\n™6\u0013š¹ïÿ\u0002âî¨Ïº%Ú!܋MÞÀU•\u0018=}ð™\"ÛZ­Ãj\u0018Ç=}ŸâY<Ÿ\u001fúÍì\b…\u0018uõ÷p¿pÕ6âq‘äÔfÔÜá;ÀÛ\t)\u0005Û)%\u0006\t\t\t‰^e\u0006\tI!=MüíˆY‹¡‚€\u0019•\u0007NÈî€Rþ@/·°ÍmOÀÇ(’óŸuˆWu!¸õVgƽó5\f\u0017hí²\b¾8,ÚAÌr4Aö䓌fg\u001deÕ\"˜Zz\ni‚,òk¬SÎ%>6û¼u\nªùâ{€rþJªÆ0³îêqvHÕS8•\u001dí´öh\u001c\fm±hÜè¿ô<Ïj\u001cÛ\u0002\nËä\\\u0014rçÓ'\u0002ñmúÉgðB;9\u0012i¨\bÜÌ{î\u000f–\u000fRx‘ø+\u0010Tz\u000f®\u0006\nåÞ\u0015ë¥vì[JþæZmË\u000e[µ÷ª4}…\u0013qRÒÜ4\u0014Ýf~„ |1¬\u0017 ˆ9¹›5lK/=M0J”ÓN•uÏMü暭Þû\u0010¸Y4\u0000\f#x‘|™= >ÍƗZ\u0003¯:nR{ª$* \u001e¶¶\u000e2\u0001èÌ>%ˆ™m ÿQd±P-™\nÁoJä\u0011\u000bcNôK)÷‰è\u001d63\u0014W’†ˆ+¨¥nÆ¡A§\u001cáƏ§ßWqsÝ#ºF\n6]’ä\u0006\u000bc&›õîáʃæˆ:=}\u001aÂ|?ÕAëé\u000bX\u001fjÖb›&ù\u0000¡…6â\u001d–˜yڅ€Ñ\u0004Ìú\u001dxô¬¼H\u0018'ƒ¬+5pPˆ*þüGz\u0007ñèš\u00187A)-˜\tÊ0BDmHÐ Þ+ª0®G±˜\u0014u\u0014RMGm/ŠY<‘¥g\u001bo³”—§\bÂ4Hð\u0010=}óç6À-\téàs—ó9\b\u0015\u0001uÉ\u001c+,â¥Ò.Ø\u0001öÑü0k5­Ñš¦‚.\u001c&ëüýpz|\u0011\bÚ¦Zdh\u0002æ\u0016À–ùè\u0001í”ü<\u0006\u000e= •é!gaô·îصÈ\u001eIC;­|°Ëo~ˆ˜)ñ{„P\u0003ö‚<\u0002FÑ\u0013{D¸ðÓe9?\u001eh›Bê\b…À-\n²×öÞ1ûWD\u001b\u0001\u001aP“›zö¡j‚÷ߖøˆÆZ\naDM¹}éO›7\u001d\u000b\u0014˜\u00110‘ȝÓÔ\u00172?‘”AŒ,ƨ\u001ed«O‘“ãÚ÷\u001eY\u0007TKmæ:–¸ÆœÜ€Æhà‹èd\u000eUo·æ}ƒ\u001cŠ\u0011Æm\u000eßwMå¾!UìxøCGHFG\u001bfn؍k:\fe\u0013\u0016±Æ)—ùTÂʬ•o¥ü·HpיÛ\u001acI#º|™&ûß4qY’êæ“wA¼íE£0Ôx\u0019²'Õ'=}æ»DÄêóÈâ6\u0011jÅ^p·~œPa\u0004ïw\u0017\nƒ¸°N¼\u001bí\u0011\f‰7­×\u0019„~j:ÎG\u0000H\u0011\u0000\u0011smâmá«7\u0003-°í =}•m‚Ùi'pë\b*K2¡Þ\u001a\fâV\u0010\u0005^É\u000e%gg~lç½Ò\u0004œ\n°oã)k\u0011Ë*Žc¦ÿJø_µ\u0000³Üéß\u0019Ò\u000eïÔ=M°I°j,KCÌ}}P¥Øs._ÆõZ¬´äˆê\u0017N\u0016ˆ­\u000e»ö²¸Ã#ÊG?­UÙ­Je\u0005jzûË(Ž˜}®¨g\u0017ñ¬Ïº<õ6ë8e\u0010K\u0005>”\u0016$Öæ\u001d3ù³²sæ+žŒ¿…á]#[:‘ÜJ6ì@¡÷!U£ i{ê= =}iU,m0ܱ—\u000bôú°ÿ×\u0013µƒßc\u001c¦\u001a¥ß¯“S$V£N£Î®^7#Áv#I/\u0004ÙGu;ä\u001f©0xNð\u0014qßÜJd-“\u001b‡cÅ;¿±n“\t\u001d\u0011Ì\u0012„Ç—Õ\"à\u0013ÖQRs½BÜ|ƒÇI‘\u0000}¶à'ÛCʳ\u0006@æ/\u0017¤Ôw\u0006+aA嗗©çI2ä\u0017˜Ä+1á±TOòãǝÇçOòäό–³zŒ®³Ð ´ß£V\u0013TIn¸èÕ²º\b=}ga;v8Œ•\\GTÑwax¨\fh{Ôdqª_j±¬\u0019Í\u0003Jß\u0019Êdñ©Gjy¨Þ´S¶ÁÞË{”#Àš»¬\u0019Ë\u0003*ß\u0019ãS\u0006¤Þ‰T4\u0003¾¤~\u0013‰©n\u000fvZmo\tåt]ÒPJD˜wâ̶\u000f¿STjÝ%¸¤Îß9«9ªÏš{5\u00036#ðßyµ\u000f»SDv\u001f¨aŠÅ°w1¨jÉ[§\u00132¿8¸´ÌÝÐx\u001e8Ü\u0000Eý‚ÜKv»Ž\u0019|Uœ¼\u0014\u0006•€ø\u0011h\u0001Ìeñë(Ã£U\u0014\u0001‡Y\u0016çúçDSLîˆù_Œõú…Çÿ(\u0013‚4¿º¤Ot=}w|é8HÛ\u0006í\u0010s\u000ef\u0004mc\u000f[DÒoêûtPW‰½\u0012]=}ǍsK\u000f\bê\f¼LV²6kòfˆÄx(&«ÁA\u000ezq1Q+j\u0013'ÕA\\BZd\u0000;W¼Ñèü*Å[À×\u0016$ì|µ•±uûÈe«&G{ž¬öoa³F°ô\u0007\u0016=}C\"|pˆzJ8ÀD,eO\u001b\u00192f:š\u0006·®¨À¯8\u0002“OÏ۔È\u001aœ\u00145—\\Ž\u001fTöFsP¼+\u0012½#5[k0E¼ù{!œ ¢W=MšéØ\u0015=Mx¢\u000b+áGê,?‘\tæåh\u0016¯tgÁw´•%u€u¦Å…n„\u0014ë„åÐ/Þ\u0016ê%Åï=}P\u0015JKqÝ\u0006CG=}¹ØæSƒ·\u001cí£\u00007{\u0007ï¿\u001aŽ8ïã¶\u000f<·<‰ûk\u0000œe&\u0018f\u00130„½Ñ&\u001dÞ´=}ċéNš¢Ÿ”ØhaÄá\u0005T\u0012ü%5í\u0016ÀžÛìl\u0013¿dU|ïp\u0000ž\u0003\u0007\u0003&4Š\u000e^Æv2{h–÷\u0000\u0010Å7›+x®\u001eî߸Hd\u0010j\u0018\bô@m«hÑß,Ìf9øâP^„ú¦\u0019\"e¥wkWx\bWÞ6¦¾?Ži²‡þéC»TNô&\u0012¾p\u0019Hß´Â5=M:d´R, N»¸½\u0011:‚\u000bzÃÊú4\bËB¡Öþ\u001cZ@†‚  Ã2€iÒtÅ/© F’›ÆÉXÕÓO³¾\u0006Ûs0\u0013æ\u000b³(”é»R\bÅ¢:…zuwçÕ?½†d”\u000f÷8¿òÃ\\\u0001¡\u0014\u0015°Q/‹Ý¿¡\u000b\u00119˜/p_2WÚ\fGy3f8øIëV9I.\\êÿŽöG =M9Uý+ ÷Ü}J\u0017~@»o¨›\u001dq§_>Ëd1\u0012—ÕüI\fÃ=}=}†µ¶I\u0007^pãÕñó+k#…càñõ­‘´ö¥t(ÛCž³\u0006= ­Ôuà+DÁ嗘½çòòÃÕ= ±tx§tt>³nÝ*ë\u0017¤´ŽTÇPJ³zŒ°+9á‰ÉĹ\"ïÊ\u0007¢§2?]°¼&\u001cKiÖN\u001crï/À¶\u000f½SLj±¬Ù±{{\u0006\u001aµO«û„T\u0018d•#ˆÁÞË{\tcÙàé%ôck\u0006ª§þ²{]jé%ð¥Ù\u0014äÊ61ïë*åfa×ÿ®°zŸæÕd)¤¾\u001dOÆûÒ\u0003à2È%P©\u000fx\u0006î%˜¦yšûîS\u0011c]ñŒ\u001cuD»\u0017G¦:$\u0017“\u001b3\u0014ß\b&”m¿=}JÀ*ƒ¥¹\u000b* ñ\u000b*1Œ·Môþy61ÇoÕ*\u001bø\u001c±\u0005úx£”~ì\u0012d\fScäçZj.=MeäM\u0013L\\òc‡>@\u0010ґf†7ý~‹¬ñ¥ãÜ{ \nYåQ\u0014dÙ°šï0·u\u0016ØÛ&q\u0015a¡Êœ¦\u0018Wg\n\u001e1.\u0011µ{]1\u000ennÃeþ;Ö\u0007šˆDÉYR¦\u000bYjòæv§é²µ\u0007-õ\u001ea\u000bRÛÈ\u0005\u0005\\²ò¤¥Ê茦ð=MV¬Š‚×MAƒNdYËÑúœa“¶mà\u0017+‚ÂßgH»hŸI.‰Ú@ÚbLÚbŒ%œðPœðPœðºo\u0012ýÄlIs\u001b,w/—曀\u000e”…òÙ*Ø%\u001c~@n4ν–nŠN\"-Š3ŸÕ5Ÿ6t\nœ›FtCܛ5¿½Ÿ= ™x¡\u0013K‘±\u0011û\tp=MÌìóŠÁ‡èÞ÷(\u000b\u001a+~Èð“ð=M˜\\¹\u001cÐÑ\u001d»É:(ù5X\u0006àV=MÏ\u0012\u000f¬á²Ü u\u0013SÓ%$ikìojó”’y-¢Mù¯»w8,‡Ë1B¹™³Š&\u0012…¢­Õ¢‡!'!}•uå\u0005³\b17¬\u0014\u0017HMŽm+Óí…\u0003é\tɦ]Ý·oÿQÕp§/_Èî\u0017k\u0019Ñ!ô½OŽÐ˜R·‚iXž]\u0013GF\u0015²\u0011‰\tì™âhØbo\t\"\u000b\u001a_›‘Ÿ\u001e\tÏ\u0015'²ëç\f9ÊMê\u0007,ÎZÈ¥*‡IO³I¸&+ì1aã¶vл]8uÁ9ëÛÑ˙1â\u000eFc=MÆ\\#PüŒóCÄj\f™&Y7\u0004ŸT´Eø‚\u001cè:v&¬5I}ÑÄ\u0004Ì©Ý\u0006)‡S/cë“tÁv\u0017y×.iu8\u0017¯Iúˆ°ü\t>4¿vyÆ%â—KiÝV…Å@ñ1¶—¶\u0019‘ ñÚX3\fª£w\u0014؄ŠÃÀÞ,\u0016E\bÜ\n\u0019~ðF¼ÜÃj\u0013\u0013Wˆ²C«¸GüPcA,\"s(\\«[1²\u001cI\u0017¥8@\u0013n\u000f°øBK\t«Ùt“j5š·eÕÖ¥t~ÿú;ïd=M,\u0016ë¿ðǃü—Š?˜JuùJîÏó\u0004(¹”\u0010\u0003è'>i7åkõ:Ø8ŠÅg4HłUHIá†\u0006h\u001aœÛ)ïH<ՕOûAJßJ!\u000bÌ}mԄ\u0007ëö‰W=MÒ\nøzxåß=M‰†/\n\u0006N+v©‰·-ÖýI.'Ü_Hýò\u0004h\u001d©rÖ©r¨×ù&Š%ˆü§ß\u0000Ôë\"uƒ\u001cI%\u0005T%OÊ°Á\u0000\u0011v\u0007†ïÿæGÞm”F7Æ%2‘c=M\u0004 ;\u001fƒöæx/äۘ#\u0010Ígã/\u0004}óTáI²ŸWÄÑú\u001bt\fB(\u0019# \u0017\u0011éIÁñ#Z3l*\u000bÆ:™æP\\J‹\u00052–M°…\u001cýÕ¾æ\\ø Ý½\b“jGŽø= ÊÛ/q˜Y\fß\u0013ÇTÉꈅ~¡³FqnÄéÐDRnd‹\u0000±n,ÐÕEÑÛÌÐò˜?9Þ+ßg)Ɠ{\u001bP• :OmÑÜcђ¼–|cSPÕ{ÀvD0Ŧa\u000fAÅÒÍ\u001aB\u0005A= \u00153¬V\u0006á,‚ö-×·„埗sB\u0004—/×¼à؉6W éLº\\I›ŸÄ´£hªWB0¨zdž*á\u001e£/‘8\u0005ÏVuä[fØlûIG0ã=MFhÔmˆÌfB5²†ñlE—ÜÁÝÏÀPŸ·ÍrÛÁsA\"‹Ð‚¼1ªn…Ð8ó‚Ãxô3–·Ýî\u0015\u0003«'À7æ-g&\u00155F\u0016õ9ð‹¿\t‹\u0013»N[ñ&¡WLÉ\u0013{Ó=}n\u0015=}fWI\u0006$1^ü¾ì1z\u001cü†FØôÂÒ%ƒ²Cd\b1\n(“æ¿J屌ƒì\u0004»B¿~«okÄá+Î]7ß²ã<ß\u0010æ<2\u0010\u000böÜ\f;Ú¯\u0016,\u0016|§Ry=}Cy<ÔSg¤k×ôA®j,ËR\u0015¾]¬èƒ7Y¹ù\u0007A7ühŸ»\u0010ÀÍ\u0016?÷ƒ3Õ(\u0004әñsÅvÈ°pZ¼WÝeÓWíŸR¼¡Ì—êÁÉG¸‘ò* úÀš\n\u0017!ÙNÏ\u001b¾æ\u0019)¦SMk˜§8‘AoôµUëàD\n¬®U­^â€\u0006?ÕAþfF,¤NÖ{¬Ü\bè\u0010+\u000fIÝL\u0012ªkþ§=}\u0006„±\u0016­Ð|\u0011\u0002Ìþ™~ƒ\u001b£T§ÃßÛ;VÉ6‰iu\u0005=}UG”ƒÁ¾“a‰á\u0010=Mh3šÌ\tӉ~žc.”}ÏUÂ\u001d7Z«\u001cÊ0Æö‡@4f/,\u001aȜٱ\\gƂÙu+ø²óíØ©ãzÄÐ#㌟ËïW»£æ´Úá¼:x\u001c«¶úHt\u0002L®³²w”NÓñÒeG\u0004ž\u0005\u000e&ðõwüÖ0¢A\tý‰ÚNh™ég[™ŒJ†K(Ô\u0004 ¿„¬˜ûñÚM/o·=}\u0013¬Há>{øN-pƯÁLúÂÓЖ«æG¶~ã»\u0003†¥\u0013%S|\b¬\u0001ûä&\b48\b¾Ï~3'\btG90x\u001e¯Â«DÇj˜ð0-‚\u00066'\"Jb¿SBœn¤Œ%Âwf®¤\u0005¢Œ\u0002éÞ\u0005#i§&= ‰þõ\u001a\u0007¦‹¢wÚ\u001f€œ¬C—2êt'!ã@m…'qa$äUjK˜Ç¡k¶‹D2áò\u0015\u0000Yç$nNӃl㠚búB´\u0017šôï¶2èé:P\u0012bìb!Â÷Êæ4!\u0003\u0005ÝΎê0\u0014Pi[O4*\u000eK¶1)‹Ek=MgÓ\bâ”h,~’p_¾ y\u0003\u0018Én\u0004‚à³Tr¿‹ÆÀ_ºŸÕ\u0013\t†0Züoì&a‹ÄÈ©%{g\"+ñŽ \u0011j¦\u0018ý’òÕ̘j\u001bvwÁ]Š\u001b\u001cÍrdG\u0013‹\u0001ÕÆq\u0007nxp<^L\u0005\u0003*΀\u0000OãÈá1LjK= ßÎ\">g'è‡ø:‹¬S>·\u001dBq\u0006\bA¢sDý•§ÐÖÆãÚs~K²æ\u0001³Z\u001e\\âIÿÔ´{¹$êþ¿È\u0005S6K¾e\u001b\u0017Šó\u0000\u0003±am+T„Ï„f‰co҂‹~Œ\u0002§×¡øڕ–n\u000f¹Î\u0013™Ÿ_?zyúGÃYÿîÄ\u0013NõK]̔¹¶\u0012\u0003ì§gÀŠÆ\u0018vH¶¢ç‰ªb)'Å5Idj>µç¢W¾í¥­:øiµe=}Æk¸ÖJ…¥=}(+‘%\u000b°9g¯?d(xÄo\u00187¨¯\u0002s&K\f±øÇÒl\u001c¾ä\u001d˜‡\"zÉ\u0007ÜøYÜíÀ\u0018Ú\u000fk\u0007v±#m\u0001\u000eO‰*s\u001cüÂG•çìR@\u001e¼3'Mý\u00183\u0018\b.BB]Ï= a~S\u0016À‘QŽ\fŸ—9\u000e,xìÄ\u000fê\u0004ð˜!Ç\u0010@¶Ú\u0018u50*!\u0000y\b–˜!p°ûó¿VäW™\u000fvËLý\u001f4rI\u0012—P2΋†\u001c6“jè\u0010ßë!o\u0004-ÿ<ØoÉuἤÉ@¤;|Y1H\\êÏtž3î‰÷âÿÍç«8n¬~\u0014;\u001b:q\u0019B\u0011@uJ>ð²\u0019ÚlʼnQ˜ñø5\u0000\n*j\u0015Š$^örÁ\u001f\\€Ì \\\\˜Ml˜@1ˆkë+Ì°¯îšŽŠÐ÷ó2\u0010(Þgã+Y:ÉXÚ\u00075‹Î“%j\u0015ԃˆi^u†ŒŽßò|\u0000Q¬Ñ¤bO\u0005¹È^[)t+J\n÷%j­fÜM@\u0003\u0014\u001dV\u00102ñ\u0004¹MŠ\u0017îx9V‰¨\u0013“ø­Ú8­N\u0017a)ÝÁ›ð‰à\u0012¹\u00024Ý\u0018Ê·øf#çTÆps!—K \u000bþžôP Ê¥Sü¦ôM\u0011»Wï\u0012æq¯\u001b¨5#ÀAJ'gdk®zÉaÕ)IÓK×6ò¯×þ\u000e\u0011í'MÚ¨j†\u0002\u001b=M…ë]Ëٛàô\u0014û]µ|ÞCë*hô‘óÀ&قõaX\u000f_[jz|#\u0015(…BŽä£NÁ \\}ÓBa&¬þ\u0010WnGÕ$GEÏC=}¶ÀG9$p1øA.\\‘ƒöj=MV' \u001a©Náõsò5‡—è¨\u000eùު·¶ÿ\u0011ÅÞåDꦖ\u0010h{ª\u001f+’2„®¿\u000e-'«ËºU,‚sØK-“*uÓ\u001cYœ“(XXXn†Úó\u0013¶Õ\u0000y\bF/EîO\u001cmõ­ýEÇÖè@\u0005“vð¿×éÿqR̀\u0016(û“‡QLW;\\\u001e˽\u000ebnl=M\u0004<Ç\u0006©a°„Þ·½ñ”\u000b¡MçUÓ\u0017VɌŸU?\u0005ä{2âÆÔ\u001aö^Ü>°˜þđʼn•Se[cŸãqØP\u0019\u0007*‘_ÏkaUpvÇÙ|fN^Øý:7.6†x7\\ûñ<Üß$\u0014s=M‚š\f;ۈ­ãêtçڛ@힗d¦\u001dû‡<ìç·ÿæRz[¯ØlŸß%–Ëûm½/HpyˆS;;\f\u0003g\"…ŸÚŸs;‘= d ŽÇ2ý\u0006®Ý—Ò\fÞ\u0001î¥S\u0001TåiÃc\u0010Q.½þb·Íá/“3ð´\u0017i3“oÇ\fž8uCj]$“§\u001eÃßÉ鍢‰¼–»xèŽO¼\u001eǵ×h\u001eÙ›ë£\u0019.s~·Š\u0001xŶ\u0012Uw—3ÔÂZí×IFÔBs;ë\u0006ý½–ì\f÷!eÆ-dòìej\u0000¸L\"ðµá‘\u000eӔRîejj×{“\u0012ëejêj•\u0014íÎW›Ìäyz§¼\u0001ºçb䔙¬ðž§uáiW2Õ0õ2U‘6=}™ìGĽe3\f>놫_M\fR¥ò¨^Á”´ljs\u0004-gž‹\"Ýë\u000blbŽ]ԉŒD_Mάa õ趂ádZ\fa ?\u0012\u0010¹%›\u0004ÄñÀJSy\u001c'“÷tUDd\u0001ӗMù\u000bì\u0000/Wï/\u000fßã‘\u0010æ9›¬|¯,9ÎäQ\u0018‡íHfÿŽ9Ž†UÁ\u0015ü™GoA)\\ïú|ð±ìZWôBÔ4\u0015i)VÀçíþÆ\u0004U”\u0007\u0014•\u0013JÓ\fn÷Ìï{¿‚ÛC\u000fQ…¿\u0001Íp{è\\•3´\n†Î´WŒÊôJ1\u001e¹\u0015\"\\\u000b€K\"5„l…iýI³„õ†ÜÏ\u0000Å\u0007b\u000b¹ÅD¹\\FÒ\u0012‹)¾Ä_×»jÒùk)à\"~\u001a\u0006çp\f\u00193̲€]¤ö\u00165À¹(°n5k½\u0004¥çY%½z™aTìd= ]­V\u001dµ,XAG?’\b\u0016\nÔ/ùÌ$\u0007äÑìdX-ØIÙq.‚i‘Ö•9²ýÿhÄx;sÄa÷eú¤Ùδt\u0001lã÷W궵üs+}]å\u0019¾g.¯Ðm-(-d\u001aäþJڃ±\u001dké¼I%i¼-Äj¨ƒü<3= ÕsðKߨÙäDB*\u0001x\bgՑ\u0016I&¡·òÖATfÕ+k\u000eŸÁ\u000e6¦Ñ\u0017\u001fs×Ò^÷^H!ÜÆx\u001cՏ@¯m²ãRÊ0ýþY\u001aÄÌk©˜Êí¥4°Q9îÅ6\u0006}¸v„\u0002ŸO\u0012”Üê(ÞGô~q\u0002Wrd½S«½1‹Þ\u001a]\u000bžþÒ('+µÀ§\bøKÔ<ÿ·;É-!ݏÅ5Fo@Šä²øe+'.ߍԀdë.ô+Ç£¥lPr–ÆÑnë\u0011Õì\u00137kЧ*E(\u0006fë*\u0007sÍIHLꨨy}µ\u0014Jµ\u001c4Di.}®P{ÊBÀ±™0ã§ë ]î&[ëêå6<ù˜à߄\u001c\u0019Ùx\u0004ÂxÕØÎrEÕ\u0005a\u0007Ó¤µøÊ=Må¬¢§ƒbŸKÐ\u0007‚N|®ºÔvЙ+~ÃÔ»Ú\\ÿ™¯‰'K>^\u0010á­\t0ÿKDõæùžVæQ\u0003J,Qü\u0016'ˆý\u001f¦‘‚\u0019^xâøöà,YÌhu\u001fÈU\u0014=M\"\u0001RÄ÷ÞÞië@= \fY8u\u0015L DÊEì¡\u0002è¡y\u000bnV¹˜´ã”\t(\u001b\u001eu¥ÈêMDpªÈ®hKÑS~\u0015™‰GœšúÞe\u001b§ÖłЎ4Ùpê¬rðÖ#„V.¾¦³bIç×}CΚ)Kú6VO¾*i“@ád7QƒH材³¿AgL¨®¦ÒšœþïŠôˆ¼-Ǔöb½4I\u000bó“H´Ì‹@Zo=}—àyK?Ý«GáE:uÿ²D&&\u0018™¨Ð¸[hž¥¡w:zž\u0006|êÖ>Gm‰zÂëž\u001eŸ\u0000^ä4°Áè\u0003]XFª\u0006\tÞÎÎèyW¬L Y¶¸Üùþü ³Ô63ÖÈtÃ\u001e@-(¦¼²µ\\*Ãä\u0018Òvœ¿’\u001aIH«y%—ÏŠÓB±=}kˆÅÌ÷GÍ=M[–\u0012íN\u000bî™9r—Æ.ލÊÍá\u000b= 6ï2-\u0000N(¤ÁYŽÀÕnj²\u0001…d›\b¹äšã?%B›=MÌëãÆ\u0007à(°#>ïOí]9¤ûٍƥÍ߄¾=}J„i1‰\u0006z6.~C\u0001¯õ‡¾Ò°=}3Åà—C)÷!j‡Sn‡S\\©u\u0004Ñxù\u001a<\u0011ÝÒ= ]ï›\u0018Qf*›÷²\u000ex´ýÅ\u0000ý&LŽJÎc2¿Yf÷E7#øÑ\u001eµ?„•§:É\u0007ŸÏhÞ­^.å.\u0005Ýȶ£\u0017=M\\\u0004/@ ¹ØõóYêbÊ\u0013\\ïu¦²\u0010a´7vÒfŸ\u0018 ‹op´ˆšbÈ_&¹rzl¡jÔ¿öß$YÜN\u0013\u0010a\u0015fä™.p,¿Ž±&1I¿Y= }·ŽÏx{Òì¿]%z\u0019\u001bÀTÚ6CæµÆ1l÷ùPõ\u0014ò’Ö\u0011Z\u0017[•1ìû\u0000+€WzÁzÁ—Np!\u0018n!\u0004bK Y= \u0002€´Ñe+‚wçœ\u0011v怰\\Jª>÷¢0?cc6­ÚA_d‘\u0015´\u001e­Ÿ«\u0007vr¹Þ\u001dN2¤ˆk<6ㅇ7™z\u001f,\tµžYô¶¶\u001a¨×åþÍ­HxDôxZ\u0001½WäøÀ>>Ր(æ8ÿ),Ü/>2¤üÿ’µ:G\u000bËj*&\"fDÑ\u0018ø…T\u0002È\u001e\u00015Î\u0018õ0é¡üóiV%:Š”õs88\u0012^V_|§Põ³~)ÕÛZ\nÐҔ‰Õhþ\u000fÿø¯\u0012žKBœàÆÂÖ9ûcþžÉµ€¥\u0015Ð/ôÈíZ\u000f¡g&= »ìŽJ\"øÒhL\u0001eL—Kï0û™©nõ —¥mý~öÿýÒâ%àY D6Û[s…n¬o\u0005|¼Üd“½eÐqŒ„¹W%\bÚaĜ±š™ÕnÅtx¡+Ü~\u000bј@ã¿'\b¸x•ÎÃ÷ï0^™ªw)WS®o\u0015i’Fq»ŸÄ\b© ´<ÑD\u0012öÛNŽO\f™%9\u0005÷“Sr¼Í›o÷!U6ÝØç¦^ä\u0018w»\u0016ð^ñ=}57= iæÌÞȜÍù\u0015î§ÕŒfd\u001fµé:òÓA¥“Š×‰Ó\u0006wpƒ‘¾ ¾kÜhf/axr—®\u000e·º]àßãþ¸«\u001as¥âòFä½\u001fWžÁ\u000bCê號c¹}h~¤ÉÑν1÷†jly\u001a\u000bú\t€iO\u00011ý­\u000fSZáўP¹oV\u0015#¡Ž²ú ʾ֊‘ýqo¤;j3wÁ}\u0015ê4wéLj\u0015gfêO„…­0n-? —gi¾þ÷§“@ϲHP-iUÕ7 ¢Kù_<‡UòÎnÈH¶L5)•[gÅ\u0018æRâ´.ߊ\u0013\u001cÉ^sIþ¾Ÿ7\\}\u000e~J1p\u0010aõÏ\u000bËQ‹,wJªÁ™\býÞSÓ.¸áäˆÃ”À·t\u001c/ÅÝ$ÅÃÛbµègÙ\u001e¤9üÆ*[’›A­\u0001u\u0013’jr$µcñ£\u0017ñ€¸wÄo·UÏã{ù«à-¾ûZ‚çn<ßÞ77£“š\u0019\u0002‰\u000bnÒäy\u000bZîr>ç\u001fM®jµß&aæË°€\u0002©íñ˜Òj3\u0002ê÷¢Èh¤\u0019'(åó\u000b¿ì]ø†\u000f\u001du½ñ÷ÂÏøÞ?ÜåJîMl«ûìêkh]¿h\u0004m˜Vï\u0004\u0006¶zg[‘\u0012]UÒ/Š¿Py0\u00014\u001aÛ5Ù;þ:\u0011-6\u0005ce0CÆÔH=MT\u0017²aÃê*;Öã\u001cë6;ï\bmÂm7dŽ,—Wrû„!'CçfEÊÐÓ¯UÖ6±¹Õ$\u001a¸šºÛ€Ž?Òy^\u0016\t+\u0011=MÈ<…7¯>9eXe\"\u000f\u0015i¥|‹–±£~š±\u0017úi\f\nù£Â= (­´Ç—zuRh|\u0013ã½L\nâ÷\u0007‚êÍ\u000efcar\u0005æ@âóÍÙPNÒ\u0002æŠl\u0018›õ\u0010ÃÀ½…Ô\u000f@\u001d0¦Ï–lÿíTùV.\u0014ӟ\u0003PÜ;²e3 Oò\u001bT\u0007]w—<\u0011\u001b‹Qõÿ06lÂN­Ý¬5f‰Ý|}Ià\u001bælN™Éû¬KLₕŽ¼P6ä0®gÂ\u001a5®&t¹Ê\u001aåLáK9\u0006\u0014D塳ÂŸ· Ÿõ¬@ÞV¨Ëí\u0014³ëçÔG³üö»€~%cv‹¬é\n…‡­ûå GDK\u0007fêá¦\u0007„–s€•ö«Ù\u0000å/C‘X\u001aóùI\u0007í ؃À@ˆ\u0001Ó= 0ʖÝ\u001c!K<ô>WÓȀ\u0005-è4\u0006\u0007\t\u000eG{„)öL8«?„BP»«·lrõn·ÉyŸ¼\u0007a8_jˆÌƒ¾Gy./“\u0018êÝ¥öA݆û¯Î;Ý\u000bû@‘‰F~‰ÏR\u0006Š½\\gÑö‚= ÐÞV‡\u00040“ö׬:î\u0019»\u001dhëFæù‹ãí\u001d=M]¼Ùûü\u000f£\u001a{3 ¤™ùp<\u001bût?\u0000‰ÅJÆ(2X}}äèqÉïëXå\u0002ew}56Ãæv«ÄúºÃv™n\t\u0002çv\u0012ø±úÎ_n²©t\u0003íO-t~‚Ö‰d†(Ô6!õZhÞ\u000fr/\u0010í³â'Žu=}m³çRÍ\u0002ìUæÔ+\u0003¥9\u001fr\u0019 NŠtD\u0006þ¡\u0013\\Gb0Á‚é]ut˜\bÆ\u001eZkꑉœë?ý<Ð>ùL‹\u0018ëé\u0002{R˜ôãhr®d\u0012g½º\u0011Òî\u0002\u0001\u0003_Á'gfƒ«Ÿ\bUÉS\u0019 ë1Æj›úSJšÊQ$“×=M_ÑT_³íD+˜¬®'J\u001cÁ¸ÆæŸ8\u0002“‹î6¯•ò֌\u0016Ÿ¢ÐAÕ²~‰³¡\u001c)BeêéÕv>0´ïƒOÆj¶%™N“‡Šô¡ÑVh\u0013\bd\u00054Q+ˆõBÙüÚßU\"þ\u0011X ÀB´a.'}_AÜ£¶ã¾\u0010‡1¯\u00057\u001cH’ñD†ò²ˆ\bíJvwS—£¹ñ2%ɔM×3qC2°\t\u00029\u0003…=}Ç\u0012] gs\u0000sl{\u0000½_ʊK[®e«\u0016ØäƒÜ$ xï\u0001S\fcBˆÛzÃ,C\u00156\f!ž…r]?;¥f\u0004&\t^Ža¿\u0004…?‡]²0B_b™1oÁäïŸî–XhŽ&…ý\"GísÚ³‹ÿúR\u000f‡…\nH\u0000QÏú\u0017¶}i»”7™\u0019¢\u0016æatæ\u0016 ÖÉÔîe\u0000o°\u0015= ¡8®À‰\tg(N \u0018Z\\\"‡\u001eíò\u000eéÇË7lÎëÕ\u001dÜKŠ\u0017orÐvíGõ7aÕ\u0005÷*ê&¸›‹®<\u0015GÖá4ûö…4\fkDŒÿ\u0002˜FØ.?6þ‚4â/¦Í\u000f{\u0003rÍzL0sæ\u001cŠìðÏZþáëÏóJ…Â\u0005„Në\u001e-6-\u0002‹ž†½_\u0017pr\u0003´/\u0006[F÷ƒ]·Ï‰Ë(˜è™LJ†Ú|®5(´èæÒ²¬\u000f°0êˆ×Økց= Æ\u000eý\u001a›ñ/h]\u00070h–?ØÆø¼=M\u001c\u0018€\nSHn];9\f„ÐXTêðpßq=}g\u0004sK9XÔ\u0007íÍÊ\u001b§+\b¹ânߪ÷@…ì5)Š'q•@ ¤/\u0010\u001e#ž(aÞÇVUo:ÈÑå°r\u0010\u0012tÌm+iŒ\u000f»t\u0013 DþOü'±¬\u0001\u001dGJ\u00139ê\u0015lô‚üŒŒ\u0018¼Rùœ.›3ƒ×\u0001š‹\u0013\u00143= Þ.:oÐE>K<…ˆ?Ï£ˆÖÈmš·ÿ1q=M\fäÌUû×U\u0012Ô\u000eÏØ8\u00060ë«Þ\u0018K¤x Xª\u0006QÕ3ÓªÃ\u0001:ÈI›°Iü3\f8°Îð\u0005gNÛV1\u000fãh›Q= Q†\u0018fß²4-ÇÒ8X¬¸£,¤wà\fm5蜘*í\u0015T8\u001e£*$cm\u0014Chý\u000eSMrݶöp‡”ŪpŒ\u000e]\u0000U€3\u0016Þè1lܶ܈;ós·€ïŠ)è,Œ\f‘YW\u0018\u0015£È•~åð>¼Ghc\u0011π̼\u0005¸\u0012ÿþh…\u0007\bk\f…)\u001b\u001ed—´QÞGb%è¼MlKì€jý·\u0013=}ˆk:#–Ì\b\u0010ÏðH3\fÜÌú‡\u001c\\\u000bN>Ì= ¾„\u0000ÒÚí¨\tüU\u0010:.cÜá9šë„FS¬ƒ=}r×½\\¶ûN­1k.\u0019\"T½¹\u0013W¿\u001c\u0011‹™|\u0015;ZšˆäÐ\u001aú€üߙ\u0002\u0018V]:0\u0017Ó|\u0000Cþ;\\Yëæ\u001e”žßّ ÁB\u0019ö̝¶~ ۟#ð\u00131†b\u000fBŽ|jèj\u0010¤#þ_ñ\u0010\u0015\u000e5\u0016Ä\u0000ÍnZ\u0010û\u001dse²¡$£D¨_ºxxi¹£Õ±S¾€»€T®œ\u0000ÙØ4€„íA½\u0001kTÄ\u001e=M\u001a—\u0011f××íŠRë\u001dG²™3\\NQŸÇ€ô\u001f½FÙN¶ ý}§\u0017“\u001d?¶Ôìœvâ\u0003X±>’boÎgV \u0010•¾÷³žÙøl2NæäÑÞdžª”—ýÇ9Á¬\u0001ò\u0019o§/gK~Xh#¼|ã\b\u0016~𪉏¦–\u0007+Cät~Ikbi3g\u0007K(5D¹ÎV¥î\u001cÿtÑ÷W“ˆo­¹Xƒ]\u0017m|FÖë+.\u001d\\Oÿs¿\u0004ëwéR]ÜÈ6¡\u001a³\u001f\tº\u00003ž\u0015Á_õ\f\u0003¯\fú›@bX\u0019T\u001b;xUqŽ=Mq&\u001fOŸ¼¡\u0000’&¶©\u0015üÉlÖ(e&‰­äJ¦ú/\u001béü\n=}Z\u0005\u0017¶µ\u0005R÷T\u0003–ÎO\u001djÉYÄ4ýÏìšë\u001f@âÒU{Ο\\h'\n‡æhÄ!„ð\u0016LyOgæyM0mØ|Îtk­\u0011ýL2÷ˆU~…Q¹Ä¿o‘y´T\u001c$°õ¢]¹\u0019Kùá\u0015Ñ騳¦±\\i‘³£ÉÓ)(Qþe8O\u0007»v\u0017”°\u0005ñàý\\\bGKͯÚ)ڈI-6ÛÛª\u001eq×ÎE]¡Sç\u0003‰5tقÃø91^…\u0015\u0000žÅíM@»~d\u001e\u000bs½=M_3 uu\u0016n¼\\-=}\f–“X:i÷}Š”}‰†\u0013Ct:Yäå¸ÐU\u0016À70jäl©ô\u001cã҄\u001e\u0019#\u0004nØOý%È6æNz1\bÅ\u001cÔ³A(AžRO ¨;Àê5\t\b¹a:˜N!0¹çx\f\u001c\u001b*lÑ\u001cêÎ\u001eðj\u001fZ \u000eœIj59ÏX)<‡™Ô›\u001b\u001bß\u0016o\u0004\t\t\u0001\tØÿŸ´üø ý\u001d9‘á®\u0001\bøééé\u0015\u0007\u0007ç\u0007šy\u0003ÑW¾1‹´Êý\u001fם¢jš+)õ*p”¹+&\u000bæ\u001e¦é®9·Œ8M­x\u0012øDM­H‘ÐÂ\u0002BÐ6|äù¶ñ”•«—°TÔ\u0017/FR-öÿ«•ºçȑHi=}VtÙ\u0011½I‡Çq\u0012Xaå\u0011ÔwB?lÞàoSې)Kùˆÿ\u001d&ö\u0016†à\u0007ïޟ\u0006KÊ¿.qÐÌÎTœ²=Mÿ\bîý:4Bê‡p= ñ¯ü揟\u001d˜´­\u0012Nõ¦ýs\u0005ôˆ\u0004¬Ù¶²t\u001aVMŠ²\u0018ó\"aÂ\u0010%\u001c—*ú¼W¥qïí\u0018\u001döh¡oÏOÂ3ζn;f·FK-«lg&ÙJE+vÜ·= QË(á6ÿ°’òOÆÈ+ˆXTÝj\u000fëì8·pÀ¥\u0007_C\u0001;7‹¯ÈûîÑî/†Ò„,üõÏ|pÉ8&ÅQZ»„*\u001e.X”YÜÎ\u001a(\u0016.7±ÄM•ÙØá™Ë8Þ\u0014ˆ×Äà̖õ²\u0005òª¬Êíæ|éZ}²C´\u0007\u0004Z\u0005Ôv\u000bÒ«ËÐC;õÕTK#»ìCwƒ\u000e¿­Â\u001e/e¼ør\u000eB4³³¯¨ƒ’\u000foÕ±ˆ3©^ÃÕ¨Ð!͏Ëô ï€ï²x?¬.ó\u0006\u000b€K@¾÷Å·ã½ÜȺ³§Mt¼úíF2Ÿ\u0012/T=MY1-aÀÁF›€×ù= ç\u0005_o\u0005—\u001b%\u0000A\u0017Ñրç\u0012æó\u0006ÿ\b\u0003_\u0011\t¾ðuxÖ¨O“4ªÐãˆ8ò%ç@ò\u0016\u000fz$0k-ҚŽH¢bt)tüV\u0010’‡Ñ2mæü\u001f/x€_\u0000;<þ\u0002ÓûAsvü¤’\u0011kx\u001a7¬N5ŽaÛ\u001d¢ØÞ¢FÓH\u0002z6^]ò“Ê(‡lœ\t¼ùŸ_MÐݍÁ˜½Õ\u0005/#¡çŽy4ä\u0018Ä<\u0001¡žBN‡¸\béœ\"Quú‹€)K˜>èZ~\u0013í|¤šè8ëÍzÙý‡Û\u000eÍùÿšL¹èE\u0005Èڐjmr= \u0005èÀ®ýB×æus~\u0007\u0007”òå‹à¥£\u0000F­dcæz\u0014]¨äüC)q©yŠ[ŽVÖü\u0012o€x\u0007à÷6\u001bќW-4íüš0ªßªƒ«$D\u001bo„t;V†À€¶\u000e= $ü3dCç2eióW[\u0013)°ÂªÄaðŽï\u0004Ë_wÉá‡\u0017ĕ§/Z,Ú@ð_L<,[P-wÉá=M\u0010…ð\n¶\u0012f'\u001b.›iɁ3ô>›»Ù”IT,ª¨=M¶\u0012_ð_4…#'¯D ٔT}gFßË1t5îÄWˆogD×+39c\u001c,^€»Q\u0016\u0001=M„:Dçã\n0£è®ZñxR¬ò1w1\u0004.¢.Â= Ý~5eâ±Ô)R³ivÊK›\u001cÿ\u0005Bal!š§%%ö£\u0015‘|\u000f~?\u0006ŒuèÎ\u0001\u0007DýŽx­{\u0013N!ðiÒh”°Ø¬CSx\u0013KVv¿Q’ÀïMÁ\"3Œœ\u000e©®\u0011-†üŒL¿\u0004èg#5\u000f-b,ìÀMÂ\u0002à{¤å\u0011\fØS\u0006âJI¯Ü£’o\u001f¬^„³z‘7RùÚ³\t\u0015E͖\u001aô\u0015wàû¯HüHN¤4“4¬¶D 4¬÷MÛٗqp÷Ü­Â\u0012&\u0016jéÒÜ\t‘ß\t\u0001•’= \b^= HæO\u000bNó]º(­å”\u0015ý\u0015:ì &µÔh½Š’\u000e/„\u00167µÌ£<Íõþ…I\u001fâ-…¤‰þ)Ä!õÌPœ[Ã侫È\u00026~°ÒÐ\u0005ÝögGÎ\u0001\u001dh…¤ŒfùßIݨ\u0000„\u0015ÖR\u001fq\u0002ˆ-Òâý)\u001b\u0006ýN¼&±G\u0007x!š5­NGÄ(ÖÛ\u000e’žµ—WÜԞ'¶³,‡ó&U¶Ã$ò³œ=}\u0013ù\fæÀ›5ó{Õ®Áðw#dJ̼\u001f÷Røwüš\u0003é=}mç}^¦\nÂ= ¶Èª”\u0004溨§eüƦ»¿BtþÞÍÏ\u001cK\u001c\u0014ý•b§zu†\u0007©rþÙÛ\u001d\u001b-Äû\"\u001bMF\u000e¥m6v…t0©ÉÒsMUcä4\u001ef\u001eðÆá²÷éT*…Ý•f®‘6ÞMW\u00043ñô\u0017\fY=MöÎ)Íø¿¸«hèIŽ…WÞ\u0007;\u0002gÈt·Í\u0019úèk£ Öi˜\u0002ÖüìÐî\tkkm/\u0001ß\u0019#1Ù%\u0006­÷¨†çdFì”\u000b\u0000\u0001Xt—ýC\tÞ|ùȕVA€4ÿ'9Շ%ÜËèþ\tm€Ü¶\u0011&9Ì}縫ÏU„\u0011ÞþÍÉàâ\u0005‚V¼\u0017ql…¯i:Ïwßô«Çª\u000bSâ\\\u001eaؔYífF¯­–¯\\ÃaU\u0018\u001fU-S\u000b'õ-\u0002§\nƳ\u0002¤§ê̟Z þ׶:rg¸KÕ\u0012»2ô<\u0012¶\u0016.–}3hêõÝC7.ä\"žôv?â¾PûU2ÙK\f\u0001ë\u001a,FÏ9\u0005ÎúŸŸƒÉü\\¥䷣©±K÷醺«ô¹\u0000\tŸçöÄ\u0002ç0‘.D¼\u0005ÒEÿÓq°µß-Õù:Émî7àßÅà4ùÌùÏ¿\u0006Fç*^^Àèoï#Ošß¤\t«Ã®ä3øˆ_¶§|ԅ\u0002¢!vg'Så¯hΎ÷-€úP™y² ç5‘²‚Y€Iæ»Q‰ÊxK‘œá#P4\u0017êK”Ù\u0012èyˆË–w \u0005só*C‡@d*\u0012†\u0002™ªä¦#SåG\u000fÖðàïKÀø®Ç“\u0012\u001f~\\¹Á\u0004HMzõ¨‰øL5ó\u001aÞÛ0Sô-÷\u0018\u000fã愛L#UB¶N\u001a3àÌt®žET‹p•¶\u0004Vt\b­!Cf”FJ!\"õ\u0018\u00117$ô\u0016\u0002üT ›Oًë~\u0011þ\u0014ŒñŠ\u0010\u0017S†w&Æ|=M_¤´\tÏúL̪\\§ˆ½\u0017&=MD|\u0012\b…\u0002Å>\u0005wkȁJŽ\nz\u001aµJ(Z‚Ä¢A·øF¥J¿\u0005·l-'g\u0002›\u0014ÖálÈ¡˜jAEúN¦‚<ÌÍ-ütµæù±J=Mæ³ãÏ[ä±Éº3‡ß‡\u0002«*÷\f\u0005¯zî\b±n#‹ý´›8΅\t]\u001cþqP?CÚ”ˆ\u0003þnn=M0åus\u0000x¤Û2þaóÑv½P\u0001ƒÛ\u001b\u001d^c«= Më‡ÊŽ|¯—¤1œW¼«õ9\n\u0002-åƒ÷?¬\u001de±¿Ü­¤ÖƒGüƒ–-)\u0013ČüdãnRP{õ!J…[zí¤M8®z y(^mbpî%\u000f7\u000b¸\u0002úÜ\u0010Ÿj\u0002\u001dɓ’\u0013[\u001f~ÆRä;&âx^š¼•œ‘^+tŸÀñk\f9¨¿w\u0016?#Æoä¨\u0002\u0004\u0013ä\"¤b¢jŠ‡\bs\u001a\\Ž\u0001ŸÊx\u0014€f\u0000\u001bøXŸ\u0015'\u0011œ~S \u001bÀÍí‘q\u0014ó\u001ei‰X[P¿„‘ýTagŗȭçS™U‹íÏõÔNÎôKÐe«•…†¦\u0006ZXœh\u0010\u001d¸ãø3Éw\u001b„\f\u0011¡™X½“ª[²¶*åm\u000bƒä‘\t!¯(M+©ŸÅú¨Zú¨\u0011l\u0001çed\f½ƒ}±“¯¶±÷¦!\"xB”9ºBo§\u000epJÒ©¶\"¢:d­U‚Õö©Hä®å\u001fø¬É*ÞK{Hh\u001d“S„ÎAUîô@Õ7<‘Ùt/—gÃȎ²¦*öy…«•wô£îjÆ\nW\u0005Óbà:ŠÚΊbߧòñ[=}wÖ:¿\u0002©Eh㤗ºÉQ·9¶˜‰‡W6z׋v\u0006uX/¹ŸR›Ù®D\u0016¹SÙçØÃÉ\u0005-rà©È!Z¯ù¿\u0005K„ÌCb= WÃîÝæ!þ\fÌR®U¼¹s¼å¯ùÝf¥(V@Äz¼Ã\u0007«<ÂõöÄHô@('>ã(„ì[Z™Í#\u0000\u0004)0Í\u0015í\u0011z¥\u000b|Ì\bFØ\u0000ˎ“G\u0011®\u001e{+ÝÉÜ7eñ\t®=}\u0012ƒ\u001eúó!ò.ô\u0016kg>X<¾ã}ãÄÜWõjœ\u0010%Gó@G|ð1ôEeî,¥*ü¾\u0007°É$x0ƒË\u0013g±¼ò,“Å·tÀ\u001bčÔ$\u000f\u0012\u0016à—4s¦;G\fL¥È³.@®};FˆéÛÑ*\u001d=}oè/j\u0004“lŸð£Ì‡ú¯Ëø=MÑy[ژ@'n?¬íH\u0006ðQ9O(ŽnÄk%ò‡9O„\u0001U)žk½%Oÿ¸,åH°\u0007(\u0005¶D“×Ú38Ù9}r¿\u001dåb±SOãÓ\u0018ô¿gdU\u0019³‹{Sà<0\u001ež²\u0010ƒ\u0010é\\oÈë·c–0d´·r3ÈW¿—Ò\u001c\b¿µXz\u0004= £i_9ë\u0002\u0007ŒmwvGàöýŒÔ\b{ËÈ(Hèòn\u001f~æ\u000f*Ú4^|ùç*ëÏØ+ô´ÀµK+ѧË\u0001¾´À\u0001\tè\u0017ùÿì\u0019ÅÝ\u00155\n\u0010.wìh“µ/”\u000bnã'›\u001f;¥Å¥\u0010˜\n‘ÀYË\u0012³\u0018nc\u0001õÚK4ß\u0017uß}rtèó:-/šÕ»Øˆsn½K¼E´iÇ\tÑÞ4¹0ԙ³5I¨†´¹*?³EV*˜p+p\u0005ŠÌNíx„H]µŠ˜Vênão\u0017×\u0002T\u0001M8¡­Ð’”óxЙ<úŒ¶ˆê­\u001bù­ÔÎü€\bªÝܨ‹˜\u000bn|ll•µI- ¼{“¹\u0000«\u0017Dê:Ç\u001aÌ]—5\\\u0011¹ÀI\u001c3(Š\u0014Ï\u001e¦®0\u0001\"i\u00064µ‹Õ\u0011̋\u0019ÌßU/藙ÓZžÄœºc¥¹E”ÓËÇ:KüXÆUû¶„׫\u000e\u0005ÓVÉE•Q\u0015°®ý³­Ÿ½©’4^·z&*²\u0006’•ŽEÍ|=M¢ÙƒA:›ÄÚ\u0011»\bS°(ÍçLªóª©ž˜iKoØjÁñ’ò%/YÑè\u001fFu{ç\u001cŒ³2Xl2Ã$\u0019\u0011Ã÷¢R³/ïË\tP¯¿X\u000fÞo\u0019\u001d‰´áª\u0011ֆÝfˆ?ôàõdñy«\u0019Ûö›S\u0018ã¬\u0005¦3n\u0005×ñ8¦(Q5ÿ½š‘{‰\n¶\u0000\u0016\u0005\u0004m¡¹WÍ~óã‹Ó\u001b‹°Íœk”©\u0004'>҇\u001b\u0010ýÁCؑµ\u0005øq\u0012󲅪òÐ_HˆÕ¢•ö‡óÇ|Ì®ñ•P™°Ž–z}ZÔñÿSÄ\u0006À9á±y¡ÉA\u000e?4Èμ\bOIOÅð›ÍioBÅ&WlÁÌ:Ëx¯‡\u0010<‚ayaP3D°rá:\u000bo&p®½\u0014= \u001c¼còù–¥þš!KQÎĈK\u0005éü°’e‰¬\u001fïäæ\u001b9²ä\u0015ŽfÊ\t!\u001b¤´1©¿¿Æ;fj؞eÙ¯<¬\u0007hqNÕýˆY†×ƒC´p‚Å¡¹œ\u0012Ρþ#'åc(y\u001cCÿG?l\u0019{F8q’«è)&!^\u001f\u0006¡ðQZYÔPA*†f'C\b~×Ð\u0014YvíòÞÛ\u0019ø„íÎ3ø'\u001dړ\u0016tøúwyÀ\u001d\u0005úNãxy\u001aQ¸Ì%¤p\\Ãw—íG]\u0005mHQñ†´o:Ö9Õ\u0015\u0017̉\u000bðÜøE†‘XÙ|1qM¦@aÒ\u00044+È[Ûà\u001f“Þ\u0002\u001f7\u001bˌõà d×rXu\u0010X\u001d·mË0}¹é\\ù5E˜ÑÓ3\u0011_7£·Ùç×ï£0[cf\u0002\u001b¨˜’Q\u001d\u0015Î¹°Ô›´\u0017\u000e™\tÎVJxÝn!\\ÿu–l¡N\u001d€\u001a-âŠ\u000bJÊmV\u0017g\u001d3¸7D#\\FÁxHµ÷€ƒ’áî=MnT\u0018~FV·L*E«Á-\u0015ɟáàÀ\u0019·…n#Ât¬”±\b½¦zÍQ\u0016Ül(ŽE¥2K¿†´7\u000eý&.·+%òMRîûyj-áùè:\u001b‹(X“ò\u0017#µß±’«‰=M@µß±l\u000e÷\u0010ó%j%š´ 3Gíù\u001c{\u0004Ç\u00139ª+äz,¤{e£†®à´Ze\u0014®+þèÿ$[ÔYT+þ‰[ø1f\n˜Ý2@˜5gЄiøÌÌÁÔÐ7\u000e\u0017;î\u001fK¿Úái©Ê_t8¶Êïȉèÿ\u0005MçÑ\u0017ç%e¨Ä¬—Ï«¤k äUæ\u00010²\u0010ßµ—”÷ßà8¬¹–àËößyý7NÐmEèÜù7åÇFôo±FòHéì.\u0011ϋßU\u0014Îi»¦Ð3\u0014Kó\u0007ƒŽ9÷VTrŠ¾¶ý\u0011\u0001Õ!ü\f\u0001\u0015!ü\u000fWIMÁ×v\u0018\u001b—ýH­¿åDÎ8]\u0013(IºÅ\t_¸òCY籆êG\u0000å\b\u0014$$\nØËÏJE…µ‰~ ½9\u0003¿µ-©#d弍pïÛR˜ñ_\bŒ˜jE]¥.\u000b]˜bÁð\u0007\u001asPbYü\"Ðy\u0002Ê5Hmído·êØ\u0019¼’äÀÙKx¢\u001e*½\u001e1ë“ÍŸtuÔS<\u0019‘RTeÆ´wŽh|\u0005P;´\u00013íÓÁ\u0018¢e}‡Ï6Âlhœh6O=MjŽ¬,AW¼x^\u000eyÑíÑÃyŽtØ5\u001b\u0018.Õ³š;MæGdﲤ§ð8ÎEi¤·Y\u0006”\u0018BR›$À\u0000¼4¤\bÞ+U~ûr”A•ÞÀo°Ã{§2ÞÃTA\u0016ˆ3gئ\u000f6ÜÑ$Á1ö\tmBˆ†é¤\u000bg}<\u0005‡ð‹Q®\u001b«‚c;|þ×\u001a\"kÅ níá\u0002ÔM¹wŒG¡\\Pm›Ê7ÎÏm1ø2 s#sƒ=}#¼û”õ\u0001'SëaŠúð°Nh\u001d>ìªÑ­ã_\u0018¸rvupC¡)Ɨ]ã'[,³\t?ž= bÎ\\F\u0006\u0015ÃfìÔ,‰ày%‘àwS«_¦à\u000f+È岘\u0014\u001b1VüVx[EÚA6÷ûF5\u0001¡R\n‘{ùd»Îڕ·-¸R¸û ;&ݔ±2š,Nݯ3Ð\u0002\u001d\u000f2)°Q\u001b\u000fT ے{Á”¹”:¿~êVj™dÈj™ýœËÜåž1Æ’mAsՑʈÛÁ&æéj=}²bi߬_Ԟ÷õz›áÂL¦´‰»¯ú\u001b/´ù]±Ó¹(F¡\u0001߇u(ƒ±\u000f4&\u0005| ÔØ\u0011>j¢«Ï*9*±ê ÊÒ­é\u0011&&1ü䈳m\u001cc±”a´FCU\"ü„\u0018£òº¨±¢–\u0004»©iݳùþ\u0004\u0000©óÁ*”\u0016©Èþ?\t\tƒÎ\u001f'ó+ðÀÏ:<õk\u0010#ÏP’ÖZ\u000bî\u0000â+»ÑêÉ»ö…ïã\u00115xÖd/\u0015ɏ)äÉñ‡Å+?¬\u0011ó\u000e¾~ŽªLÅÁwz\u000fø‘üŸ\u0013\bœêcä©;9©¾\u000fXroÄ3\n$âQºhÛ\nÇ;=}c\u0010ՙ¤æ ˜Ô‡ÓÂO™Ée?šÃÎÍÜõ‰\u001aÉ\bk–ÃÂFÝPŠotƒÅªŸ\bT1Lå¬ôN{[ݳTc’ ˜:RÑ\u0018mÄ\bkº±V ´/R>¯hí=MN‚ˆK\u0001’'»54¦üw+wð2»çv(Òêа{\u0018\u0001\f½\u001a¡),÷EÓT”eÖÓ\u001c‰s\u001buf;åÕ\b)ûó=Mûå¤ê¥>[\u0010Ç8%¯\u0005H\u0002ßÑ«˜ÌKÊWU9Ó\u0014ÅR÷ç\u0001c§/E¶ÀÄÆvǤ¹J\bYý\u0001Nˆˆ%½Ð\u0016{9:~®Øêù2öÖÕõ\u0001oë\u001dËÈ6ù]ìŸÔD÷w¶ô4\u001c…“I—Ù\u0001œãR˜¸\u001a_†.Wɛsß\u0019\u001dø\bBTFÖn\u001c¼]“@ÆQ“= Ò\u0011’îBRê#L\"úÛLµêÔù»ÿ\u0014­T*NÞÊìiB÷$\u001fఙ¹–,{9ˆ?%n)ç·\u0005äJ%:\nûÝ\u0016\u0011ƚ‚0,Š?ìjV‘·Nç÷Û\u0019\u0014Å«IÁ\u0005²\u001cMÃ¥\u001a\u0006J\u001e±Jx%‚õ\u001fˆ¶\u000eÃÚãÁ‘9KocƲ\t3*ž4^\u001eOìÄÈ.\u0017\u0018òò\u0003\u0014ø\"cÄplh(SžZ\u0015+ovß±h”¹ó²d¬e´jÇv™¸\u000f\u0014y= \tŸ}’\u0001žŸ=}Ž\u000e’ìñ¯\u0005ë\u0004¯¹%+Å\u000fÓ\b@cK%%ë+bO°ö”=}\u000eJZø“–\u0016íqN‡Ç81Ì|ç2Ý¸?çø”AQXl„%Ž'öE>ēj¯ïùc‚÷1û \\Ú \u0016Ü9öàHû]Ñ7\u0000>ð³\u0002>óGf0Iõ8ïÎï73\u0007ÓD\u001d¡\u001aª˜ìû]°ñmr'æþ[h7Ød\u000b\u0017QϏÜ.àh´T5 Ö\"Ý\tAòhԖ…ÞNå=}ÄÞÎ2\n¢°˜ºõs›h5„.šh¢H¤gNhÖøP\u0010Â\fs4§\f‹œÀ\fÿÒKÕÄp%ÛÈ°'X\\\u0003X\u001f\u001bsùYÌAè±ËE^G¯))=}<ÚT»\u001b¬\u0018À+\u0001D”.•¬\u000b\u0014ƒðܸê.jSžÂàb¿,´ïª\u0019HA–¬Jc°Ú~öt|˜rè#H£‹ÝÏa¢Ù\u001d\u0003“ŸVj‹h×å”Hz­ñ—>Ú?^+\u000e*\u0007±=MŸ‚üÿFRÍ·ÛTTÊ\u001c[Œ¤ôFfæ´9Õë÷Cäs~w\u0018É?̵AãJMTÔßÐ\u0011äR4\n\u0019𢿘1jô”<Ù\u0014\u0015ì\u00051‚Ûh\u0010&g©,ôRM©2V«ãlÙz pÁ\u0005èï­\u0013Æ\u001f(} JÈÍ®>¦tk›JÈ\"~ÌÊÿÈÒ\u000b\u00113* ª\"\u001cÁP_ö#\u000e¢Ž7Ê<²4OêßÔT¦2·Ô³\u001cr[­¸\u000bUj\bf¥êÒCû:TÉã1\u000b4‡×Û\n\u001f›*•DÝgBMfo ¦|žie—¡Ñð;ÆÙÎú^ƒÚ]ƒº\u001f³î †ÊÅ\t Ý/‚\u0013ìè\\m²™m^I­ŽŽŸ9l0¸øûíÉÞ\u0006O×浕¢Œ[½Dâ–-N<+ˆ©}¨yL*ö?$=}GÜ\"x&ó‚pê\bB\u001b•ý—Ê\u0016T?a\u0019Χ?\u0017,S\tåù^\u001ap'®èy(h\\5Q¾«\u0018Ž)­¹\u0017»,\u001aô»7N\u0012ô«àè)J%\u001aKèƒíJ%\bóWiD¡ç\u0001\u0015= >æ=MÀ\n\u001b»Ä2jr6ò†šÔ›\u001cŒ¶0ǤŠ;¢i¦\u0006‘\u000b‚\u001d«bC·&i°÷„èõRÒEÕuYL\u0005_¢>\u0014 Þ\"½¹8[ÉÇ¢LÝ#¨2:+\"Ax¢Í¶ÀÂ[vkwN¶­·,\u001a-%Ô /Ɉ䩜j<\u001fý\n=}È^äC|,p[?›g=Miz]÷>YÚdŒˆÐsBÎ$G¡“¤-\u001aTÓ\u0014‹i0p\u001d\u001bI“jèY9„c+±·2¨«D½w'Ð7Zd¼ÍÙèöùº?å½³+­D\b¦\\@z]Ýå\u0006âù»ÌåÂE=MLñ¾Á$ƒ\u001d!ýˆý\u000f4Ùz’ò=}­nJïl\u0006\u000738øi&b\u0000ç\\…\u0013Äìg®x\u0010xóùs¯Î\u000b\u0017U\u0015^;݈-Êm\u0017}½\u0018Î\u000bç\u0011r­\u0007¨0Û9\u0004³›†±_\u0017³>£¤\u0012NÈ~7)3ɗrcÀFoO¡õu&;f)\u0000\u0014²óíÂõä[Ü2JÈ\u0012œ­º(ËZ\u0017\b\u0017gãÒ˜\u001c'\u0000ø8ž\u0011dF\u0011U\u000f\u0011Ä\u0006¢oƒ¦\u0017Ä(AÂÍnRâ_¯\u0012u3 b._—rmµŽ:…ÿŠkUŠ\nÿ™UE¼´º£î´ÍùÀŝ¦hç¸rÍúj>3jW?Výß\u0007¶\u0010tÂø鹈—–äGùD3_\\€]blÔ2Ùâ–×ƭނ\n!÷[ãçÙm <“L§µ\u001b›é\b]ïî!;Ï\u001aнA{¥‰¿Ey£Y:c¹wBő0E•ÿ\"‹–³ï\u0014ƒÆ\"µÿ⣺™„â„’Z’Ššô¼mû—™*;q\tkræJøÉ\u001c\u0014“\u0016×ä!CÜ}he¦\u0005\n\u000eVï\u0015^2Ý\u0001\u0006\"œæ\u0014\u0010sä\u00044 ž‘¸ËŒ\u0002å,ö!/¯Ú^•\u0002m Ìâ'Æ#:»G”P› ÙÎCïµË~ñ\b^æóvz^ÐÙì­õþèöi®á7¯œÝIã±Q\u0005‡È#\bUúKoœ\u0005öÖ'ã¼8ÈÙ)ì\u0014÷å\u0003;Ï-JÊ\u000eDÅ;¹ê–àCò\u001dësʈY¦ •æ%἟-£íxo&v\u001d–YKawd÷ƒ¥Âš_g{\u0010= .Ô´\u0001žÆn¶ôš°Bx¼\u0005y‚½Ff-šºöbþ¯Ô=MÞlˆ˜ •-V¿V(àA/ì\\ÃW­˜ \bt'SMÀÒõ—.2åÅÃS»øºh\u000eŸFɛkäÇ֘\u0012®\u0005U_”?[J©šÑڞÃï\u0011It\u0019?W{3íž4¥A“ ŒbÕÜõ8\u0012ý)DëÄÀ²ù)Â\u0001©æÌ<ÍL,o{°Ë6øß±c\u001d»K= {m\f¸Rµ­;§Íµþ\n\u0015ô•ã\u0012r›\u0006Ìc÷¸±>zݶ¼\u0014捧‡lÔ93’–éI°œÂˆ\u001bÐ\u001b\u0017ÿ1\tâË\u001b…Ý\u0015õ= øŸëÑì¸C=MXJ酯·Žx:i½×˜à2´­\u0014ÕJíÍ\u0014 ¤ÃI›t‰\u000e_¾‘ðÎk=}äLg÷ë\u0017\u0001µô/\u0000ÜZŠIq©©Âá×9Kƒtÿ\u0019ìlŒ+B\u0002¾\u0006õå0¦\u0006\u0006\u0010»\u0007šÔ\u001fO‚á=Mbë<]=}h\u0014€G¡2=}—´dj9dS ™«À\u0012\u0002Ži\u0000Ži˜jÜäÇ٘/ À}º¤ÎXõ­üdè\u00197«]áÄÇ\u001f\u0000#W= \u0014àGžfa\u0014»¦š»yæjó\u000en=}:™.26)8NµEv·”\u0019>E¶6‰ÑzGÁ–4p\u0006\u0014ÚÏ­$ö/[\u0014ˆ|w;í= Ê˜e\u0014ø\u0004–­Û\u000frù¢ÎdQ4\u001dàý\u0002‡‹¦ÛüCAñÿ\u001b\\=  øÐIž\u000bêª!$~þ„ž°\n4×8-¦JOôÕG{\u000eëÊ}¡¬DŸ\u0002\u001e5{N\u0001\u001fEJ§þ‹\u0007Zí¼éôCæ£×\u0010ã’\u001cå®=}¥×*’\u0003—½ÑS¬Cì3Ú¬qâað3ö/ÇUŽ|¹Kô¦˜Ø\u0002º<Ûñ(4ôï¼ñлv\u00118¬pŽ\u001dt¡Ç\u0011m“¬f–¦\u000eð%Eõ-÷Ë(õ9Ì\b̳oõ)ßH-õ\u0007̨¥\u0018¼mSâNwöªð^—\fãíQFq\u00001]§w°ô“J<¿\\×·å•-Wu6\u001dë]R-äú%I¦ø\u0011\u0012غý»3‹\t®¦µn¯wÄ,·Ç¨w!M\u001daÃ\u0006« A\t­\u0007tØ\u001d*á= W©Ûx-¹\"¬SË­½XZJUz]\u0011s>H²ÜNU­Õ\u0011\f\u00001igv[Ñ8ªGCUŠÎÞ¦•nõ\u001aûLÞË\u0016<­‚‡TI2åÂüF•z/ϸAŒ£q_ N=Mðõ/ي2¶@šõ=}æAw\u001bsˆ\u0004GÎùÂ\u0014\bb„‡\u001e¡Í\u0003à\u001e÷†åaŒcp£7+R\fYÊ(5#>¼—±›ˆÑÆ;K\u0016·n\u0004ê'(§YM͔ø÷\b͊®\u0007Ž(öó‘PDwž\u0007Éè1¶5yê4É,<óÓ^êYçLÑ\\\bæ\b_æ\b'TqìÄæ\u0001‚×èëk!Ë\u0018pô3“)ÿ¦ûº½yøî)ˆ1™ÌÀŒjûRi¼“ïnòššævŠ\u001cZ-ÔÞ,zmÀ,˜´kØHW›¡ 9C\u000bÃDØ\u0013\u0018ãö™4ƒØY\u0017ÝL­*¶„â\u0012\\v…K\u000blHÿ²øM•Wþ¾€\u0015xÜY8P”T¿éEݎC…\u0007–r’>g\u0002¦-‡ß°„«„ëf¬e¬Ö³ÿGÌS_\u0011£Ïà~¦‚zSèÛzSƒ¿\u0015}„¸Yõ©í£é\u0017\\MOô®®\u00143ÁÙp»†3²§\"B°G!+漍o=MâÐPyQË<\u00069=Mõ»ìT)è\u0000õ³˜[\u0000¡lEüã^\u0007Èÿž\u0019d\u0016jùŒ\u0007ù“¯£ÿÆ\\Ç».[¿£“\u0018YmÃ\u0000¼žéýó|\u0017zçp­Ýóå½\u0006m·J5ïÉÁM -÷Æ8-\u0017ñ\u0011S\u0018µ¾¦Rl%¨½\u001bMEa²5\\÷—\u001b­«ºÄ˜Gw®„ÅõÀs%~ÃH¿\u0002¸l\u001b&k“÷¥ÿÞºÃõ#Jr¨ë·ƒl\u0016¤Õ¨\u001bŸÿ#a¥ß\tÑãQ£2;®Ó÷#’@®ƒN\u000b8Íã\u001dœ!@õM ½Dî\u0018/!Àž!\u0010ÿچªúA”¢yøð›\"‰žb\u0017\u0018v PúÚ~‚\u001b\u0018V ,N>\"‹\tž\u000eR\u0011Y\"xp™òa]|¡”ú?Æ.laƒé¸pá6\u001cÿ›\u0005Ÿ\u0015c¤ÏŠßn€r\u0004q«=}{½[›â\u0013ØÔíºñŽ\u0016OlÇ!1\u001dèõ(ó«\"¯l&N{h\u001a•Ü7faç\u0017z—4Σï¾âºï-ÔñaÎ žqcÞæ°\u0014U“]ŽËgŽ¢_Qáξ.¿\u0002\tï]÷ð‹\u0011˜r:\u001dz÷ÀÃc‚Òa.\u001eœ ”'¬-3Ë/yçBw¿ºò0j‘™í¿'áޅã9ßÕK¸\u0013Í|6 v\u0002ùâ2wä4PFa‰y»™¨ô¼ŠDy½·;=}ý®>ý\u0006E¨E±œ\u0004\u0000Pzö#èå<‡¿,Ω\u0010ªÔ@yçù‚–´!„ô ] ð\u001bޟ¡íˆß\u0000Â2cµˆËt \u0019q¾¶AHû™ýM&¹\u001dPeã\u0010ª¬1ÃÌã»Ä\u0018!\u0015„XOu^\u0004\u0016åŸãJ8è2¥K8KŒe]ëžFšw}ü\u001a\u001e\u001a.Z\u0003]µ–?Sù\u0002\u0003‹à¬\u0011>ùyÎþñsºƒëí¿ùÓ[ûí>ÐUh\u001anÔB\u0001äpR*\u000ež@hÓÒ@7À…\u0010ƒc¦)\u0011\b-ªI«8\u0015‹™Ów|íà&M¢ì\u0018·Mú7N”F„úۆ$7Óǜ\u001d€2Ážú&®ÿ´\u001d¸§ÑÒ³Ô\u0010–à\u000ea.‘1\u001bên\u00193œ\u0001B6Kå= \u000eâ\u0006k4NèD÷Ÿ¸Ò\u0003[AgØÉ\u0007^\\M¿«DÍ_8ýÂMf\u0018T>¸bŽÓÃ'ê[ԃõ\u0018ŸLu^[–3©N]\u001bvòý(7™UHe3¤˜Ö\u0007Ž(sQf+™\u0012s÷\u0011²Å”R׃ßÝïë\\Rµiµ²Ú¯Ýñ\u0006rípuÜCë&c‚tJ+=}.H)\u001b¾\u000e¡â\bï\u0012þXTGíä\u0018¿wc´M̞K\u001d\u0001;ˆÎ‡\u0016ÍFÂ+YHÏQÁ˜\u0007¢²ø¿Q\u000bR¶JNøäÆX;Œ¬\fsq\u0007•K\u001b^ ø>\u001dãcy\u0000-(Ds‹bÜx:ÊÚ($E˜\u0015ê\u0011Å3\u0018Vz0¾õQYÁwj:^\u0006vf\u00059:î5\u0016\\Kà\u001cã\\û[\u0014”\u001e\u0005¬È¼ÚÎÿ!÷P~_Þ~\füw©ó®KÀÿþÙG´¥æàªsä6³eÃnÌçn(\fQÛ+\u0006Ñû {6ËÖj1.[‡mtp@ÿ=}\u000f—'D”2Le¿G\u0006_×w¹°cw°KC\u0001T‡hB͵8×Ü\b#u_UnIô€\u0016ð†Ò¦â±çj\u0004±Æñôõ\f›÷\f½ZI3K‚4Åçtµý7:<Õ\u001d¼RøŒ\u000b\\’·»Z'ÐFÓúÉoØEqWĶXóÉ:Pû\u001f¾¬aGP‚­˜Z[Bá3fCÍd÷=}\u0017™8\\úà›-\u0011–IÀòÌ\u000eW-÷\u0007aJh\t\u000e¡=M®[gf1XÄÞ3¹D\u0010©!;÷ï¾-ÃՃ\u001aÓ½DµOx}{¡Žð™Û\u00157úŒcùH;–|ç¤Lz£ÿ™Þi•Ë 8¶ã4ó€%¹‚ª,ØL}.\u001d9é\u0011…'Ë\u0004ë= \tò¸©#¼d \tŒkêDØΆpm\u0006\u0005U>N\u000fƒÑï\t榁à¹c/\u000eÈ\u00047è„a¹Tß>µÛè¢\bþ·ÈÚ\u0010ïi8æsžÂp\tÄñ†½Š\u000e›kçßú;Jó°‚\u0017A¨ˆŸùf“\u0003-ÜoÛË=}¾û£K2¶ñ€$eƒd¹“*÷‚¬\u0018\u0012\u001f>yIœeՉúûTôî.E¥^,¤~ß\u001cè«q†¢$ÇçGdÆøžb·ï@Q³¼\u001d\u0013I\n¬ó)Œ\u000fêç\"º\f\u0007rþÓÙA\u001fèÒû§àüZm‡??(£ÓæIá¸Ú\u0006KÚ\u001a^\u0007ÌË\t\u000bJñKõÌ\u0005)å: ˆ,\u0017Ô'LÿúÜHhÊ\u0004ˆ”8R\u001a»kXä?W%\u0002x|šë ²±w†ëEaé)\"óPõx@\bƒáÝYn\u0013zÃþӏ= \u0015˜Ô\\—Š¥›\u0002LuM\"·*Ä x\u0017\u0007)Üõ\u0001\u0002Ș éP]Á&Fu\nyô\u0006Ž\u001d¬©kw믋Á‡™Ž\u001b_%ÂÔ+\u001e'€‰ãOúù綡ãÑú?¿ã{*ßXÞÜ+ò‡\u001b@©k7ÌØ\u000bl7°À4\nùÂÛ¬š\u0001)¯\"\u0004x}W±~°~EuûÑîVQ\u000bB*é‘\u0019L=}Æ¿_V/3\u0016÷Üà2e€\u0013égÝ<&—\u001dÛÌ\u0002i&Òª\u000e©òµi‹\u0012Ä\bËÁÒ ó¿iÜÝvüªŸkÊhFM«FÃW~óSRZ$ªq¾tò>0ã)¦k\u0013\u000e»|ÃÓ$N„ÍìsÒcÙÓã_\u0004Æò\u001bÆ*fœ>äڊÝÍ+5ð\u0004$²\u000fu+Ž„)°Ó«æ\u0002Ñæߐè±.¤÷fÖ¹Ó+¬[\f›ÂˆÎ/uk÷©\u000e8m¤ºoÖcàA{“v\u0003)4c\u0017†±^´?Úûâ×gC&\u0017®7Ù= ³}Rƒƒh;«Y¬To–\u0003^Ôr6›=}ó3͙VÞb\u0010\u0016s,„\u001f\f3ªJ[·ò—ó\u001bµh\u0016\u001f³t5UøXÿÏ\u0002ÏצÅ\u0013$–\u0014.ð?\u001f¯Šõ\u0011\u001fì\\áÂ͒Sl~W›pÁŸƒ Ô¯\u0016\u001bP袽d]ï*Oƒڛ8Ç©\u000eÖö\u0006S†‰§Òérï<ÿî)ÃC7â\u0004§BjD^C¥HÆJîêÍ*?{¢Æ\u0005>Eû{FëŸ\fWÁZ\u0004Ö?¥±º\\K+¯0â\u0018HdzÿØr§#*À¥YžùàˆÑöD\u001e)¥eE'ÚÇ¿u®ïM¸|\u0015~¨\u0002×_Œ%\u0010Ó¥Ô¦;ÐØd÷öëÍ×þJ€\u001dŠ\u0019‹£÷w4¯Z(\u0010ýÉۖ’z€\u001d†š…ƒ±ÄÁô,é|É=M&À|“Ù\u0019\u0000\u0005³£”‡Rª›Ž¤cä\u0006\u0018è\u0000hMb\u001cÿ.)¶\u0004£Ýý|.¬+…©¤Jª²\u0014ã|j\u0018+¤o\u0001¤D\u0018KËF¸8ÌÂî¬>póUØ´I÷µ\u001f\u0016\u0004àW§´HÀœ%ßåÁ´£wßR$íѪHÈ=MYv[\u0017±×ÿ¬\u001c\u0011ó\u001ffÓÓ¡ø5öñ‘Rj{O¥bt³\u0000ó«\nø•&®%M«« ðãv\u0011MU@¿¶m1\u0013ò³Y¬ÆǯŸAË;ð»\u0018¬¨\u001f¥BòÓÚÂ÷¢2\u000bd€ã\u0012\u0001ÌùÌËù€ØÉiñD\u0016DÄ©ˆ¢4¦ƒ\u0015x:é¶ùܺNW.s\u0006-êOޚBá\u0005aÊKB>\\ÂÁ\b\f‡•s±\u0014u¾=}C:'ô?¼>¡z\u0016¢›Š¢”r¢—ò¢z\u0016â\u001bê\u0003%㡆”C\u001csá\u0003«’ŠÒ¿‡:“$Ӄ\bm }ûÁϯe´­ s&yÃÝ£;\u0005fbª°Æ\u001fc\u0012fž’®’.Eâ.¢—r5â셏2}\u000f¼iæÆ\"3cìÏÊ\u000bŒåc£m%ͳ\t¯Â\u001b#\fæ§ëh‚“¤¡¹èšjš‚::g\"9 ŒB ìÒ¬eÃ\b[!\u00036\u0014â2¥n«\u001eô½¨\u0004AIO»\u001aº-¢nåÜ#ÚU褛/Ei\u0019!\u000ew\u000e~Y\u0010~Y\u0010~Y\u0010ÎM¸ñuÇš\b‚z¢}ÛëݖŒ|¾÷ºÇÓ£˜fgd¦³B\u001fN–Úg%Ás¼\u0000ª¸o\b‘MbYÍäât\u0003Û%•ôöO¼f„h\tf¢Ï\u001c5˜OÑo(hË©=M\u0004³\u000b-ú2\fw+4e\u001b·$Pã\u001e»@\u001béÍ÷Ó·ºßHôßGf\u001e\u0017µð(N“Ë\u000b°3·LK¾ \u0012ßڞ”æú‹¾ˆC¨­o‹¶\u0005óà‹±s Û‹Æ=M*ú\txƒà„æ¨YÑwÆ¥?K»Ü³±½+°ÈÞ])ÙD\u0016K½g\u0003\u0006“r§*]í䨾ê¯\u001cˤá\u0013åBêFå\u0007äIóñã­¯'Fƒ%Ï\u000f¹\u0019­\u001e%ä¨Zƒ\u000b\u0003»á\u0007mNj*¢ˆïO¤bƒËà\u0014×&Ç\u001bDÖ\n“þç†Î*\u001d@èn+ì\bO±^sî\u0005!|ƒÉ>s¶\u0005(àá\u0006¾=}î—\u0016AQ\u0017«ôg¾\u001a’K\u000e\u000b£ar^øœÁÀf™œÒ)äçÓ?±Ò¯¢½!âŸ\u000b›u“¡„Œ„_“Ri= i¡iˆòfýæ æL!Vá\u0000¢øÚ\u0001jvwÉ\fÒ=MuØÚx<nMíM= íT\u0015YÅ\u0002ý!ùÉ909á8»È¶h2èítã„\f$2\u0002:bӏÌ2j\u000eq\u0000q\u001coi||OLw\u001cU3+Å]†ŽTŠ£ó®0±Á±Ÿ\t7ïŽbn&a\u0017‚\u0007’\b=}™G\u001d\t]’]ÛQ™q@1å\u001e] \b¨9ÁîYÈ\u0001]–‰²}ã‡^\tzLNr½°P= 9\u0011.bóÿ|o‹}r°,mËQŸ0\n\u0003Y\u0017žt?•2¥ :œ…\u0000Ê\u0015Áazظp¬}8?þ”N1T0\u001ekaV\u001cˆðɶ\nQ| ׎‘>‚¨©6_úÛ9\u0000õ\n\u000b‘Õ\u0016ð{,Î\bØ©Æ@_:\u0010à9øK\u0006\u0011Š^\tŠ,_•2}iEŒî\u001aÁr\u001cC\u000e=MŽT=MŠì+Dâu\u0011y1[–hr=}\u0017é\u001bª)Þ6þù\u0006Ûu\u0010dq7Ÿ:p鉑NÙçIº_\u0010yٗ\u0000ZØÝP‹ü@\\xW|ÎYH\u0002NŸ\u0000r{\u0004paGnځŸ\u0011Õ}\fìû‡œŽrý\u0018/Ê]©\u000fá\u001d\\—F4OC{–Úm\"œ\u0007ß\u0004i] lèòÞéýñ–\u0002TÞ= ƒ\u0018VT ƒ9'Wžøb>ïý» ٞ\u0011h’F\u000f€¹©*\bÿ\u001e¡jß-‡\u0003Å]«5Öã‹$‡î\f6îÜQÓ}å¯vì…Ùê«×\u000f®µ\u000bè?†—εn{ÑB[ã÷&\u0000©Êº\u0017î*¬GÃsÉÖÕ=M±‹* „Ûxgþ}.iôAÍ\tA§•Ã³\u00020:òïÈJ5\u001b¹A\u0010ë'sú\fúñátn,õç­ª\u001e5\\k\u00076Ê,=M+É¥N®'àąƒ‹„ks\u0006m£œÊQ°Ú-v«µ1Þ£\u0014³\u0014.ñHö춍»û²³¦Óá*\u001bç¢é:5à‡Ôcøðß(´\u001eeía$ø=Mƺv|ƒz'\u001d¦¸ü­–\u0005,\u001azòê\u0011ûÀÓ\"qO\fö?@É}}û1¾Þý\u000b\u0011­ªÍl\tĜZ‘™Y‰=}-*è(\"Þ6S\">\u0007|ßBL6OÏé\u000b®W\u000bí°€ëÝ\u001fݜï=M•ˆÀvŠòü‘Î\u0001U¿\\ú¼õPÏá%YqæË׺=}æþƒÈ?\u0007a慐Œüǔ—×\u001a²“ÿË\u0014Ljó\u0011o= Þµ\u0006\u001d\u0016G*%È\u0005òrŽXõ\f\u0011š*\u001eš\u0015^’€Nî­íbÆð\u0014ÞàÈÄI‰q@o=}_—æ€â4‰\t!\u000bOð\u001d\"!\u0010ñš4'—?G]æ<\u0018Òálj4Á}ÄP6É,h\u0014\u0005,\\JJ{ÖJEDيíýåS\u001a\tò\u0001…Dg—}]æ•DdñÑþ¨Õ¿½KX»¹MIKÍ'AÕµ®¦ZŠ¶­„î”õðÏ\u001f\u0012mþ\u0006E-\u0010}–ú0u\u0003d¶\u0015§xlkˆ•\u000b˜¶\u0015}ú“ùÎ'U¨©á°û[‡\n‘\u0014¬ZªŸO?–ä\u001ba‚j\u0019\u0015·«|>Ÿ?\u0000%‚mˆ \u001e€Ààh\u001c\u0015G\u000f +0w$ÔL͞í¹å\t+ç}†hÏþ±åþë'\u0007×åY¯å\u0016$\bc\u0011ÿ'1¦\u000e‹0\u0019“­³’+á\u0018Œ\u001d\fø\u0006º\u0006Óqt\u000ed}Ъ2An^úô‚q&V\u0015}ˆÄªµõQëÎ>\bG1ó‡Ý\nxI¦êqˆâK\u000f‹swÁ\bÚ\b™5s= \u0014\n֒÷ÙlëA<€—\u001cNZçÁàB¢ƒ\b ÞDÖmq q}Pª5u\u0016\u00117_LH\u001c‰1QV¦Ú'èBaÅPK\u000eŠ®o'ñ\u00169\u0010«îën^žUa&½\u0004Ø\u001ci5˜^…r\t¸:¢•JÝ\"‡›LÖ:*‘ðo›ô— ÖÈÓT\u0019©&€”Ì⁠ôž<¹»2\u001a™üρ¸\u0016ݎyv²\u0010=}\u001d¹†@\tв|¾ª\u001b\u0002!ƒ=M}{^qÿµ]àÉܒ¡N©¼*\u0012ßyl\n\u0014ó\u001b\u0005ý&m2À\u001f$sy|â\u0013 ûo|ÎuºXWIT&r_8dªµq\u0007\u001dsd¾Ôd\bq=}4êv\u0016-nM½Þ¬Q,0n8>²Á^óû•]Tîv\u0007En?ˆD„ÔÊѹß\u001fü¢(γ}ï–\u0002Y\u0004\u001aõ}ø“‚ì\u000e<}ï˜\u0002¹]ÚÌВn)\u0019évwm\u001eäsY‹Ö3\" *IQ(ˆ‡|Îِâ7A\u001e¢ø6/ƒ<.IÒûZàÇOj>IÑ)âqf\u0012tMp´,\n҂!xŸJIdKìQÖ:îe\u00061\u0002Ï\u001f—Qø\u0003Ýt $\u001b\nLb¸\u001eù Ž¢\f<ñ•ÿ¿W–ãu%°ye\u001b»\u001biaT= ;‡å …\fÿXÓ+2àÕ×1àï}G½òiÖ\t‘Ö]\u0013,7dÿ´°\u001d㺫Ü;ãié}É%÷ý0Z8üærF¥;= ¯aõYå±C(]ԟí\u0011Àw\u0017Fµ\u0002¾\u000b#*´#è°wb8M\u0004Qu[¡´3lß[MÓ\u0004·öl=M!؂½QV\u001bK?ÐfI|sn\u0013\u001f+5°¡\b3\u0010²aCE–\u0003™\u000fC†ó輁Î\u0003JJ\fl&{Ã\u0004ù\u0007PŸ½ÁpEgãüãÕkÛoiÖÖ·W´_i•œ@W#d˜™ø{\u0004ÿ»À³ëÕKÂQa\u0015êË!Í\u0018#MAws=Mwÿæ\u0012\b“ÍpFáå¯/·¶Qd\u0004uAB²¸•†\t6˜Çé)\u0006\u0006²{¥\u001e«ŠZÓH‡â4¢ÖmÓŪ\u0010\näØ´o÷\u00156¼¤\u0006¥\u001eÑ<<°Øo#Î_·™¢\u0001‰ªQ«AÆi¯\u0000»¨¡¸¨VÄåÞÿ~ü³T’Î%\u001a•\u0013°$ÃÎsèóq\u0003,t8ôdï°\u0006/ú­zùüb­S;ª‚#¾\u0007ös$¹\u000e7늕±•mË¿¢Û\u0000ª7o…\u0011(êüÏßlWl¬\u0007–nŠ\u001a\u0011ºAòî0²‚a\u0018vi\u0018\u000eúp”?ÇUXTÕÖØuÅ|끢ˆ2\u001arn\u0012\u0000la??W\u0012ö“u|¡\u0001qىÝ7]=};¸Aaû\u0017àbÖýäœPÊÈZß\u0000ßI‘¯û½93\u001f—…t\u0017‡!~5Íô\u0004,È\u0013:®pú\n)A:¹î²ì߃QêÏVMæêÁHëv&úŠ¨\nîÇ5»¹%iŠF\\¾\n*í²¨ ó˜‘kDŸw= äåG\u000bÏ~„oÖ!\u0012\u001b\u001b3zýrC\u0000\u0004\u0004µBX\u0014¬Š‘íà·ú8– ‰&\u0006^æpÉ=}&\"ð8Z\u0002±8ÉQ2þ¾Â\u001fî\u001fÞÒñŒ„\u0004Á9Д·eÐÀª= \\\\êo^A–*åæ¦È…] \u001eµf%\u0005YhÊQr®´<\naâ\u0015ï=}_ÞKg\u001fÛ!xi¼š…\u001dÒÇíÙH(¨¡³¡¦õäåD*Jhï,û+÷é\u0001ìÍ3+ºMK+æ\u001a(®ÂŽÆ\u001bÞ\u0017vmZæv‹\u0004D¢0VM勡lîė\"]VóæÔÅ^^+N³]QÒÖô¦„žRzg¥»$bØF\u0011V‡\u0015\u001c)=M=}¿Z\u0002È_ˆ­D\u001d$a\u0012Þ¹q2\u0017 ² f€VO¿HÃ\u001fî—T=}\u0015«NEàçÁD\b“+{„’\u000bb\u0002ÑêmÉé\u000f×¹»6½…¥4+¥<ã¿G¤ ÕhÞ%2ÇF–ûøÿ'M›c}«”\u0018³UhO.ó§\u0013¸Ó\u0011ðþO\u001cÛjD15»\u0012àøÇÂ\u000bìBéLÛ2~÷ÚN’~Š­Â4ˆ\u000b.4IiÆ/¯°—˜\u0017\u0018ƒ\u0010KlŠ\u0014¼=}ÅÜ'©\u000fËß\u0000|9b\u001b›„ù\u0006ýîiÂ^}š\u0017b¿;g1Fµ§\u0005¦,”¯Ö2Ô<™= \"˜\u001fŽ¡Ÿ™h–\n2®‰ò\u0014\u0015\u0017»R.€\u000bÃÚ÷\u0014¹ •ö™¡ð–´Wßà'­#\u001aD«Ú—Œß,¡ã\u0002¾í\u0011å™Õ\u0007©âÎJÅþ\u00079º#íã\u0002<ÉTæx\u001c´¤ùKL‡\u0005g=MÚS»nz\u0003¦Mda‘Y\u001aZqé’}WÙc\u001agT\t©¥Áæ ¶™~Mú¸òî\u0012Š¿°AÔ\f74Ù:÷úhL~õ\u0002ü0r\u0012\u0002ìì}Z\u001c…܁ÑñŎԹIéÝý\u001fÑðµ-lš.u6ezïZÕÇôù›\f¶Ïc¤ê¸\u0010\u0018è[ZÖw… þ0AOZt š4îÞ¹ïTÕvªæ±/Tøóz= Àö铢xI’šž”.ï§¯ìËê\u001db÷îÖÅ%¹\u001b{þ1×wt\u0007ë×wžˆø\t{O”é\u001fõ\u0006{éá{~ø¢ËÆßc\u001c7Á²\n¨Æ àÀ0¸Úõ™P@ŒÛyû**ڝ\u0002˜:åIþ1sEÜÛÈkÿç\f¡œ“\u001dïƒ/\u0014ÿwû\u001d‘\u0013+–»ÐŸ\"ÛL\u0007ù§\u001d\u0012,aç‹C‘Þa·¡áeõ¦ \u0012q@\u000eC)~B¿\u0013s\u0005FaqBÒoZƒLDay-?+h™©\u000bC–&——©BTýM\u000b“\u000e–v+HqI¯¾°˜W= ^ =MFBXÁ¬s\u00070òãÖ\u001cÇ\u0002ÀCš\u001aZa= \u001c\u0015vo”©W½q‡\u001e\næ\u001c\tg•L¹ý§þ4|¢ \u0001ø\u001f\u00156bP´ºÒ՟šøãº,\u0001.ó\u001eGٝɘÈô\u0012\u0018GHݍ\u000eœÔs븘Z8è\\\u000bNEa™zºzðs\u0007Æ\\O‰ù—_\u0014·®ís™Ÿå‹×\u0010ÿTYú\\´.ç\u001d½Ãš\u0018yà= d\u001e/¹i֓Xˆ¼C\u0016Õ\u0004÷”zZyÚ۝§¦íø$QFQ\u0015g­:ô¥¨]DaâþÍR@{ßjq'J±\u0011„\"¯ÎsøÛCr4\u001d‹~Àⵘ µÜñ°°\u001fm\u0002Gré&U\n4ñ߸×{\u00006\\\u0015×lå&‚ýÁg›»\f#wvý\u0014\u0004= 6Á©” î˜0{#¬¥Ø¿†\u000eæ|(@F\u000b¸Ÿ” \u0016¸ þ\u0000åè´\u0001ù¢ƒï‹\u0017Ä\u0002 ›ƒŽ\u0016c‘\u000boK°B\u000bàBN\u0014€P\u0017ìø/Qg¤sèD\n6ô\u000e7ÄOOâ0\u001d‚êüL\u0006\u0017$»€B¸tñÿ¸ûR)ÎÎЫ¹\u000fXòHô‘\u001d»é\"zr:y|“÷T›X”\u0011—/4·þôCâ\u0001?\u0002’ORc֛z:šÚ\u0005¹ý®×7‹½nÒ\u000f”µ•)t°åÐ.µùÛ½ô„’$Q)U–Þ ÐX÷|»\u0000.Æhöô†\u0013X0ÏOÀ\nа±2*ˆ\u0019EÁV)ÉñBØ\"h]Ê79aLséá\u0006\u0019ƒmƒÍQ1Š|^œ\u001dýÃJ(Õ\u0002\u0007\u0011ßRT~:{LH™\u0011<@ÿ\u0011òú{|8O•ž=M¢þ†}ýšç[ÚuÖôA0™±$\u0007i\u001c\n_\u001aÊÛÆtüìqï\u0014\u0019M½uw5QIïX\bLÔþP\\=Mqö\u001eaÁ'\u001c\u001f4A-˜ùMjÕ= ù‹\\õ’xÕK4è@ï\bvËFÉüXkOð\u0019Õ7\b:ï\u001e\u0007~ʆ!ü²m\u001fû™F\tS1üO\nɾ;pé\tW,ü\u0010=M\t>>€9\t\u000b+@~=}Œ™\t^F¼’\u000fy^}v€Aš  \u0012\"z±\u0017rd‘àwÖ*\u001e™ë’Û}^1˜q†= žÇ\n?…Ov?\u001c)Vrõf\\=MÜ\u0002ðºM\u0005Ø\u0001IyÎw\u001f8}Rxf˜\u001d\\ìòZ‹ÙàLz^˜\u001fBÂ3dfU\u001b÷Éòk‰Ì¼àÎNŠ\b™5\u00018„ŽU\u001fîI’m™ ¼\"ǎò\b¡\\bUž$¼•ÄÞ*¡Y&H\u0019’ã\u001eZ{A Üt‚öÿZêâ~@àŠ]‚\u0011ïÿ‰]\\‚\fq\u0004EŽŒArš\u001a\\]½ßҖh•€\u0016Ö\"’‡]\u001f!9fBŠ[\u0002\u0002¶’\u0016 ¨Š  b^áʯ\u0019™DЙäϐ®&¦Z®&hê(dB:œžtbûW­SÙUé\u001e‘ç\u0012¥´ßã\u0013¾H'ðJ\u0011[ޟ\u0018šõ=M\u0017Y\bLÎõò\bH‘\u0017‘‘A]!\u0012^ø\u0001͊oÿ\u001aÚ¥–Ö%2í©øD¯›¯©U„¯\u0017\u0018¯½2ÓÒ»;˜Å÷\u0019·D\u0014'«eݴɂ¹ä\nÎéø\u001eÔ§\u0001¯–ÑÔá!SF\u0006ÇÃfÇ3\u0010:ãšè¥\u0006®Ì›\fõ;ÒíôŒÌ&\u0014#¯?Ãf\u0007ÞÜ\u0017= ‡\u000bµ‡ƒÿÌofÌá\u0001DKíó#\u0002M#ïO'QRµ0ú8Ã\u0010P\u0003\t(mÃ\u000e×Ùûæ\u0013ù\u0004•ß¸\u00179pÿxßXèR$\\ä&2äý×\u0010z%WZ$I°\u0017&\u000f\u0004÷}$\u0002\u0010ª\u0016¾\u001e÷áX*T}¤ÿ_ÆÉâ\u0017'\u00111¶=}}‹c xd_x¼Âª^CÍ}¸Ÿ\"Q3væڀ°0œ‘ÃdÁÓ¶ò÷“ç†\u0019Ò«91Û\u001c/²\u0017€ ô8ŒªDHâo\u0014¤›»iEÌËs…á«U“\u0003‹…æ\u0003\u000f¸­áί‰Á„K‡Æ\u0003O0§z»\b,â½ÝøÏ=}µ†c˜.*\u001cè¥á\f)Í\u001a¦›qì3P¢°]2é×\u0019ƒã½ýcŸ\\ÈÍ®þFTT°'#\u00199ŸZ*1\u0019çx{ñ³aÇfßݸÂèŒ\u000b=}<¤…A¨|‰\u000f‹õ\u0015\u0004\u001f<ªaI£‰\tè9Ÿºf[W·ÿñ\\HŸÞæ\u001aX®=}^$Ž‚¦‰¹= “tH²Mᘨꣶ¦ó¬Ãk¤ñ¨óªc‡¤«D£„£Ù²Cæ¤!$ˆâ£s²£¾ðãé´«\n«ï„¯\u000bà¦q\u0000§„Ò´\u000bI»É(§ø¬›àõS^\bC:ˆÃy­3qísŽù\u0003*Kcê\fcÜ~c·\u000bª}€¤eÜÊ\u0013 \u0000ã°\u0011Óؚ'Ó}ª‡\u0002\"SŽ&ã:*$b¸¨aÇÁ7ð¥~_¨kY³m5\u0004½3\f¬ÖÂÿ ¼'f€ävžfwE¥ÿ\u0000¸›\u0001öcQL¤Ðý¯Õ\u0010È돂C\u0000\u0019$\u0018ݥእے^Ó0\u001e¬ýœ¼%åäÛ&1ó¾9;¡ëÃe‘±'ÏÑÅ\u000f\u001b\"åœ\u0014'BØ2“àz´M·«Þ­Äž\u0002´„A7Ԁ\u0018\n‹d§)Nl\u0005'‡¤¯\u0010=}d;yQ\b[?\u0006¯Ò\u001emSªL+q­µ4-·´L¿ÇEX–è.àÅaŠÆ´ŠMµ>·”\u0005=}{üÏ\u000fM¹\u0016ƚ+Œ%º\u00056éÒ´AJëë›Û¬ž\u0013N'M\u0002í›\u0010áõ¡\u0004T7Ñ\u0000Ã\bBÿ75öÙÕÄÆæ\t½ÞþéîÑn[\u001aq\u0015Dø\\?¹>‡I¹’ˆz‚Ëâ\n©\bØÚÌÀÁEújÍë“\b¨@µE\u0007‚ïõ• ‘ÎÜì\u0016Îv¡ÝÎ]$û®Ê^ý\u0016$ÊPŒŒ\u000b8\f\u0002@íóûNl9ô=M™‹ÎØð‘O„Þ\u0000z“\nÕX—q¼ÐÞÄh)¿à\u0006Æ\u000fmWØH\u0000ZH\u000eÝ~\u0014ª\u0001~¬Ži{v½ª6\u0005H¦Újƒk\u000eRÛUÖ)Ûô8= 1×\u000fz4wõ\nè\u0000ûBPÑ\u001f\fÚú‘Yñ\u0012ý\u001eùòrï\u0016¶U~\\\u0016Lª€\u001fmf÷âzös8\u001e4c\u0013\u0012™É†æ¶Rœ“Œ>\u001f\nî$yÍ㐭\u000bF#eÿc\u001dÉó\u0014®ëëɋŸ;\u0003‘É©‘%«A\u001d¬y\u00004…¹æÄ~GgT\u0012ÍçØ|ƒt¼ê'øŽ´ô…&r\bd{SÚ©–¾=}ÆâѼE\"­´vU²/!øƒ‰päj®ŽÔ}–ËŸ2àiöªíÑ·)4,ҖìM‚÷5\u0018²üOã5JjÕ~}2\u0005͚¿\b9:]-Ñ üÄÍ°^Ä͒€ùŸŸ€\u0011TakÃ\f~•S'\u0019Ï7±\u0019 Å˜\u00115˜bzüáS\u0000Óð϶Ì\u0001a\"M[\u0015ŒQ\u0015„@ÊùЂÔMD¢)LN\u0011±s“î±\u000eJjé}‘|[|Q^\nM¦^;\u0014Uˆq±¼\u0019[÷’~NR4€\u001ab4†˜ž\"6\u001fáWù’û]4 s\u0006ïS= –#S]3L4°,;C}['\u0005‚V)l@ŠØ\u0012Ò>t=MvT0]™Ví¡ŽcE—\"98‰/\u001f\u0000÷»U\u0013ñ<†Å\u001cZ\u000eÂ\u0019™Á\"\u0003fcÐ]ª¸0\u0001h\u0006—cc\u0007C\t¬“x2CN¸&J¸ÅÏÿÉäo\bÜå©û†æþ\u001bÁ\u0013hn\u0010¤»ÝÎÁœ5d!±‚¢IŌk\tGžàfâYd‡yœô\u0007…^~‡ûéÙVƋ¤\u0006\u0012Úæ7Ïrµ®¦0µÑ×ö\u001d=M¡¿|¼7É÷\u000fúWr\u0000\u0006ÈÜ!úø\u000f~B\u000f\u001a\u0011†\u000fjà!ÿù‘¾\u0011=}¾ƒ\u0016\u0010ì\u0002™¢\u0019\u0007'˜àÛI\u0004øåõÜúw\u001dæ\u0000üm9úœ\u001c]<è@\u001e]1Œ¢\u000bŸHôð\u001e£U)C]Z«\u0012\u000eHÓ\u001dþäëUê˜ù\u0012_ 5#I—å3òvDÁ\u001d±¦¾Æ,\u0014t\u0019ŏnKr7-©qO¸Ú0ï55P<•È\u0002·\u0012n–÷ixÖ\u000f§‚æ1x\u0000F€•\u0019!ðBú*4Èpµx¢–=Mâ\u0013ua\u001f†W\u0014 (_ª¶+í/½ò­\u0010SÐ[úaƒõ~EIˆû\u000bâ¥\fÖ;3ü¨/9\u000fºxg9\u0013xNˆ?—W8\u0019†\u0005>½˜Å\n…ßo:\u00175èzw‰YxÑ\u0000\u0002iPM„= vÀ\u0013kÕ:ۑ‹0(¢\u0001è’L˜gƒÚi@GìßRŒ\f÷B\u0013˜H\bÎ?ù\u001a:žV\u0002ê¾é\u0011ÔºÎ—ö¢M²ÜY\u0004‰ëï OƬ–í;Ç*N…Ð@΋= #fýòôWjs\u0019†…ꊉ9ع¡h“ú HÂÉ7ûâ YdH=M–û!~FÁ1EÈ%\u0003xGí‹ØtîšMIÆâßKٍÁp=}ÞÀ+þ£×P§gþ#‘*#yú£„|rºC\u0006\u001a¤f¤{¢T˂+»\u000eŸ¡b,£ç£‡›Œñ¬cƵsç¤pТû|ò\u001e2».aÊÓCº³s¾ËV‹J³. Ýó9¤_lgҳӳ䯬G3䱨OC%©\u0019\u0013%Î_³#\u0013»3%уYß'•ßÌëŽ{}»Â´ƒHZVôƒº\u0018Ìkí\fnØ.­”š\u0013YV\fÛO\u0002š…?W1\u0010[g;S£\u001aêX»£i÷¯‹ô=}B¦ã@\u0000»#\nþ\u001cÙVŽlY\u0010\u000eچ…/übÜ~Y\u0010~/V0’{‰®éqŽ)r€\u0001ï»wÂþêØéH\f4Þ\u0016«\nŽésûÖ)ßh§«>%i\u000b¦=}‘½–rï\u0016¯þ\u0016G}9eº±«\u0016ºi\u0007]\u0016Yw.)õ\u0002\u0001\b§ó\u000e½ï=MîË1Å%rBEk°0\b€?\u001b±¿ð‡ˆ\u0007Áòˆ…Ÿ\u0017UE֔ŒÓ8Z\u0018Õ½~ˆSÊÕ:Ä®•{\u001aÉBƒj¨O\u0012ˇR.èßýøï\u0011ñ¬\u0006ik\fÝÌ\nñ7¥Fê­¡²øUŠC5uÄ͑m÷O}I…þ¸Fj¬í¦¨\u001eî§\"¡ÆÛ= ôӃ;ãž=}\u0003iÆd@J%P\u0012§8¨jb«Q!¶\u0017¡ÄûŌ\tì\"6WWØ[ÒPgU•Ñ¹âÇtTð/WÐ)í¾F.WäÝëõ£?\u00118Û銪ëþËçe\u001dëA¶IâG_X5ñžÑ›N÷‘\nL1šõÀR¨]rÈ^ü•â7e\u0012î”:¨ŒJ¨\u0018*G\u0019­™O¶¿þÏsœêSbýS\u0001«A\t®­…¨‘¤%Ϫd\u0000¦dbf¨.«á\"öÔJøèpø¸J±K«ýP\u0005•B͟(-FlÍí= øŸ\u0011O…(Y-b~LK\u000eõ\u0015Œ75G\u0018í?!ø5:J‡øC5€iíQ¯õ\u0005œ\u0001dŽn­\u0012÷ƒýRƒì)%þÑ­WéÍû”\u0000ñ|\u0018Ü>ÚktP7–Øù1=}•SknfgÓ2UÚ\\ï;n\u000büѨ6\u0015t\u000fp\u0004cu¿µ\u0005\u0016‹I@æjN|§z\bviÈ>Ââ\u0007§\u00116tÑîéJ4Յ\u0011ï\b\u0003÷)}ð\by^ÏûA(\"û¹ž^\nô]Þ6ȼ<‹\u000b\n•…\u0007©ýh¼Ï»@dWµŒ›ïëj‰=M½xvusÂB)tH÷!6J…ÜÅ8'6Ìÿ:HS\u001fó­ú\u0019ȶ¶6/î*\u00079È\u0004ƒ9'”vç¡MìÇ\u001b\u0015Å(\n¶\u001b:\u0004ñW\\‡k\"\u00111Oáƒ#aL¦öy}V\u0013'àØ\"~”E*ÀjJ|Eœy))Ǿi#©Ús}\u0010pŒ,y\u001f›‚-ÜàO{ÎZÇEx%Ÿ³®]ÀØêjc?ؖo{x€¯Šåö\u001fÂ=}\u0013vf'êþ0ìÂ=Mï\u0001(´‚\u0001¼uÜo3‚±»Ó\"O¤]\u0018{= v†\u001d;ÁR™ŒõÞõ:\u0018ˆö«\u001fÝ<Œ6t‚Û,w¤6»öÓ4—\u000e¶ÓÔ@ãx‚†ì¡Û1vd†{\\\u0018ϝ¦j\u00053Þ) Šê\u0016\u0018u\u000b-ÎêTO\u0014ÇT\u0019ÆüÔ\n§m2f\\ŠÚ?\u0016N*„|\f»„tæœ[\u0010«F¯„\u0004•\u0003\u0017šŒs\n3±vÖW<\u0018ó®ð\u0018ЏÖØ\f\u0016ó¦‚ä½»JLV\u00042½ªK4¿â+èþ©õs\u001cò婓\u001bè\"gŠ!\u000f\u0015ŽjW\"žuwu*\tváo͎pQÎ= KÀt.’UA\u0017~~&ð€\u001d“ÜKޚ¹\u0019Æ¡\u001cúíp]…ÝN®Nr\u0019\t@\u001d\n¥…Ý”‚M1o\u001f~$ùÀS=}€A\n}ôÝCÀâ¬%ª£ÄC£#\u0005|Y\u0010~¢\b~Y\u0010~QV\u0010~Y\u0010~YX\fA‘_¡EùJ˜¢Æ~tâ~i#e¹_Áچz}k{’°\u001b±Ojìa9Á¶\u000eÓsPå\u0010\u0011ÈȹˆëÑÒæeT'%\u0018hË\\º\u0005[T#„\u001cG\u0012qH:òÙ5>V\u001b†8äc)\u0017\u0001[H•\n\u0010­à¿5kþ=}k¥–\u001bu\njtKÀf~”t6.Ç\u0007㧕‚e+=M°„6\u0003·.¥<\u001cÄ#üT!K’—ˆ:NÚÈ._“v™\u0003—«\u001a•a^ÕbtñÏì\u0015C\u0015Jà®À\u0010Ì>\ffåÜÎM]ýUD܀uïÜYn'(\u0019éëïهx mŽ\u0017ÌbCf>ÃЇ:=MUäè@ú€w{\u0015ê¨p\u000bÈÇzËÕåöAèàˆk_ÆfË̝Q7‡^•\"w}¢\u0015“•ÂWŸ!ÄܞÊ6¡\u001fŠã|úI¿›%_ˆÊÏ)\u001fÇВÀ)R”a¡%(ÖBõ9ž3\u0011ݚ\u001b\u001f”َɃõu¸­\u0007Òµ!ƒ¿\u0006AÉgŠÛ\u001c\u00122\u0013\u001ehäq9h\u0000\u001aºõ\nY6×\u0007®•¤¾«\u001eΛS\u0007°\t\u001cÎÛNW7b\u001eºTLv\u001fýp\tv8¼ë±Bmàb,Çâ¾êu/t0¾1ezÄ?\u0001Ù³JOa{«€4̑ïhEùt†ú@\u001b;øÑ9QÌ·žÈVç\u001b!US¸À§d¦ãÉ䣩sV\u0010~Ù¢Ü~Y0\u000f~Y\u0010~\u001f|\u0011V\u0010~˜\u0001á<\f;ìE¾6ërh»\u0005H¾ä…=M¥¬z\f\u0012\u0005Lå\u0001¹~µ~¦‰çéu#¯G\f5(>7,=MD·\\ÈeîáQé­Ÿ\u00023“êZlUy–G\u0001ˆ³=œU\u0006ÎÜç:6#zVë\u0013\u0010ފný9Æ\u0015Ò/Vó}=}\u0016eú$Öµ–;ÖT\u000e¦Šcu7.‰QºÒÁ4Ñ«r= hŒüô¾ŒEX:4‚¢4L¡Iq{À\u0016\u0005}id§I¹ÖøÉ o\u0014¢\\w\u0013p=MMÈ\\&QOÝíZÃw|˜ÁX\u0001“)ñ\u0013 Gk·CÐ\u000eˆ‹i\u0007¸}ÑMðâØE‚®Ï‹[5à€\u0016u0¹úœsˆÝdט¥æʽ\u0005L*ä­ðÉ|—èö¤= \nóñ@Ñyt2\u0018Ð÷ãN>9B¿E¹È¶—ü—¯/P;&~⊆ç‹Åçoþ)•ZÎ\u0004‰T©ÐƎ4 \u0012Ö\u0011þ\u000ffF‰@Ká^ºv÷±c(à¯\u0019~\u0014Ë\u0015Bå\u0013›üŸ? ´)òф%ˆø_Nb$QÆ\u001aÓÏ\u001dÂåt2“\u0014Ö§á!¬ä6ÚSÍ\u001e2¦Þá\u0006†’\u0012ƒ™Ÿ,P@\"\u0013‹§º/'\u001b”Å磢©(dA¸*YK·ïå\u0007ÄÏÄ2>Ž¸´ÁM':ÍóŽøèXAÝí±\u000e%Òø®ñb\u0017Ã×æ²8yKÞ\n«\u001cy«ÄÉ3B\u000e)½Þ\u0016·AZgŠÿÎ+¢Vdq¼\u0019›\u0007\u00112àj¿Ä@‹'ÒÂÿ3|-ç¸\u001a‹,Êa\u0001K]‰&¡\u001f\u0002‹¡”*šë£Á=M¨$\n\u0016«9œ'…{H\u0013\u0007\bçCˆ¦¦(ù­Æ”Ë\u000f@¾&@éTS€¹² R§¯@ð¥¾>/À²öôö3)8\u0002Õ³7,§a\u000fÿ¾md\u0004ü¹-V–\u0014\u0000V£n-Ó\f÷/„\u0018H\u001b\u000eø)pþÎ\u0013naµ1=MgÛy\u0003|QÝcTÁŒÞ½\u0014qa¬vYY\u0003:øοyXæeK¦Aî^\u0013õF¾Î\t˜…9\u0017ÂUž„dà+…]Ä_\u001câ% ÜF;Å«Á£Žã³£­iY\u0010~Y\u0010~Y–<}Yz}\u001dØqú~YP<‡Gr\u001eZŸUÚgû)\u0000¢6„y×üÙil„›ô1“ð•_\föÂñ4Ÿ–-_AFçë5Õ9B7œ\u0004&­ê>÷<\fQiV¢M”\u0015%Ý®%؛¢¦°¡ýH,æ1¹Ä\u0015}~G0\u0002F±Éé]ÏÜEnÄà@—ü\u001eýB\u001c¶°s—Úg]Äj\t¾Dµ\u0004oˆ\u001eiGÏÕÄÈy7î2ïôû=MiaÛ\u0016WÂ>–\u000fT¨˜Ô9WZ‡nßοfO\\\u0017€½ž\fÙ\u001f“YH/Ð\u001cÅÞñ|}\u0016–+àu\u0019ª!x\u0019G\u00056ÆN-?\u000b\u001c’§Î?œÑu¨˜NÑ\u001f8]ÅY\u0014\u0006eáÚ\u0017\u000e\u0014¡qDøÁ®š\u0007¡\u001cò±±\u001cÔM’p‰\u0018—JžS1²u\u0014aŸv2\bþŸ\u001b3ˆrA^¡‹0¨\u0013rÛ3‹\u0018$»È¨t\u0018Ì+ga\u0003ùÍ*s^Õ'fáDÏá·m@…ÓÙ᫆6Ë?¦ý´k\"ºd!Bëá.‡’?ËÑ\u00010\u0005åú×â\"-É\t\u001d¯œiTÿžÔ9þ\u0014w-ÆâÌA= ¢.\n\u0018ü¥\u0012\u0011É\u0013CÆ´hz,¹È\u0014òá<\fv6üH6%†…·\u000foö<= É8\u0011ž×™¢5i\u0007z\u0017\u0019¢<ñ= \n©%X¼k\u001c\n•\u0004\u0010É\u0018\u0001ü'¡@(gྡྷ‚VÌ\u0017m„q²ÜUmÈ\n\u001cÑÑ)\u001c\u0017qlfíØB“”œ¿Ÿ3rYa¥/Á·\u0013XI³= V(OrË\u0005~¡Å?&-4œF;ÛnµÁp̄.\u000fÌÆ H7Íˆ*%Õ\u0015²8t‡\u0002q0’nÜK\u0000$=}[%\u0010šÎÛùûìw¡íïßMË\u0001ÿhžRø\u001f\u0010LIˆ¢x›*yóš\u0000°Ò8=M\\€ôî{,ýA¨xDUE1TÒ\u00187yyÖ¢\u0003àÁ1°Ûñ\u0011ã\u0015J$ƒGéU!\u0011‡S\u001f¶n\u000e>›šÉMo>l¿\u0011\tœ,\tµßþëBue}\u000eÐ\u0017*YÕ\u0006\u0001ݚþÜ€)…Ù¹á\u000fæ»vq‘(7\u000eÊÞ_&’\t\u00183!X&\u000fBñ¡ÁŽG”\"@¯ý\u001a\u0014XV.’\u001a\u0018TîH¾Re\u0011 z0œF\u0011¹¨˜sßyf†à\u000bŽ˜\u0015JWº ’\u001eü\u0015Z:\u0001ráaŽŽf\fþÂUž“.\nžû⮲—\u0016ë!#w'¤É±3\u0016\u0013#¶U&Ÿ¹àk¬tÃÜÞ©T àëEr³\u001e});v³bÿÁek\u000b;–qå3Ú®Û2(#\u0014Ïo!Ò©À·æk\u0019Ô÷i+Ä\u0014$»OéçƒôÌ%\u0000>èC‘Ð%½ø´7Ú­„€©Ä[|­„Ž\u0002¤w@¸c*³¤{/´ãžøáÿ²„ævËá;·ºã= ð¤ÿ‘m*ºŸ\u001f\u0013øpªL5ß3ÕnžŠÖº\u0001ž‰ef1¿›¸>¦ÜÂVdÙܾ\u0005\u001eUƒü\u001f¹¿’q'^¤<\u0003ù:¤•3¤®rJæ|7\u0017ÛUÕ°\u0001šGe\u001dr÷{!ܨéLIãþ=MÕK÷Èd0üìó8V¯?Ͷd\u000fõŏ2ð#W.”óÊ±'DZ\u0011¹iå}€»Ë9+$Ã.\u000bËm,¥zV4S\\Î¥¥øƃ_øÛ·H)$‡ó3^¶¥ê©æ&\u001fӏԫ%¤jã»-¬#f\u0005\"\u001bV6ª0J Ã=}–(F\u0018áS”\\ڋa–%?\u0012Aó“~¦¹±]f<\u0004ڋ¿\u0019(yäº{›j¼i—Ü$šªê+\u0013£*É\u001e»[\u0006ªÎÒ}e>¦ÙÓ\u000e0Ø;JüdåâîóÖ¦\u001bÕ(c}!®s\u001cU·Q\u0001Ô*h>oƒå/Ì\u000b=}Ò$-.ä]\u0016Ä«rÒ#b%œSe\u0004Áïù<®\u001aB;£\u001ek»\u001bôéƒK\u0010«äR˜\u0004ŽÔà‹¬v(/lÝÓ^ü¾‡z\f$¹t'?üÃ\u0018\u001fÉ×\u001er#zµv$ÜÚ¸] Jã.g\u0007;\u001f\u0015Åÿ\u0018>£J\u001ex\u0004\u000b^½ÿ\u0001K­XÐmƒÑ5@\nq4\u0006¢Þð½¥î+QìÔ\\Ï\u00147·×ÀÇN1Æ@Ì^l¹VÀ‡+\u0007´<õ^,ë\u0012\u0002ò5¥y³W8GQ\u0006Ü\\±¥E/|G\u000f\fÍL]¹ò/ÆìƒTÃÕE‘î_ù\\4‹’™gá5Ëù<4\\®ky\u0000éÇV\"Ùü´Õ6×:òÅ\\öø¬>RãéXí4ŒÄ&ïI…úéb_>,î\u000b\bøλ=œuþop“VoílfoY¶è/O íéXÝ(„îžÓèg7Ìq3ópŠÁ\u0016š7‚\u0013,4 ÿ(´qüÇæ¶×·\f¢à؝Ü\t­Ø4uC\n2õÂi'Íâ\u0001ë>ö:uxõy\u0017•ÁêýC’ä\u001a—Fß^³\u001daÄ-Q–òG2\u0001Gtˆ„\\×böë rºueA8w÷\u001aÐp/ãXš\u0010I\u0019ðèWñ\tÊ= \u0005a*!ìòV²ÁEïô=MœZ;\t\fBG°\u0011\nKöq\u001c\u000f‚È=}òRuL\u0000Ú\u000bŒëÌ\u0018<ñ\f(ŒÀÝ~žá°ñOC4…=MÝZK19Â\u0010Gµºþ\u000b\u0012|Æ]‰dö’\u00040¹Ù N¸þ\u0001uöÐ\u0012\u000b\"†\u001emx—s2šasŸþ= ×…²]’c\u0012Ý\u0010 âoÁEÌɵË\u001c\u0017·½Ní…~åÌםÉ0 ÄU‹ýÌ*։2d‡ ­Û\"7ÅÉj0f,xí\u000b\u000fG%\nÚM…yÁØ\u000f\u0016¿2\\h¶Ó\u0006\u001bŁ‰ðiK\u0016ös\u000e—×ÿ’ÚÀˆî\t\u0003pR<û\u000eN$•è=}Ë\u001fQ(}}V\u0014\u000b<±1aK.\u0016bŽ„m(©{B\b+þѼÄ\u001fÙéü€Ü›Í\u000fÑّ;*x8–Ta\"¤áÖû'’¦¹†’8î\u0013—¨ö7 \u000f)5æ‰{Þn¥¾O¼ºès\u0006܃* 9;\u0013p­Âyý†K:Ù۔JÐím{† \u0018ª‡\fۅ\u0018æʏ\u0001ƒ/P\tÑ[,\u0014è\u001c\u0013æþ…1oõ²ŸYk¶&ï_Sã~¾@ʜ\u0003X_Ò¡¡†.˜\u0012ŸsP4*ŒÚ \u0014lD£ßó»+êE%3û¨\u0006q—³WÀ%jæ\u0014j”Ó÷r°êðž«Ïø.gJÀ4k9ç„L7\u000b—@º&…a»w\\·.ñÌ\u0014›éÊÁ¢Wj†•\u0010¬ËSðgš‚¶”4\bÛyȬ\u0012šÈ\u0004j‘\u0007/Ôòär\nÌ\u001bÇÒ¸ ÷vӑ\u0017½á(\u0017ßx?1\u0010ô¼»ŸÐ¦p¨<;Ä<(æ\u000eVSæľøÙ\t†Ñœ¿ïý<&þ©\u0016óÅÖº\\z\\›sڲʀpfnéœ[ êá9 pê= 3¥\u001fýù#\u00186›ÛÝ.2¨x\u001f?Öö#}¼¥¯[ÐcMTåoˆ¬ÔŸC³ú\u0017®Tîö'\u001c4Å\u0017ÛËå2êÅßù/õ9\u0005_;Ñi\u0010*g\u001bMí/â\u001eh;Ö4è \u0016¹8&û×o\u0006Ôb+hâÊüßpT[H$h¶ÀÏ!¡k\u0005²¹ø©¡„fÏ!¿\u0004„p¹¡\u001en%\u0014¸®eÆϏï\tDc;¨Fú\u0005[W쯭i\u0005#Þœ\u0019¹$\u0006H³—9­„šÔ¤\u0013Æ\u001fû‘hªjà¨ÓF؇H–äpÓ²\u0016„ÏÒªæUdwâ®\u0015ÀÕäpÛ¦IlHfDÊL\u0013…ó­û©È&ûĬ5ÑÊe\u00072§{xÀª ,Tãêf)3˛›Ó¥õ\u0017fäê¿­\u001dØdS=Mÿ³›Û©c”\u001fÁ\u000fۏ®VÛ\u0012k\u0010•'†Ò$Ž\u0013(Š2@äPu´'ºd\u0007VÐûhûæ ß.œ::9%\u0018%¼?ö\u0002¥mZ¹e=MbœC¢\u0014±/rÖ){ä¦ûgz&F‚\tff\u0013Ð[\u0000Ô®qp#öÎIå\u000e~Ç\u0013y?£©¬=MS= ç¼-^·äCI£\t9\u0015Ó·Ê°’y/©\u0006ž´µ?”:ÑñWîá¶^n’+h8\u0011…\u001dǛ€éM§°'•MëJà5úñ\u0011ÿ\\ñ©5Ò5e¼JlYm†ÇΌÃì9€ðÁ¿{íͯz6þú¢êÍu›çÆÌ(K'ç³ ¾ÂÕ×nAo\bí\u0017‘¼5…XÖ+T&­”Â4ÇLtB<^ÿ֖\u000fðIf¢ÃÖS\u001a¨ö!y&,@Ù(|ÞImeC\u0007Lh@ŸêHiY¼ˆ¡2\u00028^¹\u0015Þ7å\\”qŽ[Ã<\u0005ÑH/\u0015=}¬òÜ\u001a(ÂÎÒüÝ\n2Ý  û&AóAæ¢VUCÔn?K~\u001dÁPÞµðàrHö^®ÅM‹V-ÁMã¸ðZôxF\u001e\u000b?‡\u0004-\u0004ʋ6n\n\u000b…kÈ=M\u000b\u001e6áüñLdXž—\u001cúØàÄ|çIâIÜiW\u001adÎ=}ޚ¦= Pœ8\u0011½–6‘\"zòþåÇswõµBò:d âˆÓKå¤\"\u0012¾*a¤Í‹ÜôÀŽ½Éƒ|el{\u000b×°J×pc7÷°ßÆH0ÚYŽ\u0003™÷ O{\u0012+~xðS\u000fxÿwœÝÂ\u0012\u001bÑåbvî“x#¼Ý~ü\u0003=M%îsµÚ\u001fXéB,\u0019;V{¤B\\Ý\u0004õ3®Í*^„8òÇ\u0011\u0001[\u0012T²\u0001<ƒ*›…yt¸Æ^\u00123Ë\u001d‰°¿_ñL¸S¡ÝX!ÿz”Ž‡dx®Rv»É™\u0000_i\u000b8b“½V |¹¥Ðã¬KmmmEE¯Ú}‚ºC¦÷\"\"\"þþ\u001c£¶Ù¤MçØÙÙ9:Š\u001bԟ\u0014£˜F\u001d\u001d\u001d½¾îŸ:\fg¶¹&|e\"\u0017–U€[ï\u0001J¼\u0012\u0005\u001d\u0016&åqU³V›;}‘WÙÞì\u000f\u0012\u0012»c\u0003Áóeè9\u0003´\u0002v{&ى䱙$<»p®Í[u­O‡\ný\u001euy?Ç6F \u0004Ñɶæ°Úý&0Ÿð\nÒ{<®‡\u0015UÔÉJâ\u001aˉß.Ô2rL’\u0001ŽV:‡™š1Œ»q¶m[wÕψ\u001e=}\u001ew‰¿È@f \u0005Ùi–)ÍQX­\u000eœ@™AXà\nl‰\u001b‚;2ŒÇ³…ùæ{m¢\u0017š-€\\åáJ>Ãç'_Js=}¥˜/\u0005{\u000f~YÐ†X\u0010ŽZ\u0010pY\u0010>‚Œ<\u0010~Yšaw\u00105å(­ÜV¢lÿ[Ññ»–o$ÕMn%Œ7¦òñÚ\u0005À:ÞsÊÐ1\u0010sÛó˜= 2 Ž‘ã>°®ü8ú\u0019\u0017p€f!pWFûxnï‹\u0010*\tjþ¹\u001ei)8Î.v,羙_LåpRü4uL´ˆ*ý”ìwA\t\u0011Zƒf?áçxÏ{\"kB‘Š>\u0014\u0014¯8\u000b%ž\u001aɘ\u001e\bç\u000bܨ\u001c¾½ÔZE8Až¼“}†ÈæYÁ¦a2IÁÝÀ\u0017…ìwlMèkh¼GÕ=M\u0003‘ÜB--x{Ô\bÌ /óä\u001b]=}e~ÎÔKjÉ=MŸê1eyÀGâÏfb(ä\fÁÌMbÜãò]î\u0013^‘\u0014=M\u0013þ'\u0006ÛîøO¨;?\u0017<Ñùojªlðuqmh=Mp ÍÿÞªÍxö½Úá®È\u0016\u0002öN’¼\u000b¼™4ÁÊJ\u0006\u0005^’\u0017\b›”-èõóš\u0004´asÒ¬) hœ\u001fú¥árÑhŽ\u0012,&äù9\u001aa´&Ž= Î“Ú‚E¡|ú‰u-4ÛqN\u0015ùÚ¿Xï؛z©DÛxYْùÞ»jRwˆÆn§…@X¤Ò–d²pÙ‰Šq²(‚‰bõ¢ È\u0013[rì\u0010¢‡­ªžjJי’XVVú˜t©\u0019\u0014PÂÂx€RWluAte\u0003¢'\u001b\u0016žwèéžâV;¥»C²¥#$»)$o\u0005‹E9Ž‘²²p@’¼nOl}|6= F´Pt/™\u001bg\u000e߆à¼5\bÕÈ~\u0007ïyl?vÄ\u0000Iö]ðj\u0017@qŒá¯e\u0005;'pÓ­N\u0004¹\u0019fÓϲvSà/fÓ²ž\n;±«££$Ã'¸–RÝxÿ©i×ë.\f5ÙvËPIü}ðfW?I\fÞ0v\u001d=}J »+(Ô´¾\u0006Çùiï/Dû½öTØi\u0005\u0010oh»/hÔ¼>\u0006×ùj\u000f1„ûÁvTài\u0006 oj¡ß3º‰,_Ô2‡8–ïÜ²ˆH–÷Ý2ˆX–ÿÞ²‰h–\u0007\u001fÁpNrV -Œ&S¥Ë'¤Ã\u0005³#ô×\u00040ÿ\u001a¢\u001b&‡=MYfš{˜â^A\nzŽ|˜!\u0019PjQ˜|XÂ^™\nz\u001c{\u0018á\u0019@:\u0000Š\nz {\u0018â\u0019€:\u0000š\nzß{ØÂ\u0019p.\u0000–\u0006zß|Ø\u0002\u0019p>\u0000–\núÁm*\u0000\u001cTÎâ\u0019ˆlQ\u001f|8Ú^•\núÂ{x²\u0019˜(\u0000 \u0004úB{xÒ\u0019˜0\u0000 \u0006úÂ|xò\u0019˜8\u0000 \búB|x\u0012\u0019˜@\u0000 \n:ª\u0019œ\u0003:º\u0019œ\u0004:Ê\u0019œ\u0005:Ú\u0019œ\u0006:ê\u0019œ\u0007:ú\u0019 ž~\u0006A–½R˜Á’X)XO\f\u0010\u001e{nA™\u0019©\n\u0014É\n\u0016é\n\u0018\t\n\u001aª\u001a\u0014Ê\u001a\u0016ê\u001a\u0018\n\u001aÚ¦VÓ¶VÔÆVÕÖVÖæV×öVØ\u0006VÙ\u0016V:$Ï\u0007ž¼lí\tU6DÏ\bÍþ¼ný‰Uz¤\u0000s¬€s´\u0000t¼€tÄ\u0000ùuÔ\u0000v܀vä\u0000wì€wô\u0000xü€x\u0004\u0000y\f€y\u0014\u0000z\u001c€\n#¨É{\u0003'¸\t{\u0004+ÈI{\u0005/؉{\u00063èÉ|\u00077ø\t\u0006Ú)BèÝY¥³)$»Ý¤¾œWÐ\u001eIœÈ²ë\u000f삒œ_â‚r¢\u0016?âšp Öro:\u001cÖ\"™l!|ڞ*ê›'ú›(\n›)\u001a›jêŸgúŸh\nŸi\u001aŸJ*—4\u0001uò\u001dí\u0002ŒÐ à¹Ž#©£³©\u0005ÃqÍ¥0\u001bäyU‡ßRnà‰á\u0016R\\‚\u0016‘ÞšAžrÁU2ÈžlAURÐžnÁVrØžpAV’àž2ª”Ä\u0001g2\u001bµ\u0002…ðŸ,ê”Ì\u0001hR\u001b¹‚…\u0000Ÿ.*”Ô\u0001ir\u001b½\u0002†\u0010Ÿ0j”Ü\u0001j’\u001bÁ‚† Ÿò²u*—Å ëòu:—É ì2uJ—Í íruZ—Ñ î²vj—Õ ïòvz—Y–’~Âý2vŠ—Ý ñrvš—á Â9ŽC££³«%óÔ\u0012J\"ÎâW#\u001bÃá+º…*\u001bÅa+څ2\u001bÇá,ú…:\u001bÉa,\u001a…B\u001bËá-:…J\u001bÍa-Z…R\u001bÏá.z…Z\u001bÑa.š…b\u001bÓá/º†j\u001bÕa/چr\u001b×á0ú†z\u001bÙa0\u001a†‚\u001bÛá1:†Š\u001bÝa1Z†’\u001bßá2z†š\u001báa2š†¢\u001fÃâkº•*\u001fÅbkڕ2\u001f\u0007!Õ\u0002bpŠ‰\u001a–= œ‚\u001f\u0013!Û\u0002?âqʊ:–p–r–t–v–x–z–|–~Š^’¶§²«$£££c\u0019Y\u0010~Y\u0010~Y\u0010~Y\u0010~Y\u0010\u0007š'Ùm\u000eP^uM\u000eO= mNP\\qÎD-©}‹D/½=}‹C2­\u000bD.¥Èøxóþà8øööÀ˜øô\u0000Ð\u0018øK7=M½\fJ:\u0015=M\fI6!ÍLJ8\u0011-·òÜ O\u0016òݘ/VrޜWÖrÜ¢ÇõlÃ>ß5ìÆ6¿•ìÄ@Ï\u0015ì3\u0007M¼\t>\nU\f\t=}\u0006aÌI>\bQ¬6íÐF•íÑPo\u0015mÒH—UmÐô…ÎRb˜‘îRa”™\u001eÒb™‰Þ’bg;\u000fVjÕ\u000e\u000fUfáÎOVhÑ®9ÿ\u0018f\u0010šÿ\u0019pð\u001a\u001ah\u0018Z\u0018„õN\u0010W€\u0001nPX|ñžPWù^Ðý¥¸¯Sd¦¼×Ód¤Â·sd¥º§ëE-ÄY\u001bÅ.ÉIۅ.Å]û…-³ÌwÓe±Ò‡se¯ÊŸóå²Î³Ä0Ýi{†0ß};†/âm‹\u00060Þ\u0005gÅ1\f\u001eëûÓ­cË\u001f’\u0012~Y\u0010~Y\u0010¾fÓlÞ\u000b¸ÇQEè\u0017\u00156/’àr›W}\u0004l ÏytÛj§2¢[\u0010Õܑ…\"Ÿê\u0010:l]K¥t$ˆ¨Y¸‹\u0011ƒ>$Œ§MÂÅ©lÁÏ\u0012SPä\u001aª‚¿ï\n󠄚­Ô\u0000çØ´läÏÂT\u0010皳‚û×\u001d”[hJ¹D\u0000/\u0015\u0014<艺8Åÿ93ìå\u0006«2Ê\u001f=}³ÝeËñ7„U)ï½½\u0006\u001b_„v)s¼ét÷ŒInXëI‹ÓðB\fïˆ\u0006ÝjöHBњ\u0017MJwáP•ŒÖòD\"‚,æPÙ\u0004ÇmúJãçêÁ1ÕÞLF\u001f—zT“gÇö›ï°(\u0005Kõå:ÁáBæL¹ýì9¸UP6\u0002m\u0007\u0010Æ\u001e¶|ûlmä!Ø00\u0018O/\u0006ü¼~{=}j}ٙé.\u0017ùwVÆA\u000eҊžü6rA\u0019¹0›°êE ú<ÅE&ú‹\u0013ìò¼š£\u0006j¶©£\u001fš\u001f²\n~Y\\ÝàbV\u0010~Y¢K\u0010~\tó~ùû^0MœY\u0011ʜÈB©T*þ^\\? „Z\u00189eS†k\u0011\u0007ÐU·<.Ÿ2ïŖ4Ìn7\nmuˆ0q°ñ˜ñ&É&ÉöW:“Ù\u0016Y\u00130Y\u001c0ª/§¯²ª°¨±©±)zêŠ-õhLÌE×ÉÆEÓWuJxL€árø‰6Ãî/î¸Ê.õ\u0005u(üEÏô8ö= \u00006ð6p\"}ö\u0017IÑˆPƒ\u000føàC\u0015ó\u0010.]„y#©U;l2ͳHh\u0007«Ö\u0007\flT<ï¹ø¿ýµù½y‡z„Ù\u0011Þ\u0007<ŠÃ\u0018²òr­Î\u0016L\u0013Q\u0019\u0012\u0017K\u0016K\u0018‹×¼×Àx@w>JTë\u000eDqý¡¹qáXfÍ>wº\u0014—Z)ùjÇ.6µ¶Õ;÷\u0004-Ãö?ÒË®L«\u000b“N²O°–À\u0017=}\fà\fA\u0012Î\u0018\u0014\fn\bÍ\u0000\u000e?=}ÝOýýO\u001eO*\u0010ɗJ¼qyþ\u000bßz\u0007H¡©P€Ÿ€?<Ÿ¬ð&P\u0007= ËáÔÄÖa'k¸‡é·¬Î§\u0018$p!\u0000!p!ð$Ɓ\u00061®OI;Šüî@ÓO;gÓ¬…#\u0003ÇÙÿäE’TìO™£$@:³“ä(>Ûzí0RHN\u0012\u000b\u0007\u0005=M\t\u0011\u0004\f\b\b\u0010\u0006\u0006\u000e\n\n\u0012Rœ–>XþÛz‹†\u001e Ûªöt\\ï£+|½ »XP÷\u0016QVÈû³Jº‘Æ+Y÷9Z}\u001d¥@\u0015¾ŠÝ= ÿˆcA\u0005ܗ'£³æpóCè\u0001A^5£Ë)öt[zçHÍÞQá!+£³æp\u001eq\u0006\u0005E\u0015'¨”Zá\u0015ªŠ™…‰2{ürÞn¬£ÔwYßÛä\u001b\\7TÃa\"“\u0002yR\u0016SIbâmiÖZñµƒ\u001e=M•\u001d\u0005ž\u000b£”\u0002œ2\u001c]šÑqøG}“Ò`});\n\nvar HEAP8, HEAP16, HEAP32, HEAPU8, HEAPU16, HEAPU32, HEAPF32, HEAPF64, wasmMemory;\n\nfunction updateMemoryViews() {\n var b = wasmMemory.buffer;\n HEAP8 = new Int8Array(b);\n HEAP16 = new Int16Array(b);\n HEAPU8 = new Uint8Array(b);\n HEAPU16 = new Uint16Array(b);\n HEAP32 = new Int32Array(b);\n HEAPU32 = new Uint32Array(b);\n HEAPF32 = new Float32Array(b);\n HEAPF64 = new Float64Array(b);\n}\n\nfunction JS_cos(x) {\n return Math.cos(x);\n}\n\nfunction JS_exp(x) {\n return Math.exp(x);\n}\n\nvar _emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num);\n\nvar abortOnCannotGrowMemory = requestedSize => {\n abort(\"OOM\");\n};\n\nvar _emscripten_resize_heap = requestedSize => {\n var oldSize = HEAPU8.length;\n requestedSize >>>= 0;\n abortOnCannotGrowMemory(requestedSize);\n};\n\nvar wasmImports = {\n /** @export */ b: JS_cos,\n /** @export */ a: JS_exp,\n /** @export */ c: _emscripten_memcpy_js,\n /** @export */ d: _emscripten_resize_heap\n};\n\nfunction initRuntime(wasmExports) {\n wasmExports[\"f\"]();\n}\n\nvar imports = {\n \"a\": wasmImports\n};\n\nvar _opus_frame_decoder_create, _malloc, _opus_frame_decode_float_deinterleaved, _opus_frame_decoder_destroy, _free;\n\n\nthis.setModule = (data) => {\n WASMAudioDecoderCommon.setModule(EmscriptenWASM, data);\n};\n\nthis.getModule = () =>\n WASMAudioDecoderCommon.getModule(EmscriptenWASM);\n\nthis.instantiate = () => {\n this.getModule().then((wasm) => WebAssembly.instantiate(wasm, imports)).then((instance) => {\n const wasmExports = instance.exports;\n _opus_frame_decoder_create = wasmExports[\"g\"];\n _malloc = wasmExports[\"h\"];\n _opus_frame_decode_float_deinterleaved = wasmExports[\"i\"];\n _opus_frame_decoder_destroy = wasmExports[\"j\"];\n _free = wasmExports[\"k\"];\n wasmMemory = wasmExports[\"e\"];\n updateMemoryViews();\n initRuntime(wasmExports);\n ready();\n});\n\nthis.ready = new Promise(resolve => {\n ready = resolve;\n}).then(() => {\n this.HEAP = wasmMemory.buffer;\n this.malloc = _malloc;\n this.free = _free;\n this.opus_frame_decoder_create = _opus_frame_decoder_create;\n this.opus_frame_decode_float_deinterleaved = _opus_frame_decode_float_deinterleaved;\n this.opus_frame_decoder_destroy = _opus_frame_decoder_destroy;\n});\nreturn this;\n}}","import { WASMAudioDecoderCommon } from \"@wasm-audio-decoders/common\";\n\nimport EmscriptenWASM from \"./EmscriptenWasm.js\";\n\nexport default function OpusDecoder(options = {}) {\n // static properties\n if (!OpusDecoder.errors) {\n // prettier-ignore\n Object.defineProperties(OpusDecoder, {\n errors: {\n value: new Map([\n [-1, \"OPUS_BAD_ARG: One or more invalid/out of range arguments\"],\n [-2, \"OPUS_BUFFER_TOO_SMALL: Not enough bytes allocated in the buffer\"],\n [-3, \"OPUS_INTERNAL_ERROR: An internal error was detected\"],\n [-4, \"OPUS_INVALID_PACKET: The compressed data passed is corrupted\"],\n [-5, \"OPUS_UNIMPLEMENTED: Invalid/unsupported request number\"],\n [-6, \"OPUS_INVALID_STATE: An encoder or decoder structure is invalid or already freed\"],\n [-7, \"OPUS_ALLOC_FAIL: Memory allocation has failed\"],\n ]),\n },\n });\n }\n\n // injects dependencies when running as a web worker\n // async\n this._init = () =>\n new this._WASMAudioDecoderCommon(this)\n .instantiate(this._EmscriptenWASM, this._module)\n .then((common) => {\n this._common = common;\n\n this._inputBytes = 0;\n this._outputSamples = 0;\n this._frameNumber = 0;\n\n this._input = this._common.allocateTypedArray(\n this._inputSize,\n Uint8Array,\n );\n\n this._output = this._common.allocateTypedArray(\n this._outputChannels * this._outputChannelSize,\n Float32Array,\n );\n\n const mapping = this._common.allocateTypedArray(\n this._channels,\n Uint8Array,\n );\n\n mapping.buf.set(this._channelMappingTable);\n\n this._decoder = this._common.wasm.opus_frame_decoder_create(\n this._sampleRate,\n this._channels,\n this._streamCount,\n this._coupledStreamCount,\n mapping.ptr,\n this._preSkip,\n this._forceStereo,\n );\n });\n\n Object.defineProperty(this, \"ready\", {\n enumerable: true,\n get: () => this._ready,\n });\n\n // async\n this.reset = () => {\n this.free();\n return this._init();\n };\n\n this.free = () => {\n this._common.free();\n this._common.wasm.opus_frame_decoder_destroy(this._decoder);\n this._common.wasm.free(this._decoder);\n };\n\n this._decode = (opusFrame) => {\n if (!(opusFrame instanceof Uint8Array))\n throw Error(\n \"Data to decode must be Uint8Array. Instead got \" + typeof opusFrame,\n );\n\n this._input.buf.set(opusFrame);\n\n let samplesDecoded =\n this._common.wasm.opus_frame_decode_float_deinterleaved(\n this._decoder,\n this._input.ptr,\n opusFrame.length,\n this._output.ptr,\n );\n\n let error;\n\n if (samplesDecoded < 0) {\n error =\n \"libopus \" +\n samplesDecoded +\n \" \" +\n (OpusDecoder.errors.get(samplesDecoded) || \"Unknown Error\");\n\n console.error(error);\n samplesDecoded = 0;\n }\n\n return {\n outputBuffer: this._common.getOutputChannels(\n this._output.buf,\n this._outputChannels,\n samplesDecoded,\n ),\n samplesDecoded: samplesDecoded,\n error: error,\n };\n };\n\n this.decodeFrame = (opusFrame) => {\n let errors = [];\n\n const decoded = this._decode(opusFrame);\n\n if (decoded.error)\n this._common.addError(\n errors,\n decoded.error,\n opusFrame.length,\n this._frameNumber,\n this._inputBytes,\n this._outputSamples,\n );\n\n this._frameNumber++;\n this._inputBytes += opusFrame.length;\n this._outputSamples += decoded.samplesDecoded;\n\n return this._WASMAudioDecoderCommon.getDecodedAudioMultiChannel(\n errors,\n [decoded.outputBuffer],\n this._outputChannels,\n decoded.samplesDecoded,\n this._sampleRate,\n );\n };\n\n this.decodeFrames = (opusFrames) => {\n let outputBuffers = [],\n errors = [],\n samplesDecoded = 0,\n i = 0;\n\n while (i < opusFrames.length) {\n const opusFrame = opusFrames[i++];\n const decoded = this._decode(opusFrame);\n\n outputBuffers.push(decoded.outputBuffer);\n samplesDecoded += decoded.samplesDecoded;\n\n if (decoded.error)\n this._common.addError(\n errors,\n decoded.error,\n opusFrame.length,\n this._frameNumber,\n this._inputBytes,\n this._outputSamples,\n );\n\n this._frameNumber++;\n this._inputBytes += opusFrame.length;\n this._outputSamples += decoded.samplesDecoded;\n }\n\n return this._WASMAudioDecoderCommon.getDecodedAudioMultiChannel(\n errors,\n outputBuffers,\n this._outputChannels,\n samplesDecoded,\n this._sampleRate,\n );\n };\n\n // injects dependencies when running as a web worker\n this._isWebWorker = OpusDecoder.isWebWorker;\n this._WASMAudioDecoderCommon =\n OpusDecoder.WASMAudioDecoderCommon || WASMAudioDecoderCommon;\n this._EmscriptenWASM = OpusDecoder.EmscriptenWASM || EmscriptenWASM;\n this._module = OpusDecoder.module;\n\n const MAX_FORCE_STEREO_CHANNELS = 8;\n const isNumber = (param) => typeof param === \"number\";\n\n const sampleRate = options.sampleRate;\n const channels = options.channels;\n const streamCount = options.streamCount;\n const coupledStreamCount = options.coupledStreamCount;\n const channelMappingTable = options.channelMappingTable;\n const preSkip = options.preSkip;\n const forceStereo = options.forceStereo ? 1 : 0;\n\n // channel mapping family >= 1\n if (\n channels > 2 &&\n (!isNumber(streamCount) ||\n !isNumber(coupledStreamCount) ||\n !Array.isArray(channelMappingTable))\n ) {\n throw new Error(\"Invalid Opus Decoder Options for multichannel decoding.\");\n }\n\n // libopus sample rate\n this._sampleRate = [8e3, 12e3, 16e3, 24e3, 48e3].includes(sampleRate)\n ? sampleRate\n : 48000;\n\n // channel mapping family 0\n this._channels = isNumber(channels) ? channels : 2;\n this._streamCount = isNumber(streamCount) ? streamCount : 1;\n this._coupledStreamCount = isNumber(coupledStreamCount)\n ? coupledStreamCount\n : this._channels - 1;\n this._channelMappingTable =\n channelMappingTable || (this._channels === 2 ? [0, 1] : [0]);\n this._preSkip = preSkip || 0;\n\n this._forceStereo =\n channels <= MAX_FORCE_STEREO_CHANNELS && channels != 2 ? forceStereo : 0;\n\n this._inputSize = 32000 * 0.12 * this._channels; // 256kbs per channel\n this._outputChannelSize = 120 * 48;\n this._outputChannels = this._forceStereo ? 2 : this._channels;\n\n this._ready = this._init();\n\n return this;\n}\n","import { WASMAudioDecoderWorker } from \"@wasm-audio-decoders/common\";\nimport EmscriptenWASM from \"./EmscriptenWasm.js\";\nimport OpusDecoder from \"./OpusDecoder.js\";\n\nexport default class OpusDecoderWebWorker extends WASMAudioDecoderWorker {\n constructor(options) {\n super(options, \"opus-decoder\", OpusDecoder, EmscriptenWASM);\n }\n\n async decodeFrame(data) {\n return this.postToDecoder(\"decodeFrame\", data);\n }\n\n async decodeFrames(data) {\n return this.postToDecoder(\"decodeFrames\", data);\n }\n}\n","import OpusDecoder from \"./src/OpusDecoder.js\";\nimport OpusDecoderWebWorker from \"./src/OpusDecoderWebWorker.js\";\nimport { assignNames } from \"@wasm-audio-decoders/common\";\n\nassignNames(OpusDecoder, \"OpusDecoder\");\nassignNames(OpusDecoderWebWorker, \"OpusDecoderWebWorker\");\n\nexport { OpusDecoder, OpusDecoderWebWorker };\n","const t=(t,n=4294967295,e=79764919)=>{const r=new Int32Array(256);let o,s,i,c=n;for(o=0;o<256;o++){for(i=o<<24,s=8;s>0;--s)i=2147483648&i?i<<1^e:i<<1;r[o]=i}for(o=0;o>24^t[o])];return c},n=t=>{const n=[];for(const e of t){let t=(e+42)%256;0===t||10===t||13===t||61===t?n.push(\"=\"+String.fromCharCode((t+64)%256)):n.push(String.fromCharCode(t))}return n.join(\"\")},e=(n,e=t)=>{const r=t=>new Uint8Array(t.length/2).map(((n,e)=>parseInt(t.substring(2*e,2*(e+1)),16))),o=t=>r(t)[0],s=new Map;[,8364,,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,,381,,,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,,382,376].forEach(((t,n)=>s.set(t,n)));const i=new Uint8Array(n.length);let c,a,l,f=!1,g=0,h=42,p=n.length>13&&\"dynEncode\"===n.substring(0,9),u=0;p&&(u=11,a=o(n.substring(9,u)),a<=1&&(u+=2,h=o(n.substring(11,u))),1===a&&(u+=8,l=(t=>new DataView(r(t).buffer).getInt32(0,!0))(n.substring(13,u))));const d=256-h;for(let t=u;t255){const t=s.get(c);t&&(c=t+127)}f&&(f=!1,c-=64),i[g++]=c0?c+d:c-h}else f=!0;const m=i.subarray(0,g);if(p&&1===a){const t=e(m);if(t!==l){const n=\"Decode failed crc32 validation\";throw console.error(\"`simple-yenc`\\n\",n+\"\\n\",\"Expected: \"+l+\"; Got: \"+t+\"\\n\",\"Visit https://github.com/eshaz/simple-yenc for more information\"),Error(n)}}return m},r=(n,e='\"',r=t,o)=>{const s=(t,n)=>(t%n+n)%n,i=(t,n)=>n.push(String.fromCharCode(61,(t+64)%256)),c=t=>t.map((t=>t.toString(16).padStart(2,\"0\")));let a,l,f=[],g=1/0,h=Array(256).fill(0);if('\"'===e?(l=[0,8,9,10,11,12,13,34,92,61],a=t=>0===t||8===t||9===t||10===t||11===t||12===t||13===t||34===t||92===t||61===t):\"'\"===e?(l=[0,8,9,10,11,12,13,39,92,61],a=t=>0===t||8===t||9===t||10===t||11===t||12===t||13===t||39===t||92===t||61===t):\"`\"===e&&(l=[13,61,96],f=[7,205,231],a=(t,n)=>13===t||36===t&&123===n||61===t||92===t&&(85===n||117===n)||96===t),void 0===o){o=0;for(let t=0;t{const n=new Uint8Array(4);return new DataView(n.buffer).setInt32(0,t,!0),[...n]})(r(n)))];for(let t=0;tt.replace(/[\\\\]/g,\"\\\\\\\\\").replace(/[`]/g,\"\\\\`\").replace(/\\${/g,\"\\\\${\");export{t as crc32,e as decode,r as dynamicEncode,n as encode,o as stringify};\n"],"names":["module","exports","Worker","EmscriptenWASM","WASMAudioDecoderCommon","HEAPU8","wasmMemory","ready","base64ReverseLookup","Uint8Array","i","wasm","Object","defineProperty","get","String","raw","_opus_frame_decoder_create","_malloc","_opus_frame_decode_float_deinterleaved","_opus_frame_decoder_destroy","_free","imports","b","x","Math","cos","a","exp","c","dest","src","num","copyWithin","d","requestedSize","length","what","abort","this","setModule","data","getModule","instantiate","then","WebAssembly","instance","wasmExports","buffer","Int8Array","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","initRuntime","Promise","resolve","HEAP","malloc","free","opus_frame_decoder_create","opus_frame_decode_float_deinterleaved","opus_frame_decoder_destroy","OpusDecoder","options","errors","defineProperties","value","Map","_init","_WASMAudioDecoderCommon","_EmscriptenWASM","_module","common","_common","_inputBytes","_outputSamples","_frameNumber","_input","allocateTypedArray","_inputSize","_output","_outputChannels","_outputChannelSize","mapping","_channels","buf","set","_channelMappingTable","_decoder","_sampleRate","_streamCount","_coupledStreamCount","ptr","_preSkip","_forceStereo","enumerable","_ready","reset","_decode","opusFrame","Error","error","samplesDecoded","console","outputBuffer","getOutputChannels","decodeFrame","decoded","addError","getDecodedAudioMultiChannel","decodeFrames","opusFrames","outputBuffers","push","_isWebWorker","isWebWorker","isNumber","param","sampleRate","channels","streamCount","coupledStreamCount","channelMappingTable","preSkip","forceStereo","Array","isArray","includes","OpusDecoderWebWorker","WASMAudioDecoderWorker","constructor","super","postToDecoder","t","n","e","r","o","s","map","parseInt","substring","forEach","l","f","g","h","p","u","DataView","getInt32","charCodeAt","m","subarray"],"sourceRoot":""} \ No newline at end of file diff --git a/lib/icecast-metadata-player-1.17.3.synaudio.min.js b/lib/icecast-metadata-player-1.17.3.synaudio.min.js new file mode 100644 index 0000000..48048ec --- /dev/null +++ b/lib/icecast-metadata-player-1.17.3.synaudio.min.js @@ -0,0 +1,22 @@ + +/*! + * Copyright 2021-2023 Ethan Halsall + * https://github.com/eshaz/icecast-metadata-js + * + * This file is part of icecast-metadata-player. + * + * icecast-metadata-player free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * icecast-metadata-player distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see + */ +(self.webpackChunkIcecastMetadataPlayer=self.webpackChunkIcecastMetadataPlayer||[]).push([[731],{469:e=>{e.exports=Worker},178:(e,g,f)=>{"use strict";f.d(g,{D4:()=>b});const r=(e,g=4294967295,f=79764919)=>{const r=new Int32Array(256);let b,t,i,s=g;for(b=0;b<256;b++){for(i=b<<24,t=8;t>0;--t)i=2147483648&i?i<<1^f:i<<1;r[b]=i}for(b=0;b>24^e[b])];return s},b=(e,g=r)=>{const f=e=>new Uint8Array(e.length/2).map(((g,f)=>parseInt(e.substring(2*f,2*(f+1)),16))),b=e=>f(e)[0],t=new Map;[,8364,,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,,381,,,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,,382,376].forEach(((e,g)=>t.set(e,g)));const i=new Uint8Array(e.length);let s,p,o,h=!1,q=0,n=42,O=e.length>13&&"dynEncode"===e.substring(0,9),c=0;O&&(c=11,p=b(e.substring(9,c)),p<=1&&(c+=2,n=b(e.substring(11,c))),1===p&&(c+=8,o=(e=>new DataView(f(e).buffer).getInt32(0,!0))(e.substring(13,c))));const u=256-n;for(let g=c;g255){const e=t.get(s);e&&(s=e+127)}h&&(h=!1,s-=64),i[q++]=s0?s+u:s-n}else h=!0;const x=i.subarray(0,q);if(O&&1===p){const e=g(x);if(e!==o){const g="Decode failed crc32 validation";throw console.error("`simple-yenc`\n",g+"\n","Expected: "+o+"; Got: "+e+"\n","Visit https://github.com/eshaz/simple-yenc for more information"),Error(g)}}return x}},875:(e,g,f)=>{"use strict";f.r(g),f.d(g,{default:()=>o});var r=f(178),b=f(469);const t=new WeakMap,i=String.raw`dynEncode01658cce3922eÆØÒfeeefsfÅoääääääääääegtfhÊÓÛkÒÊÒÔ×Þgeghgfekmfäe¦åíipl€gnÈÔ××ÊÑÆÙÊeepÄÄÍÊÆÕÄÇÆØÊheoŒfŒivälànâiá©eeeeeeee†“g¥g¥…g¦g­re…g¦fІ|…f¦v³i¥…f¦uІz¦e…fІ}…e…f¦gهxφ~…e¦¥Ð‡u†th¥…f…f…wчvφ{…t†p…u†o¦e†qh¥…e…q‡g¦gÙχq…qbeee…e…g…vϦgÙÏbeeebIfbpee…e…g¦iׇq¦gÙχr…rbeee…e…q…vϦgÙÏbeeebIfbpee…e…g¦mׇq¦gÙχr…rbeee…e…q…vϦgÙÏbeeebIfbpee…e…g¦qׇq¦gÙχr…rbeee…e…q…vϦgÙÏbeeebIfbpee…p‡r¦¥Ð†p…o‡s¦¥Ð†o…g¦uχq…z­repg¥…f…q±reg¥…f…qЇo¦i®re…e…q…vϦgÙυ~®iä…e…q¦gÙυe…{¦gÙÏ®j¦epre…o¦áև{¦iЇp¦gÛ¦fϦfֆg¥…pªi¥¦e†gqfp…z…gЦáÖ¦iЦgÛ¦fϦcdddlֆp¦e†gh¥…s…rbege…sbegebIfbpge…s…rbegu…sbegubIfbpgu…r¦…φr…s¦…φs…g¦mφg…p¦gЇprepp…i¥…e…g…qχg¦gÙχp…e…g…vϦgÙÏbege…pbegebIfbpgep…o…{«rf…f…q…{χqІop…q¦ä؆g…o¦fÖiä…e…q¦gÙχo…e…q…vϦgÙϏge…oge÷ge…q¦fÏj…qp†q…g…}«re…f…qІp…y…q¦gهoφr…e†gh¥…g…oχq…g…rχsge…qge÷ge…q…sgi…qgi÷gi…g¦mφg…p¦gЇprepp…x…yφy…t…xφt…w¦fχw…|¬repqfp…f¦e±re¦e…fІt…f¦fֆu…e…f¦gهvφw…f¦i®†y…f¦áևo¦q«†zh¥…f…rцs¦e†gg¥g¥…yre…e…e…f…sϦgÙÏ®…w…e…s¦gÙχq°Öre…e…qbege…ebegebIfbpgeg¥…o¦i«re…e…qbegu…ebegubIfbpgu…o¦m«re…e…qbeg……ebeg…bIfbpg……zre…e…qbeg•…ebeg•bIfbpg•p…f…o‡g«rfp…g¦ä؆q…uiä…e…g¦gÙχx…e…g…sϦgÙϏge…xge÷ge…g¦f×j…gp†g…q…t«re…f…gІq…p…g¦gهxφ{…e†gh¥…g…xχs…g…{χ}ge…sge÷ge…s…}gi…sgi÷gi…g¦mφg…q¦gЇqrepp…p…vφp…r¦fχr…|¬reppg¥…j¦g­re…j¦fІv…i¦v³i¥…i¦uІ|¦e†y¦e…iІ{…h…i¦gهzφ}…h¦¥Ð‡j†t¦e†wh¥…i…i…wчuφx…t†p…j†o¦e†qh¥…h…q‡g¦gÙχq…qbeee…h…g…uϦgÙÏbeeebIfbpee…h…g¦iׇq¦gÙχr…rbeee…h…q…uϦgÙÏbeeebIfbpee…h…g¦mׇq¦gÙχr…rbeee…h…q…uϦgÙÏbeeebIfbpee…h…g¦qׇq¦gÙχr…rbeee…h…q…uϦgÙÏbeeebIfbpee…p‡r¦¥Ð†p…o‡s¦¥Ð†o…g¦uχq…|­repg¥…i…q±reg¥…i…qЇo¦i®re…h…q…uϦgÙυ}®iä…h…q¦gÙυh…x¦gÙÏ®j¦epre…o¦áևx¦iЇp¦gÛ¦fϦfֆ~g¥…pªi¥¦e†gqfp…|…gЦáÖ¦iЦgÛ¦fϦcdddlֆp¦e†gh¥…s…rbege…sbegebIfbpge…s…rbegu…sbegubIfbpgu…r¦…φr…s¦…φs…g¦mφg…p¦gЇprepp…~i¥…h…g…qχg¦gÙχp…h…g…uϦgÙÏbege…pbegebIfbpgep…o…x«rf…i…q…xχqІop…q¦ä؆g…o¦fÖiä…h…q¦gÙχo…h…q…uϦgÙϏge…oge÷ge…q¦fÏj…qp†q…g…{«re…i…qІp…y…q¦gهoφr…h†gh¥…g…oχq…g…rχsge…qge÷ge…q…sgi…qgi÷gi…g¦mφg…p¦gЇprepp…y…zφy…t…zφt…w¦fχw…v¬repqfp…i¦e±re¦e†p¦e…iІs…i¦fֆt…h…i¦gهuφw…i¦i®†y…i¦áևj¦q«†|¦e†rh¥…i…rцo¦e†gg¥g¥…yre…h…h…i…oϦgÙÏ®…w…h…o¦gÙχq°Öre…h…qbege…hbegebIfbpgeg¥…j¦i«re…h…qbegu…hbegubIfbpgu…j¦m«re…h…qbeg……hbeg…bIfbpg……|re…h…qbeg•…hbeg•bIfbpg•p…j‡g…i«rfp…g¦ä؆q…tiä…h…g¦gÙχz…h…g…oϦgÙϏge…zge÷ge…g¦f×j…gp†g…q…s«re…i…gІq…p…g¦gهzφx…h†gh¥…g…zχo…g…xχ{ge…oge÷ge…o…{gi…ogi÷gi…g¦mφg…q¦gЇqrepp…p…uφp…r¦fχr…v¬repp¦e†i…n¦e›ge…m¦e›geg¥…k¦e¯i¥…k¦hֆjg¥…k¦fЇi¦h®i¥¦e†oqfp…e†g…k¦áևo†qh¥……gge …ggi …ggm …ggq †…g¦uφg…q¦iЇqrepp…ji¥…e…o¦gÙφg…j†qh¥……gge †…g¦iφg…q¦fЇqreppg¥…i¦h®i¥¦e†oqfp…h†g…k¦áևo†qh¥…‘…gge …ggi …ggm …ggq †‘…g¦uφg…q¦iЇqrepp…ji¥…h…o¦gÙφgh¥…‘…gge †‘…g¦iφg…j¦fЇjrepp…k¦uІs…‘…k‡‘†‡…k¦v­i¥¦e†i¦e†qqgp…‡bx†¦e†j…h†gh¥…€…gbeee…bJf‡€…€bKfbIf…gbeeu…bJf‡€…€bKfbIf…gbee……bJf‡€…€bKfbIf…gbee•…bJf‡€…€bKfbIf†€…g¦¥Ð†g…j¦uχj…s­rep…i¦Õֆq¦f†iqfp…k¦uІs…“…k‡‘†‡¦e†qp…€b„h…€b„g…€b„e…€b„f÷÷÷†ˆg¥…k…q±re…q¦ä؅kφp…k¦hևoiä…h…q¦gÙφg…o†jh¥…gge…‡ø‡‰…‰ù…ˆ÷†ˆ…g¦iφg…j¦fЇjrep…o…q×j…qp†q…p¦h®re…k…qІj…h…q¦gÙφgh¥…ggq…‡ø‡‰…‰ù…ggm…‡ø‡‰…‰ù…ggi…‡ø‡‰…‰ù…gge…‡ø‡‰…‰ù…ˆ÷÷÷÷†ˆ…g¦uφg…j¦iЇjrepp¦e†j…ii¥…‡bx†€…h†gh¥…g…gbeee…€bJfbpee…g…gbeeu…€bJfbpeu…g…gbee……€bJfbpe……g…gbee•…€bJfbpe•…g¦¥Ð†g…j¦uχj…s­repp…ˆ…k¨eeå$÷‡‰ú†ˆ…f…kІtg¥…j…k³re…k…k…jЇf¦h°iä…f¦áևr¦iЇg¦gÛ¦fχo¦hֆq…‡bx†€¦e†p…g¦q´i¥…o¦adddlֆo…h…j¦gÙφgh¥…g…gbege…€bJfbpge…g…gbegu…€bJfbpgu…g…gbeg……€bJfbpg……g…gbeg•…€bJfbpg•…g¦¥Ð†g…p¦uφp…o¦iЇorepp…qi¥…h…j…pϦgÙφgh¥…g…gbege…€bJfbpge…g¦uφg…q¦fЇqrepp…f…r«rf…j…rÏj…jp‡jІq…h…j¦gÙφgh¥…g…gge…‡øge…g¦iφg…q¦fЇqrepp…ˆö†‹…t¦e¯i¥…l¦gنu¦e†r¦e…kІv…k¦fֆw…k¦fЦÕֆq…‹ †’…e†oh¥…e…r¦gÙχyge†Ž…e…k…rϦgÙφ|……‘†Šgä…iªi¥bqeeeeeeeeeeeeeeee†€bqeeeeeeeeeeeeeeee†¦eqfp…Šbx†‚¦e†g¦e†pbqeeeeeeeeeeeeeeee†bqeeeeeeeeeeeeeeee†€h¥……g…oχfbeee…‚bJf‡ƒ…g…hχjbeeebKfbIf…fbeeu…‚bJf‡„…jbeeubKfbIf…fbee……‚bJf‡……jbee…bKfbIf…fbee•…‚bJf‡†…jbee•bKfbIf†…€…ƒ…ƒbKfbIf…„…„bKfbIf…………bKfbIf…†…†bKfbIf†€…g¦¥Ð†g…p¦uχp…s­rep…qp†f…|ge†…€b„h…€b„g…€b„e…€b„f÷÷÷†‡…b„h…b„g…b„e…b„f÷÷÷†ˆg¥…f…k³re…f¦ä؆g…wiä…y…f¦gهjϏge…Šø‡Œ…h…jϏgeù…ˆ÷†ˆ…Œ…Œù…‡÷†‡…f¦f×j…fp†f…g…v«re…f¦gنg…k…fІjh¥…g…oχfgi…Šø‡Œ…g…hχpgiù…fge…Šø‡…pgeù…ˆ÷÷†ˆ…Œ…Œù……ù…‡÷÷†‡…g¦mφg…j¦gЇjrepp…ˆ…‰ú …‡…‰ú …’‡‡…mgeÃi¥…n…r›ge…m…‡gep……Ž … †…o…uφo…l…rχr…t­reppg¥…l¦f±re…nge‡f…l…lчgχj…t…j…t­€†t¦e†p…f…gЇf¦e…f¦e¯€†rg¥…k¦e±i¥…“†qfp…k¦hֆjg¥…k¦fЦh®i¥…“†qfp…e…r¦gÙφg…“†…k¦áևp†qh¥……gge …ggi …ggm …ggq †…g¦uφg…q¦iЇqrepp…jªre…e…p…rϦgÙφgh¥……gge †…g¦iφg…j¦fЇjrepp…r…t³re¦e…kІp…k¦fֆu…e…r¦gÙφo…k¦fЦÕֆl…‹ †’h¥…e…r¦gÙχvge†…e…k…rϦgÙφw……‘†Šgä…iªi¥bqeeeeeeeeeeeeeeee†€bqeeeeeeeeeeeeeeee†¦eqfp…Šbx†‚¦e†q…o†g…h†jbqeeeeeeeeeeeeeeee†bqeeeeeeeeeeeeeeee†€h¥……gbeee…‚bJf‡ƒ…jbeeebKfbIf…gbeeu…‚bJf‡„…jbeeubKfbIf…gbee……‚bJf‡……jbee…bKfbIf…gbee•…‚bJf‡†…jbee•bKfbIf†…€…ƒ…ƒbKfbIf…„…„bKfbIf…………bKfbIf…†…†bKfbIf†€…g¦¥Ð†g…j¦¥Ð†j…q¦uχq…s­rep…lp†f…wge†Ž…€b„h…€b„g…€b„e…€b„f÷÷÷†‡…b„h…b„g…b„e…b„f÷÷÷†ˆg¥…f…k³re…f¦ä؆g…uiä…v…f¦gهjϏge…Šø‡‹…h…jϏgeù…ˆ÷†ˆ…‹…‹ù…‡÷†‡…f¦f×j…fp†f…g…p«re…f¦gنg…k…fІjh¥…g…oχfgi…Šø‡‹…g…hχqgiù…fge…Šø‡Œ…qgeù…ˆ÷÷†ˆ…‹…‹ù…Œ…Œù…‡÷÷†‡…g¦mφg…j¦gЇjrepp…ˆ…‰ú …‡…‰ú …’‡‡…mgeÃi¥…n…r›ge…m…‡gep…… …Ž †…o¦iφo…r¦fχr…t¬reppppetÙÆ×ÌÊÙÄËÊÆÙÚ×ÊØflØÎÒɖ—`,s=String.raw`dynEncode010e15d7b662o{+nn‹‹‹ns|„{s{}€‡OŽ–)q}€€szo‚smmvso~mpos  ڍ‹N.OV.Oy/.O\N.Oy/.O‚/.O/N./O/N...x08.8 F..8.8 F..8.8 F..8.8 F.Ox/.Ox/.Ox/..VN..Oy0Z....x8.8 F../..T..y/..O‚0x/./N..x0..x08.8 F..8.8 F.Ox/.Oy0..x/..Ox0U.OZ.O‚/.8/.OT/.OT/./N..8. 0FN...8.8 F.OT..8.8 F...8.8 F..x/.Oy0‘‹N.0OVO.Oy/N..x08.¡0..x08¢.8.¡0.8¢.8.¡0.8¢.8.¡0.8¢.    /..¢..¢..¢..¢.    /.Ox/.Ox0.V.OyOŠ0.\.O/.O..O‚0x8.¡0..x8¢. /..¢. /.O€./O.y.T..y/..O‚0x/..x/N.8.¡0.¢.8.¡0.¢.  /..8¢..8¢.  /.Ox/.Ox/.Oy0..ÀQŽÍ 0£É..£É­.É°±Äʍ‹ŠR/$N.......OD.ODN.OXN.O/.Oy0O]N./.OŠ0/N. .8É®.8É®.8É®.8É®/ .Ox/.Oy0.N.O‚.x/./N. .8É®/ .Ox/.Oy0N.OWNO/./.OŠ0/N.!.8É®.8É®.8É®.8É®/!.Ox/.Oy0.N.O‚.x/N.!.8É®/!.Ox/.Oy0.Oy/.À/.OVNO/O/.!Ä.£/O/./N.8.¡0.¢.8.¡0.¢.8.¡0.¢.8.¡0.¢.    /.Ox/.Ox0.V.OŠ/O/.Oy/.À/O/.!.Å0!±Ä/N..\..Ox/.O0.O‚.x/./N.8.¡0.¢. /.Ox/.Oy0..€./.OW..y/.O‚.x/N.8.¡0.¢.8.¡0.¢.8.¡0.¢.8.¡0.¢.    /.Ox/.Oy0O/.N./N..8.¡F..8.¡F..8.¡F..8.¡F.Ox/.Ox0.V..QŽÍ £/..y/N..\..Ox/..yO0N.O‚.x/N..8.¡F.Ox/.Ox/.Oy0.OW..y/.O‚.x/N..8.¡F..8.¡F..8.¡F..8.¡F.Ox/.Oy0.Ÿ/N.OZNO/.O‚/.O‚/O/./O/N. .8ɯ/"..x8É/#.8/... .!±Ä..0.l..D..F../.".#®/ ..x/..x0.VN.OZ...z0x0...V)/O/..y0O.OX)/N.OZN.$/ .O/N.OyOWN.$/ .O‚.x/.$/ .OŠ0/N. .8É®.8É®.8É®.8É®/ .Ox/.Oy0.S..xO‚.x/N. .8É®/ .Ox/.Oy0..\.O‚.x/..xO‚.x/N. .8ɯ/".8É/#.8/... .!±Ä..0.lN..D..F.".#®/ .Ox/.Ox/.Ox0.U`;class p{constructor(e={}){this.t=e.correlationSampleSize>0?e.correlationSampleSize:11025,this.i=e.initialGranularity>0?e.initialGranularity:16,this.p=e.correlationThreshold>=0?e.correlationThreshold:.5,this.o=t.get(p),this.o||(this.o=(async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11])))().then((e=>e?WebAssembly.compile((0,r.D4)(i)):WebAssembly.compile((0,r.D4)(s)))),t.set(this.o)),this.SynAudioWorker=function e(g,f,r){this.h=new Map,this.q=(e,g)=>Math.min(e.samplesDecoded,g.samplesDecoded,this.t),this.O=(e,g)=>Math.min(e.samplesDecoded,g.samplesDecoded,this.i),this.u=(e,g,f)=>{const r=g.BYTES_PER_ELEMENT;let b=f/r;for(let t=0;t{let r=this.h.get(g);if(!r){let f,b="text/javascript",t=`'use strict';(${((e,g,f,r)=>{self.onmessage=b=>{new e(Promise.resolve(b.data.module),f,r).l.get(g).apply(null,b.data.params).then((e=>{self.postMessage(e)}))}}).toString()})(${e.toString()}, "${g}", ${this.t}, ${this.i})`;try{f=void 0!==process.versions.node}catch{}r=f?`data:${b};base64,${Buffer.from(t).toString("base64")}`:URL.createObjectURL(new Blob([t],{type:b})),this.h.set(g,r)}const t=new(globalThis.Worker||b)(r,{name:"SynAudio"}),i=new Promise((e=>{t.onmessage=g=>{t.terminate(),e(g.data)}}));return this.o.then((e=>{t.postMessage({module:e,params:f})})),i},this.m=(e,g)=>{const f=Float32Array.BYTES_PER_ELEMENT,r=this.q(e,g),b=this.O(e,g),t=new WebAssembly.Memory({initial:(e.samplesDecoded*e.channelData.length+g.samplesDecoded*g.channelData.length)*f/65536+4});return this.o.then((e=>WebAssembly.instantiate(e,{env:{memory:t}}))).then((({exports:i})=>{const s=new Map(Object.entries(i)),p=s.get("correlate"),o=new Float32Array(t.buffer),h=new DataView(t.buffer),q=s.get("__heap_base").value,n=this.u(e.channelData,o,q),O=this.u(g.channelData,o,n),c=O+f;p(q,e.samplesDecoded,e.channelData.length,n,g.samplesDecoded,g.channelData.length,r,b,O,c);return{correlation:h.getFloat32(O,!0),sampleOffset:h.getInt32(c,!0)}}))},this.N=(e,g,f)=>{const r=[],b=[0],t=this.q(e,g),i=Math.log(e.samplesDecoded*t)/Math.log(this.i+1)*Math.log(t/1e4+1);f=Math.max(Math.round(Math.min(f,i,e.samplesDecoded/t/4)),1);const s=Math.ceil(e.samplesDecoded/f);let p=0;for(let i=0;i{let g=0,f=-1;for(let r=0;rf&&(g=r,f=e[r].correlation);return{correlation:e[g].correlation,sampleOffset:e[g].sampleOffset+b[g]}}))},this.I=(e,g)=>this.j("_sync",[e,g]),this.k=(e,g,f)=>globalThis.Worker?this.j("_syncWorkerConcurrent",[e,g,f]):this.N(e,g,f),this.l=new Map([["_sync",this.m],["_syncWorker",this.I],["_syncWorkerConcurrent",this.N]]),this.o=g,this.t=f,this.i=r},this.v=new this.SynAudioWorker(this.o,this.t,this.i)}async syncWorkerConcurrent(e,g,f){return this.v.k(e,g,f>=1?f:1)}async syncWorker(e,g){return this.v.I(e,g)}async sync(e,g){return this.v.m(e,g)}async syncMultiple(e,g){g=g>=1?g:8;const f=[],r=[];let b=()=>{},t=Promise.resolve(),i=0;for(let g=0;g{e.correlation>this.p&&o.edges.add({parent:o,vertex:n.vertex,samplesDecoded:q.data.samplesDecoded,...e}),i--,b()}))),i>=g&&(t=new Promise((e=>{b=e})),await t)}}await Promise.all(f);const s=(e,g)=>e.parent&&g.parent&&e.parent.samplesDecoded!==g.parent.samplesDecoded?e.parent.samplesDecoded>g.parent.samplesDecoded:e.correlation!==g.correlation?e.correlation>g.correlation:e.sampleOffset!==g.sampleOffset?e.sampleOffset>g.sampleOffset:e.vertex&&g.vertex&&e.vertex.name.localeCompare(g.vertex.name)<0,p=new Map,o=new Set,h=e=>{for(const g of e.edges.values()){if(p.has(e))return p.get(e);p.set(e,g);const f=h(g.vertex),r=g;if(f){let e,g;s(f,r)?(e=f,g=r):(e=r,g=f),g.cycleWith||(g.cycleWith=new Set,o.add(g)),g.cycleWith.add(e),e.cycleWith&&e.cycleWith.delete(g)}p.delete(e)}};for(const{vertex:e}of r)h(e);for(const e of o)e.cycleWith.size&&e.parent.edges.delete(e);const q=new Set;for(const e of r)q.add(e.vertex);for(const e of r)for(const g of e.vertex.edges)q.delete(g.vertex);const n=(e,g,f,r=0)=>{for(const b of f)e.has(b.vertex)&&s(e.get(b.vertex),b)||e.set(b.vertex,{name:b.vertex.name,correlation:b.correlation,sampleOffset:r+b.sampleOffset}),n(e,g,b.vertex.edges,r+b.sampleOffset)},O=[];for(const e of q){const g=new Map;g.set(e,{name:e.name,sampleOffset:0}),n(g,e,e.edges),O.push([...g.values()].sort(((e,g)=>e.sampleOffset-g.sampleOffset||(e.correlation||0)-(g.correlation||0)||g.name.localeCompare(e.name))))}return O}}const o=p}}]); +//# sourceMappingURL=icecast-metadata-player-1.17.3.synaudio.min.js.map \ No newline at end of file diff --git a/lib/icecast-metadata-player-1.17.3.synaudio.min.js.map b/lib/icecast-metadata-player-1.17.3.synaudio.min.js.map new file mode 100644 index 0000000..4a51147 --- /dev/null +++ b/lib/icecast-metadata-player-1.17.3.synaudio.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"icecast-metadata-player-1.17.3.synaudio.min.js","mappings":"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","sources":["webpack://IcecastMetadataPlayer/./node_modules/synaudio/node_modules/@eshaz/web-worker/cjs/browser.js","webpack://IcecastMetadataPlayer/./node_modules/simple-yenc/dist/esm.js","webpack://IcecastMetadataPlayer/./node_modules/synaudio/src/SynAudio.js","webpack://IcecastMetadataPlayer/./node_modules/synaudio/index.js"],"sourcesContent":["/**\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nmodule.exports = Worker;","const t=(t,n=4294967295,e=79764919)=>{const r=new Int32Array(256);let o,s,i,c=n;for(o=0;o<256;o++){for(i=o<<24,s=8;s>0;--s)i=2147483648&i?i<<1^e:i<<1;r[o]=i}for(o=0;o>24^t[o])];return c},n=t=>{const n=[];for(const e of t){let t=(e+42)%256;0===t||10===t||13===t||61===t?n.push(\"=\"+String.fromCharCode((t+64)%256)):n.push(String.fromCharCode(t))}return n.join(\"\")},e=(n,e=t)=>{const r=t=>new Uint8Array(t.length/2).map(((n,e)=>parseInt(t.substring(2*e,2*(e+1)),16))),o=t=>r(t)[0],s=new Map;[,8364,,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,,381,,,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,,382,376].forEach(((t,n)=>s.set(t,n)));const i=new Uint8Array(n.length);let c,a,l,f=!1,g=0,h=42,p=n.length>13&&\"dynEncode\"===n.substring(0,9),u=0;p&&(u=11,a=o(n.substring(9,u)),a<=1&&(u+=2,h=o(n.substring(11,u))),1===a&&(u+=8,l=(t=>new DataView(r(t).buffer).getInt32(0,!0))(n.substring(13,u))));const d=256-h;for(let t=u;t255){const t=s.get(c);t&&(c=t+127)}f&&(f=!1,c-=64),i[g++]=c0?c+d:c-h}else f=!0;const m=i.subarray(0,g);if(p&&1===a){const t=e(m);if(t!==l){const n=\"Decode failed crc32 validation\";throw console.error(\"`simple-yenc`\\n\",n+\"\\n\",\"Expected: \"+l+\"; Got: \"+t+\"\\n\",\"Visit https://github.com/eshaz/simple-yenc for more information\"),Error(n)}}return m},r=(n,e='\"',r=t,o)=>{const s=(t,n)=>(t%n+n)%n,i=(t,n)=>n.push(String.fromCharCode(61,(t+64)%256)),c=t=>t.map((t=>t.toString(16).padStart(2,\"0\")));let a,l,f=[],g=1/0,h=Array(256).fill(0);if('\"'===e?(l=[0,8,9,10,11,12,13,34,92,61],a=t=>0===t||8===t||9===t||10===t||11===t||12===t||13===t||34===t||92===t||61===t):\"'\"===e?(l=[0,8,9,10,11,12,13,39,92,61],a=t=>0===t||8===t||9===t||10===t||11===t||12===t||13===t||39===t||92===t||61===t):\"`\"===e&&(l=[13,61,96],f=[7,205,231],a=(t,n)=>13===t||36===t&&123===n||61===t||92===t&&(85===n||117===n)||96===t),void 0===o){o=0;for(let t=0;t{const n=new Uint8Array(4);return new DataView(n.buffer).setInt32(0,t,!0),[...n]})(r(n)))];for(let t=0;tt.replace(/[\\\\]/g,\"\\\\\\\\\").replace(/[`]/g,\"\\\\`\").replace(/\\${/g,\"\\\\${\");export{t as crc32,e as decode,r as dynamicEncode,n as encode,o as stringify};\n","/* Copyright 2022-2023 Ethan Halsall\n \n This file is part of synaudio.\n \n synaudio is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n synaudio is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see \n*/\n\nimport { decode } from \"simple-yenc\";\nimport Worker from \"@eshaz/web-worker\";\n\n// prettier-ignore\nconst simd=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]))\n\nconst wasmModule = new WeakMap();\n\n/* WASM strings are embeded during the build */\nconst simdWasm = String.raw`dynEncode01658cce3922eÆØÒfeeefsfÅoääääääääääegtfhÊÓÛkÒÊÒÔ×Þgeghgfekmfäe¦åíipl€gnÈÔ××ÊÑÆÙÊeepÄÄÍÊÆÕÄÇÆØÊheo\u0016Œf\u0013Œivälànâiá©eeeeeeee†“g¥g¥…g¦g­re…g¦fІ|…f¦v³i¥…f¦uІz¦e…fІ}…e…f¦gهxφ~…e¦¥Ð‡u†th¥…f…f…wчvφ{…t†p…u†o¦e†qh¥…e…q‡g¦gÙχq…qbeee…e…g…vϦgÙÏbeeebIfbpee…e…g¦iׇq¦gÙχr…rbeee…e…q…vϦgÙÏbeeebIfbpee…e…g¦mׇq¦gÙχr…rbeee…e…q…vϦgÙÏbeeebIfbpee…e…g¦qׇq¦gÙχr…rbeee…e…q…vϦgÙÏbeeebIfbpee…p‡r¦¥Ð†p…o‡s¦¥Ð†o…g¦uχq…z­repg¥…f…q±reg¥…f…qЇo¦i®re…e…q…vϦgÙυ~®iä…e…q¦gÙυe…{¦gÙÏ®j¦epre…o¦áև{¦iЇp¦gÛ¦fϦfֆg¥…pªi¥¦e†gqfp…z…gЦáÖ¦iЦgÛ¦fϦcdddlֆp¦e†gh¥…s…rbege…sbegebIfbpge…s…rbegu…sbegubIfbpgu…r¦…φr…s¦…φs…g¦mφg…p¦gЇprepp…i¥…e…g…qχg¦gÙχp…e…g…vϦgÙÏbege…pbegebIfbpgep…o…{«rf…f…q…{χqІop…q¦ä؆g…o¦fÖiä…e…q¦gÙχo…e…q…vϦgÙϏge…oge÷ge…q¦fÏj…qp†q…g…}«re…f…qІp…y…q¦gهoφr…e†gh¥…g…oχq…g…rχsge…qge÷ge…q…sgi…qgi÷gi…g¦mφg…p¦gЇprepp…x…yφy…t…xφt…w¦fχw…|¬repqfp…f¦e±re¦e…fІt…f¦fֆu…e…f¦gهvφw…f¦i®†y…f¦áևo¦q«†zh¥…f…rцs¦e†gg¥g¥…yre…e…e…f…sϦgÙÏ®…w…e…s¦gÙχq°Öre…e…qbege…ebegebIfbpgeg¥…o¦i«re…e…qbegu…ebegubIfbpgu…o¦m«re…e…qbeg……ebeg…bIfbpg……zre…e…qbeg•…ebeg•bIfbpg•p…f…o‡g«rfp…g¦ä؆q…uiä…e…g¦gÙχx…e…g…sϦgÙϏge…xge÷ge…g¦f×j…gp†g…q…t«re…f…gІq…p…g¦gهxφ{…e†gh¥…g…xχs…g…{χ}ge…sge÷ge…s…}gi…sgi÷gi…g¦mφg…q¦gЇqrepp…p…vφp…r¦fχr…|¬reppg¥…j¦g­re…j¦fІv…i¦v³i¥…i¦uІ|¦e†y¦e…iІ{…h…i¦gهzφ}…h¦¥Ð‡j†t¦e†wh¥…i…i…wчuφx…t†p…j†o¦e†qh¥…h…q‡g¦gÙχq…qbeee…h…g…uϦgÙÏbeeebIfbpee…h…g¦iׇq¦gÙχr…rbeee…h…q…uϦgÙÏbeeebIfbpee…h…g¦mׇq¦gÙχr…rbeee…h…q…uϦgÙÏbeeebIfbpee…h…g¦qׇq¦gÙχr…rbeee…h…q…uϦgÙÏbeeebIfbpee…p‡r¦¥Ð†p…o‡s¦¥Ð†o…g¦uχq…|­repg¥…i…q±reg¥…i…qЇo¦i®re…h…q…uϦgÙυ}®iä…h…q¦gÙυh…x¦gÙÏ®j¦epre…o¦áևx¦iЇp¦gÛ¦fϦfֆ~g¥…pªi¥¦e†gqfp…|…gЦáÖ¦iЦgÛ¦fϦcdddlֆp¦e†gh¥…s…rbege…sbegebIfbpge…s…rbegu…sbegubIfbpgu…r¦…φr…s¦…φs…g¦mφg…p¦gЇprepp…~i¥…h…g…qχg¦gÙχp…h…g…uϦgÙÏbege…pbegebIfbpgep…o…x«rf…i…q…xχqІop…q¦ä؆g…o¦fÖiä…h…q¦gÙχo…h…q…uϦgÙϏge…oge÷ge…q¦fÏj…qp†q…g…{«re…i…qІp…y…q¦gهoφr…h†gh¥…g…oχq…g…rχsge…qge÷ge…q…sgi…qgi÷gi…g¦mφg…p¦gЇprepp…y…zφy…t…zφt…w¦fχw…v¬repqfp…i¦e±re¦e†p¦e…iІs…i¦fֆt…h…i¦gهuφw…i¦i®†y…i¦áևj¦q«†|¦e†rh¥…i…rцo¦e†gg¥g¥…yre…h…h…i…oϦgÙÏ®…w…h…o¦gÙχq°Öre…h…qbege…hbegebIfbpgeg¥…j¦i«re…h…qbegu…hbegubIfbpgu…j¦m«re…h…qbeg……hbeg…bIfbpg……|re…h…qbeg•…hbeg•bIfbpg•p…j‡g…i«rfp…g¦ä؆q…tiä…h…g¦gÙχz…h…g…oϦgÙϏge…zge÷ge…g¦f×j…gp†g…q…s«re…i…gІq…p…g¦gهzφx…h†gh¥…g…zχo…g…xχ{ge…oge÷ge…o…{gi…ogi÷gi…g¦mφg…q¦gЇqrepp…p…uφp…r¦fχr…v¬repp¦e†i…n¦e›ge…m¦e›geg¥…k¦e¯i¥…k¦hֆjg¥…k¦fЇi¦h®i¥¦e†oqfp…e†g…k¦áևo†qh¥……gge \u0005…ggi \u0005…ggm \u0005…ggq \u0005†…g¦uφg…q¦iЇqrepp…ji¥…e…o¦gÙφg…j†qh¥……gge \u0005†…g¦iφg…q¦fЇqreppg¥…i¦h®i¥¦e†oqfp…h†g…k¦áևo†qh¥…‘…gge \u0005…ggi \u0005…ggm \u0005…ggq \u0005†‘…g¦uφg…q¦iЇqrepp…ji¥…h…o¦gÙφgh¥…‘…gge \u0005†‘…g¦iφg…j¦fЇjrepp…k¦uІs…‘…k\u001c‡‘\b\u001b†‡…k¦v­i¥¦e†i¦e†qqgp…‡bx†¦e†j…h†gh¥…€…gbeee…bJf‡€…€bKfbIf…gbeeu…bJf‡€…€bKfbIf…gbee……bJf‡€…€bKfbIf…gbee•…bJf‡€…€bKfbIf†€…g¦¥Ð†g…j¦uχj…s­rep…i¦Õֆq¦f†iqfp…k¦uІs…“…k\u001c‡‘\b\u001b†‡¦e†qp…€b„h…€b„g…€b„e…€b„f÷÷÷†ˆg¥…k…q±re…q¦ä؅kφp…k¦hևoiä…h…q¦gÙφg…o†jh¥…gge…‡ø‡‰…‰ù…ˆ÷†ˆ…g¦iφg…j¦fЇjrep…o…q×j…qp†q…p¦h®re…k…qІj…h…q¦gÙφgh¥…ggq…‡ø‡‰…‰ù…ggm…‡ø‡‰…‰ù…ggi…‡ø‡‰…‰ù…gge…‡ø‡‰…‰ù…ˆ÷÷÷÷†ˆ…g¦uφg…j¦iЇjrepp¦e†j…ii¥…‡bx†€…h†gh¥…g…gbeee…€bJfbpee…g…gbeeu…€bJfbpeu…g…gbee……€bJfbpe……g…gbee•…€bJfbpe•…g¦¥Ð†g…j¦uχj…s­repp…ˆ…k\u0017¨eeå$÷‡‰ú†ˆ…f…kІtg¥…j…k³re…k…k…jЇf¦h°iä…f¦áևr¦iЇg¦gÛ¦fχo¦hֆq…‡bx†€¦e†p…g¦q´i¥…o¦adddlֆo…h…j¦gÙφgh¥…g…gbege…€bJfbpge…g…gbegu…€bJfbpgu…g…gbeg……€bJfbpg……g…gbeg•…€bJfbpg•…g¦¥Ð†g…p¦uφp…o¦iЇorepp…qi¥…h…j…pϦgÙφgh¥…g…gbege…€bJfbpge…g¦uφg…q¦fЇqrepp…f…r«rf…j…rÏj…jp‡jІq…h…j¦gÙφgh¥…g…gge…‡øge…g¦iφg…q¦fЇqrepp…ˆö†‹…t¦e¯i¥…l¦gنu¦e†r¦e…kІv…k¦fֆw…k¦fЦÕֆq…‹ †’…e†oh¥…e…r¦gÙχyge†Ž…e…k…rϦgÙφ|……‘\b\u001b†Šgä…iªi¥bqeeeeeeeeeeeeeeee†€bqeeeeeeeeeeeeeeee†¦eqfp…Šbx†‚¦e†g¦e†pbqeeeeeeeeeeeeeeee†bqeeeeeeeeeeeeeeee†€h¥……g…oχfbeee…‚bJf‡ƒ…g…hχjbeeebKfbIf…fbeeu…‚bJf‡„…jbeeubKfbIf…fbee……‚bJf‡……jbee…bKfbIf…fbee•…‚bJf‡†…jbee•bKfbIf†…€…ƒ…ƒbKfbIf…„…„bKfbIf…………bKfbIf…†…†bKfbIf†€…g¦¥Ð†g…p¦uχp…s­rep…qp†f…|ge†…€b„h…€b„g…€b„e…€b„f÷÷÷†‡…b„h…b„g…b„e…b„f÷÷÷†ˆg¥…f…k³re…f¦ä؆g…wiä…y…f¦gهjϏge…Šø‡Œ…h…jϏgeù…ˆ÷†ˆ…Œ…Œù…‡÷†‡…f¦f×j…fp†f…g…v«re…f¦gنg…k…fІjh¥…g…oχfgi…Šø‡Œ…g…hχpgiù…fge…Šø‡…pgeù…ˆ÷÷†ˆ…Œ…Œù……ù…‡÷÷†‡…g¦mφg…j¦gЇjrepp…ˆ…‰ú …‡…‰ú \u0004…’\u0007\b\u001b‡‡…mgeÃi¥…n…r›ge…m…‡gep……Ž \u0006… \u0005†…o…uφo…l…rχr…t­reppg¥…l¦f±re…nge‡f…l…lчgχj…t…j…t­€†t¦e†p…f…gЇf¦e…f¦e¯€†rg¥…k¦e±i¥…“†qfp…k¦hֆjg¥…k¦fЦh®i¥…“†qfp…e…r¦gÙφg…“†…k¦áևp†qh¥……gge \u0005…ggi \u0005…ggm \u0005…ggq \u0005†…g¦uφg…q¦iЇqrepp…jªre…e…p…rϦgÙφgh¥……gge \u0005†…g¦iφg…j¦fЇjrepp…r…t³re¦e…kІp…k¦fֆu…e…r¦gÙφo…k¦fЦÕֆl…‹ †’h¥…e…r¦gÙχvge†…e…k…rϦgÙφw……‘\b\u001b†Šgä…iªi¥bqeeeeeeeeeeeeeeee†€bqeeeeeeeeeeeeeeee†¦eqfp…Šbx†‚¦e†q…o†g…h†jbqeeeeeeeeeeeeeeee†bqeeeeeeeeeeeeeeee†€h¥……gbeee…‚bJf‡ƒ…jbeeebKfbIf…gbeeu…‚bJf‡„…jbeeubKfbIf…gbee……‚bJf‡……jbee…bKfbIf…gbee•…‚bJf‡†…jbee•bKfbIf†…€…ƒ…ƒbKfbIf…„…„bKfbIf…………bKfbIf…†…†bKfbIf†€…g¦¥Ð†g…j¦¥Ð†j…q¦uχq…s­rep…lp†f…wge†Ž…€b„h…€b„g…€b„e…€b„f÷÷÷†‡…b„h…b„g…b„e…b„f÷÷÷†ˆg¥…f…k³re…f¦ä؆g…uiä…v…f¦gهjϏge…Šø‡‹…h…jϏgeù…ˆ÷†ˆ…‹…‹ù…‡÷†‡…f¦f×j…fp†f…g…p«re…f¦gنg…k…fІjh¥…g…oχfgi…Šø‡‹…g…hχqgiù…fge…Šø‡Œ…qgeù…ˆ÷÷†ˆ…‹…‹ù…Œ…Œù…‡÷÷†‡…g¦mφg…j¦gЇjrepp…ˆ…‰ú …‡…‰ú \u0004…’\u0007\b\u001b‡‡…mgeÃi¥…n…r›ge…m…‡gep…… \u0006…Ž \u0005†…o¦iφo…r¦fχr…t¬reppppetÙÆ×ÌÊÙÄËÊÆÙÚ×ÊØflØÎÒɖ—`;\nconst scalarWasm = String.raw`dynEncode010e15d7b662\u000eo{\u000f\u000e\u000e\u000e\u000f+\u0011n\u0011\u000en\u0013‹‹\u000f‹n\u0018\u000e\u0010\u001d\u000f\u0011s|„\u0014{s{}€‡\u0010\u000e\u0010\u0011\u0012\u0011\u000e\u000f\u0010\u0014\u0016\u000f\u000eOŽ–\u0012\u0019\u0015)\u0010\u0017q}€€szo‚s\u000e\u0010\u0019mmvso~mpos\u0011\u000e\u0018  \u0011Ú\u0011\u0010\u0019\u000f‹\u0010N.\u0010O\u0010V\u001b\u000e.\u0010O\u000fy/\u0014.\u000fO\u0013\\\u0012N.\u000fO\u0012y/\u0015.\u000fO\u0010‚/\u0016.\u000fO\u000f/\u0017\u0011N.\u000e/\u0010O\u000f/\u0012\u0011N.\u0010.\u0010.\u0013x0\u00118\u0010\u000e.\u00108\u0010\u000e F\u0010\u000e.\u0010.\u00118\u0010\u0012.\u00108\u0010\u0012 F\u0010\u0012.\u0010.\u00118\u0010\u0016.\u00108\u0010\u0016 F\u0010\u0016.\u0010.\u00118\u0010\u001a.\u00108\u0010\u001a F\u0010\u001a.\u0010O\u001ex/\u0010.\u0012O\u0011x/\u0011.\u0012O\u0012x/\u0012.\u0011.\u0015V\u001b\u000e\u0019\u0010N.\u000f.\u0012O\u000fy0\u0011Z\u001b\u000e.\u0017\u0012.\u0010.\u0010.\u0013x8\u0010\u000e.\u00108\u0010\u000e F\u0010\u000e.\u0012\u0013.\u0011\u0019/\u0010.\u000f.\u0012T\u001b\u000e.\u000f.\u0010y/\u0012.\u0013.\u0010O\u0010‚0\u0018x/\u0019.\u000e/\u0010\u0011N.\u0010.\u0018x0\u0011.\u0010.\u0019x0\u001a8\u0010\u000e.\u00118\u0010\u000e F\u0010\u000e.\u0011.\u001a8\u0010\u0012.\u00118\u0010\u0012 F\u0010\u0012.\u0010O\u0016x/\u0010.\u0012O\u0010y0\u0012\u001b\u000e\u0019\u0019.\u0013.\u0016x/\u0013.\u0014.\u001bO\u000fx0\u001bU\u001b\u000e\u0019\u001a\u000f\u0019.\u000fO\u000eZ\u001b\u000e.\u000fO\u0010‚/\u0012.\u000e8\u0010\u000e/\u001c.\u000fO\u000fT/\u0011.\u000fO\u0011T/\u0013.\u000e/\u0010\u0011N.\u000e.\u00108\u0010\u000e.\u001c 0\u001cF\u0010\u000e\u0010N.\u0011\u001b\u000e.\u000e.\u00108\u0010\u0012.\u000e8\u0010\u0012 F\u0010\u0012.\u000fO\u0010T\u001b\u000e.\u000e.\u00108\u0010\u0016.\u000e8\u0010\u0016 F\u0010\u0016.\u0013\u001b\u000e.\u000e.\u00108\u0010\u001a.\u000e8\u0010\u001a F\u0010\u001a\u0019.\u0010.\u0012x/\u0010.\u0014O\u000fy0\u0014\u001b\u000e\u0019\u0019\u0019‘\u0011\u0010\u0013\u0014‹\u0010N.\u00120\u0013O\u0013V\u0012O\u000e\u0013.\u0013O\u0012y/\u0017\u0011N.\u000e.\u0014x0\u00128\u0010\u001a.\u0010¡0\u0018.\u000f.\u0014x0\u00168\u0010\u001a¢.\u00128\u0010\u0016.\u0010¡0\u001b.\u00168\u0010\u0016¢.\u00128\u0010\u0012.\u0010¡0\u001c.\u00168\u0010\u0012¢.\u00128\u0010\u000e.\u0010¡0\u001d.\u00168\u0010\u000e¢.\u0019    /\u0019.\u0018.\u0018¢.\u001b.\u001b¢.\u001c.\u001c¢.\u001d.\u001d¢.\u001a    /\u001a.\u0014O\u001ex/\u0014.\u0015O\u0012x0\u0015.\u0017V\u001b\u000e\u0019.\u0013O\u000fyOŠ\u00190\u0012.\u0013\\\u001b\u000e.\u0012O/\u0014.\u0013O\u000f\u0012.\u000e.\u0012O\u0010‚0\u0015x8\u0010\u000e.\u0010¡0\u0018.\u000f.\u0015x8\u0010\u000e¢.\u0019 /\u0019.\u0018.\u0018¢.\u001a /\u001a.\u0012O\u000f€\u0013.\u0012\u0019/\u0012O\u000e.\u0013y.\u0014T\u001b\u000e.\u0013.\u0012y/\u0015.\u000e.\u0012O\u0010‚0\u000ex/\u0014.\u000e.\u000fx/\u000e\u0011N.\u00148\u0010\u0012.\u0010¡0\u0018.\u0018¢.\u00148\u0010\u000e.\u0010¡0\u001b.\u001b¢.\u001a  /\u001a.\u0018.\u000e8\u0010\u0012¢.\u001b.\u000e8\u0010\u000e¢.\u0019  /\u0019.\u0014O\u0016x/\u0014.\u000eO\u0016x/\u000e.\u0015O\u0010y0\u0015\u001b\u000e\u0019\u0019.\u0019.\u0013ÀQ\u000e\u000eŽÍ 0\u0010£É.\u001a.\u0010£É­.\u0011É°±Ä\u0019Ê\u0019\u0011\u0012\u0012‹\u0013ŠR\u000e\u000e\u000e\u000e\u000e\u000e\u000e\u000e/$\u0010N.\u000e.\u000f.\u0010\u001e\u000e.\u0011.\u0012.\u0013\u001e\u000e.\u0017O\u000eD\u0010\u000e.\u0016O\u000eD\u0010\u000e\u0010N.\u0014O\u000eX\u0012N.\u0014O\u0011/\u0013.\u0014O\u000fy0\u0018O\u0011]\u0012N.\u000e/\u0012.\u0014OŠ0\u001a/\u0010\u0011N. .\u00128\u0010\u000eÉ®.\u00128\u0010\u0012É®.\u00128\u0010\u0016É®.\u00128\u0010\u001aÉ®/ .\u0012O\u001ex/\u0012.\u0010O\u0012y0\u0010\u001b\u000e\u0019\u0019.\u0013\u0012N.\u001aO\u0010‚.\u000ex/\u0012.\u0013/\u0010\u0011N. .\u00128\u0010\u000eÉ®/ .\u0012O\u0012x/\u0012.\u0010O\u000fy0\u0010\u001b\u000e\u0019\u0019\u0010N.\u0018O\u0011W\u0012NO\u000e/\u001a\u001a\u000f\u0019.\u0011/\u0012.\u0014OŠ0\u001a/\u0010\u0011N.!.\u00128\u0010\u000eÉ®.\u00128\u0010\u0012É®.\u00128\u0010\u0016É®.\u00128\u0010\u001aÉ®/!.\u0012O\u001ex/\u0012.\u0010O\u0012y0\u0010\u001b\u000e\u0019\u0019.\u0013\u0012N.\u001aO\u0010‚.\u0011x/\u0012\u0011N.!.\u00128\u0010\u000eÉ®/!.\u0012O\u0012x/\u0012.\u0013O\u000fy0\u0013\u001b\u000e\u0019\u0019.\u0014O\u0012y/\u001a.\u0014À/\u001f.\u0014O\u0013V\u0012NO\u000e/\u0018O\u000e/\u0010\u001a\u0010\u0019.!Ä.\u001f£/\u001cO\u000e/\u0013.\u0011/\u0012\u0011N.\u00128\u0010\u001a.\u001c¡0\u001d.\u001d¢.\u00128\u0010\u0016.\u001c¡0\u001d.\u001d¢.\u00128\u0010\u0012.\u001c¡0\u001d.\u001d¢.\u00128\u0010\u000e.\u001c¡0\u001d.\u001d¢.\u001e    /\u001e.\u0012O\u001ex/\u0012.\u0013O\u0012x0\u0013.\u001aV\u001b\u000e\u0019.\u0018OŠ/\u0010O\u000f/\u0018\u001a\u000f\u0019.\u0014O\u0012y/\u001a.\u0014À/\u001fO\u000e/\u0010\u0019.!.\u0014Å0!±Ä/\u001c\u0010N.\u0010.\u0014\\\u001b\u000e.\u0014.\u0010Ox/\u001b.\u0014O\u00110\u0019\u0012.\u0010O\u0010‚.\u0011x/\u0012.\u0019/\u0013\u0011N.\u00128\u0010\u000e.\u001c¡0\u001d.\u001d¢.\u001e /\u001e.\u0012O\u0012x/\u0012.\u0013O\u000fy0\u0013\u001b\u000e\u0019.\u0010.\u0019€\u0013.\u0010\u0019/\u0010.\u001bO\u0011W\u001b\u000e.\u0014.\u0010y/\u0013.\u0010O\u0010‚.\u0011x/\u0012\u0011N.\u00128\u0010\u001a.\u001c¡0\u001d.\u001d¢.\u00128\u0010\u0016.\u001c¡0\u001d.\u001d¢.\u00128\u0010\u0012.\u001c¡0\u001d.\u001d¢.\u00128\u0010\u000e.\u001c¡0\u001d.\u001d¢.\u001e    /\u001e.\u0012O\u001ex/\u0012.\u0013O\u0012y0\u0013\u001b\u000e\u0019\u0019O\u000e/\u0013.\u0018\u0012N.\u0011/\u0012\u0011N.\u0012.\u00128\u0010\u000e.\u001c¡F\u0010\u000e.\u0012.\u00128\u0010\u0012.\u001c¡F\u0010\u0012.\u0012.\u00128\u0010\u0016.\u001c¡F\u0010\u0016.\u0012.\u00128\u0010\u001a.\u001c¡F\u0010\u001a.\u0012O\u001ex/\u0012.\u0013O\u0012x0\u0013.\u001aV\u001b\u000e\u0019\u0019.\u001e.\u001fQ\u000e\u000eŽÍ £/\u001e.\u000f.\u0014y/\u0010\u0010N.\u0013.\u0014\\\u001b\u000e.\u0014.\u0013Ox/\u000f.\u0014.\u0013yO\u00110\u001a\u0012N.\u0013O\u0010‚.\u0011x/\u0012\u0011N.\u0012.\u00128\u0010\u000e.\u001c¡F\u0010\u000e.\u0012O\u0012x/\u0012.\u0013O\u000fx/\u0013.\u001aO\u000fy0\u001a\u001b\u000e\u0019\u0019.\u000fO\u0011W\u001b\u000e.\u0014.\u0013y/\u001a.\u0013O\u0010‚.\u0011x/\u0012\u0011N.\u0012.\u00128\u0010\u000e.\u001c¡F\u0010\u000e.\u0012.\u00128\u0010\u0012.\u001c¡F\u0010\u0012.\u0012.\u00128\u0010\u0016.\u001c¡F\u0010\u0016.\u0012.\u00128\u0010\u001a.\u001c¡F\u0010\u001a.\u0012O\u001ex/\u0012.\u001aO\u0012y0\u001a\u001b\u000e\u0019\u0019.\u001eŸ/\u001c\u0010N.\u0010O\u000eZ\u0012NO\u000e/\u0018\u001a\u000f\u0019.\u0015O\u0010‚/\u0019.\u0014O\u0010‚/\u001aO\u000e/\u0018.\u000e/\u0012O\u000e/\u0013\u0011N. .\u00128\u0010\u000eɯ/\".\u0012.\u001ax8\u0010\u000eÉ/#.\u00168\u0010\u000e/\u001e.\u0012.\u0011. .!±Ä.\u001c.\u0014\u001e\u000f0\u001f.\u001el\u0012.\u0017.\u0013D\u0010\u000e.\u0016.\u001fF\u0010\u000e.\u0013\u0013.\u0018\u0019/\u0018.\".#®/ .\u0012.\u0019x/\u0012.\u0013.\u0015x0\u0013.\u0010V\u001b\u000e\u0019\u0019\u0010N.\u0015O\u000fZ\u001b\u000e.\u0018.\u0015.\u0015z0\u0012x0\u000f.\u0010.\u000f.\u0010V)/\u0015O\u000e/\u000f.\u0018.\u0012y0\u0010O\u000e.\u0010O\u000eX)/\u0010\u0010N.\u0014O\u000eZ\u0012N.$/ \u001a\u000f\u0019.\u0014O\u0011/\u0013\u0010N.\u0014O\u000fyO\u0011W\u0012N.$/ \u001a\u000f\u0019.\u0010O\u0010‚.\u000ex/\u0012.$/ .\u0014OŠ0\u000f/\u001a\u0011N. .\u00128\u0010\u000eÉ®.\u00128\u0010\u0012É®.\u00128\u0010\u0016É®.\u00128\u0010\u001aÉ®/ .\u0012O\u001ex/\u0012.\u001aO\u0012y0\u001a\u001b\u000e\u0019\u0019.\u0013S\u001b\u000e.\u000f.\u0010xO\u0010‚.\u000ex/\u0012\u0011N. .\u00128\u0010\u000eÉ®/ .\u0012O\u0012x/\u0012.\u0013O\u000fy0\u0013\u001b\u000e\u0019\u0019.\u0010.\u0015\\\u001b\u000e.\u0010O\u0010‚.\u000ex/\u0012.\u0010.\u0014xO\u0010‚.\u000ex/\u0013\u0011N. .\u00128\u0010\u000eɯ/\".\u00138\u0010\u000eÉ/#.\u00168\u0010\u000e/\u001e.\u0012.\u0011. .!±Ä.\u001c.\u0014\u001e\u000f0\u001f.\u001el\u0012N.\u0017.\u0010D\u0010\u000e.\u0016.\u001fF\u0010\u000e\u0019.\".#®/ .\u0012O\u0012x/\u0012.\u0013O\u0012x/\u0013.\u0010O\u000fx0\u0010.\u0015U\u001b\u000e\u0019\u0019\u0019\u0019`;\n\nexport default class SynAudio {\n constructor(options = {}) {\n this._correlationSampleSize =\n options.correlationSampleSize > 0 ? options.correlationSampleSize : 11025;\n this._initialGranularity =\n options.initialGranularity > 0 ? options.initialGranularity : 16;\n this._correlationThreshold =\n options.correlationThreshold >= 0 ? options.correlationThreshold : 0.5;\n\n this._module = wasmModule.get(SynAudio);\n\n if (!this._module) {\n this._module = simd().then((simdSupported) =>\n simdSupported\n ? WebAssembly.compile(decode(simdWasm))\n : WebAssembly.compile(decode(scalarWasm)),\n );\n wasmModule.set(this._module);\n }\n\n this.SynAudioWorker = function SynAudioWorker(\n module,\n correlationSampleSize,\n initialGranularity,\n ) {\n this._sourceCache = new Map();\n\n // correlation sample size must not exceed the size of each audio clip\n this._getCorrelationSampleSize = (a, b) =>\n Math.min(\n a.samplesDecoded,\n b.samplesDecoded,\n this._correlationSampleSize,\n );\n\n // initial granularity must not exceed the size of each audio clip\n this._getInitialGranularity = (a, b) =>\n Math.min(a.samplesDecoded, b.samplesDecoded, this._initialGranularity);\n\n this._setAudioDataOnHeap = (input, output, heapPos) => {\n const bytesPerElement = output.BYTES_PER_ELEMENT;\n\n let floatPos = heapPos / bytesPerElement;\n\n for (let i = 0; i < input.length; i++) {\n heapPos += input[i].length * bytesPerElement;\n output.set(input[i], floatPos);\n floatPos += input[i].length;\n }\n\n return heapPos;\n };\n\n this._executeAsWorker = (functionName, params) => {\n let source = this._sourceCache.get(functionName);\n\n if (!source) {\n let type = \"text/javascript\",\n isNode,\n webworkerSourceCode =\n \"'use strict';\" +\n `(${((\n SynAudioWorker,\n functionName,\n correlationSampleSize,\n initialGranularity,\n ) => {\n self.onmessage = (msg) => {\n const worker = new SynAudioWorker(\n Promise.resolve(msg.data.module),\n correlationSampleSize,\n initialGranularity,\n );\n\n worker._workerMethods\n .get(functionName)\n .apply(null, msg.data.params)\n .then((results) => {\n self.postMessage(results);\n });\n };\n }).toString()})(${SynAudioWorker.toString()}, \"${functionName}\", ${\n this._correlationSampleSize\n }, ${this._initialGranularity})`;\n\n try {\n isNode = typeof process.versions.node !== \"undefined\";\n } catch {}\n\n source = isNode\n ? `data:${type};base64,${Buffer.from(webworkerSourceCode).toString(\n \"base64\",\n )}`\n : URL.createObjectURL(new Blob([webworkerSourceCode], { type }));\n\n this._sourceCache.set(functionName, source);\n }\n\n const worker = new (globalThis.Worker || Worker)(source, {\n name: \"SynAudio\",\n });\n\n const result = new Promise((resolve) => {\n worker.onmessage = (message) => {\n worker.terminate();\n resolve(message.data);\n };\n });\n\n this._module.then((module) => {\n worker.postMessage({\n module,\n params,\n });\n });\n\n return result;\n };\n\n this._sync = (a, b) => {\n const pageSize = 64 * 1024;\n const floatByteLength = Float32Array.BYTES_PER_ELEMENT;\n\n const correlationSampleSize = this._getCorrelationSampleSize(a, b);\n const initialGranularity = this._getInitialGranularity(a, b);\n\n const memory = new WebAssembly.Memory({\n initial:\n ((a.samplesDecoded * a.channelData.length +\n b.samplesDecoded * b.channelData.length) *\n floatByteLength) /\n pageSize +\n 4,\n });\n\n return this._module\n .then((module) =>\n WebAssembly.instantiate(module, {\n env: { memory },\n }),\n )\n .then(({ exports }) => {\n const instanceExports = new Map(Object.entries(exports));\n\n const correlate = instanceExports.get(\"correlate\");\n const dataArray = new Float32Array(memory.buffer);\n const heapView = new DataView(memory.buffer);\n\n const aPtr = instanceExports.get(\"__heap_base\").value;\n const bPtr = this._setAudioDataOnHeap(\n a.channelData,\n dataArray,\n aPtr,\n );\n const bestCorrelationPtr = this._setAudioDataOnHeap(\n b.channelData,\n dataArray,\n bPtr,\n );\n const bestSampleOffsetPtr = bestCorrelationPtr + floatByteLength;\n\n correlate(\n aPtr,\n a.samplesDecoded,\n a.channelData.length,\n bPtr,\n b.samplesDecoded,\n b.channelData.length,\n correlationSampleSize,\n initialGranularity,\n bestCorrelationPtr,\n bestSampleOffsetPtr,\n );\n\n const bestCorrelation = heapView.getFloat32(\n bestCorrelationPtr,\n true,\n );\n const bestSampleOffset = heapView.getInt32(\n bestSampleOffsetPtr,\n true,\n );\n\n return {\n correlation: bestCorrelation,\n sampleOffset: bestSampleOffset,\n };\n });\n };\n\n this._syncWorkerConcurrent = (a, b, threads) => {\n const promises = [];\n const lengths = [0];\n\n // |-----------| |-----------| \"end\"\n // \"start\" |-|---------| |-----------|\n // | |\n // | |correlationSampleSize\n\n // split a buffer into equal chunks for threads\n // overlap at the start of the buffer by correlation sample size\n // overlap at the end of the buffer by correlation sample size\n\n // initial granularity low -> high, more -> less threads\n // correlation sample low -> high, less -> more threads\n // file size low -> high, less -> more threads\n\n const correlationSampleSize = this._getCorrelationSampleSize(a, b);\n\n // rough estimate for a good max thread count for performance\n const maxThreads =\n (Math.log(a.samplesDecoded * correlationSampleSize) /\n Math.log(this._initialGranularity + 1)) *\n Math.log(correlationSampleSize / 10000 + 1);\n\n threads = Math.max(\n Math.round(\n Math.min(\n threads,\n maxThreads,\n a.samplesDecoded / correlationSampleSize / 4,\n ),\n ),\n 1,\n );\n\n const aLength = Math.ceil(a.samplesDecoded / threads);\n\n let offset = 0;\n for (let t = 0; t < threads; t++) {\n const aSplit = {\n channelData: [],\n };\n\n for (let i = 0; i < a.channelData.length; i++) {\n const cutChannel = a.channelData[i].subarray(\n offset,\n offset + aLength + correlationSampleSize,\n );\n aSplit.channelData.push(cutChannel);\n aSplit.samplesDecoded = cutChannel.length;\n }\n\n offset += aLength - correlationSampleSize;\n lengths.push(offset);\n\n promises.push(this._syncWorker(aSplit, b));\n }\n\n return Promise.all(promises).then((results) => {\n // find the result with the highest correlation and calculate the offset relative to the input data\n let bestResultIdx = 0;\n let bestCorrelation = -1;\n for (let i = 0; i < results.length; i++)\n if (results[i].correlation > bestCorrelation) {\n bestResultIdx = i;\n bestCorrelation = results[i].correlation;\n }\n\n return {\n correlation: results[bestResultIdx].correlation,\n sampleOffset:\n results[bestResultIdx].sampleOffset + lengths[bestResultIdx],\n };\n });\n };\n\n this._syncWorker = (a, b) => {\n return this._executeAsWorker(\"_sync\", [a, b]);\n };\n\n this._syncWorkerConcurrentMain = (a, b, threads) => {\n // can't serialize the webworker polyfill in nodejs\n return globalThis.Worker\n ? this._executeAsWorker(\"_syncWorkerConcurrent\", [a, b, threads])\n : this._syncWorkerConcurrent(a, b, threads);\n };\n\n // constructor\n\n // needed to serialize minified code when methods are refererenced as a string\n // prettier-ignore\n this._workerMethods = new Map([\n [\"_sync\", this._sync],\n [\"_syncWorker\", this._syncWorker],\n [\"_syncWorkerConcurrent\", this._syncWorkerConcurrent],\n ]);\n\n this._module = module;\n this._correlationSampleSize = correlationSampleSize;\n this._initialGranularity = initialGranularity;\n };\n\n this._instance = new this.SynAudioWorker(\n this._module,\n this._correlationSampleSize,\n this._initialGranularity,\n );\n }\n\n async syncWorkerConcurrent(a, b, threads) {\n return this._instance._syncWorkerConcurrentMain(\n a,\n b,\n threads >= 1 ? threads : 1,\n );\n }\n\n async syncWorker(a, b) {\n return this._instance._syncWorker(a, b);\n }\n\n async sync(a, b) {\n return this._instance._sync(a, b);\n }\n\n async syncMultiple(clips, threads) {\n threads = threads >= 1 ? threads : 8;\n\n const workers = [];\n const graph = [];\n\n let notify = () => {},\n wait = Promise.resolve(),\n runningThreads = 0;\n\n const resetNotify = () => {\n wait = new Promise((resolve) => {\n notify = resolve;\n });\n };\n\n for (let i = 0; i < clips.length; i++) graph.push({ vertex: {} });\n\n for (let v = 0; v < clips.length; v++) {\n const vertexClip = clips[v];\n const vertex = graph[v].vertex;\n\n vertex.name = vertexClip.name;\n vertex.samplesDecoded = vertexClip.data.samplesDecoded;\n vertex.edges = new Set();\n\n for (let e = 0; e < clips.length; e++) {\n if (v === e) continue;\n\n const edgeClip = clips[e];\n const edge = graph[e];\n\n runningThreads++;\n workers.push(\n this.syncWorker(vertexClip.data, edgeClip.data).then(\n (correlationResult) => {\n if (correlationResult.correlation > this._correlationThreshold) {\n vertex.edges.add({\n parent: vertex,\n vertex: edge.vertex,\n samplesDecoded: edgeClip.data.samplesDecoded,\n ...correlationResult,\n });\n }\n runningThreads--;\n notify();\n },\n ),\n );\n\n if (runningThreads >= threads) {\n resetNotify();\n await wait;\n }\n }\n }\n\n await Promise.all(workers);\n\n // prettier-ignore\n const weighResults = (a, b) => {\n if (a.parent && b.parent && a.parent.samplesDecoded !== b.parent.samplesDecoded) return a.parent.samplesDecoded > b.parent.samplesDecoded;\n if (a.correlation !== b.correlation) return a.correlation > b.correlation;\n if (a.sampleOffset !== b.sampleOffset) return a.sampleOffset > b.sampleOffset;\n return a.vertex && b.vertex && a.vertex.name.localeCompare(b.vertex.name) < 0;\n };\n\n // detect cycles and weigh for which edge to remove\n const path = new Map();\n const cycles = new Set();\n\n const detectCycle = (vertex) => {\n for (const edge of vertex.edges.values()) {\n if (path.has(vertex)) return path.get(vertex);\n\n path.set(vertex, edge);\n\n const cycleStartEdge = detectCycle(edge.vertex);\n const cycleEndEdge = edge;\n\n if (cycleStartEdge) {\n let keep, remove;\n if (weighResults(cycleStartEdge, cycleEndEdge)) {\n keep = cycleStartEdge;\n remove = cycleEndEdge;\n } else {\n keep = cycleEndEdge;\n remove = cycleStartEdge;\n }\n\n if (!remove.cycleWith) {\n remove.cycleWith = new Set();\n cycles.add(remove);\n }\n\n remove.cycleWith.add(keep);\n\n if (keep.cycleWith) {\n keep.cycleWith.delete(remove);\n }\n }\n\n path.delete(vertex);\n }\n };\n\n for (const { vertex } of graph) detectCycle(vertex);\n\n // delete any cycles\n for (const edge of cycles)\n if (edge.cycleWith.size) edge.parent.edges.delete(edge);\n\n // find the root elements\n const roots = new Set();\n for (const v of graph) roots.add(v.vertex);\n for (const v of graph)\n for (const edge of v.vertex.edges) roots.delete(edge.vertex);\n\n // build a unique sequence of matches for each root\n const traverseRoot = (path, root, edges, sampleOffsetFromRoot = 0) => {\n for (const edge of edges) {\n if (\n !(path.has(edge.vertex) && weighResults(path.get(edge.vertex), edge))\n )\n path.set(edge.vertex, {\n name: edge.vertex.name,\n correlation: edge.correlation,\n sampleOffset: sampleOffsetFromRoot + edge.sampleOffset,\n });\n\n traverseRoot(\n path,\n root,\n edge.vertex.edges,\n sampleOffsetFromRoot + edge.sampleOffset,\n );\n }\n };\n\n const results = [];\n\n for (const root of roots) {\n const path = new Map();\n path.set(root, {\n name: root.name,\n sampleOffset: 0,\n });\n traverseRoot(path, root, root.edges);\n\n results.push(\n [...path.values()].sort(\n (a, b) =>\n a.sampleOffset - b.sampleOffset ||\n (a.correlation || 0) - (b.correlation || 0) ||\n b.name.localeCompare(a.name),\n ),\n );\n }\n\n return results;\n }\n}\n","import SynAudio from \"./src/SynAudio.js\";\n\nexport default SynAudio;\n"],"names":["module","exports","Worker","t","n","e","r","Int32Array","o","s","i","c","length","Uint8Array","map","parseInt","substring","Map","forEach","set","a","l","f","g","h","p","u","DataView","buffer","getInt32","d","charCodeAt","get","m","subarray","console","error","Error","wasmModule","WeakMap","simdWasm","String","raw","scalarWasm","SynAudio","constructor","options","this","_correlationSampleSize","correlationSampleSize","_initialGranularity","initialGranularity","_correlationThreshold","correlationThreshold","_module","async","WebAssembly","validate","simd","then","simdSupported","compile","SynAudioWorker","_sourceCache","_getCorrelationSampleSize","b","Math","min","samplesDecoded","_getInitialGranularity","_setAudioDataOnHeap","input","output","heapPos","bytesPerElement","BYTES_PER_ELEMENT","floatPos","_executeAsWorker","functionName","params","source","isNode","type","webworkerSourceCode","self","onmessage","msg","Promise","resolve","data","_workerMethods","apply","results","postMessage","toString","process","versions","node","Buffer","from","URL","createObjectURL","Blob","worker","globalThis","name","result","message","terminate","_sync","floatByteLength","Float32Array","memory","Memory","initial","channelData","instantiate","env","instanceExports","Object","entries","correlate","dataArray","heapView","aPtr","value","bPtr","bestCorrelationPtr","bestSampleOffsetPtr","correlation","getFloat32","sampleOffset","_syncWorkerConcurrent","threads","promises","lengths","maxThreads","log","max","round","aLength","ceil","offset","aSplit","cutChannel","push","_syncWorker","all","bestResultIdx","bestCorrelation","_syncWorkerConcurrentMain","_instance","syncWorkerConcurrent","syncWorker","sync","syncMultiple","clips","workers","graph","notify","wait","runningThreads","vertex","v","vertexClip","edges","Set","edgeClip","edge","correlationResult","add","parent","weighResults","localeCompare","path","cycles","detectCycle","values","has","cycleStartEdge","cycleEndEdge","keep","remove","cycleWith","delete","size","roots","traverseRoot","root","sampleOffsetFromRoot","sort"],"sourceRoot":""} \ No newline at end of file diff --git a/lib/icecast-metadata-player-1.17.3.vorbis.min.js b/lib/icecast-metadata-player-1.17.3.vorbis.min.js new file mode 100644 index 0000000..5e8860d Binary files /dev/null and b/lib/icecast-metadata-player-1.17.3.vorbis.min.js differ diff --git a/lib/icecast-metadata-player-1.17.3.vorbis.min.js.map b/lib/icecast-metadata-player-1.17.3.vorbis.min.js.map new file mode 100644 index 0000000..35beeb6 --- /dev/null +++ b/lib/icecast-metadata-player-1.17.3.vorbis.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"icecast-metadata-player-1.17.3.vorbis.min.js","mappings":"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","sources":["webpack://IcecastMetadataPlayer/./node_modules/@eshaz/web-worker/cjs/browser.js","webpack://IcecastMetadataPlayer/./node_modules/@wasm-audio-decoders/ogg-vorbis/src/EmscriptenWasm.js","webpack://IcecastMetadataPlayer/./node_modules/@wasm-audio-decoders/ogg-vorbis/src/OggVorbisDecoder.js","webpack://IcecastMetadataPlayer/./node_modules/@wasm-audio-decoders/ogg-vorbis/src/OggVorbisDecoderWebWorker.js","webpack://IcecastMetadataPlayer/./node_modules/@wasm-audio-decoders/ogg-vorbis/index.js","webpack://IcecastMetadataPlayer/./node_modules/simple-yenc/dist/esm.js"],"sourcesContent":["/**\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nmodule.exports = Worker;","/* **************************************************\n * This file is auto-generated during the build process.\n * Any edits to this file will be overwritten.\n ****************************************************/\n\nexport default function EmscriptenWASM(WASMAudioDecoderCommon) {\nvar Module = Module;\n\nfunction ready() {}\n\nModule = {};\n\n/** @param {string|number=} what */ function abort(what) {\n throw what;\n}\n\nfor (var base64ReverseLookup = new Uint8Array(123), /*'z'+1*/ i = 25; i >= 0; --i) {\n base64ReverseLookup[48 + i] = 52 + i;\n base64ReverseLookup[65 + i] = i;\n base64ReverseLookup[97 + i] = 26 + i;\n}\n\nbase64ReverseLookup[43] = 62;\n\nbase64ReverseLookup[47] = 63;\n\n/** @noinline */ function base64Decode(b64) {\n var b1, b2, i = 0, j = 0, bLength = b64.length, output = new Uint8Array((bLength * 3 >> 2) - (b64[bLength - 2] == \"=\") - (b64[bLength - 1] == \"=\"));\n for (;i < bLength; i += 4, j += 3) {\n b1 = base64ReverseLookup[b64.charCodeAt(i + 1)];\n b2 = base64ReverseLookup[b64.charCodeAt(i + 2)];\n output[j] = base64ReverseLookup[b64.charCodeAt(i)] << 2 | b1 >> 4;\n output[j + 1] = b1 << 4 | b2 >> 2;\n output[j + 2] = b2 << 6 | base64ReverseLookup[b64.charCodeAt(i + 3)];\n }\n return output;\n}\n\nif (!EmscriptenWASM.wasm) Object.defineProperty(EmscriptenWASM, \"wasm\", {get: () => String.raw`dynEncode01a33fc84f8dïoØå§ä³¨s¢þé\u0014õ?§\u001a\u001ašæ—ƒQ¬\u0001\u001e·\u0005ñì\u0012\u0006>_•å”\u0013è£\u001fM\u001aí'…Ë\u0013ÏÊí\u001f\tçåzmòeúaݐ\u0016§¢é\u0013,š\u001aî= 9z…ó¡= $\u0012.\u0012JõT¬K„'¨®ç ƒä“Ó\u001b·ßé‘àäà(u¾ŽÃ÷¯Ãì\u0005Í\u0000H¶3KQtíŒ;Çø=}ÉóX=}Çã»°£)½SÉVy{oEqûUHhé\u0007ì8÷7ó[Ÿ”¼ˆ\u0014\u001aiÖ¨A\u00062º»ƒÈ\u001c(ä\u0001\u0006+Ú»‰Ðé\u001b*7šç}ìÏÖ\u0012@ü€¿À\u000e¿B;?=}A\u0010\u000f?>\u0002ý\u0011ÿûüÿ\u0002~{\u0005xÎ#†ë5X.]J\n=Mi=M\u001e°UH\u0000\n˜5šâ’ª±ÀéOmr\u0001n\u0017¿¯2Ljª•\u001d˜{•\u0006\tÝájÔֆ\u0006\t\t\t±Û©bŸÕ\u001e\u001dé)j\u0019{èüül8üàJr/¡™¨‘‡²Ýþ\u000f^\u0018UÜàÈO6܅\u0007jÙ5èâ×að1º€H\u001fH=M2Û6íÊóI̧[TÜïÚÉ)„\u0000ÁW|âßH\u0005\u0006eF,l\tÌ¥\u000b'ž0Äb8Ï\u0012\u0019\u001cK“ß\f\u0016è!\u001dŒ\u0005e‘€J\nvÑz–Œ& WrnV\f\"5Ê\u0000ñ ýkwP”4Ã\b\u0016p¨‘¸RAx[\u0019p¼Ïóƒ;š7>ÃÑþ¨VU?°Rˆ›\u000eq9~\u0007ò‰Q”\u0003ڃw‡\u001bI=}­žœ•\tf›òÔ·rñ¾ª\u0014¸gðx7\u000eQE5-±\u001c®M߀ã\u0015l–?\u0012\u0016£Á•ãÃE\tóØ{\u000eË\u0003ÒÂÌ\u001e@µ\u000b–z\u00115fñ‘}.;\u0015\u0011¾ê%Mi‡\u000e‰_³ZU@å.ɂñ‰î¾Þ€m„Ät†×¢.\f,ä²BB;朤‘äû\u001aûZ_¡V)Œ‡ŒªAUµ¾BfÈéŸ Ò&§¦$¢Š\u0014\u0002»ôåÀk£z‹(Ÿ_zܟ^r>†ï ¾bˆ>ÁŽð/ªÄ\u001f\u001eDT\u0018\u000fçQ\u0007ŽlÄIÒ\u0001°Q}\u0019:\u00168_þ\u001aŽ!@ßvñ!\u0016\u0005œOö\n\\”\\ebVp\u0003Ȝ±\u001cÖ\u0017~\\¥NÐ'eŸB\u0002œb·#ÈN¥\u0013\u0012ŸY\t\u0017ßà#W´0a]¼!þ½\\n×\u001fØT¿¿‡¶çÉS­îä\u0007x7óÎ6ñI\u0001\u0011-ììùpfåh¸Çú,\u001ccµÔeiÂeic\u000bÓÂçˆ#ê²up¹aÛÝ\u0011b0¼þ7–\b\u0015\u0012Ÿ™\u0012\u0007Ü\u0006”>F3ÞÔTþñfkï±bxö”€„öf\u001dٍ†ˆ±…6H„”ΟÊß6 šÒ°ÂyV¶Á?»‰‚@?{¨Q¥+=}¥±ÿԓÌá9%û\u001e!\u0007>Âì&¸Õ\u0010@Ó\u0010„Uùq÷?ñ\u0014qt˜\u001b¿“çIU+÷g‚\u001ay\u0014+5sä\n¼¬åí•\u000bG\u0002Ö®\u0004‡S1Kƒ;…\u000eB\\\u0019\u0010\u0013©™f‹\u001b\u001fhX˜d)ºÐ¿²Uw ûû\u0016X1ƒ5°Ò1„LÁ”-Œ;j= piN:}îºB\u0003¯ÅÉw\u0012\u0016Xtô§¶¸3Œy¶¯oJáà\u0002Lž¸jÎn®În -Š¸ýûÄàsT\f½\u0015ÎòÓÄe\u0012s\t´{OsèÚÎþ´ƒÇ“å9Se\u001dkF†‰TV³úŽK-”š÷WE¾OÔ\nµR½‹ø*ٞvVèJ°§†\u0018¼Å¤ªàCŠœsr²^\u001cÕvü3ã\u0012ãÔ¯/´ Poü|$\fRÞ§KuÉ#þ\u0000‰[ªß{¦Ñ\u000eVú>ý>Ôws\u0012~~š9ž=Mz¶-ږ•hiò>ñ²1\u0013ždüÿ!ü>ý>í¾¿ñ\u001d赙À\tž/«\u000e~y\u0012æ¨Êwór„b0©\u0013\u001fì!ˆ\t\u0006~°»Ïž\u0005øj§\u0018Ý#ß88š÷\u0017AlÛ¦\u001c3¹ÇS8“oK:xÜ×\u0018'dAkÉÜ<É;–)3ÀbÐ{í«Û5?þ\nÈ\u0012N\u0018øRÙᾙ¹/+ß>ۏ¾6åô\u0001}mzQ|p÷Mž\u001b¼ðjÑí\u0003\u0011©;\u0001\u00102½&Ì#g×g|/[k*Zõ8ZvãXƒ\u0016çà\u0011F–\u0017ª¯a*÷«ª+V,\\¨rÏâ'É:\u001fG-à\u0019ëˆW\u0004£óÿ‡ˆîŸ‚8rpÿ\u0000]k€=Mîéû|]\u001b´$\u0003Î\"’îá“\u0014VìDŽ\u0013_d%~m\u0012¢>\u0002\u001daj%\u0019U6¨^8\"ž\u0018b ]¥®}l†ì\u001f\u001c\u0012­ï\u001aèÈfõ\u000blÔ\u0017֋ç\u0019ÝÜI\u0011ÃqÜ\u0010;ñ‘°[‚ÙåTàÆä\u000f>í•÷™õ\u000e{¯oí½3*iú\u0005•\u0007D¿gÔæÁ@sÙ Ñ\bèÚ\u0003=MÉ\u0006k\u0019áÑüçu\u0007êÕÙð\u0002\u000fw\u000e¨\tÀ\f³Fô~{\u0010ï_µ\u00039Ñ\u0002¬5,}í5×0ÿ>_6l*{îò)\u0018¯Gj\u0010\u0015E7(aôrÃ\u001ebôÚj˜Ç½\tT°ÜÃÄ\u0019gk;ß_߇Â֍ûÄRZð\u0014ùÒ¸\u0013§=MX*gê\u001e[ÉXÚ©^uN„~u~®\n:Õ_\u0002\u001dN\u000e\u0011ø\u001eW‰ë\u001e\u001aP\\^W\u001a\u0007pÀttØ\u001a÷\u001e2ÿ\u00162wTØ\u001aï\u001e2þ\u00162v6y6;V˜ÌۆI\u0014÷?ªê\u0003„̶^&\u001d>&í£F\u0013]V\u0007BfŒ¨T\u0004ß\u0010e|þîõ\u001d¹\u0004ù\u001d±\u0014ú\u001dÁ$˜]ö\tw\u001bá†yƒÏV.îbÁۂŠÆ.Þð¡Øۆ\u0000ït\u0014nZ$þ:—KÌòñӘð?«Ÿ»…\u0000±l“â\u0001¶\nSӀÿZ·ƒ©'7\ns%»4äcL+øÈ{\n^ÑKCU¨n9ðÑ~g³/rӆV$\u0002\n[cÉ6 &\u0013\u0015›(¿ô‚qðx\tú’Æ6\u0000ÞYSÇO×Èò{\f’-\u0007L;áèÚÆ\u000fUhk(öyžÄ„è7´Þ\u00141CY˜¤Dèé׃40,ä$Em9†¦\u000fS£\"¨ü“Çk\u0006U€ô¹ŠË UgÎ{>%[2\b\\ösiUîçÓ.œ\u0016À¨ãôÂ\u0010ÏûÇ~që¤\n˜$¼À&*ãhæM#Ïî8å#ûûU@·I‡§a†Âú[Hc\u0017°cŠ¥öém¶«èä\u0010ªªˆ#÷‡ˆ\u001dñg;ß¾ó\u001eºš/9í?\tg~ïB9¨'Sü\u0010ß.›),‡gi±Æèzåëf¹,\u001eÈâ^k¿|Ð= ”ÿÉUvî‡\u001c©ˆñ\u001fÚÍÖـ\"&•|\u0017ª[Å¢l\u0015Žy‚D¸ÖÏñI´QCÑ\u000eWõ\u0006ȉà°\u0014\u0007zÈ2_Ǹß(ËÒ¹pi}çkU̇-PV$MÍ)\u0005}é\u001cžD×q¹{¤aä†.|í+/ýºIë¸××I¥^\u0014bü½ö?Ñ/Æ°\u0014uCH¥g±•‚|¹M\u0006Þ#L²„ææûºÿ\f\u0013'œîA-÷\u0014B\u001c\u000f¿7\u0003<\u001bޙԭ\f9ì&\u0018Ô¢fÓ1EãÈ/ cE%5ÙO‡£.u\u001aK\u0011~¨¸;Ëíô°ÿu7u\u0016Rö¦×³…®= °~£3€0\u0012Èö‡ˆpI\u000bìx‚û\u001bŸ\u001c)þÏ\u000fXËyey\u000e„o\tI%Ùý°\u0016ðà8­Kð!9¡ƒ‰C£'Ý\tY0\u001d\u001f\u0006\u0004¶±Ú}\u0015îùÛÆze\"ߦ[ÌM…\u001cˆ\u001a÷qAš\u001c?¬;Q\u0013W–et\u0015„\u000bbW¬ýÛ)a\u0013W–et\u0015„+\u0018*˜¾­j¥h8Î\nÉëÎ\n~øqù|ô*= D\u0015ÑW\u0015©â\u0003\nq'$iÇùç\u0013Æ®sç4|¶¢USæK|cÅ\u0010À(46?µŠƒ#ËM0÷rYNAP÷r¦á«Ò×{²¶ÁØäpg´e—Ý\u0007|\u000e¸ìH=MïmÿOn@óå+(÷Ð\u000bMI3“ìñÈó倝\u0001Óz*^,áÿJ²Úz*\u0006 [Ò\u0010íxê|Žfp˜„ûÂû\u001aûBŒf4þs*þs*ö [ñ‘bG²ÐnjÄ%Àßñ«Zù\\è\u0010¬è\u000e ‘\u000bK-\u0006ÚÈ®”Û“×Ώ\u001eVyT­´1˜bØüJÅ\u0015ZÕüJÅ\u0015Ú=}\u000f›\u0002<\u000fó´\bnul/6|@{æÔî½\u0017àb|é ª\u0006³½wTŒAª³uêÀ.¸šNvΘ‘æS\u0002UL-÷h›rH7ÙV\nVÕ\u0013-pL¿ã.PÒ\u000e¿\u000fê\u0001Ã\u0013ÿqÎÁE­k…ÜŒ¦ÙÇéÙ²—l¥(t³p–OYúHp’cÖ¸ó„\u0019æÞy5½¶ÎÕ9Ȍ\u0018³˜\u0018³\u0018²ô\u001a³2§'6Š­´É‘»_9Ɏ^¿Ï«;\u0007Ù\u0001Ëa­&rb—f±\u0016_\u0006ZØÀª%#ŽÎh?̑;\u0006zÀVš‰j¿Ž2lúꋆGÂ^hì\u001e\nÊÀþߌ\u0014ðT†Gximü\u001f1Oå®&\u001f¥ïߗµe‰cË\u001a/9\u001a/Í\u001cN͟\u001dê\u0018¤MÎü´M\nƒ•]Fö\u0010kj\u0003®\u0003ò\u001bJ¤C©K•'î\u001cO§•GiÆb6ô¡ØfÒ\u0004\u0005é\u001c\u0012þ‚h°\u0014¶˜À= µfŠaG€Hߵэ¬Ãà\fÖO¥*–Ýh·s-#\u0019ýtú\u001aø*³D¡S6(t,ÀF0(´¡†¿nƒ,Ùádý˜Y@²íۄâ\u001e\u0001Ànhé9ÿ{~@øJèT\\†VåԞOó\u0001¢üdrí„\u0015¦ür…\n¨&\nÝJB¸ŸV%tr­QžóӞO\u0003—Våâ SBi¾ÿڐç\u0005ܘ\u000eÄ6OLi.p·Å(›Õ“x\bD¨\nD¨¼¬\f\u0015؍\u0016ª¼L9¯¨ÌšÓn¤°\fBªb\u001bêt\u0017Ó«óÚ;[K\u0012°èî¦AÀ—Ο™0ý'ð§|\u0004ÌÒÌ÷´rq\u0001½ó\u000b̎µazûû8\bœm´Ê/ŸœV:È&®\u0004¬ØÌZ&\fUk\u000f\u001a£‡r¿Ãî9>ÊR‡rѤçśz\"ÈBw&!Aúÿ’\u001c‘üd˜–&ù¤º¤ûë\u0002©ÿ?þlâSwÉ£kl¾2ž9²bÏáz\u001d«–­®k€(Ȫ-Ðg\u0003ýu\u0017ä\u000fƪa­ß÷Ðî5A3*®\u0017ÖÖ»­·G‚\u0005V@øb1r#\u000béof:\b&z:r\u001byG~qb˜f\u0015\u0000“ÜVš\\Q°\u0010%¿¦cœåþ„\u0007¤6\u000eá0n\"՘\u0003\u0005\u0006a•Õ:¬®{\t™$îN³ºüÜ~=}Ą6¬ÁÛ\u000eÏÓ¥Y¬ŒÆ€m‚šÝÜÀ,ØAà\u001364æ0kÐÇi\u0001žL#\u0010=MMôk%9ÿ[þ|Ä[Á<\u00000¯\u0019 ý¥þÖváÐ\u0014\\yí¬\u0016-zÌOï1ä@\u000b¤†ÙÙ®»…ÏÈ\u0000ïõ¯•j¢×ì”=}G›þÈÌû\u001aû¢r5·\u0016\u00065¥„\u000eƒ×ZíõÅä֔þ&Â\u0010žRX\u0002*ƒü°Q:ýBÖ.ùžkô){©Ô™B­>´MLZØî’Rf,\" ŸÊâ\u001eŸ¢¢p¦Ò\"ìÖ!¡o4•ºÕ††z0\u0004ŸŠÎÆm\u00110'$¦g,ˆžòߖö\fk†\u001abßì°qºU‰\u001fL?R©\u0001@c‹4¯Öçî\u0006쐁 U\tú\u0010˜Û‹(ZEOÂ\u000b\u001bD\u0000X\u001ez\u001a\u0004ÄC=}°×D$ãÞ)é\u0005]S²œ\u0014Äz¿¾ß‚ÝEL·kÍM\u0007Vañ„\u000f%F\u0018J\n\u001a4ôñ=Mچ™fÒ¶‡AÉ\u0018ÂíÁ\u001b|…Ô¤joÁÏ\u00133ÜV5íÇ-:5rKÜ[uò¦\\ŽÀ\u001cÜ]3ނµÂ«âQÙúх\fåô=}*´TLß8Å\u0004î7>Â'±„\u000f:LCdh\fúÕe÷͏M73ëFrԉmÝР“†ÿÀ’ÓM|\u0014\"6d‡\u000e@O…\u0006¹‘cs‚\u001dZ¡g%n’B³ý£UMŒK\u001bÅÖ0\u001aÝ8ÒõÏu·ø¶g͜¡ñš¾€ÚÓN\fŠ0þR)h= †þ‘P\u0012{n\u0019\u0019øQ€I3Åß3\u000314™\u0004’ÐT‘= Ìy”Åy¾–l܅= ÚÃiUCg´\u0016WœQ(ŠÁ$^]\u0002)Ù⑥þ\f \u00122­Û·>å˜m\u0014s&b¼úªèôQ'Yè¨FüyIr\u00181ýÎmaî0'\u0011\fÇ\u001bÈ\u001eýªÿ’#}^\u0006W_\u0006W}2QjAÂ*ϐšO¾“rûÿ\nDñöëß_\\Z= Â)¡#\tú„\u0010⟡]\u001bôö¯öx1ÓȒ6γ5_x}']Ö+—ü\\c°”O×\u0003ì9¯g_³Šd‘óai\"©[9ûЀC\u001b¹^\\:R¢ìŵ‡ý\u0019rt‡q׉Çܹ–‰'Æ\u0015Y[7lÅ4Ót\u0013Ò¡\u001fS\u001eÛà\u000b-W~\füx¯d…ãG@fýÉ\u0011Osó–Í\u0004@O¹\u0001\fg.æ\u000b\u0003,ŒHåÑ?_w‰Š•XÜi~ZS(E¶²ü×\u001d¹RJ=M¹\u001d\u0003Å\u0006_=Mø˜ÑL\u001f^\u0005ålZcþ‹\u001cëÙõðÛà„¸\u0012‚\u0016õ/ð±Üzé/™whW:ÍÐFÔ\f#ÉG´Â\u001fÈWŸ²\bÿÌ\u0010M+\u0010\u000eínrí\u001e\u001eî#ÌDoñ\u001a•„\u0012L}\u0017ª.–ñ¸ŠçpƒÑ}Ê\t\u0013\u001aYW’õ]j\u0006\u0010ã\u001aN¬k¸Áç÷F\u0001€Lã\fäªÇÔ)üõ\u0016¤ùæÈð}\t+æ® õ9\u001b~%žñõª÷\u001fè\u0012þ\u0004æutµØî «ï‚h\fw\u00003ZyVÖfÛÓÖ/fOP= =M»\u001aÔ4ßýa3‘øœ¿„\u0018\u0007‡$±äšFY\\ò\u000e[¬)¢Rø¼‘fلO\u0005\u0015\fü71w¿ŠæZlý֋°\nÓÚ? .)fsnW®Æ\u001dù–«Iò‡Í\u0002\u001b?Uñš¥A1ƒ¢7+\u0003_꼉ßÝÙâÕÐ\u0014¦]s¿î\u001es¿ðS9šÓ\u001cšŽú ÞWLs_Iu™=M¨6\u001fÛèÝë§bCgт \u0007{F¼©\u000f¦¶ÌKDZüM\u0013v•)Fº»ý»è e\u001bI\fÏ\u0001ÚëÆ\u0011*\u0001\u0017\u001b$&Ù轔\u001dÖe´XSX×øØê½ñ4\fÍàG+ô\u000fgÒ\f\u001b\tÈVæ\u0014T[å^~×?|#K·ÇlLÎØ\u0004i;ùV'j÷œ\u0015\u00130ðÀók\u0015—=Mî\u001eAxyv\u001ašJ\u0016bÞà0Œ\u0019\bVHÈA€\u0016¤M¸\u0011;O¸‘/(SÔ«¦üÆ3؍kU´Jf³)óg»1W¾‚lÄë§1ŠTõùÝ\u0010‡’†d%=MaPu™í(pD\\\u00000\u0019Þ0;7àe“(ÙД´\u0006¬\u0004\u0006µ o6˪@L\u0002$Žë¸Ç×cL›Jß¼Òó,]þ&5µÒ‚&ñ´…tÉv\u001dâPŠx\u001d\u000bXŽÔ šÔ8\u0005ç‹ÖH\u0005ë\u0006KÊ0]f\u0003 ê8-rü\u0005ºª\bå±­¼(ó\u0000åНµÒ3äóOôIø—Áþì\u001bj#\t= —bF%\u001f\u00144»XîÛ\u0016ð«!@$¹@Bl‘ý’U@O‘EDç/ \u0010}òªT\u00173Á$È%nJµ’Æž„[gÊóÀ;=M5»Ã\u0007:_ÿq¿BßÀ¥1æ-\u001fe ×D¦\u0017»6*„Û¿\u0017×_\u000e\nÔQ’¦sá0Ž¸ê\u0016w—Š]ÂÕÌ6Y\u001e£\u0006>3\u0002Cë\u001dxâF4!y'Èw†±Y¾ŽžñÕõ0ww‹*·\u0017ÕX•\u00073ógg5^\u0018/’S–Z.´‚ËÆK†9éÓm\"Ž}bŽ}âV|‰\u0002þPê¬t¤]pbŠ=M»tJ\u0010= ^¼-ÄÞ\u001b˜=}žWȼ\"¾ix=}žØW\u001f.¢µ}d=}žÜ\u0011ôwŸ·}S‰!/þ·KÂãŽy\u001es}ؚ±W\u001fwþ¿0—˜&)”\n±}Èóðí×=M\b©\u000b\u001b~šÜP\u001bAŠ\u00079Z†”ƒ*S\u001cό؜ñ\u001fÑMN·c¶\u0010Hï–ëŠB\u0003¹]h_þq^&\u001cZ=}\u001a*\u0011 „’\u0019! ÓœÿÉÊìíƒv\u001c‰\u0005™“×®>‹BŸŸ²Å2!´4\u0000\u0015œp_ÊݛÕ!©diŽtÓ7Ȳ¶–®â.;Ù1Ðëb¡º÷ñF\u0007\u0014\"inˆ/­­¯YNÓ(ÐÿÄ<š–›(ÓC–\u001a9~õ-­\u001f\"‹§7LQ‡<1Œ¢‡\b­ŸAäHÕ«´Dî‹ù–‘\u001bPŠ€= ñc{?ýW:Í;Ԃ\u000f]\u0014cán¿˜¼ü\u001e\u0001ÍJŸ\u0006£)™Glú!¯dئ:PN\u000fÂg\u001a½ÍŽ^–JÑjÅ\u0002^¿6f(Ä\u001fA?\u001b\u0017anD(°Hsn\n$\u000eR§Ärkx÷ò­Å\u0018á\u0006wÛ\u0013Èo]?!$\"A\"\u0011\"÷ð lÄ\u0005–ä¾qLô;±óðŒýó;^ð=M,±ð(&²À\u0013\u0000M\u0003ª\u0003ªÍü\"Kb(6tÒevö&h„ÌD}ÔeŒ¼<}TÑØõnzÞª 7º}óì\u0013.$¦‰„1Vå\tÇ=}5\u0001Mþü²!ì\u0005m¹™¼\u00136ˆj¦š€›ƒDƒ©èÒ·e\t\u0017§\f‚\"Š\u001eGœ\u0000ÑÜ%ɶÒÏ\u0010Ya\u001e[\u0005Jðe#¥ïÔ/;\u0015}¿:óöª\n¨\u001eÓ\u0013GÄ< 3mN¢¥¶«Ÿ°XقK—Þ°2ÞŹð¤d|9c\u0014¹õ\u000f.“J3¼«\u0002+™|°*\u0005Oôž‘ æï1²„/½©°„ˆ¬·³'´öÛ~ö\u0018|ïˆ\u0017šõJÛOi¹Ê·û† Ø<¦í>;°HÜVßÒ= &XÀî\u0015Ž15\f¦ð\u001d\u0006öƒÊ0ÊÀùl†=}¯~ñk\u001bÄÁ’4\u00171qø?ùÕºÏO,K,N¥‘EP\u001aÕ§v4\u0004‰Íøþú•³¥Êˆ\u0004‹k+*5­çr#1\u0018\u001eD\u0013Û<ç\u001bª£…\u0018\u0004\u0005´¯|{\u0012Ù\u00071¬‰ÇÆIje¥Y\u0003\u001eàkadž°–ÓÊ\t3$\u0000\u0006AßzŽHÇ·Åö­Ë6·Uœl\tþq\u001f5!¢×“EGm*°¥þ6¶ÔùWøJéW\u0003ÅN$p\tõ}\u0013ÙÕ/}°•,+:Ù\nµ'ãŸã²_‰6U˜Á|á÷\u001b*c»\\ÆU,g*ðÜÆl1ud™\t8¯à“\u0012-y÷I ŒÌxÉü.ù†e=Mɔ=Mk«\u0016?\u001e<çNd2o:Sò°\u001eÑX\u0014tÅÝjV\u0004ZTÃïÎ\u000eòê;èXúQÉ6ØØ91Ï=M1èpî®Å(è(P\fI³p¾[Ÿ\u001dy)\u0006$ì$ö®…K÷\u0019„¥{®!n\u0000P‘Úvä6œÐ\u0015’ÈVþCr¶>è\u000fqv\u0003É\u001b2ÇtD\u001ed@«=M¤c¶ç\u001f¨·íi«5A‰›,¸Ô\u000ffª/ْX¬‚š×\u0006ƒò*\u00012®\få¸oô\u001c\n{ë.»Üy½Ct EâaúÅç¶\u0001Gtœ\u0004d‡n\u001bòÔQº5Ñ\u000e66/\u001eË1=}wk*—l$¡J_!JÄ\u0011©m,v›À„p£re /7P$\u0015Ç.6TAE\u0019%8Ō7RÓ]Vú¨µp\bžPßGO\u0002ëüâëüÂGO2GO2HO2GO2\u0002=Mëe›HI@Kgg\u0006,p^›OSü5Ï\u0007Æyˤ˜&.‰\u001b+&Adëg=MÿšŸ‘O[¦çŒÀ‘\u000fmƒØa%\fÉ\u0019­V\u0013­8=MûŽ\u0005PNfýú’‰0uÝ'|!·‚Éñ\u0002jŒÖañ\u0005÷eWÂÏÍø4M;ȅ0 À\u001f'ú4¨àª\u0014\u001e¦~F>Dï\u001bo6¼.r\u001c]“gO:¦]§½„”Xhg†õ(Ýۂ†š‰@\u0011\u0019´¨¯ß£éD˜üÄF§\u001aƒÃ»y©õŽ@€= ´LM\u0013‰ô‚¯[y‡B3솆ÿºw•K)¢w¹ÆFY=MäՉñsÏGBGˆ'÷@Ki=Md¥\u000f”C\u0007k¤­3v»Õ=M\u001c÷N®fºŠÍ;Çà“³8M\u0010G\u000f>\u0004†Œ(’pÅ\u0012\t²fÌ\tŒÇ$‡€î2Ô.ÿ\u001b8ˆ…doÿ£©æ.oŒÏóSÛpX¡\u000bێ\u0019zÉw\u001e%šUµ¹Íî\u001bԭہMÁ†\u00165fg\nûîBÚþd\u0012Ÿâõ´ñŠB­,ײc‘ÒŽ\u000bPþq×wŠ\u0010À²©Ã\u0014= BOµ%DىϪðõ™üQqÀ5\nÀRÃgèˈ‰øÅ7IÑÜ\" eŸø;âqæÞ±g&:ã'sÆk\u0015®¨ÏíLàô\u0004oªH'÷:'\u0019\u0007E÷\u001ddf5*îx= £ñlí\u0002®F$\u0014\u0012«wmٓõîUT\u001d¬\u0017—»™åÕHFÔ]ò&÷\u001c*$Þ)Ê<\u001d{\\‘\u000eΘÍ?Çâ\u0016›V¹\"œpžAn·{‘²Î\u0017bu¾âaÍ«ªá\u0019\u0011éĊ9z_KW´ûS§%í\t©BÆÝ®¿µ\u0005t\u0005&ƒdùë³\u000fïú7ô£\u000bNÎ'ð µ\u0006\u0006Å©ïz0´™î¦\u0004êUtâKΣ¤=MdTr\u0019zU8\u0010vM[§óѳ±I„[‚ý¢wIÃÑy\u0014n·QÔÝ\u0011Uæµö\u0019ېðÀ¶{}IC°¶\"ë®ó ß\u0015›ƒ^vèZ\\y}\u0016׳BE6’°Èʊ\u0007’вJQ$-9Çê~>t‰m\u001b\u000bw¿²ˆŠ¦¨®®(|nÈÛp».„ÛTÀ^æ©É6•:\u0007ݽç\u0019²=}÷\tÕj\u0002Û¼Œ!ÙñI¯Ž.y_ŒüØ5ku–á\"P/qžÕ¡>F\u0004ˆÕëfâ=Mg4‘_’q|= lrö™RCD‘žö™zê]ÚæšKN4_©vÚè}ò͜p\u0003[üÊãᮍÓʃ.Æ\u0015i\bñC˜ÿ\u0014êÀž}2\u0005&[»ïmá­rÍ=}ĺ2x\u001e>ÄÂéèÖ{ÝÎæ—íǶáN\u0006!\u0002|Ä\u0005ώd[\u000e?9èH^ù—®µ;\u0019Z\\º¬yI‡\u0012ì\b²p>œÚ¾POŽ?\u0019@†º“ý\\zþ}\u001653)\u001e\u0015¡ÐÁÍç\u001f6 O\u0014#¤ˆ\u0000\u001fáÊcËc\u001d£ûÀ¨Û\u0002¥Û2¤y£ûVBر«£Š›_ÅcpF£–¤ƒŸËc=M¬ƒ¢g£(þf!yÛãO“\u001cí#\u0015·ƒm£\u0013ºÞñ#Ñ£ï:£áÛ©\u001b¢næâ\u000e¿ã#/\u001eàÁyÏW\u000e²C\u0001\t‡'՟X؈%¦\u0018)Ü\tp¹€ü˜C\u0017Q\u0016õãÓÛ}~¯$Oî\u0014LàHJ¸\u001ccø:«7í­döº¥ºXJæ9Ô÷\u001bÜÀ›ëé0þ“õ\u0015ÕÒÈ\u001akîщȺ–õK,þ‰H‡\u0007\u0001í‘3:?77nóŽ\bKÔæÈÊÖ÷\u0015*¯\u0018Õw\u001f¼=Moøllÿ8#N5£ØÔQ]Vóú1(=}•®ëdɌüŽ×üNihó.ˆF¹U\u0018ø†bg…³n\tûæyª(…âïþ¨5\u000e꯯\u0016\u0004;\u001eÞ_ï\t\t\t\t«Ö\u0016­\u0016&t\u0001Ê\u001fBƒ¨Å|’ø ö\u000e×P\f= 4o™Q\u001c\u0019…”&@²ªÞ= Ê—;·iª*[€/\u0012\u001b\u0005³‰<“{O\n\u001b\u0011ӊ(Ӄ\u001b\f&\u001a;Õ\u001b8\f„8üÂÓ\u0006\u0013oC“ý\u0015¢€¸ë€Ó\u000eQž;ÖËÖÒß؎Ä)¯Ï«fqF¹ÀÆ1È>›'ô&\u00169(T•j²õÚÙ¡%¸&\u000eù(”F\" ”–0†cÿ2S\ts\n\u0000{“¦O¦>©\u0010Y'\u0010®ë=McsÔ\u0004ØÞ©\u0003ú;ò}›°1¯\u0001‡û{VH!t;¬OÃ?½‡Ü¶q £Î eÃpH\u0013Xz\u0019ÿÞ\u0011¿žýxÓ\u0011ê¬ P‡\\šM'È¿…ë\u00179þÿ„}‚#Î'\u0014́ƒ}”÷»é¥¾\u0004åzt僵´„È\u0005A\u001bú.C„\\}!iÔjÛ\u001dAڌ¶¾;’ðOŸ \u000eÞÉ(àp’ø;åòXCy¹JùŒÛ51J.Nòvô.=M@ƒo”g1f”ë\u001b+³­1\nkË;´\u0010«ô7À®\u000bEˆ»¹éôäxT/½1¸\u0004xâ{Û¹ûÝysäzü°>;\u0005‰{e«\u0006j'S†ßMqÊØ>ÔÏzöp‰ýP³5=MX= :\u0015\u001f¸Š[\u0013\u001fð\u001b1·u1ºkĒ\u001bÌï¬v+FÎoŒÍ\u00180Ûçs•2Eî§tävòÐÒ×8Õ/\fž3ùŽ»¤.\\i8“{Ô#¤)eÎç³^Hšòtéæ»e½¶\u0004g\u0002፻¶\u001e\u0007^À¤g4xŽ³©3èô;¸¹\u0014-Ks—Á%ÌÂ>Ð= \u0015/³Åas8,}F9ÔRšr\u0011sh¿Ø³ú1j\u001eé ]Oš+E¶™ÛM9\u00114”%k’\u001c\u0016˜H4v|ß\u001f\u0001‚ͱÎØÑ\u0013L\u0017N ¤\u00040ãÀØj\u0016j®0 i\u001b[s+òwÝeD\u000b缸¶ëûº?k1Zp½r¡\u000b¢Í\u0001V=}\bOH\u0001V+\u0006?®r7šâÔúTÃ\\´æ~ÓY^‘\u0004É\\9<„¹\ta§ñ$‘î;òîâ3öuJ?\u0015­\"ã¡Ãoœ3ÿeKJŠ}T^f[ÞÖQõø|R÷©ìȌĎ\u001a랰Y8¦}òþr5IPò„8/0x¼v‰SP—\u0017|IëÞ(æ.ɇÕéH#\u001c2廗[_¯È\u0006\u001bHÇ·y”-1“c’©ÈQËàH‹(DÛËvšì\u0007R Œ„\u0013£Ú\"/u¡D$uDT˜Â%Þûµ«HÝ>f·!Ô0ŠŸL‡3¼m!_“À÷4{Çýàrá\u0019©-\u000f¯ú”Ê\u0013\bðÿ(jˆè€‹²ÅÎÃÌ\u0012ĖUÒ±T§\u001d#\u0004i(9\u0018\u0011í97­öºÛïH¥v•%!ßOWª·\u0017Ä~ãÀ½<€A iŽ¶…\u0018/%\u0015Ýز1PŒÂé\tÚ/¨Ueiñ$ÛÚOw±·Ü9\u0010C±0o\u0011»>ôí±ã\u0001¥\u001cPuÔµ·Ü=}\u0010C±0o\u0011»\u0000ãУ¶å\u0013Ëgí…éð\u0011£\"}3£Éx{F\"S\u0017^¼±b^Ù\u001c v\u000f„wsõ×ý½c\u0014ë=}P£i\u000f\u001f,Ðx'\fS¶¿£aDŠçH‚\bOó>.ü,LœD…º‚Lý.\u001cœ\u00106Іm…™¹ÿS\u0005~©'È3>§,à:FAú4{vìÆùHèâ\u0002~\u0005ëAú$çpq¬…%=}AúÐûV\u0005©¼rf9Ø\fy’Ñ0\\î«ï= ©Hܓ\u001d‰±(ä\u001fâ°6^€ÏO\u0000нڀ/}KŒZXÊ]w˜Òb\u0013þ/U}Ôn$q2èÚ3¡ˆdüzbP®µPÔ0‰Õ˞í6¡LK\u0015¢\u001doЃE¬= \u001eÎèt¬ZóÉ\u0014k\u0013+= ¬˜ý\fÀ²‚­qAå¬'þä\u001b²'þì[¶'2ã[6'\u001e㛯'\u001e\u0003\u0018Ӗ›v{Uj˜²^\u0013¸¹îŒ,¹\u0015<ªJm=MÖ¸\u001eʎ5,\u0019ró±Â\u0013.Ó\u001b=}t\u0016xHë2ÿ\u0011ë'±\u0016: ò>A6Ü3ÚȖùaÈÐ=M%\bŒ\u001cmٌ$UÀ°²åœ4“ä\u000bÝÞÇ8èðS\u001fæ\\ö>qâ¯}Ñ\u0006xO…üx͒¼É¦;\u0005çÒgÿ;\u0015»D.úâoÆ\u0017ì:Ñq\u001e|Š¨\u0010m}'¤@nÍ\nÁc[)•Ôp\u000eh¦\u0011ýI”Á­×\u0018Åà+(w9¥¨ì\u001cGkÁ,Í\fòש\u0004%t’°gX\u000bC°\u0004C€\t©}½g3\u001e¿´‹„Û±\u0010\u0012F£îÔòêÖú\u0010™¼ Ô\u0019lÝÂÓª±†FOkéûT•b–\u0004l›SO\u0014À\"4²äq\u001eǽbê¥,ß*i\\ô\u0019;S€‘FÀ\u0007ÿž$ª\u0003AÉÞF¸l\u001b”UKŸÑI\bè$u¾Oå]É\u000e×ʴ̊Œ´Tö>[çƒû ³Ü™\u001e¦dÍ\u0000O\f\u0013\u000f=}¿fW,u&Gâþ\u0010ø¦ì>N=}ù»F‰…\u0017½.Ö]MÌÔ¡‘c·»vTø0\u00162ƃM1†«Mø°=MöÙr\t/*‚R\nÙÔ ä\t\n\\.\u0007ô¦Î0ƾ¸êÅé#îmQ‹k;Þb\u0012Uä€\u001dJrr ý¬È˜ ¯Mo†,ܲìºBë®N­™äè\u000b$*{$ô²ùn]/!\u0018§\u000f¶­!ª\u000b¢OÖ³©oIz\u0010¤4Áeîô[&\u0018ãv\u0018ÃÉÎ{HÍë©Ò\\\u0019\u0018Îú4¥¥ß£»‹œ\u0016±WðNÕÔs{BµN\u0000\u0017+Z\u0010‚,ôToI\u00115yhÐ}naO,\bdèDqU È0q\u0013¶œÍRÝÒ4L\u0014Ü2¾á\u0004{\u0007å¬Ï]<º\u001f†\n}QÅÿ\u0015«^pY½Ÿ\u0003\u0003Œ.ÓÖv\u0017\u0003•UÓ\\)Œ›ƒ³\t\tI’®ÖŠ¹\tqÌ\u001f¬vÔ\u001f­\u0016 \"8w\u001c¾ñ\u0019\nI°ÅîHõøì˜úÝwܤßi‹%aƒ\u00050B*\u0014\u0015;Ó´±ï5Û|\u0019\u001bƒK\u0012\u001f´ú¥\u0010²IéëÕ!¾úÆURD՟J7ž\u001dFEz\\û.*z\u001flîAԓ¼…£·”Vä)•«zp\u0006!V[á»DB\u0001ÿx³Ãœ‚Â%:WŽÄËÙ\u0015¦ˆ\u00116ó{³Ûyµ2ã\u000b~Ó= !°'c\u0013¥‹þóí1À\u0004ëÚ2ÓG„«¦š[ÖÞm3\u0015M\u0007á0j»)\u000f†Ãæ\u001dÃæMª¼Û]ŠÂ\t+“1œ½W¬ŸµAEçRè\u0010̵·\u001d×GÃ;ƒK£ø‹àÇê=}pöÄá²kéâ@§oÎDEÂÈ«™F¡U\u000b\u001a…\u0014v¨bò^ÄÏ×\u0012í\u0018*Y¿KÝÛގã=}ÆÊ<\u001dMâH¡·Ç\u001f\u0013˜ØßÃ.\u0004\u0000JpÀ)ñ\u001d\u0017*,\u0011Ë)ШŸÏݘk0-\u001e<Òq™\fÿd‘\u0011\u0015¤\u00147¸¥ƒù¥…W'B\u0014.2WKà§Ìëz_و\nŽäñ!J^žÇÀf\fÕ\u0012‹Ÿ£…ìµÜ¡ÓÅë Äî€öÉò¥Òimu³Ô(\u0006ÌB邒€\"‘—,ßà\"]!í»1ƒ§=MèCf/WrëF\u0007\u000f,O(ÄCC\u00041Å*U$\u000fJ\\\u0015\u0003ŠìV]\u001c\u0002•AÁ†ò¬ÑÜ'‡Héô\u00152Z>,©ï\u0002ï\u001d·‰¶\u0000Hö¥Vڀ\u0005CJ\u0007AuĞÿ“Ô\u0005KG”;Ë\u001d5Þ¿*ðÚ\u0017ûB{½\u0000\frèJK+”ˆ\u0016ÿ\u000bz\u000eþ\u000bâ\u0013ÏÔx½†\u0015ãõ\u0006'»Þ\u0015L+0¶Á\u0005¯\u0018²¸cšG‰:\u0012ù= \n\n´æVüK¾ C0\u0011‚ÎSý‘4Å0= ší⠒-~Šˆ¥\u000bmÒRU…ì8c¹\u0015sž\\E²¼ïû\u0006\u0015\fn¦¸]\u0010͈60ÐÃù\u0011/Æìâ$Å}}#\u0014üÄ°^\u0018;¥ŠøKBÍùe…æ!™\u0001Ö\fˆ\u001a lB9Zþ O>£ñop\u0012!= Ö\u0012)\u0007T]ŽÒ\"•>(Š¡üâ>?\u001c–¾ !zö\u0010ùÂ\u001e†þá›Ta–\\\u001f‡8 LI¾ºM‹Ä¼ÈÍ%Iãù끞Âz†^Úb\u0019{½æ@\u0010\u0010å@\fj¯®[ÖrŸ\u0005’Åñú%®d\u0019‚m‹FvãüÓ\u0007Ç},/3ÓÎ\u0005r¾k:†>Dx²tÁ\u001a7_ÔfŸ²ÖJ¿\u0017=}òޑÕ|AõEÒ*ù\u0001\"O&\u000b}¥Hˆ0çôWùØ\u001d!\u0019…\nÇs®zã4‘æ\u0012œ\u0003\u0002\u0006r„ ŽPÅg\u0015û›l\u001eâɝøÑ@\u0011 þ~Ê°¶¨ú\u001d’퍾Y Y\u001bÓ·¿~a…²Æ\u0017Û\u0001\u0005іS,‘|\u001aŒ6ól\\ŸÌ—PË_Vy†Îù ±J¥½„\u001bræΕù\u001dìT®G[ù‰BnWôËieºNúûi¨\u0016°\u001b×@S¤•\u0001•‘ˆaýP?ÒdçùN:\"°\u0012”þ\u0012Å\u0018ÿŸ[òœp\u0000™dÄ\u0002PÞ\u001102Ùâ¾Þ\u001e†\u0016אŸŸw\nðƒAŒ, (–<´£é8oŽå¥’\n+»«4D‡¬Ø¥C¹À»ÍÒ°9KÓp*ÖB´¦\b\u0004£\u0019¶ÑDfœ\u0005’Eƒt8ÔÎÍY˜0Í\u001fEW¢?Ÿ\u000b>ø¸\u0004\bãè#Ûº?b҈®íq¯~Èëî·õ;\u000eœ‡î¼P£x\u0017~v/Ç\u001c!\beÌ·5“Šî4_7ÕÊòÄÕËu\u001dPÔmN{ô~\u0014Ò:!%ªõ±Fc3ÑH\u0006üµ\u0018ç°ÅF\u0012)wf8\u001e—('¬Dc=}\u0004ƄH'\"må/Á­\u000e\u001e£7p|©\fÒ\u0014\t\u0001\u000b=}TÍ\u0001}\u001dœ¨\u000e6†jÐáèÔÝy\u0006h¸È¬\u000fÔz®1ô\u00022âô«+ùÏ$Ý\u000b 0±\bÁ™\n­j\u0015›Œ–P–¶™\u0000\\GB¬žÖ¾š\u0006\u0014OÂÖù\u0005¨½¨¸$%EX,=}ÉÓ(GAӓ=}8Ž%ÅÓmÎ= •Û\u0018@2=M\u0003Ö\u0005õ“\u0010Ézr¹ý»Z+ïuûGï;ï&#ÇüüH]X•ååd¨r¯Œ*É՞\u0004ñéx&*¯ÕX\u0012\u000e¸ç7N\u001cO k™CaàOB„zrSEs®8·Œþ{:4G= —\u0004æ\u0019ô‚\u001d«Ò\u0015„éå©#EÜ\u0013u]õßºSÑÍ£ðÙs¨\u000eG\u00006ú‘!óñ‰gÔ\"\fÎLiý¦\u0000Qð\n\u0014¤º,\u001dD\u0017Ã'óö¼Gâ{ü>Á’¬¹(¯â2©ë£\u000eЄèïD\u0014I+Àgï\fk7iï8¥\u0015ؔ“\u0013í3ÿð(—èsnĨÀ†Ï•êª¦ßHAu-/\u0012ë¦ÜX'mÞ=MÎçnKk\u000bf\u001cõMÓ<–\u0016ùŒ\n͍Æ\u0003EÒ̚®f\u0015ÌóV\\È!”Óñ\u0017Qq¹^4\u001dSyáèÏ\u0012-=}<\u0003¹×3ý\by\fÀ’ ·ðmå6·¡­MI¾<\u000fVrº2F}Õ²jAŠ\u0013¿«Ê\u001cðå„w°F+i×?_˜}AÒð(ûï~wÖìzW|Ô]ÇA¥ˆ³\u0000l<@gúæ©GŸNà­ß·v›´Ósx)™<›ýޙƒóAЗ|d4\u001ehÐ\\k\n'Î6­ób\u0004ö¶Eaó-”œdcóöçšë)<7*\u001bã\u0011\u0002kcëÌ·ãk·ۄ¤\u0010\t£\u001a·q¬²\u0003þŒ?Á2ÿ²m\t†>L š”ú=MxoèÌìŒÎº\u001d?€LŽ=M¬\u0002V·Â÷¢ñ÷¢0<èäÇå“Áü—ðxîG5,ñi\u0004¤Á×\u0017×\u0015¿±\\rˆx\\.)¿À¾c{žù\u000eÀYKž\u0004$öGÍmÓa°ÿ)\u0011sJÒCÓØw‡\u001f\u001aøè²1yÞ±µü·æ«wê /¤\"+œÅL‰\u001eœýÓª*¤.\u001fÄxȂkâw%¦6\u0005…eºå¿æÃ.|„sƒ!-07ê¿#ð¸s*IY±'UZ¬@®óõ\u0002¦L·Î¢S&k@>ø\u0011þ8g{O qèª ³ÄE&\u0016\u0002õ#«CIþ\u000eóö‘HL)Cd±äbãûÁ úb¾àÇóQòOõ\t»\u001e¿Ç‘|c>/ã—\u0014˜H–û7».\\ZiéÊÌÔÐ\u00021syìæj\u0006ƒÓ¼–Ô¤•dŸ—A·Ä;ïpÜÀãז\u001bìW7˜€·\u001a\b[~\u0000yäÔ=}é3Õ0¡ÀX¾Óqä@>Ä{°÷¯ÕøÃ=}Cã×ÿH»B»ÕB=MåÛ¬o=}ó'C\u001bä®ö\n'=}=}¦M…ÞÖ0Ts*he–ó\u001bÁÃt\u0003ÛVXÑÔSB+¹f}=}9”íÍþ\u0006gҚ&\u000fucõ›m6\u0000~\n\tÀH÷\u001fý:Q\u001b¼BÍ)³’#Ì'žDDšI,ˆ¨pDIºUŠ=Mѯ\u000b±w'A¾ì¤ì4K+÷ò¤ˆ¤Û·&\u0017æ{«§ô‰:|U®õ\"ûÿ\u001c~S+Yɋ¶±Z•˜|á,NÐoGIöç\u001fJ\u001d€-°º úI\u0004É8·Ù­®¡\u0017\u0011¹'_,È\nZ±LORŠü\u0010\fVpêh«R\u0005Ü\u0013\fIÀÑ\u0003¥\u0005o騋y㵤†\u0016æº\u000b±d\u001fÒ@T¨\u001eàNۋ¶fòn×ÕçYӄ} Ö¶Ûø°\t]_¤€\f¶ˆn ¥š†*\t\u0019°\u0010Þú¦=M/\f^N©òߌEŒ®Ý†ZÕs´\n1Wޔ.«:àÛ¶\u001aU\u0004MÖ'\u0006ø*TM̱ö딤Ïv]zœ‡t'I„5\b=}¶þ‰^cˆ\u0002ì^Q‡Ô—ÃÏöv\u001e;ïÂ-rŸ¯\"\b ;\u0004»º»1è«[&@»R=M]-„*àç½µ×µä\u00067כ@\f‹¼=}'ÀáŸ\u0005æÄÃú‹\\Näe-^ö•\u0004ìý¨8§pöè\u000b\u001fH\u000bð£º&ËÆ\u0005dt#Àȁñ²²\u000fw5kÊ\u0016\u000e_^RÓþ%c}ç:—DŠ6ƒN¹ø-+Nuº\u0011·‰cºY\\kÔp]Ž\u0005´\"É»K[¬‰=M\u000b0Õÿ‘ÖÖ\u0010\u000b×½¦)DÎ\u0003´{\u0018\u0011Ôºõ´šÍm7º©l¸<ÞÎdú*Y@\tŽ+ÔG\b;Aº5*L?¬\u000e/Ðý˜3ŽšUï\u0015UÇkh¬è£Q1\fÓ\u000e~§ÏççŽ,i¹Åõxs£îþÀP\u0019û÷ÀoʑD6¬Ý\u001b= È¼DýMË\u00013\u00144²C\fŠ^‡¸¾£±¹hÁé\u001cKñ€˜ózŽ–\u0017¤/StÓ¹weP—ͱÆB\u000fů0\u0013²Í7ñ1ôfãËßúp[^pô’\u0013Ü8Ì2÷\u0007It0²‡>Â.Ì4\u001a\u00166bà†­/”YÀ–=}ŒáånӒ‘ÜûôQ\u0014ɹcœ$dJ´d*+\u0002©yt\u0015ç¾ìVY1´©eo\u001f?s;’þÓ|i\u001e}\u0010\u0015kÀëöH‚\u001c§‡ZõFÜN(µŸâ¾Ì/C‡\u0000B,\\¡g®\u0003E= z¦G\fʁ\\ÙZN¡ñ{:w\u0013”WQ½%zÎôÆýˆ\u001d:XNü®\u0018l2¾þ\u0012ï-\t€¼âë*\u00126_E.²Ö>†¯§Ñ²«lÕ bo”ÿŠ›\u000eT¼=Mô¡¥5»\u000eDðs‰\u0012ìz”7÷,Ç?]¸vŒÿ±v[Òð­Ò\u000fù)\u001bh?/Xði³Ù¦î\u00017Áš%Ë&ü\\×/–Ò\u00076@³xÈ7=}<ÂOR'ŸrJ!3ueh¼#H+[¶Ð!ã¢Ö¼È³\u0019ˆ¶»½±_Þ½‰÷Œywñ\u0017&C§&Aþ¦bÞe?Ä´\u001ejãÍÿ•µÁÇfø¶«ÜèEÀŒöñ(ÀâèèéÝw¼ ¦%(\u0015Ó?{Žò¥˜kŠÄ/©yxÓÂ;Š·•\u0003æ„74\u001e‰Ö5\u001eٍ®jëËÊҍ>#g¬\u0005ûkMJOŸËHIÉu\u001aTä‚(tZr»“\u0012_‚§U‰¥_\bwßڂGNE‚m \u0011e(\u0007|¨Š“,=MYz»¿Ù™I*‡èf/k]i\fjÿ\u0019\u0005&rpP;~ß]\u0002û4Èv¹HC\u0006a,J\u0010y1”Y+LÙT((CÀV‰ÙS‰ý1\u0010Ð8Þn\u0018ÊÉÆ<ÌòÎ'¹&ìT…̸BÖarÄÿ\u0010îˆÝÇ°¼9“°¨2¬ø—îÛ½³q\b;Ô5rë\\“ù?€ÆÍâ²x©çè\u000bv‡\u001b÷B\u0010A©GE)ãà\u0017×\u0007›AõüP\u0012‡Ì\u000eÂe÷jIÔ鈁4pè\u001aU\u0018v=}\fþ¾‘¬\u0018œ;/ùç4\u0013ìô\u0019dzóÃÐ&³\u0017urÐÙòˆò\u0015\u001anU\u0016mh+ÍlÝEí¶m\u001a\u001b„¥\u0012å\u0016ó!\u001aë¹\u001egK€áQ¹Š…t­jR…ª÷ÃÊ2\u001aŒíd\u0005¿bm’ËrÝ\bÎíY\u0001\u001b­_»o\u0003\u001c-o\u000e½;ú\u0011ÞÔ\nDSfí,Lú«&ÂûöW\u0011’'€K¨Ò\u000fâ­IÌ_B\u0016†zQh^9šF˵éW:=}ï\u0015ì×-²Ï\u0001ðÑær€–c€üù¬Ñ/ԗÃDEù\u0015´“i\u0001¼QP4%Úíö”ð]¡åŠa–E×òg$€ éÇbÇìUbÔ¯Â×£¦Ã£c™lê¥õ3)\u0017yÉØïn\u0019ÿš—Ùïn\u0019ÿš—Ùïn\u0019ÿš—Ùïn\u0019B°M]ù£)DÀˆñc±[^Ÿ\u0015ÍÜ2ÃÌ8\nv†±\u0002l8‹22)vß î\u0001óÝ\u0007Ï?xÎ\u001eÄwêÚËéÂx÷ù…\"¨xÆ\u001d\u001aÑëÞ-ϒ-ü\u001e^Çgæ,r‰x\u0001\"Վ2ípÔ±­Y}QË&¶g\n\u000boñ\u0018Û²[K(\u000e\u0000\u0014ý\f™â8¬—Z\u0006¢‡Ò¸Î&\u0005\\\u0000@¿®Å„úÊ\u000b܂ª9ƞ\u0012÷.8‹VâöémÏ\u0002\u00128pO{ÜT1Oâ‘p¬Ïj=M9Â= \t*7\u0018É\u0007²\u0010Ð\u0010Öñ\u0012튕ý\u0014}\tµŠŒº-‰VžSlT\u0016üuŠ\";M·y\njƹÿ\u0001n±1=Mꁄ&\u000bOŒÛ½\u0012‡íf·\u0014\u0017 •â‡T09*ÂD9\u0012qôq¾—\u0000ž/‡ŽatŠ6x\u0007…‚¥”u»™\u0017=M²–$€“r&áÛ߁¿fœ\u0013\u000b†¸{\u0011¤[Q ¾ß|±*‰q'¢<Ü\u0013ݐ¥ |‘\u000b{ƒ06ô¡ëM±e0Á\u0004«Ì,£œé\u0006j}û›*Ksåʤ\u0000\u0000¶T\u0000Hiý\u001a°}\u0019x\u0005ã-¹Ê]\u0013ﱅ;\u0013+\u0006là1gR¿\u0010ÎܙŸ‰\u001b€g”²*ïY£ÝiÍh+hém{OÿˆJ^\u0013:SUú4óˆ\u000eÉe~ìo‡ÎèDö]ûÁœ÷\u0017\u0002xDZ¼}4è9±\bޜǙ‰= ²î\u000f\\+ÈzR\nY²šV¡Ÿ¯îv= l}\u001ba\u0005û\u0000iÍ\u0016>t(= iWƒæÊÝJØFfM\u0004· úCát¶\f\u0018;¦¨\b\u001cu<„\u0017éQHó–\bwƒ]=}¯uÚôõZ\u0000‡ ƒ£(2òD[]ö\u0007\u001cØ.™‡ti¸\u001aË9âDÀ®\u0001t=}\"átnPèwŸ{òý<øòb= >dÎóª\u0006&°ƒ·\u0003%\u000bšY;Úf·‚P]ƒ^\f²Ë®\u001e„,a+±½«ß»\tŠ)d\u0005eë'‡ýe\u0013+µ•\b¯\u0000’0ä~I”«\t.Ø\t6ô\tݸP\"ñj5–Vó‘†#¹0\u0016T󐯔.Îïêpêö3ªMú\u001dDxÉÂ\u001bєæ\u0012Z£Ï Î«¨Z%„Š½-@Òf“\u0004ï§õÚç\u0005”fË÷wç\u0006H\u0014Ïmð…3~³*w:Í\u001bÀ-jñš§WÙñ'\u000bűûM\u0004\u001e\u00010ä¹½;\u000fwƒ\u001f\\©\u0002j=M„7Gh ~ýŸ9\u0014\u000f4\u0016ï\u0016…[Bk\u0014\u0011¾j4¶¿FR\u00147Š\u0016[\u001fƒK͇»üddNÜ'\u001d1î°¿™ð¿\u0006¡\u0013\u0007ìmÇð¢x¡j/øù9n/Ož‚kXAš,Ì.í\u001aÌÀ\u001f-7-†\tefzñeTòΨ–öŒ%,î$\u0013’˜ÂdHîÊT!Kÿo¾\u0005ʑƒÒ±0ûÏ!_Vô_s”3{o¡_ûX“1\u001bƜ@[֘:\u001bÖbÈÎS\u0010f*\u001a\nŒŽªÕ‚t\u000f\u0018iÛYÍ\u001b©n€Ø2Ð諾\u0007R\t°ÈîüzÂN<ìZÐÏ\u0017ŒÁ™W¢´™GÌ&ø¼\u0002\u0003Z\t‡TjZ’U°\u0014¨\u000fHv\u001eÙÕO3ØrŸh¥éÙTc“9—= ¤H›XI\u001dIט\u0015ú-\u0001v.qéšJo+dw\nŒ«}?QCöHçI†¡Éz·Þ\u000esϝ8ˆë„‘–\f\u0003º\u0002Ý¡È;9‡èt'ö¬\u0017„ˆ¥]Ž\\']ùÑJ#xÎìØ\u0017Ќá‚ãœnYsÑY&\u001dŸðÒ’ÆŽ\"±4PvÔM¾=}éÝ)ÊL\u0012t¼Õ\u001c;ìÔ<Üw‘“¸}a˜½\u0000ý\u0018.éÐ= ê¼®Átêöu“º×=Mt¾mÿ™$ÑOå(¾\"óqµ}\u0015“\u0002-ìNG”Š=MŒwH©U™5\u0004^\u0012\u0016o­\u000b¬Ô뺕\u0003 ‹©¾\u0005\u000eCÔ\u0015Ÿý\u0004=}ú¾¯\u0013\u000e*±À\u0003=Mz´’K։m^eX\n\u001aם®Ôøàԑð\u0012»\u0002Ôf,=  \u0003OÀ#I\\&ƒâw¥¦=}°ä2êæ\u0004Tö14AÆsL‚ˇ\u001fÁ09\u001eO“\u000fYØ݌«ëÞÌ\u0005$¶äx£\u000b\u001a/(\u001d‡\u001b[€?£†ÜÙ+\u001e\u0012.ÇRìSŸ×¼¡Ñös™„÷;TŒû\"\u000b©I‹r%@r\u000fÏmTj\u001a6Ü+\u0017=}.Ql1\u001b˜q¬L@\u00003×h¸´¬\u0011\u0013~â²vQpj›²‘óù\u001ecõz®-ف»‚dªQ\u001fTws²Ú½ŸsRsÂê©cŒçÃiO¯%R\u001eÓ\u0001¯®ä\u0015\u0000«\u0011\u0002¯(*ݯTFftLÓ¿ÖZé\u0003—;ëß ¿¬YË­.^èÆÖƽ\b·¦h»Gï.(–æ,\u0000¿Q‡h\u0004¢\u000b¸ï²MÃ\u0012¸² ‹\u001b?Î+j—4¬Ë\u00018# BµS\u0015÷ÅÑÒí'f ç›\u0019ófcô°j\u0010=M§¹ëzy½Ë\u0010×»7C¤H\u000bS™H©9Ýý{°x….= ¹€…Xs~LhHÏп\u0002\u000bô•î.\u0018É¿Ñ Û_§1?Œ¿½ò1®ô¿nº\u0016wPŠ‹>otØ(FÏjŒn¿¬ZÛ¿Á\u0014{âŠû”9æ™<†\u001aŒ‚\u00051Ј¿Ê\"í‚NÛyx\u0013'w\u0014÷z\u0016ûÙ\u0013ûØ\u0015×\u000e…{È\fš*fò\u0015ã\u0015ò•øõÌ\f3ŸœRTÒ$\u000bOU\u000fÿ\tG\u000b\"Þúôž@ü\u0012M}\bÀ¸þ\u0007\u00009\bI/K\u0016õ™= õŒ¡Å\u0000|\nö$UèÊ<“\u001bùÊ\u0004OéÑ;\u0011T¶—\u001až®(Z¹®À7>'úž±¬\u0010\u0007‡šåžíÄÒìêÿsNP›õæïpÁÇaa\u0005Ì1ÂÖäoVAÈ1í\u0016ºF\u0019',1p[›Ñ\u001f\\;X\u001eP\u000bQZð5Yú¯\u0002\u001eï7!íOyr´\"È\u0002ºNÅÂ-ºa·\u001a€žÏ½qѶþ\fxAœ±‘eaôò\u0019ØWÂÎoY\u0003Y êSÞ\f­‰Ô®OI= °.¢Ü(àÌ@p¡x\u0014\u0004|íòy\u000eø£vR²\n\u0011î÷\u000f,Œ¥ùú= ;НY?X¢U5È:R\b\u0000°ÙTۜÙ\u0019o\nºÞ\u0013\u0017Ò\u0016OÞkU‰Á\u0006üúv{·\u0019-pb\u00191 \u0016o\t2ŽÒV\u0019jRT\u0010aZ<&Ÿ¤ö‹ˆÖ\u001c”\u0016ُp¾yŠxêùžˆ¾~zóo/\u001dúÓVüxˆ}‚oÇçé¤@þóp\u0010Àí\u0002Kòî\u0004ç´Ðý4¢ Ù‡a^àð2ë‰v^s²\u001c\u001aõ\u001a‘ì\u0012\u0018sB}a—_\u0005£Ü¢\u000eñ=}mÄ×Uìñ4ÉF\u000bëÂÎ\u0015·8—f(tF¨\u0006Kèm\u001b- \bæ\u0000þòIR¶JupˆÖ‹€|Wbfÿ…Aq'V\u0011÷\u0003äÆ¥_\fuÀâÕ9ªô“1ó\u0015Ø+G^»íN÷ôè[=}5ÍÛ0m\u0001ë:›\u0005\u0015TüíÐþÒJ¶Òú3v„ÇM-\u0001è}bzóôJ\u0018×E\u0007àðn~ë9ÞÙv*KP\u0007Ö Þ\\°ìà0\u0019vE…àg’’ÈF6žLŠ9&\u0017õ ;U_2uS\fjlcÝ8K\u0002݀\u000b\u001a%Y×ÞèêÍñö|JV‡\u0000\u0013A=}\u0011\u0000CvºV̄—è=}\u001fŸÕ\u0018|Bî\u0012\u001aÿHØ>QöBXÚ\fðu\u0010]^Ñ€\u0002\u001fBùÐ\u001fë0ŸÔ\u0018‰œ—çþã= œ\u0016=MƒÒl\u0014„\u000e½U›Ð(Ò ò@ù\u001fGÑÎâö“=}RGV„Þ= ÿë\u0002Yº6ŒAõ•€\u0002ñ\u001a²ú33•.uÕMk—ï°¨\bytd?‚\u0017™íÆ\u0010\\™*¡ÅffRpƒ›= Üq \u000b$ò(Д_몾-\u0018\u0004ÿE*\u0014ȝ»õ\u0005#Þh)\u000b\u0002\u000f'9èi{f§ZaXeÒPô¡T°_\u000e®žzÓ–\u001c\u001eß\u001du¤\u001a‘>%€+á\u001c@³6€¼Æq\u0017$æ=Múßâs°Š\u0019\u0017êl]Á+ü™ºIəç\u000bûÒߖ°PæÂ\u001b~=}\u00044EÒA±*\\@žæê\u0012£\u0001ú±ãdj$Ëbâ« Ò;ƅ#¨ÁR½/ÔÔæ3†Ý·»â¯ÚªmÔp\u0007ە¢À1¼œÆ\u0013˜oë¯{ß­¬tF4Ünµ\u0012)ü„N4¥²aÌSœ-ØÏZÎ4ÁÑCqé'\f\u001a)∯J–«•ðã'š»ç2¿®N\t†\u0013‘¡Û7\u0012¾2²A¶So…\u0012_žœÚa\b}\u0003:i¹0\u0006ÉåRhÇ\u0007\u0001@'ù.Êæ\u001aOÀ5¾“ß\u0016­õÆJE^hח¢×°ÚZñêF€¯\u0011=}$¤Ê\tEFžÏ\u000f\fؾªV\n¦!™“\u000eŽ#Qü±;†Ôª€˜‰ÅÃ\bÑ\u000b=}ÆY8ÞåXy¬\u0012*ۆiÀ\n/“\u0018ä\u0012<ÎÙ\u0011\u0016hU\u0004\u0011› p°âÀŠÄC\u001bÁßx–”}kÀ¨~€ÔFbªI?—c\u0010HÊ\u0011‰\u001ce\t5º\u000fÂ\u001b„qï\u0012ßmš)F= ²_– óÜfº©š \u0014cy²úR›Äë„2ÀŒ¡;\b¹#0þ¥ƒQÂ+ïøÃ\u0019\"²ç¾*ÃWr°e\u0004.\u0003€·/È°d\u001b¼%ÖÚæÃZ«h'xDKÏ°h;L\u0004Óò¬fü= \u0013\u001f—¯jl?\u0013—Ú0c›ƒ«»‰èÃT\u0006Ç\u0019©çÅÓÞµèéô‹Œµ¨&\u0006ôëP5Q\u0006F\u0004YÕ½°œt{}ЩøÁԋ\u001dÇ©hÔkÀµ.,\u0004Tëq+h@UûÁ¿* ¤\u0014Sâ·*Ғ†ƒsè(FÖø›WåÝÖÿùDðH­é¦†ô†¿2ŠN…4\u0019ÔÁ=}u\u001bïA#±6¶“ÌÙ¤\nšÊ\u0003€ §gyÇÃKúÅeÊÉÅÌÏ´ü>¶D6@+3š,K=MQi!=Mç{M´Rii¸=M·Áôƕ)½•Ò=M—\u0012I$ö²°\u0011Î×óryÃÍç&ön׳6Ø\u000b\"\u0001]ásÖ.©ÎŽH\u000e\u000eÐi˜x\u0005Så®8@¹¹–WS¬z…åЕÙ\u000bԋ#¹Ðò\u000eÔÊò®VjýÌ ÐOíXûÿR(&Áêé\u001e1ðàܗÏÛ¯Ðܙ1„[â<\u0006&àjòÚ1\u0015\u00021x\u0004¿²…Ûq\u00151”nÜw\u000eÛßÚ\u0016w‡\u0003žÜ·êÜ­vÛ\tB‰ó\b\u0015Û\u0002‡\u000bkˆ;\"&\u0006|À1‹ª¿&A\u0013¿ÐƒK\u001fd\u0004•é­ž1†—êÌaÒuž\u0012¿\u0002\"ë\u0004-ÛíîÛ\u0015mÛ¥¡ˆKQƒ“œh\u0014a5FO-fK)FðÐê6‡üÀjq\u001d1ÌbÜíǍ©Ì_ÇW4Æ\u0002Õ[,Æ\u0001\u0015ôõÆÔ¢f\u0004ÒôìYëÕÇúȜ5²5Åì(GýõÒ\f7× ‚\u0018¢¢ë\fP½€\u001c\\4xj~\\ùä(ïTC\t:ÅÞDëtœU<\u0018$o|ýt\u000f8˜z2Œy1ž®OhÕ\b\n2ñm/\u0018\u0015ˆR¯Þˆvî¡m‡\u001a.8\u000eÀÙ̈z±Ì†oÖ8qΑ͒=  R_\u000f\u0001H\u0017\u0001êóÞW¸}'˜³ÉX׺\u001d=}ý¬ìžÉ«®2pµ½©\u001e«¸¹„%†\u0004ÑW\"SÿÛI^ñË÷\u0012¶‘lš¬vž¿º¥\nA¹]\u0001m´‰›‚³]q\u001bÇo2\u001cȗ\u001f”è;PͺÍÀ¨\u0010\t\u0016”GZa[!{¢Æ«Á£f£#Ã#pY\u0010~Ÿ>\u0010¾X\u0010~Y\u0010~Y\u0010~Y8\u000fC€^ZtVf\u001e\u000bŽ.æÇJ\u001e%·ªrt\u00114N—\u0013žÀ½Î\u001cãú%BvS¢Þ]5 8]: Hà\"üËM;>uÛ'Œqá\fýÌQë*œø,ðï6í\u0017\u0017,Ök3±Z>u—¼Î½9XF¸°ñ\u0017ˆFÞ¬º\u001döÝæ£@@²ÄÎBë}m¼êéz5\f~i¯Õ@kDP&(GÜôéF¾=M‹–Xé\u0015ƒ\u000bF\u0015’\u0011½>ÀCl\"\u0006÷6Úð\\\u0011.\u0003l^·œ\u001aú#\u001a–=M«˜Pèðt©[j\u0010é\u0014ƒÙŸ–|,Ê!\u001eC½aªձ\u0004\u0000fô_>â$i†\n3•œß)ØÑ$ژÍÑQa,>\u0002‘ãl°{[‹ÄM»AC̆Ü1\u001d°¾b\u001a\u001b\u001c‘¶ñ¨!hðŸ'\u0013dÂ÷\u0015Ô# À®\u0019*UF2(¾p\u001eœÔõÌ'¦™\u0005\u0003ƒ9å{à܋RögnüÈ\u000b°Mƒ J½oýדRü®‘P݃y&¢+¤\u001bº¾f\bVÌáÂÚ*§ü\u0005–\u001a\u000e¿³X(X<à×EÀtw¯r0\u0011K]Š¤´äÒ+[žCMd²ñž¦4žÚ»‚Àæ\u0014RÆ¿íúE\u0013ëÄ©Þ­†c\u0017ß´î\u00076ÔýA-~ÚÕ3\u0010A¨r<¿·V‡†ìäÄ\t‘8\u0003ÕC¯Zñ÷ÅeQ½E\u001ec\u0012|£Š= p{ƒ{­¢vÀó¬%y6\u0001g:˜†Ór³Ÿ90%|\u0004¿š‘ò¤0֛NÙ2¨%ƒ¤Cu§£c\u0003YzY\u0010\"\"‘yY\u0010~Y\u0010\t~Y\u0010~Y\u001eÚVMBÛ\u0000ÊÇ;ÂÇ,\u000bS×\u000eÒnÓÈô9Zvˆ\\œý$=}ýè-yÍVnü(P¦xë\\Fñå<©Îz˜ér^²\u0011¶\u0004•\\âmU¦L]ß«P-dˑ½mug\u0004\u0017ÏÀdƒ#4ûÒ½08n»r½ê@€\u001b\tñBë9€Ç=M\tñ„Cn÷׺ðŠ9¢¯)Ñ@h3'|ÿ‚Ô:\\\b–û\u0014\u0014¤A5.[¢!Ô¢éæ\u0002ú$?\býWˆ=MV’5Ñ&ø—¼\b=McèPH\u000b\u0007ÒF˜­é˜\u0002hêzxÏ~U¹1\u0018ÿ \\$ÝPð»9\u0011‰€NP\u001bo€qc_À{â~h0\\\u001e[ù[º–Zž4xÝkžæÏÚße‡ðj;N\u0013%æaʔ_\u001b=}üöqµø\u001f1ªbÒS\u0010~È9š= eigNÿ\u001c\u001eÀ^Øڌù^pwF\u001aÛ[ÑFʂ†Km \tz‚Š\u0001u¦Ù[àgŸjÆ\u0011‚ ï•DÊûQ\u001b-\u000b‰Ö…ªß\n[›®mn\u0001ÓØ¡Èø‘R»\f›=}[º\u0012\u000b]—9ú\u001e‚”\u0006h\u001e)o¢#‹2ÿõžg-‘ò_L›/ñ}º™*\u001fHyŒ¾È)‚Ô\u001b¢¦˜žâtÜ¢.o bl{“*h\"4?¢2춰\u0014Á\u000fgÂø\u0006mÈï\u001b~\u0005ej­ö=}\u0016oSî×ÊÛo%<á9WÛýD\u0011\u0004p€âً Y\bžÎÞ%Á}\u0016–I¦²ÒÝ5\u0018u,Þ*?ÜV~¨nÐQïþŠéz\u0015\u001aw˜àÛDŒ,…ÅÒ=MŠ\u001bv\u001a)²ZɞÕ\u0019_ÂmF <Øß#ò&¦<àëHad¯¸e´Xóm8f›P»q֜«o\bÆ\f:1…]÷×6È\u0006ó7+Hb\u001b¿\u000eh…\u0014¹hFÐíCPÊ4‡AÇu\u001d5´˜GSÿ7->Ë°¦T¯=}hÕ¬·reýžÊl¿õG\u0015ô:l†C\u000fá\u0014\u0015¨OøËG÷T+ÚmhOóÐ\u0004#\u001dÌp½\b‡˜ÑÊ= \u0012¨| ÎL½û(—3=Mi°N\u0004˜+ý\u00111Mf\u0011ïàȆ½»ÙT4Ð6>\u001bÞX¼=Mò\u0016­ù„ï.Fq§¨\\ƒ^y(ò9QËI[UH@¾~\u001e\\tžP¾pÍ,a‡ñÿ/ªZ\u001cÓud6¶ÖßÜud.a= _›•m®ž\u0005\u0012—ñ\u001eVÚ{ªŽøá络\u0005×e:؂\u001fœ\u0001†jBî!/“j\u0010@â(ɤÓÅ#Ž\u0002¥\u0013K¯g \u000fÃR¥&Ë\u0001µg£p\u0003-\u001e¨–•ìÓqŒÄû¯„[\u0018Ëù\u0006å\u0014¢½m>õËÜ© fë>¹iœb\u0004WK°ŠtŒ\u00137´\u000fA´då0ëe=Mż\u001cÕ5$‘ôÛï1EzšË\u001d¹ê\u0006Zâ=}ayÔ¯½½&z.»iÇhÕ\fðÏô\u0000†;Î0\u0006t(ÛÕ= …üØÔA؆lrï\u0003˜)§9\u000eÉ5Ïì\u0007i<çiÝʄ×ŬtvǕF5\u001cÔÒ¼n‚l\u000b‡JÓ\u001bö­Ž]GuRÄ8Ò*õtÕî†åZןÒG´„7q*$Œç‚íÊgÞ&ŽÆÖ³ßoƒúãɦj\bU‰ìÉà&V\u001bØá®0Jü\u000f°mIŽ[\u000fÝám\t(\u0002±Òê‡\u0013‰\u0019±<‘\\\u0017Â3îgHÿù|‡Tð8ê˜tßٌŠVKÙÂBPœwXÑÃË^#X®®ÛŸa#A·\u0015\u0004÷ÄjRºõ\u0011þg¯ü´•àè_\u0011úï>\u0005±oÐi‡èÔ¥’µÙ™Ñ„4µñ\u0019ÌÈÑR7M\u001cHûßÎH2þ¼àø\b«\u0019:4€E¿R›\u0015y2̊h\u0015é®Í\u001bø÷dn\u001c¸/\u001b÷d¬^íù×÷…[]5gZ8\u0017•KåÏNåYT­€òø·\u001bú&E=}f¾N\u001c˜D=}ðÁØ;ë=MSþöfh:Ø;ÞwuHI9\\®=MÜ\"J9è)\u0018»‰w„Ôa1:ʎ+\u0010\u0000ò\u0017ûàò]z†[TAQR<\u0011€c„E©Éð=MCpL©ïý×\u0015ÈC´\u0012ìÆáî½\\\u0014V´\u000epÉW\u0005=}ûwF,þ\u000e=}{™C,£àÄ\b”å?\u001e¬<= ék‰\u001eå‡ýÅQç-[R³Ô\u0004T+Š:èß\u000eÈ\t/2;>ø\u0005qò·ÆÝÃ\t†ÞԖïțÉìó\u0019:ó_çe~®µ¿¡í‹Ç\bù17n H\u000fþÈȉM7ap\u0007÷Ýl›;ÈfX2¯€HÕ9B8”ŸN/Î\t\u0015GT\u0015Y,‡OAÏÊ\u0010:?¨²‡o\u0012NÃpød=}ï¨Þ^Ìórù“\u000bb%\tò·?\fJÇlèìr×Èè\u0015È\u0012ÉΔ}Ig”)5.â8[>K«®øtE÷è2aÍ9oøÔ\u0007R­F^ÍM¢Ÿ‚ç0ôS=}D¨=M9\u001aöÖ\u0013-½ð=M­r¢¢0½@±€»—2¤\u001c#X¦­¥Ë;ºwY\u0010ÎMñ\u0010~Y€N€}YPCY\u0010~Y\u0010¢\u001bÉ^\u0004\u0010üf79)\u001fámÖ°ÖÙ»ý@Ùß\u001e=Mk¼T\u0007î\u0010\\úgõb)\b\u0017ê.¼\u000flÝjÕ\u001c&\bj¬n5ª9íâÏ\u000e¶ÛÑ\n\u001aËŒ\u000bø‚\u0014WN†³j˜ü1\u0004\u000e¿Â±ÝÕ\u0001\u001aÇ\u001c†Û¼”7=}nÖEGJ\u001dÀr0™Aٍj\u001eÕЕ¿‚ƒÌ\u0015{vŒMJ\u0016ò™BApT¦Ôv©\u0015‡®ÇÇ\u0013[\tC\u0017Nc;\u0001$œ&¦\u0004\u0015ޅce\u0018$*\u001e¦Br§Ñ€±¯!¸›˜Æóá)sÅ<óÔ.“RCÓ½„äØÄ\u0019¶Ä\u001dê„\u0015\u0002D’\u0003„l\u001bÄz¿Do­Ä‚©„\u0011\u0004‹\u0014„xÈĊàDgîÄ~º„ŒâÄgõ\u0001Éô•JúM‰÷í¸ù…9óÙúó­zõiÚù™Xôq\u0017øY—ö/ËlêÍöÊÍÒ\tÍ\f¹Ì\u001cùÌLyÌòYͶšÍl1̈́/\u0015“U•9•D\u0015¡(Ն= õ>•BÐ\u001e#¼Õ¯FÓ?\u0010~i7\u001cU\u0010~YŽqY\u0010~Y\u0010~Y\u0000\n\u000eM¡\u0010z“\u0013›‘ž„A\u0003Kö»×Òµýº¦Ð+*]Êä¼öDVŒ”= ±\u0010p-%Šé<•F…èó45ËðܗQ5žMF\u0018s9©Ëôöw]Èý{¹À+ñ\u001aèž\u001eEÜ ó6¤Ë™³W\u0014ÛmؽPÁ*ÅïåøJEôÖs]|\u000b‚ßW\u001eÄýY§˜\u00021-Påby\u001bj\u001d’'Ù\u0010äLYFÄÞt8€Ëqá÷…#\u001aÁå 2CäjóR¶KtÌ7š/ŠBæÊqFºô-n\u000bz¸z\u0002æjRÞ\"¶Ð= (å€äx’\u001djà\u0017žá-³ˆ\u001b'MàéPAC\u0011òô2\nKf\u0016wƒ¨Í¡µH\u001c(¥béJ\u000fe¾÷„Эš±\u0010Z)’ôk²\u000bQ\bœ+±ýLò‹/8Ÿ/™þ‰Òqþ‹RK(ÀTǂóÊÞ\u000bôaFMÙf\u0011û?ÂK_°Y\u0010™w\u0005Ÿç\u001cOT°V¸\u0019Aý“\u0002Ë$\bU\u0005ùn}û\u0012¾\bÖ\u000f,PZ\u0000\u0019{ñ~È^\u0004šTàZú™q៝\u0016! ha|š\"a–\" ¢= ÂC†D]Ÿ©ý£H¢×N)®ÙòmdÙaŒàڑš?Úc\u001eÚÎcÆÛD¥ýÛ= ¥/Ûï‡QۆHxÛjÆ£ÜK\u0007ºÜ)8ÓÜ\u000bYîÜãj\u000bܪ‡&Ü\fÿ7ÜboHÜ©Ø[Üä8nÜ\f‚Ü\u001bà˜Ü[§d¦#»ë·¨S}Y\u0010¾–‚|O\u0010P\u0010~Y\u0010~Y\u0010~Y8GO\tÁBZÖ°(ftA®\u000f (^oҝú\u0019Ê Ô\u0016¢š¶>\u001cÃgQ¹ÍU¶=}o‰;´þWY\u0005²ÂÜր‚ û#\u0017Ë.Œ,\u0006ay¼ïüF+Tƒ½ùYb@àë½\u0007A\u0011Ö/b\u0018¨,>QƑrþ‹R*^\u000bŠ^¦7L\u0018/a9ADÑÿIʌÚl02ôp0B\u000b\u0017’B×\u001b“¤ˆ ¢?\u00177t<‰R‡Ÿ42IºçŒ\u0015?ÏÀqöɆ\u000f\u0018µQsI[´ µá\u0005åiRϋ#>°\u0010ý\u0013ññúÝz‡ì²\\ŸK\u0004Ô+-àeŒ^»=MÞ4ëÎIõìXÑ.a¸ˆ6ú\f¬ €ôì¢QNÊbžÐgÐvìMÜ × !'\u0015OÉ\f\u001fr߄”\u0015›¿þ(W,ØsÑþ2Œ‹ð{Œ\\¸øYޓ>x\u0011_X~*¦\u0001ªD¿\u001e§)¸j”~—ÌÛ@ߪ:\nº”:„¸;º\u0000*¡~Ûc\u0016²2õ«:ñŸ£ÒB4ܘ¾×§¢åê¢b‹· «0ˆò4\u0011”¥Ñڂƒóx\u001eõž/Q^¿[Úm06´Ÿ“ôµéq\u0006\u0014K\u00015éh\t\u001c\u001f7ø%VK­¥§xCÄK$\u0016EýÓ:täa]Á­o¯\u0003ˆ\f'î¬ÉsMÕ&¢'¨\u000f™ü†¢’\u00104f\f2p‰1{>„/q¼úk‚—ãXCºI¦ sۍª\u0010­gGéÓqø'…“œ«7Îé„\u0004𯗑hæjÉ´\"Òîä±\u001a½Ùù\t\u0003vB|k2nh\"Z®Cºÿ§ŽH›Ð_¿”Ke\u000b\t°ÝAzf_^´n7ý\u0013™ãÞyè\u0018eø²\t¹S\u000e³Èòê“\u0007˜Û—FÊDÃß&V:ŠDtZ+È%ƒ¤S­££C\u0003Y\u0010~™nY|±Â|YÔ~Y\u0010~Y^k\u0016àü†y®P¼ ›“_ÒòNž\u0014u£Ý%©•\u0003€\u0003u¯*Ó\u0005…ÓIaÀñ’Æ”´/…ÿ \u000b¥÷iÕK\u0005¿–¸ÊÓL\u0005ŜÍ6\u001cõâ(Ùdי˜A$~<ÿBÛ>Hé\u0016+ÿÚ2\u0000d–\u001c\u001e\fÄ\tx.›–\u001f¬z\nÏF|\u0018ܵŠùE€S­NR\u000e›S!À^uy¶—\u0003Æö¹\u000f\têo¹Ù+Yu\\\u0003Þ\u00025\u0019s\u001fºnڐ\u0004\u0018ˆ\u0001’j“uäi/ào”‹Æÿ\u001f\u001e/8*ò³â‡·^Fñ–ƒ–üA\u0002Ûrh<º\fÑ= g°jÎ\u001f\u001c\u001f02Ê\u0012\u0013!Y§h°5«8éõþ9F\u001a‡Œ\u001cõ´„õ\bªLµóEi:ó°¹ý\u000b”—†\u0010¯\u0012‚ˆpØĎ²+Ôÿ\u0016B-²²3\u001e”3cª2‹Î\u001boÿpÊoú\u001cmã(\n'nßêø¨˜µÒÜҔ-bµR”4\u001f&b—þ/‡ÄR—AdÂ\u001b žÆH…òÏ\u001b<\u0000\u0012bcZR/t¡é+Œ\u001aÑÞ¡ÃošÊ¶E\"T֖ڞΡSK†ÒÈ梖\u0007]ÙPÎ\u0018Û_êºd¨àÁ̎Ƙg#|b°\u0014ZØ\u0005\u001c;ÔE\u001f¶\u0017Þðt>\u000b1\u000bP¨nòý…I\u0005h—\u001ayÿYSäÐe9N8\u0019oÁ„#šÍêy?\u0018…ac¼¢ÑŸ¯\u0013èY0D\u0006ß\u001bTh6·ÌÒ]\u001evæ\u000bDÒÍF Ì|Ác\u001d8ãџ®…\u000b\u0007ӆ^åSþ´i\u000f,\u0013Gaè\u0013Ú×5Ž\u0000ôïÿ¾&aåÏà—…û=}¹r5Ô,WÀì…z.\u0007©œJ\u0013S꽺ë\n&Ó&å:ïÇýUS;æSú\u000ešßG^•Ì|ükIŠè?²Ò\tŠKõýq:ÄuÑÊO[%e8ø'®N´ªysÕU1\u0010úŽÜ\tycE9éŚØVˆ\u001e®èPK\u0012\u000b\nvN±åvÞ¼ÜD>\u0004\u0013£¯¥¤£\u0003™?\u0010~_Ä~ûQÐ~\u0019V\u0010~qØ~Y\u0010þ¢*¤o­½#€$@Ó«žCä[â;@6*ƒ»Ù'ªò)\u0005Û\u0016»\u0016…)ĕ\u0019Ûúº2\u0003\u000f‰«¹Í1g\u000ffËA82ep\u0003×^š/äM\u0016¯‰q¥?ÞÒkîäÄ}¥'ë Å/{¥´_Uç“óºè\u0003^»ô\u00057^1艍Û;ÛA:\u0014†´9>c“P¶Ü‚ß´\u0004:ìo5†\u0001i߂juÀžT³à#\u000f„¤\u0001\u001eÁG“fÄ/²Âi\u0019i´Ž2ƒ¿\u0013·\u001eP\u0006×\u0000à1}}¶_½\u0019µ‚/6+^?\u0005užvëÁàfr=œu_’3éʉÏP9ŠS\u001e\u0019Á> ºK>\u0014´(y..a'(x\bIb_åˆDN¯?Ò&\u000fR¯\u0005LU«]\u0000†'\u0018íÒÃ\u0013 ðm(\u0011\u0014I•¹\u0005dZ<\u000b\u0019*¾Ò‘u\"—Á¨î’Ö\u001dg¦ºâ\u0003V¢æÓ\u001c'm.jo۔'‘8ò<ě¯ˆ\n\u000f,\u001fqý*ºß4\u001eì*oÎåG\u00016ݎ°îªaÈEƒÐq¤’ëS\u001fr9òÂ\u000b\u0000œ4ªù¼Н,krB\u0013\u000f¡'6\n\u0005õâÆWž®r!\u001fD\u001etúOða\u0015êã1¶Â‡[sË*E/ßìL•\u000f~FãgÒ¨AÑöçõ4h\u0005íO8ú…\u0005Jµ1\u001a8´Ìói‹[­µ„ͯ~EíX^͘Vx³Ôó†{\u000b\u0018_áKV_è@k>½\u001fqxã;É*eØ\\_ø®°ÒÐ\u0015‰\u000eVn÷>û´ÀÁ̋S]úª„Ê]/Ow\b‰Èà1H\u0004X\u0002BÔä\u000b\u0012×\u0003@*¤p–¯,ÔØÇóo+ç\bÆ\u001d©½Æ˜m»>©\u0006\t×d҂'\u000eJðü¼\u0012m[€\t/˜Ú\u0006|©\u0016Ñ\u001e;†]c¥ôî®WÉýUën5O4ù{ YåT~-RòPÔOXɗ]°F­\u000f[Ä\u0010îñ5ÐZ±{Ä»\tê7[à‰âôý†#->¦Y®¿ìX\u0015\u0007m÷Ê\u0001ŒÞôΏo®¸\nɱ\u0016đF®É€Ñ_\u001e‘mVéúá‚\u0018fQ0N‘Ïq\u0016êø}&äLÁK”\u0007\u001c/Êè^= \u0013±™åä>ºb= \u001c^dª\u0000Ÿú›uŠ…n4(!›|T\u000fyÚ!; †‡‡’¯Ø›ñ[{²ïØ\"“üƒÊ\u00127\"Åڟºù\u0002\"´Ú“Ú¥Â!\u0016DŠÚ¢\u0001 \u0004\bžÂ_B¡\búv\u0002ÍŸfO™Âú’›VauBlÚ¥³Ï°ãçÉ3\\($]·g.Ã!?®\t\u001bùÓU\nåëï®\u0004¢lóõ5æ\\\u0016ϯ„gÓ%²*–ØÑ?\u0006ªÆû¹¶d[ 4/1-ç\u0003\u0012·vÅE{[Þ=}Î\u0004t‹/ÄÐÇ)|Þ\u0005\u001c¶¿îa÷¿*&…+5/Š\u000b\u0003ß赬\u001f«ë\u0003açż¡,‹-Ê\u0014qâ,H…l¯šòI=}·U¡H3çÍl¢õlÆ0I\"\f«,JVqâÀ¼”¯/ Ök·r\u0007\tãɲÈU«²k\u0005a\u0007ÙM$|\u0017쉓ÓË*½LÿÁ©ŠuXà²83ß\t’oÊÃ×Â|\u0000¨«)º“\u001a\u001aÄòÅ­üaZ+kş™¸–Ä];fªí;¾þå’dõU†íœ\u001a[¯~'Õw29–ÑL?ªjÎ3ðLƒelíGv¡¢\u0017¸ŠÕM[Ï\u0000ppO=MÁBN„ ñ°=Mº=MÔrNh–õÀĨ\u0018\u0007\u0000LJTKAôU°oÌ\u0010#Ž0ë:ڕ—\t¶ý8ð[€\u0011ÉM]}ó\u001du1øîÞâA\u0018³zyät.ñýÝݼ•]®t‘ÑIb\t\u0004\u0012Ú΁šSYb*˜Â\u001eüÞS28BžûÛ[B\f\u0002žô›2D\u0013£+&¤c\u000b\u0019nY\u0010z]:Ö!oY8Ô~Y\u0010>€pY\u0010þvt…ú)¹ W\u001b\u0017ë®,AÙêUW,=Ms\ty´\u0010\u0017°\u0017‹3Fæ\u0016F±dj\u0017\u000bÕwˆ\u0011QÑ,f\u0018¼\u0016ÿ:þé\u001d'‰ŽÔ\u0003'Ážñ‹D\u000eEòù$áXƘ|€OrÞ¶¦\u001f®°³1ÕCõ\u0010cµöæ1¸½•\u000b7Ä}½æ¿o/«ÍÕÅ!W´\u000b/k×ÖÉVk»d\u000b\u0006\u0005Øi›<<\u0003\u0000\u0007ezôÉÿú>S€w7”(IWÁ\bí'}7òÉ\t\u000fÒÓF’ëÖå=}p[\u0011\u000fñ\u0006aÜÄÆo\fá\u0011ñ\u000eF¹\u001fo\u0010äðö®¯2XClc¥P¿®\u001dÚû\u0013ŽS¨<\u001d9ÏkW‡\u000ePȜªÐF _Ìÿ’p4ºçªœÓT@²2¹›³!n*ñqaï6›U\u0006EÒÊòœ\u0015tg2ÖÜ!P˜\u0006‘\u0001â\u001d\"–ÆԁBZ= Ÿëñ©èTR\u0018·–\nètŽå·ô‰tp1I]Õ½.\u0010t/\u001cÀpš#»G¢jS\u000b\u001d¯Zqg\u0003\u0007¿.\u001a\u001dÏd&\u0005”}³.„vûQ\u001eiÔò¹êœ›ÛÀ.F‰\u001a¿b††Œ}àAFî…T_¼òQ\u0010¥€­¶KLðC\u0011ê¥ ‚Çó´3+žb,ÿ@?ë0Ý´ª@Ç\tÈÉ\u0004Æ,Qî5{\u0014à,²ùl[‰È¶\u0000<ï‰\u0007ŸBÈFŠ««ãc(á¥]Òº“„)#±ù\u0013×¾O©æ¡ý‹\u0019²Ív»ÿ3é>m×µÚI”ˆ\u0004½î?u´·J\u0016KÝ@{pŒ/\"?q¸Š¯oîÕ«PlÃ\u0014\u0016©´2ÖS\u0019q‡ñôÉÖNÕì~;l<ª<·Þ\u0007TÜâ®fDü\u0007RpEj@ύOVLnmI\u001e¢\u000fU9\nF\"Ð>°I܇H‰sà*'œÜ/Þ>fÜ@ÿ!j‡…sѺŠL\\»ÀnˆqŠÿ¹¨‰ôÑr†Œ+ß]o†mVßÅ\u0000•Œ\u0000;rĜ\u000fü˜šz–ü\u0003ýã¢7¥…^·\u0013\n\t¤ >®\u001bšX£èóÄ\u000e\u0007(ß\u0010Íg\u0005þÄA2­\u0014Y΅ú\t´=}èwÒËe¢ï´¾! \u0018ûÔ°m\u0005ñ0Ëé\u000e\u001eÔQ2-”YÐdÍF'\nàíûàJ§<]'ú\u0002틍\u0002mè\u0004Ì¡ØHWýþ톘õɼ8ÔÕQ/ÑPn+Àúi†\u0000\bwàÌfkQ?¤Œˆ?ù1ho\u0015519ö—Q?ÿš­å®Í›yR%°®ÍËâüdXÒ¸·œ­üý͇|\u0003ęî('A¸µŸæ+ø#+ވÅ\t¯¸4_ïg„VŅ\"+;‹Ò‰õ<»@Ä\u0005¿:+TâЉjºÔ½\u0012¬\u0018èµ\u001fžîûàò%ž¬¬¦‚ì{ŒÅˆ\u000497ҀG\u001f;͈máÌîAëôûl›5ÇFUX/ºÆ\b\u0007\u00115ô\u001e\u0000i­\u0000ÜÞå‡\u000f³m<Óç1\u00054¿öX?h’‡›Üλ:Qƒ\u0011ê¨Ñ†¸«YÌk^HÃè\u0002, K5N¸í½©Ì\u0014?R\u0007•ôÈ\u0002\u0001ËlUôÔÓìh7¢÷o\u000bót[í(•O­jr͙[¡\u0004;?¥ˆ­#»ý~Y\u0010^àX\u0010P pP\u0010~Y\u0010~Y\u0010~\u001f†ì•¾ª0\u000eÞ{º\u00153\u0010/¦’骆QÜû•~deñ)z\u001au\u0001\u00175\u0017_6¸>@7_„\u0007qÂÊB\u0015^Ë\u0000‚èêdè\u0013O.Q¾\u0000÷= Å™òºŽU^L\u0002np\u0004b>Ef€—ÿˆ\t üڊá[\\=}qf4-Á\t\u0018™s\\2*{–à/â‹Ät¶²D'\u0001y¹™\u0015J,:ÒU:r†_ƒ\bxÈÒaÒ\u0001…\t—ÔM52\u0002@\u001fWŒˆ\u0006u\u000fÂ^š›Û zj4\"á9‰•Fw•6nŽ\njãâø¹œü\u001fkr:ê!íi®sÝ\u0002#Q\u0018¦×šªËßÛcŽè¤IÀ­ó—ô#\b\u0014%Çp¶GæPÃFä9š®U\u0019\u00113ü\u001e%‹Z&7Ÿ¸‡=M‰³$íÄ\u0011Z²ôx±Ô\u001bõ+p¾å?ܺ…>³~6)¼üÛï= ©\u0004\u0001›fû¦\u0006™_;\"ò;ôÚf›¹‰ÿ]«Šíê{}ßeÓÔåp„´ÁÏ1ÃÀ+\u0013’ñ'MâƗnÃS]/cD‰¥ª§$¸æ¨\u001dÏ·Ë^úƒm°¤šº$nLçí¸¶,Ù³ü…¸|€ê\u0007r\u00174\b>ç\u001d?¸Ì¢å‡\tÿ,\u0013±,\u001e8Ç\u000bÆÔÿ9{Ø¥,þ^Çñÿ4û“ñe6ûÉ\f\u0001<\u001cx\u0007UY:¼Cmÿ»Ñ6\u001bDïT\u0000Õ8Ñn·\"Æ6Ï$eˆ¿­æÎ͇\u0011LS×O3!#%Õæ\u0004 ©(~Ê·áß+ŒÂ­ÚöNOÌOÅwõìxì\b$I5\u0010[í¢\u001c͊YMÇßNõ‡,½†Ê8…\fØõ·t[ôö\u0006\u000fª0µ-i™d½è\n\f/C\u0014”;éŸ^½\u001câ\u000e·ìE6à:q2•Ýª=}‹»Á@7€\u0017I1yì[ójZð\nˆ\f@~²\u0005×\u0002\u0018\u0005È֛;nƒÿ\u001c&\f0°½\\¯A<©}\u0013&êV°=M\u0012Ó» gƒc°&ª\u0012¯\u0001jÙ\u001c7‡ë\u00046,xð½ZÕ\u001cŽÚŒv€‡žË¶Šß6\u0018¾ð\u0001ÂÔì\"fG“Ž;¡º\u0016JT\u001b@r\u0005\u0000è®\n\u0006.’\u0000НL¹Â©ûW?\u000fÔ\u0016Lhœ¹Âòýga\u0006”ŽPhfûÙþu{ûœ\u000f\u0015ùS|ycI=MÊ>ø%ðEÙPi{¯>\u000eV\u0005@p™ Ù>Ñ{o\u001d\u000bF U̶Òm \u0017ô\u001dˆ2µZå7‘˜F\u000bÂHóË-bþ7tfEÏ?™B\u0004\u0015#%¦.¤ƒ|Y\u0010žL\u0010~Ùâ6}Y\u0010~Y\u0010~YXÔBjÓ\u00057DjÏæ€ø)7^¯Úñ½×Ÿ•?\bŸ^92aXכjUÃ@ˆý\u0001n\u001e\bÐâwT\u001f‚{•\u0019Ênh¤9<†ÐxŠüû\u000e¼]~•xÌ9–òÞ¡\"nôŽ®êr‚¿\u0006öÛÉ\t\u0018¯Í\u000b÷t4Fa†HI1¼@¿\\©Û\u00190\u0018‡?;ae”eÙê™f1)º¿¦’É¡Ašï\u001bjv’î2 p6Ñ\\Š\u0004Ér‹ŸAW\bß\u000e\u000eÇ\u0015“¬¹ßò\u0017–\u0007¿‡4\u0014AÄVßÖ9\u001c‰\u0011ퟒ–\u0017܈Ì\"p–fÆra:¥°‚®_”øC~R$Š5©MG²or¸\u001b÷ד\u001ahãdÝ$MµKxÍóQ\u000eÖ#c\nF¦jJ)§ž$WN¦\u001eZÉ\u0019ª¥ªñ¨Õ\u0000°¯= Â[›ÿ‡ŠÚÆèá1[\u0012Æ\u0010!2Wð½4\u00174uÜÅ¢¹-ÒÀ<ùØõ_!‡9é=}X-ß|Èõ^\u0012\u0007nSkÚ¶Å8\né©Ñ-OÿÀÜ_È\u0015!\u0012‡Tk–4œÚÅ@Âé­áÒ_™)ӊ¦Dƒ:elÂ(m\"¬ž6¬Œu¬ V¬J–¬‚ºº­:ºG]sPaÓã'áp(ِ(=M€(× (º*®Îi¬˜J¬’p¶iÒ¸¡üÎïÅ\u001fTê\u000b\u0019û{\u0016훝5ó‰Is˜$ӎ¼\b–nm$Zµ¡DUˆ®\bqšír‚7-¢ÍâHó1HøÝ\bô¡kPOËK‡ÏDOÒJGMM/KPß\u00048M\u0017\u0012I\u000f\u000bFŽG\u001f}öœJb5\u001dK5\tW•¢çˆNŒmö\u00168\u0000.7ÄÎ7uŽ7\u001aZË®\u001aÍșÎú2˕;„\u0014££å.\u0005‹Z\u0010\u0007~ylY\u0010~\u0011nY\u0010~Y\u0010~Y\u0000r]v0#b~$i2Þ\u0013èªu= ®}B,Ö\u0002.«â-Eb¬¢ÐÉè³NF-@Tg›\u0005êµTÅH»BñWæ·oÑ¡qÆñ·³ --\u0017Hg\\\u0015E\b\b”ø0“ùê\u001fzóKL[xõ‡\u000eÊIýߌÅu™·P-ܦh”D…xë”~Û´ 5ëÓðgBÈEp¶bϵr:-ÆÎh/XE|é4\u001d\u000eƒ{ÄI’´è±'–\u0004t¢[+\u0015ݓ@¶¬Ò(}N…b>EŽÀ\u0014†akû¯\u001eÉÑa·Ô-mÂgsroIÒp˜\u0012oºâ;¢\"ٔ!Öl¡¯–¶¢\"¶Ô5œÉM\\¾€-\bijØ°µ;7,p–G\tä­öÐXœÜ@ü9d·Æw\tÔÀUªÿÑvÒ2œábŒõsßÐ\u000f͸Öþí;KHð>U\tò\u001c–\u001aÈöa-¼öp¿N´\u0013XðM]Iå †)„= Tüw×\u001b\u0010Áþ=}&Pp$Ydò\u001eVñ\tñêÖWV\f€x7\u0011µš×B˜Ù*;ô ¥r£¶\u0004óƒÁ\u000f\u001d°Ø\f*>ÎÆïrôÉq»V\u0018OÌÞá›A³ßðÕBñÔ\u0000J=}rJ*¿Öo†<þe‚ù\u0016\u001f>\\T€ß~\u0004á×\u0002‘Ù\u0002’Ô\u0002°á™¨@ӒÚÂìZª3\\f£#fÐz\u0000»u…\u000f~\u0004™9\ti|±V\u0010~Y\u0010~~\n~y6pR\u001d]›\"¼\"’(\u001fW™ò™û\u000ešha‹pF˜‰±=Mút?¶[¢v;bOè\u001eQ”jþ\u0012q\u000es6¢Ün¢\u0011Vò.Á·=M\u0010¡î\u001c(ô„ivGÒÓû:q\u0007.ـÛýú\n7é@dUû= ýJáç P­\u0010¶×\u0005ÝɝHð5\u0016EA\u0019 3흘ÕÕ¼6M¼vÍp¿K3Q\u0002–%ý¼‘ªÄWxX򫔻 \u001e¦D×qyi\u001c舿À@FgvËú:ŠÕ\f×t= Ê\u00145\u0013M‰þ¾N[ê½x®ø9\u0015(Ó%(ycûy\u0013(‚7õö¾’lçy\u0016AšÇ¶Ë\u00192‹i»¹U@®_Ç'\u000f%ȑàPŒpëIT'\u0010¿ŠÝrœénj7³Ë\u0018RKì¶Ýs0¤¯\bß6;hÅ9T1P„³ÊÛj¸\u0011\u00152jߊ°Â›o\u001a!”2óe,Å)\u001bµìÉ8×ÕkÇ>¿\u0015lÆB¥­äj*\u0005s–¤à£ן\u0015\u001ct\b\u0001.Õ£1£\u0014¢\u0005+®Ø:kdØóŒàÙZš?ÙÑ\u001fÙB\u0010~Y\t~Y\u0010~Y\u0010~À®)±…}ŽdŸë¼%‹¡\u0004ŸX¼q ÜÆüÎÖ-5at+\"ÁnwM\u0014kß=}ã\u0000qç\u0019‚?oj—ÌË\u0000B)\u0011‰\u00177‘q‡ö”Ï\u001bà*9\\k«o\nm›(+‹ÑÅ\" µ9§Ðˆ…˜ˆ_Kþdî”øÿ\u0001_)¸¡\u000eÌ\\^ÁLa°oÕ'…tÐ×ø\u0012\b2m\u0019’~,\u0017xѷ׃’,= ÿ‘}jÇ^¦\u001bßág”Üê“òÜm\u001f(†ßÞ\u001eµXTJT.à&= eÜwR\u0001ƒ|îoÒ= /R ø1Ÿ\\1vL>/?\u0016>\u0006X\u001a\u001b¸\u001b2\u0012²\u001bœ¡´*òá\u0004‹U\n{¯!¤èÒ\u0014¯!pۖZÿ3\u001crRrÂ4]–¼d†\u0002\\Z˜Þ.9ŸÇ=Mm\u0012\u0011±¢î\u001fzâI\u0018Ÿ\nþ.£Ê¾¨Ü\u0002Òg,Ý\u0004Yy,Ó\\\u000175©ÔÏ=}h\\zÑd+Áì/ªìV\fG¯1¶\u0007üÝö±L蕷Qô\u0003p±èAÂùå˜%ÕQš÷+\u001bNío\u0002Ø%ˆwTÙsãoü6î„ýïotÉCô**Ƙ\u000büCrr@©×ÿׇi¾Æ¿h0ŒÔÙ\u0004\nCÌr•p³Öê\u0010aȍžP3\u001d\u000bpÞ´¾±þ{ÕÍy1#É\u001e\u0001o\u0015\u0007säÊG\u0001ÝÖï|(²aQg÷[Ô\u000e=}ªz±\u001cŕd®Æ \u0012¿… \u0013»‹*¡\t\"¡â°ƒ_\tö…%«»µe&€D×!¯†FøÛèh´¿=}Â(up\u000b5÷\u0006»?¿nEì”\u000f_3c©(ç‰ÈÉtàÜ(+NL+\u000bITÔÒ@‹È<ÿ 8è_\u0006ÙÞ]\u00153â?êM\u000fá\u0006Õ®{SO+æB-ܵóeY¬\bï= \u0002ñ4 ¨&MÛ\u0018H=}\u0005–½\u0001šwõ\u001bTAF¹°\u000b¯\u000bŖ\u001dÖÆ¿þûÝI0°r}ü¼wd›¨\u0000·¢Œi×^*Ηtò³ß£é¤££·\u0000Y\u0010~‰òzU\u0010~Y>\u0010~Y\u0010\u001e„\t~فž\u001bï'@àÅ\u001f\u0019fmþ \\ÓaÂP´ »˜Lâ\u001dΩ\u0003?Ú#\f½¦¼!\u001b³\u0012ç©\u0016m\u0006Ó9ò)“\u0015óÿv*•ë\b»ý*)V= ‚«qž0C‡ëMú0…\u0014œËQ<2ɕi»ÏI2HæÛ9«˜\u0014¯ÝàA#t¶Ëò;#_Ÿço2ï\u0005 “l\u000f1>/V·/2ñ\bƒK\f‡Éð\u0006X\u0017=}rq\u0003p7<‡\nq\u0007S”Ïo‘qi Œ¿Yxq\u00046jÿOaoæäÓBUD®“ìüã2qå\u001f\u0011ÒE\u001fœ\u0005·>º\u0006¸W'ðUî|\u0019\u0011¼\u0011\u00169\u0006ÿX?¡áÎk3ûleÖN˛3È ÂD÷ +*¼2\u0014.\u001deî2J»<à\u0006Z\u0016qŸ\u001d$“ˆîµ\u0011a\u0005†Lz/µ_„…Zïÿ›±d‡š‡² ãæzªy ‡ätʅuá\u00065“(usR»\u001c\"Æ}”Þ\u000eñ¢cքª\u0012² ‡\u0014gò\u0017™ŸEòƒÒ/Y ‰&z\u0012GÙ+4Åilx…¯\u0018³J\u0006<§®\u000fÇ3ûÏl\u000fî썺ët\fÉh1œu\u001b<í–\u000bA¯\nï\b\u001bÚò9\u0007öü\u0011r:\u0006(\\¿Îºm–cõA—h­ŸYôƒq\u0015èaÝË5Sý,\u0016Qíï}Koë\u0012\b\u0019\u000fúdßó¨$ã8L4MÏÝOivçØmòN\u0006Ã÷ê‰M©™œ½¯\u001dC,\u00198ÉZ\u0001\u000e\u0014^𮀒}¯ÀK&6?±­†\u0017ÔxtH\t1ÁRO˜ûaéB¼+‘Ùcß}#\u0010J¯¼?\u0004k+Þé¿KÕeŠ@ÔZèï³k;\u0013\f_Ì9©IÏþ\u0005éTN¼eÀ‰+g;\u0016 O¨ð\\¹§âTÇOx5\u0011ÔÎA0T\t_$Ø\u0018î\u0010‹’\bfÔôþµõ\u000f´b\u0004jn=MÞwb{öàw$\u0012}±«¹ÞUvv4úž?뢎g*^q¿\u0010\u0015‰%[®ý¶ÿ¼\b„-’éگŀ“[ƒñ¢\u0015\u001aGâ\u001eû„lýæòÑO”eØw.= Š_¼ù‰pCÒá\u000f¼ˆ.4,Ò\u000f—\u0006\u0017/Â6Rœ\u0016YBË,£\u0001ﮇ;öÃÚè&Sì²\u0005t.\u0003uª'³E¾å‘=}óyé(…\u0016Ð/šð\u0004ß3®ê\u0014\u0001§¸á´\u001fܸlA•ë›¸h6LtÇ^疋\u0013¯þ­\u0006{™Ø9z¶†k\u0018/†Šd\u001bq¸g\u0016–\u000e¥)6µ¼Š5+’4Ç×î5S8ïx/·‘\u001eJӄ\u000fÍPXL/7¢fhÈ\"´)¢è‘yâ\u0001šŸæô’âÜþ'¡Ò\u0007}~ש0î\nD\u0016ÝB1\nsZݦ\"\\ï:\b4·6hEê|[¯l„(\u0018±Z±‰Åø9îa\u0017Ár:‰VÍÙB\u001cò­Û×E³\u0016*åyBËELQ+\u0015x\u0005i\u0010τ\bG¼ùÏð~\u0019\f]÷\u0007;÷Ðf” Õ\u000bmu~ÅnZ¶U/Ô6&áÜçÒn\u0014‚äANæ‡\u001c\u0015úÁ¨Â¨…ÉËS“H¥M„-ïBF+šÚèÉÎT\u001aHµîÇ7üÿKoQm_÷ödHä(\u0014j÷3Õö\b\u0015bÍ!z÷œ‘Mi|t=M\u001dIi¡ó\u0018‘oôê*Ý(Œ½¿ÿJä#_ɊÎ،ÞKì#4¹}= ýkÿxåxð¾zT}w_w\t\u001eG±i.\u0017;ÆO.þaњYŽUëö2\"þ˜\u000bÜJêB&áVê‹\u0016œLṄ©/ÿ\u0003#/SÄ\u0016•°,|\f+E1´rÝ/[!l+ªQi+/ÚižPÔ&†ð\u001bau'\u0015üöaù<ՒKÌè9\t\u001b±ÙfŸ4¼yD‰'ÑÓJ\u0000g%àè¹»V\u0003E4Èé¢ý\u0015“1È ¤ùgrTe\u0000\u00030î$Ø´\u001eO\fÕW\u0004 âÙkXDÖs9B\u0016\u0010<Å\u000fê\u0007TÀ-ª\u001b\b=Mr= $™_\u001f\u00072ÿ'¦ÄîÀ»Îkj=Mêñݕn,œ\u0006?k\"Š'ö-Öý>?ts\u0017dIn(w¾Ñïc8\n\u0016ÿì¶\u0014†íL¾˜êsX\u0014Š™ë\u001aY_\u0014\n\u0014UªnÚ\u001c\u0013ón62àA›”\u0007õSºµ.= »Ì0ø@Úzr\u001dÖrp*aLáן—DFs:,ª Ü\u000fˆ*eËâ=Mœ\u0014ΰmY&+D⾪›vžwBO[£Ezª3O¼ë \u0012Ã\u0016‘¨•Ûß+C8äOú±iNÆ;–Ú&œâÛ'“HÄ»Ì'Es½-•˜óO¦fë\u0002¿i÷\\\u0013×*6 Ð?Ž¤´wÒ1ãîá5nÐ4Ï= Ál;CËéÏ0\u0005I\u0005×\u001e~Fœ!Î=}kS»9R/dûÐ98àTgß+賶j4˜\u0014Ïs,\n…¢”ï\u001eÁr‡§‘\u0011òc{×41´, 3ë!\u0011µ\u0012²ÉÔ|á$‰C¯qbq\u0003!\tÉ&™\nu\u0006:hClüϳm‰\u0005\u0018Ù}:U\f­k„‰U¿\u0015w\u0015\u001c€Bn'\n\\gI‰D= Ê2Ryœ_;;rÞä¤Õب\u001bÿÑCàK3\u0006ή\u0014sÍ\u0005l#Åÿ‚·\u0014Ñ^;¤*.,\u0017Ìd\u0013\u0019¬ÕÕHëY:E\u001cb·B›Õ½Z:TpE¿X¬ˆŸÒKãGY%lúΓ°N‡†]홻÷Ô\u0016ç¸ÆbùÔIO=}(ŠNÜ´ó&›M½5\u0017=MüÖG¹FòXÏËQfŽ\u000fÀ\u001aL\n}-\u001dmW¾«¼u#ŽJ©ßí½,ázë\u0006ã¶îúؔ\u0001Z<'„p}/\u0002è®JÒXs¿}-ˆ)ù\u0001¾Z\u0014\u0007\u000f¾Ž¨OQ\u0012\nŠP\u0019\u0011i\u0019ÃbV&§~ñ¹ñ’çýI.¢]]3!yh%o\u0011µ1\u0019Ɗx–*„\u0013#’å\u0014W›\u0011YPX\u0000‡\u0001‚\u0002Y0rnY\u0000–M|Y\u0010~Y\u0010~ib†æapڟ‰ j¡z\u001a¿\u001ea¶•‹ª¸Üâû\u0013÷/þa\u0005·oµ\n}ì\u0014ñm+FÁËñ\fJÛ~ÙìC˜ã%äƬA\nîóÜø5ªêÇ\fµ:çú5œ\u00105›R6…d\u0000̉¼ë4AÄ(y\u0007\f‘¿5\t.;×v GŒ\u000f4I\u000fP¯ü\u001a\u0007ëz:ÄÊæ)mlU—À5\bQ[Ï^ \b\u001cuÉ.lB·žl\u0015FB_m¡ìwW\u0002Ïâ™.‚õb‹±›hVQ\u0002w-¡‰ˆ†‚¯; éXƒÚ>‰k4!ý±T‚\u0015\u000f±:F\bã±2P•+b5Š%@ßE¸•oûEcƒ\b¨=}ø¸K0úC!WÅ@¥èi\u001fôç{æ´ä6ŲzËD\u0018ê,ç¦ÈÉ\bÎ\u0014\u0011]Õij8Œ7ô‰\u000f+ÕA m+\u000fôä H­ö÷óQó\u0004aSÍYúø|NDíì5ÍU†x{\u001fã0}Â=MûM”[†rºø\no¶\u0018-Ðw¬Ñùj\u001d$©ýºØ3útƒú_©­\u0006×t|N,€Úðe= ØÌ\u0012v\u0007…ÉÐ\u0019ßy…H(¹™hý×Ðs\tžÈ\u0010‡÷XÌîs\t’ÛÀOšŽÓöï*B!ݟxH&‡â]ï\u001bQ.Q0ÑE¸]g®Ž”…]Á–W˜+ìvæ\u000f-á^2ŒÖåùBgó /©˜œ[f#.’°{ˆ=Mcé¦‰RØ\u0007i âÙØ\u0007\u0001DÄΉ¾TE´\n÷0\u001b8\u000b'y\u001b\u0006e²½vÈ\u0004/\u000b3ÔҞ/”{=Me\u0002\u0012ðے\u000f%æ= ¬¶z;•A̜ÉI?Ï×È\u0005a¼žÑ<´H\ti|\u0007ÖíÊ=}–”+ÜV\u0007o”­ØŠ‰3Ü6\u001aü³™t%’Á¹\u0011X\u0003wÉîõAû\u0005\t\u0010lz­îQ-ûTž)¸N˜P;>\u0006hG|y/à\npÛ\b\u000eIÉûV\u000b_°>±|\u0013ëm)\u001eÄٟ½Wd\u0018JÐhÂ\u0010<ˆ\fnLÙþ·èë\"\tj\u0005ÞÞAú~´aeÁ„Þ™+¼~öø\u0003r|¨±'\u0000\u0019\u0003*I¦A\f±\u000f@‰ëƒìê1mÞ5º†kŽÔñïáƒ'6'¶º&@³½\u0017e\u0018JÖ²âÜVn<•\u0019\n\u000f¢\u0014„€îº±Û]Ób(™ØQGà\u0013hne¸6Õú79]Ä\u0014f0r©\u0011\u001fožv–´b‡1%)Þ)\f‘[ð–Ô7ª°­Áï.š\u0003j\u001bòÁÁ™çòi6w\u0013òÉ2“…wÁÒw\"\u001bô»ƒh)!Òg\u0019\u001b6 t>p\u0001\u000b\u0019\u001bv¢R²š\u0002ž3„f„ÉÂ%ڛUŽLÒ¤YaP”È\u00118Âú‘žô\u0012‘*ç<Â.矬[ŒrðÆ\"i¹†TÓ#\u001ez¥;R¾ãý\u0019£m\u0016¥Ü\u0016Ô3ܽ$·J¨…Ûà«TÖäÿ÷±å×Ì+l6&\fáÁïIÿÓdTdÛ1®d›\u0013«=}UÄËê)CÛÍ·ˆ D\u000bë)\u0005·½-= ó»¤%Óõ\"'ôº»i;dÓù \u0002Ûja)–}Ò¿f\u0013µYêӗÔ%p´_‹-c!îÇ°’ÅœjÆ5r4矾hoÚôß\u00130ÅCÈ-|\"ꖉ\b×\fñt\u000f\u0010-i\u0013\u0006¯\u0006Bj“Ä)M»QP2ȘìÏʏ\u0005,N0ˆ›}ÛõÁh\u0014hÉ1UÛ\u0001P1ŠR*”\u000býhVTÍA‹8¬^BcËn§\u000f͵ÛXÅ4A^,û;Ê\u0015aß4tn6“^6g¾VÇÙ9ÈôÊ5/ \u0007\u0001;ÉV\\×uìqLñÁË\u001au4,gWÑIAeãX.X\f\u0000\u001bp‹\t¢œ\u00115x^\\Atð˜OÁ\u0001\u0004ëV*\u0002üào?~.„ˆ\u0001ùŒ—…?vn™œ 'ÿ†+\u0001Âl\u001c ÿý{òd˜!\u0011¾—öøsr6h¦× ¢£R0©\u000bÒ½ƒ= “Ã@Úªœ\u0003•Jî©\u001cÊÕ玐Ä\u0001;°ô\u0002Ùg&ˆf7À‰=}hӌ¸fûq³µ7¡ÎÇû\u001b\u0001ë\u0013ŒP3ãè\u0000볎ÑÇ»4ÄÇ{|ÄÇ\u001b֎Ò$‰b§¢\u0006\u000bÁ#/ñ\u000fޜ\u0006JY™‘N\u0010~Y\u0018Ù\u000e~Y4@}Ù¹X\u0010\u0016Ÿé’í洙äÅ=Mñ³”n©´¾q-[žõ'\u0003ºö^[;B¾.üÞûoX,\u0005o>g7ÞÒI’\u000eÔÖ¿µ±:3“],'“ó¬XÊî»]üe?®µ±= 4“oÌhøí­pG\u0017½ÉˆBÌõù\u000f4\u0015…E7Š\u0012Hû€Õ-99tS\\/¤f\b/<Í\u0006hù¼*U\u0007\u001fʆVþ1V/?%Ї÷ ññŽ\f\u0015©IˆŸ@Ð\n}\u001eÜÎà­Y:ô\u0013E(%n‚Ì\u001bÛðd^W¥è1¥–ª¨%CÇ=}DÇ\u0012îÈèaúõ=M]5\u0012Õ87pôõ„&5-%--¼ÍmZ÷ô™\u001e¸¼vø7k÷ôËêè•&-CCi4Dé~õpŠ’wß>I‰\u001dýpŒ\u000fØނNb¡½I9t“ê®°= bvs\u001b=})/W)\u0003Y©|\u001e°Z€ý±7yU[\\9â*\u000e\fâønZþXÛUWß\u001cN\bbîj—õݝÙvô!;±n·Àzڎû äj²\u0012\u0017÷\u0018Ô8w\u0016D,Aüæ—\u0017;GÊYìr@\u0016\u001d¹= uvl\u0011Ã÷ã\u0011Ʀ¶ª¼Kàd#\u0017&$p\n¯\u0017\"\u0004c\u0006Ø\u0015K+4D°/ç©»ÜÙykƒXé'öé\u0019áØut\u0007å\u0001kg%]É͗Ø\u0014\u001c7,\u0004Nï;1>û—kç)oT\u001f\t}wՖKJ<’¡ÚFû\u0011\t—\u0004Ö1ž\t\tKЧõ¹‰ùV³\t\u0004y‚¹ß.Ðï{\u0012ä\u001a~e\u0012\u0015ÎRFù]ùU\u0015DF8mbþüÞr-\nZ8‚Qü\\ÎUôÖ\u000b\u0006\bü¾]YÙ]¢\u0007\u0006’ᄀ\u0010Ù©ˆ}ۗd)úSvN/@o‰\u00197fwB\u0005\nm\tÞ:r~¬= Yvt‘\u0003\u0011Ôª:¾Ý\u0013²\u0017ó\"?&bzÝëB\u0017““,¦d‹Gý¤Ê¦=MÞ.[l\u0011ÉŽªÚŠJ^Ü8\u0019\u0016Ënp™Z\u0011yÝàoЄ\u0004\u0017\u0006²‚°•s\u0014_*Žß‡âˆd“wfæ&cdŸ¥\u0016\u000e¬¯ŽÌóŽâ¤¢õ$*ª§Y¹›ð‘H\u001dw.aE:†= /ŸˆN\n\u001e4\u000fšUØz\u0001ŸÁÂêywê\u000b+2¦¶\u001f—û’æ\u001e}juJáͼ ‡‰švb9Âüò↢˜¶ÿ…\n|!â(\u0012œ|Ë°óÕ¿\u0003\u0006\\£(~©û\u0006#c/£†u¤Çü¤a¬3\b²õQû3¨°%kžªŒÛÝk™8ä¿ê&—_Â\u0007>Í'Ñ´Eüˆ³\u0016Þ)[–\u000e+ß\u0016å—{Á\u0005ô\u0011+N’æۀ\u0004=M7¯–\u0000†Ó.ª)ÜàÙo~x\u0004_jf\u001fžÓï®ð'dl«ÆMç;vÌe=}‚Å\u000fB¶„ƒ™«Ê\u0015Æ?\u001c„OÎmLµô1×-U\u001eã7ð\u0006EÏý¸\bŸtËâ2uì¸F=MßéEõ¯\f*»\\âjûÚÖiB<Ô½\bh«a,\u0014z¹\n\b4Û Žhl‚Êq€¢†o\u0001½J„$Ûuþ\u0014yíµW«É³4\u0003!n§¸)Ê[ßÌds°¬WJ¶o\u001f5Ã2álißìÕMÈ|tܬbÊìrìõ\u0017\u001e5ÈÜì’5Ÿë”O\u000b-\t˜ö\u0007™ìÄ/ëÔ\u0007\f-¶žöç\u0011I»ÇqfÑ\"ÁW\u0002»³ª£C¹»-!Ö~™V€lY\u0010~Y\u0010~Y\u0010~Y\u0010^ÝµËøì\u0003ï\u001e$v\u0006§\u0005Pµk\u001eÿCf¶$¨¢-?lǕÈZë}=}Å\\],÷BÏu\u0004&kSVÅv\u0002,Ï0ÐTä7{ùó\u0005\nà,= ÈÙp3û\\ø\u0005‘È,ԒÈ\u001dÇ3LRl·ÑÉÆ×9œ\u001e#o0ÜÕ\u000e\u0019m—\\Éö•VïUÇ­zï(ŒÈ¸M×öëÛû„s\u001f(q\u001e·U÷ۜøD\u0000Õ8g1m=}uÍèþK½Eu\u001dDmҞ÷©õ,˜\u0000\bû\u00150¢\u00000á\b×áWs\u000bÛ÷†å0ž×\t€u›^阇ݎ¿@¢m‹÷=MDÖ\u0012+qv¨Ý\u0001@‰Ú\u0018¹ x\\ß\u0000\u000f\u00011Zf7GÑ\"þÑðî[¿\u0012Å™\u001aŒÞnˆ…ù:Ϻ\u0000ýb\u0014|·~†îÙ²ÒBêN=}Á–]\u001b?¾’”Ž=M2Ïjß­à—K¢*ò2wá\u0006\u001fB|\b 9X“üÖ{\n€ßBxÞ ¹\u0002”<¡\nû_#±õãX¥¤w±ëÐƒ˜'#= N¦i¿®KÓÀÂÄZõ(ï˜åm7¬œV\u001ckM$Ä8Š'\u001f~™\u0016b»…_¬ÜµÎE=My+ª\\Æ=}ú.\u001b|ÄE|‹+žîÆÍÂ+Û\u001bÎe›½ \u0003ó¿£{«#Ãû~Y\u0010^<ƒ\u0010wY\u0010~Y\u0010~Y\u0010~Y\u001cÿÔÐ\u0018#’è¦÷Õ¥O\u000fµƒúb£o£†Úª[\u0017Ù㕺¤/»sÒ¶OΦÚà+u½U±(-–Duñ\u000b\u0015¼Ýa(A\u0014&—pÁG\u001ahÃ\u0000M©\ftáë04ä'h䕐°µ’\u001d3jÂ%í³\u0005\u0017Q³Ø%ÄUy«”K\u0006+œFæ÷\u0002½Å„¡³Þ\u0012'\u000b—Ìç?ç\u00049‰±¶­(\\õÆï6ñ\u00042±v\u0018\f;\u0012že\u0017_´‰hjÓضéÛ=}Îå„\u0003'”xÆ_Œ³ä¿¸\u0004}…«ò™çË\u0017Ð垚´yi¶\u001b9\u0000Ãæè¤= -ãJY¥v*¬\u000f>Ò\u0013\u0004*c6.¥\u0002\u0001¬ç,ȵ֖¢ÐƵh¸œÿ‡l£4–ÖèY\u000fµ<\u001dýGf¶´ˆRë}×µ2.ëO÷ÈýØ3kvö…qç,TNÇmÂ9\u001b\u0013þ\u0005ƒº,o,\bY‡94&ÕºNlw\u000bÒ\u0016\u000e[ïX¨Õ\n\u001ak§ÒmO\u001dÌ6ß)åJ¯­Šîˇٸ]ÚùÛþÄ¡·¨\u00160e“Æ­\u001e’Ë_žE3ÄTíÛZíæ÷ùø<ù\bló8˜\u0016øY\u0011 b\nøÙßøü™ú\bý=M0$(Ø=}l½í\u00000\u000f\u0000Øa1tÛ]ç\u0006ŸÁ0mú×õ_tÛ¶ö\nãé@EÈ\u0018\u0011»Ý ½Œ\u0007‹HV\u001cE1UõŠ•¤@}Ú\u0017‘= ¢¢†½ÿq\u0005Ã:Ô{\u000b¾G\u000e=MsN2dXl©(ù¾—à\u0007\u0013…Iä52©ñß64üð™8Ô\u001c\n>¢VÉ$áÉXÊ>\u0017ü\b՟Clw¾É–>Ï/\u0006ÔÒVhwõ¹fð.Ñ0Ï=MšW«ïSë^…\u0001. úÏé_YS\u0006{Çñ\u0012\u0016_Kð\u0012hÉ\"\u0000>î@\u0010]1Uì\\s\tx\u0019¾q|?\u001f\u0005† Y\\;dqŠ\u0013ۋóUMfy±Ô©Ü×?„S\u001e@æ5F±\u0018\u0011ÞÏ ‹“ßQîQÏÑXî\\/Øÿ\u0019Ù\u0013\\‚pȍû:¯.\u0000-\u0017¬A\u001aôB];b\u0000—‡Á4_ÁȔkù|Æ\u0011î2º ß1ï”;\\mFˆ$¢Ø2ÂRàYêš\fByÊ\n\u0004B®%òš½áŒ~œ\u000fÀ\u0006q—\\VqJ|´BzÚ ý= š\u001cµNµxÖ÷…\u000btí·5ÎÔ¡Â&…£Ãç£çt\u000f~Y\u001d|\u0011\u0010\t~Y\u0010~Y\u0010~Y\u0010€“n³\u001bväCmÓ$lV¨‘\u0010³k\u001dïcbÐӞ&c\\»Å\"u-\u0007ÒÏõF]+R.—\u000bÒÕ\u0015+k7<ÅÖy,ïâÏՔ)k3ZÅÀFí\u000bLÇmˆ:ëøü…PÇTZ8g“¡µ\u0018Jëg\u0000Ì\u0014\u001bRçzîµüBî?ÐtÝTïo¿ÕVnk‡\u000eÃVx:Ìv\u0000\t~\u000b<%®\u0007¹\u00114ì\u0013õI–\u0000<ÎÂÆW;­&vÍÿÍK3QM%PËo\u0011ÀdžÎç>Eó\u0013(%[êD–¨(Tò·¹¡óûº\u0002\bþ\t8ÀhøYwõü\bMoCÕ\u0017+ín¼ÍØzK\u0007áC•ŒUm¡ŠÍf!NwëG´È>iY5½ðŽ\u000bÇWØÙ\u0019w\u000bÓ÷†Œ¯0\u0011\u000e×EÁs»!üƉ\u00160¤b×áÊs”U‹?ËQ6Z9qÓæŠ\u0019Þ@\u001f&\u0017]ñx|\\办\u0011@%Š\u0018êÝ\u0006a\u000f-\u0010\u0013Ü@d~%©ôM»Ç5¯õXÓëv~ÈÛ&›®°¡\u000fÙ\u001b!oƒ—ð&ø\u0012¯©èÕ45=}\u0007l\u0004•E7l-ÝÉ$\b5M&lTäɐJ=}Çü\u0004U\u0011:ì˜VÉz‘>[BïAéZ«öüp\u0006tK_h©¹|ß.Ä@Б²XËáf\u0005“Í.Ö\u001eϵ@ZKšÓ%\"Y{µf‰!Í>‹\u001c\u0010U8ẐcID\u000e\u0006\u0019U¬*{×@\t†QS4\u0019|÷Þ\u0006öƒAð5²Ù’EÛ¿ð‰ÓÐ*&úmÄú\u0010*\n]fŸÙ±åâ*k¶¿9Ò\u0017KX|„l´*Az¿…_\u0013;—vÄèß:lŒ\u0000…¹\u0017Œötˆ\u001cÆ:\u001dan=}qÑÔ)]\u000bvÿ9Ð\u001a\u001cZfHsÌ:yZ\u0000¹a\u0014\\“zˆúå2¯<àm¸”³M\u001b'%ê*sFþz+À‰t!]êSeF”ñ2ÕJßu€™›™}†oÂ2ܬ\u001f=}\b—lþkŠèèB¨0\u001f=}\u001bá¢ÝÏ¼‡ö\u0010Ur há@Z›ç܍֕MòŸ\náÆaè\u0007\u0005©Wò¸\u0013Öúã(u¤\u0016=M¨\u001fø¦=MY¯;uփyk#\u0017V¥‡ø¤F\u001a¨ß¸“‹ùã/z¤ü\"ª7,ºõÊ\u0000+7ÒçÒºT\u0018æ§ÆGéŽ3…= æu0±œÞ·iM3\u0018^åA­L\u001cÎǁN36âf¢¯9¦[¸ô³#V\u0010~YŽrYy^ª|\u001d|Y\u0010~Y\u0010~ّûBê¯-\u0004óË(d ©æ.¾\u0007L\t\u0013CLäÆnƒô\u001a¦\u0012;d~L©‘õ&*þ¯½¿Ô{\u001e|Æ\u0006&äB¯\u0011èÓl6cGò\u001d6æœïÅ:ØÌþjGþ\u000e6HalœáÉBê<Ç;\b5\u0006HìŒÀÉx1>w= ¹…JÉØa'Æü‡ð\u000b4Ï&hR\u001f¹ÚSû\u0002~\u0005óÎ.}AèE¹:êû/@\u0011ô!éÙ0Ý}\u000fvÙ,©}ۆ\u000f\u0019pT,U}Iiñ>ôj\u0010±\u0002Xœ¡{ÉnÊ>}„À\u0007ÿ*ÔLÀ¹ˆ\u0017{ÿ\u0004\u0002¸*f0åd\u00042\u0015{s‚\u0004»*\u0004V¿?¸±8ZÜGᅓ™Efqž± ‚Ý“~„ê\u0017:Øì\u0000ý\u0007\u0019,÷s\büü:-X\u0000\u0011X\u0013”\u0010:€ÿ*\\Ÿ>ƒu\u000eAn~xÑP\u001a]¿Þ‰5†-n“*њ‚\\D\"l\bã¯2FìàE\b™KócFÊÁÎ=M\u001dÿ=M‰”€“ë}hƂã2-\u0006àr•\u000baFˆ¹2\tªàA–Ë\u001a~ƚ®2'\u0002àáè“ܾz\nôÍÂ@€J÷´B\u0013¸Ÿs\u000fž\u0017\u0012Œ6f™\\yxJ¢ÃB—†\u001f™o•\f[Šl\tÂ\u0018cŠ~<ó€ðB2ò oòáú¢œ70¸SÛüãgo¤Ð•ªOÎÀ“JýãHi¤f}ª¿±¥!š­kàÏCœG#¤–¥¹O­{VЃuD#ꊥ­›—ÏgB¥Ÿ®\u001b»ö\u0013ÄL\u0003\néd_%aȨ0M«UÚ³\u001f\u000eÐ{Š«©\u0018¶Óˇ2´O;Ä\u000b_ç“\n= \u0003\u0011äl†%.:§À‘¬= ·\u0017 Í›½\u0001E\u0006îAÈ6×pÇÜ7ú5PG\u0007ç\blF\u001d5\u0005PÇfÐlhq5G ÈðéíÉï4¿<Ҝ_í5\t>GŸäì^Ö5zȆÁì‰_8ϞÄü¸ìTÅQ\u0005\u0004­hwo-S\u001f­bGE\u0001\bè\u001d-\u000bиZ¯híHs ·è)ÌáòóO7•~8\tª7‘Ê8¡:7\u0004Z8´ò%!N—žI\u0017 R×,=M70\n\u0007í\u000fçî\u0006ßl\u0005o\u000e/Î\twÎ\nÇN\u0011R\u0012Ï\u000b\u0004wŒ\u000bçŒ\b\u000fŽ\n×Â\u0011ç?\u0003ÏB\u0004·\u0002\u000bÿü\fW€\u0007\u001f}\t›!†r”CÒ§¢)t‘D\u0014˜Hô•6T•:´Ü%vÍ)VÖ$¶ÆLvÓPªAqV_ñ]\u0005ñ–UqoMqT]qJIñE\u0019ñt\u0011ñæ\u0014\u001d²\u0015é2\u0015\tò\u00159q\u0015yÏ\u0015yQ\u0015ù\u0010\u0015¹\u0010\u0016I‘\u0016)¿\u0016Ý@–\u0013)h¤}±Ã©EX\u0010~Y~þ~Y\u0010a€ÇX\u0010~Y\u0010~Y\u0010žÂ/*-:¥\u0007a¸ÃŸF£š\u0002©{›Ôã¢B¤m*\u0013ç,ƒÛ¾€ÔÅaF\u000b\u0015jj\u00171œ|¿\b–܁ƒ»\u0000i4Y-\u0006\u0012\u0010ê8i1~P¿PÝÜ\u0001—\u0017WŽ\u001bßkô\"7†—çê¡<1(®¿\u0004ù§\u0010yޙ\u0012\u0016g€ºWލ{\u001di”’UF‡\u0010jƒê1 ÒÀ\u0002âÛu¢\u0013w¬‰¼³yV×-Š\u000b\u000frFçABÌàôÕ\u001dµˆ“Gp’lÿw6H/Êö\bòMýA›°à„þ\u001báZ–|ŽßVž\u001d¥æ߸ê\u001eµò•_?„|ׂ†9\u001c•Q˜\u001füTnv“Cʅ¬r9\u0016A©úàb\u0012\u001e\tᕇ\u001fŒÜ™öš>Š”Âòjóež«å:‹en[åVÇeH÷å”/eå/\u001fårÅe(5å)­åb=MeœÝå…iåN9em™äbQå½Ê׍Æï»Ç¿»Ä_ÁÊg?͇<ÐwýË\u0017\u0000ѯ\u0000Îo{ÏÏ~Ì\u000fÒ\u000fâ͏ßÀgº&Ÿ\u0018\u0004œ\u0000\u0004‰\u0006\u0004{îD~\u001eDqúĂ\u0012Äñ«ˆ\u0000ûˆë\u0007\b=MïH\b\u001fÈ\u0016õˆöÍ\b\u0016©HþÙÈ\u0006Áˆ!ä\b\u0005Ô(Õm.-m{íY]m|éí>¹mBYm[qí…AmÕô՚öy°±…4m•\u0014í5Ìm'íkžítÊ-_÷yaö‘ ùÅ¢÷•¡ö½(՝(ډçÔYj×qhÖÁÈÙáIÓ¡IØe\u0007ÙŇÓʼnØe¸Õ%ºÖa8Õ\u00017ÚQøÔ±w×9zÖéØÙÝWÓmWØ5\u0019Õá\u0018Ö±ª/,\t׋\u0012ÇÂ\u0005ßÁ\u0004Ͻ\u000e×A\u0007g<\u0011??\u0010‹¥Æõ†ŸíÆSq+Z|{Y€Kaj\u001b\u0014c‹\u0016w+\u0015m;\u0018që\u0018|û\u001c€k\u001fjû Ã‹šw;šu+œq»Ÿl››p\u000b›~Û·OÚ\fåš\t뛁ß/>¢¯9¦»¸ã³'V\u0010~YŽrY\u0010~_@\u000f~Y\u0010~Y\u0002Yq\u001aVò6Ò=}\u0006åÏ¢1Šk5{tÒ\\†\u0013=Mꋯ1uü¿f\u0015Û±‡\u0014\u001f΃ëúgôZ'\u0006\u001b¼j)­1\u000eø¿â=Mۅw\u0018‡\u000b‹KswtWHF\u001eþjƒ11\u0014\u0000Àv\u001dÝ\tš\u0018o8bªœ¢Ó22\u0015¯½Š˜É\u001c \f\u00119ZBŠ+Vk”\u0006L†íjIX14¾À°ZÝՒ\u0017Ÿ|†Û!cÔ¡+F}¬ê/Ö1nŠÀ\u0006ÒÞíÿ\u001aŸ_ˆû rôšDƇöj}º1M\u0012¿B‚ÞÉ\"\u0019\u0007‘\"ܽŸ\u0016AF¾ æ¼„f¼öŽ”F½–\u0005»,…»V†¾Ô¶¾\u00065¼äõ<ŠºéÃ&ôÑ.TÜ^´ÊZtÚB\u0014VC4N+Ôa[”G74J?ÔUEœA»ì\u000e»P\u000e¾\u000eŽ¼’½½<=}½\u0010þ».þ\u001e^\u0019é'ñédQÁŽ\u0004ï\u0010\nß7´\u000534\u0005Kô\u001b'ô\u001aWt\u001c?Ô\u0017EÔ\u0010-T\u0007]T\u00049T\u0016QT\"$\u0014\u000bT‚n/¦Î0€\u000e/pŽ0¸>/|þ0tÞ/^0\tž/Uª0Ïê/\u000bj0²Ê0\u0016\n/8Š0¤:/½ú0wÚ/\u0012Z/Æ\u001a0\u0014¤2àՅàؑßډ_Ս_ØE\"Óñ\"•Ù\u00020â/êb/¬\"0ŸähFƒ\u0005\u0007Ë4ÄOÛ¶\u0001W0Çå踖E.?Tg,ÛE\u0011\u001f”ßD‹AçŸðÉ)I·„u+Ԍç'/áV«4ð[¿…\u0006ÑtÅR[9\u0002·ÒÇÙ·¹”-,$ÈgvõE\u0017üTE_«üì×QÅ\u0019ù¶4\u000e-\tXhy]Åç¦ôH4;€çß=MÉuY·þ.X\u0010hŽ™ÅðÊtW.;xðÿ‹Ä%š¹|ž\u001do,\u0014µÞ©+cô\u0015KzÀÑm/·Pê.Ä\u0006hŸ”\u0005žç\u0014\tU«ï¸ÂI.ÃVçgÜÅqß4\u0007$ëXëGþÅÕϖ\u001e(ë^íGÿƵP¶Ôڛ]Ú,â>h~P…q\u0019\u0014\u0015J{_þoŽ\u000e’\u000eâËíÀ¹L2-3jèƒ'{\u0018íïßÆý@¶œÑ+«:gn\u0005høt]Ë\u001bö'[Ðñ´\u0006‘,­¤R–ó?\u001dÇ)á´(A,ÒrhM:E„\u000e´œP{šñW¢Ã\u0005\"µªâ.y\u0002èG’\u0005v²ô :›—þïŸÎÕ¨Œr,C \f¿_â‚å—\n\u0017K¡Ç­vB˜\u0004žö‹â\u0014š³¨k$¨ó×ñ}Y\u0010~Y\u0010~Y\u0010~Y\u0010~Y\u0010~ º\u0006’ÉŠ×îb=Mž!ªu\u0005©y=}©xj\f\tŽ(sfŒ\t>*ye\f\nþ(vŒ\n>éwn\f\u000b\u000eét´\u000b.é’9\u0010J9ÙX9\u0019\u0019\u000f GAYþߐ\t\u001fÐ\u0005å^2¶|\u000e?ç6;÷\u000eJRpNR@6õn=}ýÎ;iá†W™¯JZ¾Û&Àk\u001d~c< !¹ð\u0002ù@\u0000Ù\"\u0002\u001aÞÅJ\u000eˆu¼‰T>ÛRáØBQØbéUCáS3\u0000_(\u0018C\u0019Íê–\u0012˜8z†±ÎD\"ÐLzvˆÉÏFNÏN ÏzÐ~\u001d ‘­Qúì¶üüªýèöûx”xß\u001e\u0018rþf˜\u000eÜIYQX1\nONÞOJ\u0006w‘Ñ=M\u0003ZU!š\u0017Ært{Ÿ=}‹ü>Œ÷>^Ҟ=}¶Zw$YU>ür>^0\u0019ùvþG@9ôzþ_¦ÀpM6 j@àöº^*^=M\u0019^\u0018n9ÿŠ¾Z*ñ\\JžH²wžáŠýÂÐ\t\u0002֌\nQ ØF\u0019âZÀ\u000bٝ‚ÿ&X<½ƒãæ€Öê)\fÚ*\u001eBÆ_Z4¡\u001f7iü¶Ÿ9Æ\u0006¿R°‘Óq /ÚÆ “®\u0019ïwGñ\u0015alA\u001a-q4\u0010\u001d„¡v–\u0017ž4Øf:;Ùv¿WfT\n>ÀV‰›˜ÿŠ<Šr¼Ö‚‚\u0002CZxµ\u0012HpŊV\u001e­f\u0018hÜ:!;\\o¯9\u000eÇüSåî_õÆl_ø1\u0002\u0001<_iÿy]± z\u001ci˜aú\u0010ӎ0QðYðQî>p‰HäAî9P®°YÜâfZ\u000e\u0004ØlNlPîáèð\u0010•Öݐ\u0019R‡´ç}Ž?ÇuÌRÇ != Ôܱ›!k\u001eóŽíaæ!Ç2!\u001cº|2\u000b&ìN\u0004\u0001äe\u0006A2+j\u0000>‚ñ[±rKL\u000eáæö÷…Œ>j•.i\\ÈúÌK\u0016\u0001æ—\u0016ý\u0011\u0001õ„_’0\u001bº×R_C/™\u001cà4ќÑ\\å¹À—·áô„-\u000e³M\u0019;&gyè\u001aˆ¿lWt \\åM¾Qh¸õ‹Gž\u00131§ýŒ1¿Å5\t]ľ› 1Ù?¼ßÄ= !]ºê«JFQq\u001fA4ùò€(\u0000ŸDLÑo\u0013ñ¶ñþ\u0000$,ÿÅUi]Õ6[ë\u001bP\u0018üé\u0014/ãòoBA\u000f‰ÐlWz˜Ç›cÒ¶\u0001=M\u001b®Ù—\u001e¤^·±º±ùô>né7\u0016i/9Z•ç\u0012Éüô3à³ð_Ãó\u0012ö˽÷PÖ]÷\u0015ÃÝ¡\u000bßýyÄ¿\u001cÉiF”\u001e@\u000bÂý0e\u001e\u0010èS¡¤7aâ¬= ›A$weZó‚šr4\u001a…ÚWT$-‚\u0012؅RnpÛvj¶\u001eÚX\u0005ŒÁ+= :«ß‰ù«›_¶qn¿#†:0jž*†·\nßA»ŒgR¯N\u0014í= P{\u0001SÂò>9'¢ÛA$\n\u0012\u0005Š™ŠÛ\"eÚ?ùèÈQ|éõÓmï- –ànüìŠj¤‡ñÒä?NåkZp@ë\u0013£Õ]\u001b\u0015= \u001bÛ¼ÔßAç\u0017\u00185ݚú´†\u0012þks\u0016ž¬\u00127ç=MrqÎF\u00125^&A6ژa4Zâ·}OV49\u0011\u000fIq\u001dsÆrÐ\u0017qQ£]t͋\\aÄWfƒñ×Ul£ÝwÛAMre\u000b0é”\u0017ð Ê@T\n¸À3= (Q\u0013JH5‹ƒi¼wp!6©ø\"ñâaŸí= ÑÎOKB4¨÷ÕVÀîàûœæ¹\u0019\u000fí£>œ HEAPU8.copyWithin(dest, src, src + num);\n\nvar abortOnCannotGrowMemory = requestedSize => {\n abort(\"OOM\");\n};\n\nvar _emscripten_resize_heap = requestedSize => {\n var oldSize = HEAPU8.length;\n requestedSize >>>= 0;\n abortOnCannotGrowMemory(requestedSize);\n};\n\nvar wasmImports = {\n /** @export */ b: JS_atan,\n /** @export */ a: JS_cos,\n /** @export */ d: JS_exp,\n /** @export */ e: JS_log,\n /** @export */ f: JS_pow,\n /** @export */ c: JS_sin,\n /** @export */ g: _emscripten_memcpy_js,\n /** @export */ h: _emscripten_resize_heap\n};\n\nfunction initRuntime(wasmExports) {\n wasmExports[\"j\"]();\n}\n\nvar imports = {\n \"a\": wasmImports\n};\n\nvar _create_decoder, _malloc, _send_setup, _init_dsp, _decode_packets, _destroy_decoder, _free;\n\n\nthis.setModule = (data) => {\n WASMAudioDecoderCommon.setModule(EmscriptenWASM, data);\n};\n\nthis.getModule = () =>\n WASMAudioDecoderCommon.getModule(EmscriptenWASM);\n\nthis.instantiate = () => {\n this.getModule().then((wasm) => WebAssembly.instantiate(wasm, imports)).then((instance) => {\n const wasmExports = instance.exports;\n _create_decoder = wasmExports[\"k\"];\n _malloc = wasmExports[\"l\"];\n _send_setup = wasmExports[\"m\"];\n _init_dsp = wasmExports[\"n\"];\n _decode_packets = wasmExports[\"o\"];\n _destroy_decoder = wasmExports[\"p\"];\n _free = wasmExports[\"q\"];\n wasmMemory = wasmExports[\"i\"];\n updateMemoryViews();\n initRuntime(wasmExports);\n ready();\n});\n\nthis.ready = new Promise(resolve => {\n ready = resolve;\n}).then(() => {\n this.HEAP = wasmMemory.buffer;\n this.malloc = _malloc;\n this.free = _free;\n this.create_decoder = _create_decoder;\n this.send_setup = _send_setup;\n this.init_dsp = _init_dsp;\n this.decode_packets = _decode_packets;\n this.destroy_decoder = _destroy_decoder;\n});\nreturn this;\n}}","import { WASMAudioDecoderCommon } from \"@wasm-audio-decoders/common\";\nimport CodecParser, {\n absoluteGranulePosition,\n samples,\n data,\n codecFrames,\n header,\n vorbisComments,\n vorbisSetup,\n isLastPage,\n} from \"codec-parser\";\n\nimport EmscriptenWASM from \"./EmscriptenWasm.js\";\n\nexport function Decoder() {\n // injects dependencies when running as a web worker\n // async\n this._init = () => {\n return new this._WASMAudioDecoderCommon()\n .instantiate(this._EmscriptenWASM, this._module)\n .then((common) => {\n this._common = common;\n\n this._input = this._common.allocateTypedArray(\n this._inputSize,\n Uint8Array,\n );\n\n this._firstPage = true;\n this._inputLen = this._common.allocateTypedArray(1, Uint32Array);\n\n this._outputBufferPtr = this._common.allocateTypedArray(1, Uint32Array);\n this._channels = this._common.allocateTypedArray(1, Uint32Array);\n this._sampleRate = this._common.allocateTypedArray(1, Uint32Array);\n this._samplesDecoded = this._common.allocateTypedArray(1, Uint32Array);\n\n const maxErrors = 128 * 2;\n this._errors = this._common.allocateTypedArray(maxErrors, Uint32Array);\n this._errorsLength = this._common.allocateTypedArray(1, Int32Array);\n\n this._frameNumber = 0;\n this._inputBytes = 0;\n this._outputSamples = 0;\n\n this._decoder = this._common.wasm.create_decoder(\n this._input.ptr,\n this._inputLen.ptr,\n this._outputBufferPtr.ptr,\n this._channels.ptr,\n this._sampleRate.ptr,\n this._samplesDecoded.ptr,\n this._errors.ptr,\n this._errorsLength.ptr,\n maxErrors,\n );\n });\n };\n\n Object.defineProperty(this, \"ready\", {\n enumerable: true,\n get: () => this._ready,\n });\n\n // async\n this.reset = () => {\n this.free();\n return this._init();\n };\n\n this.free = () => {\n this._common.wasm.destroy_decoder(this._decoder);\n this._common.free();\n };\n\n this.sendSetupHeader = (data) => {\n this._input.buf.set(data);\n this._inputLen.buf[0] = data.length;\n\n this._common.wasm.send_setup(this._decoder, this._firstPage);\n this._firstPage = false;\n };\n\n this.initDsp = () => {\n this._common.wasm.init_dsp(this._decoder);\n };\n\n this.decodePackets = (packets) => {\n let outputBuffers = [],\n outputSamples = 0,\n errors = [];\n\n for (let packetIdx = 0; packetIdx < packets.length; packetIdx++) {\n const packet = packets[packetIdx];\n this._input.buf.set(packet);\n this._inputLen.buf[0] = packet.length;\n\n this._common.wasm.decode_packets(this._decoder);\n\n const samplesDecoded = this._samplesDecoded.buf[0];\n const channels = [];\n\n const outputBufferChannels = new Uint32Array(\n this._common.wasm.HEAP,\n this._outputBufferPtr.buf[0],\n this._channels.buf[0],\n );\n for (let channel = 0; channel < this._channels.buf[0]; channel++) {\n const output = new Float32Array(samplesDecoded);\n\n if (samplesDecoded) {\n output.set(\n new Float32Array(\n this._common.wasm.HEAP,\n outputBufferChannels[channel],\n samplesDecoded,\n ),\n );\n }\n\n channels.push(output);\n }\n\n outputBuffers.push(channels);\n outputSamples += samplesDecoded;\n\n this._frameNumber++;\n this._inputBytes += packet.length;\n this._outputSamples += samplesDecoded;\n\n // handle any errors that may have occurred\n for (let i = 0; i < this._errorsLength.buf; i += 2)\n errors.push({\n message:\n this._common.codeToString(this._errors.buf[i]) +\n \" \" +\n this._common.codeToString(this._errors.buf[i + 1]),\n frameLength: packet.length,\n frameNumber: this._frameNumber,\n inputBytes: this._inputBytes,\n outputSamples: this._outputSamples,\n });\n\n // clear the error buffer\n this._errorsLength.buf[0] = 0;\n }\n\n return this._WASMAudioDecoderCommon.getDecodedAudioMultiChannel(\n errors,\n outputBuffers,\n this._channels.buf[0],\n outputSamples,\n this._sampleRate.buf[0],\n 16,\n );\n };\n\n // injects dependencies when running as a web worker\n this._isWebWorker = Decoder.isWebWorker;\n this._WASMAudioDecoderCommon =\n Decoder.WASMAudioDecoderCommon || WASMAudioDecoderCommon;\n this._EmscriptenWASM = Decoder.EmscriptenWASM || EmscriptenWASM;\n this._module = Decoder.module;\n\n this._inputSize = 128 * 1024;\n\n this._ready = this._init();\n\n return this;\n}\n\nexport const setDecoderClass = Symbol();\n\nexport default class OggVorbisDecoder {\n constructor() {\n this._onCodec = (codec) => {\n if (codec !== \"vorbis\")\n throw new Error(\n \"@wasm-audio-decoders/ogg-vorbis does not support this codec \" +\n codec,\n );\n };\n\n // instantiate to create static properties\n new WASMAudioDecoderCommon();\n\n this._init();\n this[setDecoderClass](Decoder);\n }\n\n _init() {\n this._vorbisSetupInProgress = true;\n this._beginningSampleOffset = undefined;\n this._codecParser = new CodecParser(\"audio/ogg\", {\n onCodec: this._onCodec,\n enableFrameCRC32: false,\n });\n }\n\n [setDecoderClass](decoderClass) {\n if (this._decoder) {\n const oldDecoder = this._decoder;\n oldDecoder.ready.then(() => oldDecoder.free());\n }\n\n this._decoder = new decoderClass();\n this._ready = this._decoder.ready;\n }\n\n get ready() {\n return this._ready;\n }\n\n async reset() {\n this._init();\n return this._decoder.reset();\n }\n\n free() {\n this._decoder.free();\n }\n\n async decodeOggPages(oggPages) {\n const packets = [];\n\n for (let i = 0; i < oggPages.length; i++) {\n const oggPage = oggPages[i];\n\n if (this._vorbisSetupInProgress) {\n if (oggPage[data][0] === 1) {\n this._decoder.sendSetupHeader(oggPage[data]);\n }\n\n if (oggPage[codecFrames].length) {\n const headerData = oggPage[codecFrames][0][header];\n\n this._decoder.sendSetupHeader(headerData[vorbisComments]);\n this._decoder.sendSetupHeader(headerData[vorbisSetup]);\n this._decoder.initDsp();\n\n this._vorbisSetupInProgress = false;\n }\n }\n\n packets.push(...oggPage[codecFrames].map((f) => f[data]));\n }\n\n const decoded = await this._decoder.decodePackets(packets);\n\n // in cases where BigInt isn't supported, don't do any absoluteGranulePosition logic (i.e. old iOS versions)\n const oggPage = oggPages[oggPages.length - 1];\n if (oggPages.length && Number(oggPage[absoluteGranulePosition]) > -1) {\n if (this._beginningSampleOffset === undefined) {\n this._beginningSampleOffset =\n oggPage[absoluteGranulePosition] - BigInt(oggPage[samples]);\n }\n\n if (oggPage[isLastPage]) {\n // trim any extra samples that are decoded beyond the absoluteGranulePosition, relative to where we started in the stream\n const samplesToTrim =\n decoded.samplesDecoded - Number(oggPage[absoluteGranulePosition]);\n\n if (samplesToTrim > 0) {\n for (let i = 0; i < decoded.channelData.length; i++)\n decoded.channelData[i] = decoded.channelData[i].subarray(\n 0,\n decoded.samplesDecoded - samplesToTrim,\n );\n\n decoded.samplesDecoded -= samplesToTrim;\n }\n }\n }\n\n return decoded;\n }\n\n async decode(vorbisData) {\n return this.decodeOggPages([...this._codecParser.parseChunk(vorbisData)]);\n }\n\n async flush() {\n const decoded = this.decodeOggPages([...this._codecParser.flush()]);\n\n await this.reset();\n return decoded;\n }\n\n async decodeFile(vorbisData) {\n const decoded = this.decodeOggPages([\n ...this._codecParser.parseAll(vorbisData),\n ]);\n\n await this.reset();\n return decoded;\n }\n}\n","import { WASMAudioDecoderWorker } from \"@wasm-audio-decoders/common\";\nimport EmscriptenWASM from \"./EmscriptenWasm.js\";\nimport OggVorbisDecoder, {\n Decoder,\n setDecoderClass,\n} from \"./OggVorbisDecoder.js\";\n\nclass DecoderWorker extends WASMAudioDecoderWorker {\n constructor(options) {\n super(options, \"ogg-vorbis-decoder\", Decoder, EmscriptenWASM);\n }\n\n async sendSetupHeader(data) {\n return this.postToDecoder(\"sendSetupHeader\", data);\n }\n\n async initDsp() {\n return this.postToDecoder(\"initDsp\");\n }\n\n async decodePackets(packets) {\n return this.postToDecoder(\"decodePackets\", packets);\n }\n}\n\nexport default class OggVorbisDecoderWebWorker extends OggVorbisDecoder {\n constructor() {\n super();\n\n super[setDecoderClass](DecoderWorker);\n }\n\n async free() {\n super.free();\n }\n\n terminate() {\n this._decoder.terminate();\n }\n}\n","import OggVorbisDecoder from \"./src/OggVorbisDecoder.js\";\nimport OggVorbisDecoderWebWorker from \"./src/OggVorbisDecoderWebWorker.js\";\nimport { assignNames } from \"@wasm-audio-decoders/common\";\n\nassignNames(OggVorbisDecoder, \"OggVorbisDecoder\");\nassignNames(OggVorbisDecoderWebWorker, \"OggVorbisDecoderWebWorker\");\n\nexport { OggVorbisDecoder, OggVorbisDecoderWebWorker };\n","const t=(t,n=4294967295,e=79764919)=>{const r=new Int32Array(256);let o,s,i,c=n;for(o=0;o<256;o++){for(i=o<<24,s=8;s>0;--s)i=2147483648&i?i<<1^e:i<<1;r[o]=i}for(o=0;o>24^t[o])];return c},n=t=>{const n=[];for(const e of t){let t=(e+42)%256;0===t||10===t||13===t||61===t?n.push(\"=\"+String.fromCharCode((t+64)%256)):n.push(String.fromCharCode(t))}return n.join(\"\")},e=(n,e=t)=>{const r=t=>new Uint8Array(t.length/2).map(((n,e)=>parseInt(t.substring(2*e,2*(e+1)),16))),o=t=>r(t)[0],s=new Map;[,8364,,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,,381,,,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,,382,376].forEach(((t,n)=>s.set(t,n)));const i=new Uint8Array(n.length);let c,a,l,f=!1,g=0,h=42,p=n.length>13&&\"dynEncode\"===n.substring(0,9),u=0;p&&(u=11,a=o(n.substring(9,u)),a<=1&&(u+=2,h=o(n.substring(11,u))),1===a&&(u+=8,l=(t=>new DataView(r(t).buffer).getInt32(0,!0))(n.substring(13,u))));const d=256-h;for(let t=u;t255){const t=s.get(c);t&&(c=t+127)}f&&(f=!1,c-=64),i[g++]=c0?c+d:c-h}else f=!0;const m=i.subarray(0,g);if(p&&1===a){const t=e(m);if(t!==l){const n=\"Decode failed crc32 validation\";throw console.error(\"`simple-yenc`\\n\",n+\"\\n\",\"Expected: \"+l+\"; Got: \"+t+\"\\n\",\"Visit https://github.com/eshaz/simple-yenc for more information\"),Error(n)}}return m},r=(n,e='\"',r=t,o)=>{const s=(t,n)=>(t%n+n)%n,i=(t,n)=>n.push(String.fromCharCode(61,(t+64)%256)),c=t=>t.map((t=>t.toString(16).padStart(2,\"0\")));let a,l,f=[],g=1/0,h=Array(256).fill(0);if('\"'===e?(l=[0,8,9,10,11,12,13,34,92,61],a=t=>0===t||8===t||9===t||10===t||11===t||12===t||13===t||34===t||92===t||61===t):\"'\"===e?(l=[0,8,9,10,11,12,13,39,92,61],a=t=>0===t||8===t||9===t||10===t||11===t||12===t||13===t||39===t||92===t||61===t):\"`\"===e&&(l=[13,61,96],f=[7,205,231],a=(t,n)=>13===t||36===t&&123===n||61===t||92===t&&(85===n||117===n)||96===t),void 0===o){o=0;for(let t=0;t{const n=new Uint8Array(4);return new DataView(n.buffer).setInt32(0,t,!0),[...n]})(r(n)))];for(let t=0;tt.replace(/[\\\\]/g,\"\\\\\\\\\").replace(/[`]/g,\"\\\\`\").replace(/\\${/g,\"\\\\${\");export{t as crc32,e as decode,r as dynamicEncode,n as encode,o as stringify};\n"],"names":["module","exports","Worker","EmscriptenWASM","WASMAudioDecoderCommon","HEAPU8","wasmMemory","ready","base64ReverseLookup","Uint8Array","i","wasm","Object","defineProperty","get","String","raw","_create_decoder","_malloc","_send_setup","_init_dsp","_decode_packets","_destroy_decoder","_free","imports","b","x","Math","atan","a","cos","d","exp","e","log","f","y","pow","c","sin","g","dest","src","num","copyWithin","h","requestedSize","length","what","abort","this","setModule","data","getModule","instantiate","then","WebAssembly","instance","wasmExports","buffer","Int8Array","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","initRuntime","Promise","resolve","HEAP","malloc","free","create_decoder","send_setup","init_dsp","decode_packets","destroy_decoder","Decoder","_init","_WASMAudioDecoderCommon","_EmscriptenWASM","_module","common","_common","_input","allocateTypedArray","_inputSize","_firstPage","_inputLen","_outputBufferPtr","_channels","_sampleRate","_samplesDecoded","_errors","_errorsLength","_frameNumber","_inputBytes","_outputSamples","_decoder","ptr","enumerable","_ready","reset","sendSetupHeader","buf","set","initDsp","decodePackets","packets","outputBuffers","outputSamples","errors","packetIdx","packet","samplesDecoded","channels","outputBufferChannels","channel","output","push","message","codeToString","frameLength","frameNumber","inputBytes","getDecodedAudioMultiChannel","_isWebWorker","isWebWorker","setDecoderClass","Symbol","OggVorbisDecoder","constructor","_onCodec","codec","Error","_vorbisSetupInProgress","_beginningSampleOffset","undefined","_codecParser","onCodec","enableFrameCRC32","decoderClass","oldDecoder","decodeOggPages","oggPages","oggPage","headerData","map","decoded","Number","BigInt","samplesToTrim","channelData","subarray","decode","vorbisData","parseChunk","flush","decodeFile","parseAll","DecoderWorker","WASMAudioDecoderWorker","options","super","postToDecoder","OggVorbisDecoderWebWorker","terminate","t","n","r","o","s","parseInt","substring","Map","forEach","l","p","u","DataView","getInt32","charCodeAt","m","console","error"],"sourceRoot":""} \ No newline at end of file diff --git a/src/.fleek.json b/src/.fleek.json deleted file mode 100644 index 80d2e19..0000000 --- a/src/.fleek.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "build": { - "image": "denoland/deno", - "command": "deno task build --location=https://lume-blog.on.fleek.co", - "publicDir": "_site" - } -} diff --git a/src/.gitignore b/src/.gitignore deleted file mode 100644 index 42de261..0000000 --- a/src/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -_site -_bin \ No newline at end of file diff --git a/src/404.md b/src/404.md deleted file mode 100644 index c2d5b2a..0000000 --- a/src/404.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -layout: layouts/home.njk -url: /404.html ---- - -# Content not found. - -Go [home](/). diff --git a/src/_config.ts b/src/_config.ts deleted file mode 100644 index 53ca5e3..0000000 --- a/src/_config.ts +++ /dev/null @@ -1,46 +0,0 @@ -import lume from "lume/mod.ts"; -import date from "lume/plugins/date.ts"; -import postcss from "lume/plugins/postcss.ts"; -import codeHighlight from "lume/plugins/code_highlight.ts"; -import basePath from "lume/plugins/base_path.ts"; -import slugifyUrls from "lume/plugins/slugify_urls.ts"; -import resolveUrls from "lume/plugins/resolve_urls.ts"; -import netlifyCMS from "lume/plugins/netlify_cms.ts"; -import pageFind from "lume/plugins/pagefind.ts"; -import sitemap from "lume/plugins/sitemap.ts"; -import feed from "lume/plugins/feed.ts"; - -const site = lume({ - location: new URL("https://example.com/"), -}); - -site - .ignore("README.md") - .copy("img") - .use(postcss()) - .use(date()) - .use(codeHighlight()) - .use(basePath()) - .use(sitemap()) - .use(pageFind({ - ui: { - resetStyles: false, - }, - })) - .use(slugifyUrls({ alphanumeric: false })) - .use(feed({ - output: ["/feed.json", "/feed.xml"], - query: "type=posts", - info: { - title: "=site.title", - description: "=site.description", - }, - items: { - title: "=title", - content: "$.post-body", - } - })) - .use(resolveUrls()) - .use(netlifyCMS({ netlifyIdentity: true })); - -export default site; diff --git a/src/_data/netlify_cms.js b/src/_data/netlify_cms.js deleted file mode 100644 index 60c9b63..0000000 --- a/src/_data/netlify_cms.js +++ /dev/null @@ -1,54 +0,0 @@ -import f from "https://deno.land/x/netlify_cms_config@v0.2.0/mod.ts"; - -f.defaultRequired = false; - -const config = { - backend: { - name: "git-gateway", - branch: "master", - }, - media_folder: "img", - collections: [], -}; - -// Posts -config.collections.push( - f.folder("Posts", "posts") - .description("Here you can create or edit your posts") - .preview(false) - .create(true) - .viewFilter("Draft", "draft", true) - .fields([ - f.string("Title"), - f.string("Description"), - f.datetime("Date"), - f.list("Tags"), - f.boolean("Draft").required(false), - f.markdown("Body"), - ]) - .toJSON(), -); - -const pageFields = [ - f.string("Title"), - f.string("Url"), - f.markdown("Body"), - f.object("Menu", [ - f.boolean("Visible"), - f.number("Order"), - ]), - f.hidden("templateClass"), - f.hidden("layout"), -]; - -// Individual pages -config.collections.push( - f.files("Pages") - .description("Here you can edit your individual pages") - .preview(false) - .file("About", "about.md", pageFields) - .file("404", "404.md", pageFields) - .toJSON(), -); - -export default config; diff --git a/src/_data/site.yml b/src/_data/site.yml deleted file mode 100755 index 0e61942..0000000 --- a/src/_data/site.yml +++ /dev/null @@ -1,6 +0,0 @@ -title: 1159 -description: Mario Romero personal site. -author: - name: Mario Romero, - email: mario@1159.cl, - url: https://1159.cl/home/ diff --git a/src/_includes/css/navbar.css b/src/_includes/css/navbar.css deleted file mode 100644 index 4e25422..0000000 --- a/src/_includes/css/navbar.css +++ /dev/null @@ -1,66 +0,0 @@ -.navbar { - display: flex; - flex-wrap: wrap; - align-items: center; - padding: 1rem 1rem 1rem 2rem; - column-gap: 2rem; - row-gap: 1rem; - background-color: var(--bg-secondary); - - & a { - display: block; - color: var(--fg-secondary); - - &:not(:hover) { - text-decoration: none; - } - } -} - -.navbar-links { - padding: 0; - margin: 0; - list-style: none; - display: flex; - flex-wrap: wrap; - column-gap: 2rem; - - & [aria-current="page"] { - font-weight: bold; - text-decoration: underline; - } -} -.navbar-search { - flex-grow: 1; - max-width: 800px; - margin-left: auto; -} - -#search { - & .pagefind-ui__drawer { - margin-top: 2px; - position: absolute; - background: var(--bg-secondary); - padding: 0 2rem 1rem; - max-height: calc(100vh - 200px); - overflow-y: auto; - box-shadow: 0 10px 10px -5px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.1); - border-bottom-right-radius: var(--pagefind-ui-border-radius); - border-bottom-left-radius: var(--pagefind-ui-border-radius); - width: 100%; - box-sizing: border-box; - } - & .pagefind-ui__message { - margin: 0; - padding: 0; - } - & .pagefind-ui__result-link { - color: var(--accent-primary); - } - & .pagefind-ui__result-excerpt { - color: var(--fg-primary); - } - & .pagefind-ui__search-input { - color: var(--fg-primary); - } -} diff --git a/src/_includes/css/post-list.css b/src/_includes/css/post-list.css deleted file mode 100644 index e4d8e23..0000000 --- a/src/_includes/css/post-list.css +++ /dev/null @@ -1,19 +0,0 @@ -.postList { - list-style: none; - padding: 0; -} - -.postList-date { - font-size: 0.8rem; - color: var(--fg-primary); -} - -.postList-title { - display: inline-block; - padding: 0.5em 0.2em; - font-size: 1.2rem; - - &[aria-current="page"] { - font-weight: bold; - } -} diff --git a/src/_includes/css/post.css b/src/_includes/css/post.css deleted file mode 100644 index 4ee1df4..0000000 --- a/src/_includes/css/post.css +++ /dev/null @@ -1,45 +0,0 @@ -.post-header { - padding: 5vh 0; -} -.post-title { - font-size: 4rem; - font-size: clamp(2rem, 10vw, 4rem); - line-height: 1; - letter-spacing: -0.02em; - margin: 0 0 0.25em; -} -.post-tags { - display: inline; -} -.post-body { - font-size: 1.2em; - line-height: 1.4; - - & p, - & ul, - & ol { - max-width: 45em; - } - - & h2, - & h3, - & h4, - & h5, - & h6 { - max-width: 20em; - margin-bottom: 0; - } -} -.post-navigation { - & ul { - list-style: none; - padding: 0; - display: flex; - flex-wrap: wrap; - justify-content: center; - } - - & li { - padding: 1em; - } -} \ No newline at end of file diff --git a/src/_includes/css/reset.css b/src/_includes/css/reset.css deleted file mode 100644 index 1fa2859..0000000 --- a/src/_includes/css/reset.css +++ /dev/null @@ -1,73 +0,0 @@ -:root { - --bg-primary: #0a0a0a; /* Black */ - --bg-secondary: #171717; /* Dark gray */ - --accent-primary: #26a269; /* Teal */ - --accent-primary-pale: #26a269; /* Teal */ - --accent-secondary: #613583; /* Purple */ - --accent-secondary-pale: #c061cb; /* Light purple */ - --fg-primary: #ffffff; /* White */ - --fg-secondary: #f2f2f2; /* Light gray */ - --font-family: -apple-system, system-ui, sans-serif; -} - -html, -body { - padding: 0; - margin: 0; - font-family: var(--font-family); - color: var(--fg-primary); - background-color: var(--bg-primary); - - /** Pagefind variables */ - --pagefind-ui-scale: .8; - --pagefind-ui-primary: var(--accent-primary); - --pagefind-ui-text: var(--fg-primary); - --pagefind-ui-background: var(--bg-primary); - --pagefind-ui-border: var(--bg-secondary); - --pagefind-ui-tag: var(--bg-secondary); - --pagefind-ui-border-width: 1px; - --pagefind-ui-border-radius: 6px; - --pagefind-ui-image-border-radius: 6px; - --pagefind-ui-image-box-ratio: 3 / 2; - --pagefind-ui-font: var(--font-family); -} - -main { - padding: 5vh 5vw; - - & > :first-child { - margin-top: 0; - } -} - -a { - color: var(--accent-secondary-pale); -} - -/* Warning */ -.warning { - background-color: var(--bg-secondary); - padding: 1em 0.5em; -} - -table { - margin: 1em 0; - - & td, - & th { - padding-right: 1em; - } -} - -pre, -code { - font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; - line-height: 1.5; - font-size: 1rem; -} - -hr { - border: 0; - border-top: solid 2px var(--bg-secondary); - margin: 5vh 0; -} diff --git a/src/_includes/css/search.css b/src/_includes/css/search.css deleted file mode 100644 index 688a54d..0000000 --- a/src/_includes/css/search.css +++ /dev/null @@ -1,34 +0,0 @@ -search-form { -} -oom-search::part(input) { - border: solid 2px var(--accent-primary); - border-radius: 4px; - padding: .5em; - background: none; -} -oom-search::part(label) { - font-weight: bold; -} -oom-search::part(input) { - border: solid 2px var(--accent-primary); - border-radius: 4px; - padding: .5em; - background: none; -} -oom-search::part(items) { - padding: .5em; - margin: .5em 0; - box-shadow: 0 2px 3px #0003; - background: var(--bg-primary); - width: auto; - min-width: 100%; - right: 0; -} -oom-search::part(item) { - background: none; - font: inherit; - padding: .5em 1em; -} -oom-search::part(active) { - background-color: var(--bg-primary); -} diff --git a/src/_includes/css/tag.css b/src/_includes/css/tag.css deleted file mode 100644 index 62bf836..0000000 --- a/src/_includes/css/tag.css +++ /dev/null @@ -1,16 +0,0 @@ -.tag { - display: inline-block; - text-transform: uppercase; - font-size: 0.7rem; - line-height: 1; - padding: 0.2em 0.5em; - margin-right: 0.8em; - background-color: var(--accent-primary); - color: var(--bg-primary); - border-radius: 0.25em; - text-decoration: none; - - &.is-big { - font-size: 1rem; - } -} diff --git a/src/_includes/layouts/archive.njk b/src/_includes/layouts/archive.njk deleted file mode 100644 index fb89de0..0000000 --- a/src/_includes/layouts/archive.njk +++ /dev/null @@ -1,30 +0,0 @@ ---- -layout: layouts/base.njk -bodyClass: body-tag ---- -

{{ title }}

- -{% set postslist = results %} -{% include "templates/postslist.njk" %} - -
- - \ No newline at end of file diff --git a/src/_includes/layouts/base.njk b/src/_includes/layouts/base.njk deleted file mode 100644 index 469b79e..0000000 --- a/src/_includes/layouts/base.njk +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - {{ title or site.title }} - - - - - - - - -
- {{ content | safe }} -
- -
- - - - diff --git a/src/_includes/layouts/home.njk b/src/_includes/layouts/home.njk deleted file mode 100644 index f0acfa8..0000000 --- a/src/_includes/layouts/home.njk +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: layouts/base.njk -bodyClass: body-home ---- -aaa -{{ content | safe }} diff --git a/src/_includes/layouts/post.njk b/src/_includes/layouts/post.njk deleted file mode 100644 index 1794dd5..0000000 --- a/src/_includes/layouts/post.njk +++ /dev/null @@ -1,43 +0,0 @@ ---- -layout: layouts/base.njk -bodyClass: body-post ---- -
-
-

{{ title }}

- - - - -
- -
- {{ content | safe }} -
-
- -
- - \ No newline at end of file diff --git a/src/_includes/layouts/tag.njk b/src/_includes/layouts/tag.njk deleted file mode 100644 index 3535475..0000000 --- a/src/_includes/layouts/tag.njk +++ /dev/null @@ -1,14 +0,0 @@ ---- -layout: layouts/base.njk -bodyClass: body-tag ---- -
-

Tagged “{{ tag }}”

- - {% set postslist = search.pages("'" + tag + "'") %} - {% include "templates/postslist.njk" %} - -
- -

See all tags.

-
\ No newline at end of file diff --git a/src/_includes/templates/postslist.njk b/src/_includes/templates/postslist.njk deleted file mode 100644 index b577fd5..0000000 --- a/src/_includes/templates/postslist.njk +++ /dev/null @@ -1,24 +0,0 @@ - diff --git a/src/about.md b/src/about.md deleted file mode 100644 index 6bbedc3..0000000 --- a/src/about.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -layout: layouts/post.njk -title: About Me -templateClass: tmpl-post -menu: - visible: true - order: 2 ---- - -I am a person that writes stuff. diff --git a/src/archive.tmpl.js b/src/archive.tmpl.js deleted file mode 100644 index 7150cf7..0000000 --- a/src/archive.tmpl.js +++ /dev/null @@ -1,28 +0,0 @@ -export const layout = "layouts/archive.njk"; -export const title = "Archive"; - -export default function* ({ search, paginate }) { - const posts = search.pages("type=posts", "date=desc"); - - for ( - const data of paginate(posts, { url, size: 10 }) - ) { - // Show the first page in the menu - if (data.pagination.page === 1) { - data.menu = { - visible: true, - order: 1, - }; - } - - yield data; - } -} - -function url(n) { - if (n === 1) { - return "/posts/"; - } - - return `/posts/${n}/`; -} diff --git a/src/deno.json b/src/deno.json deleted file mode 100644 index ddc662f..0000000 --- a/src/deno.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "imports": { - "lume/": "https://deno.land/x/lume@v1.17.3/" - }, - "lock": false, - "tasks": { - "build": "deno task lume", - "serve": "deno task lume -s", - "lume": "echo \"import 'lume/cli.ts'\" | deno run --unstable -A -" - } -} diff --git a/src/img/.gitkeep b/src/img/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/index.njk b/src/index.njk deleted file mode 100644 index 3fe37f4..0000000 --- a/src/index.njk +++ /dev/null @@ -1,25 +0,0 @@ ---- -layout: layouts/home.njk -menu: - visible: true - title: Home - order: 0 ---- - -{% set postslist = search.pages("type=posts", "date=desc", 3) %} - -

Latest {% if postslist.length == 1 %}Post{% else %}{{ postslist.length }} Posts{% endif %}

- -{% include "templates/postslist.njk" %} - -
- -{% set postslist = search.pages("pinned=true") %} - -{%if postslist.length %} -

Pinned Post:

- {% include "templates/postslist.njk" %} -
-{% endif %} - -

More posts can be found in the archive.

diff --git a/src/netlify.toml b/src/netlify.toml deleted file mode 100644 index 20c2d3e..0000000 --- a/src/netlify.toml +++ /dev/null @@ -1,6 +0,0 @@ -[build] - publish = "_site" - command = """ - curl -fsSL https://deno.land/x/install/install.sh | sh && \ - /opt/buildhome/.deno/bin/deno task build --location=https://deno-blog.netlify.app/ \ - """ diff --git a/src/posts/_data.yml b/src/posts/_data.yml deleted file mode 100644 index bd026d2..0000000 --- a/src/posts/_data.yml +++ /dev/null @@ -1,2 +0,0 @@ -type: posts -layout: layouts/post.njk \ No newline at end of file diff --git a/src/posts/fifthpost.md b/src/posts/fifthpost.md deleted file mode 100644 index 2618e39..0000000 --- a/src/posts/fifthpost.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: This is the fifth post (in draft). -description: This post shouldn't be visible in production -date: 2021-01-01 -tags: - - second-tag -draft: true ---- - -To see this post, run `lume --dev` diff --git a/src/posts/firstpost.md b/src/posts/firstpost.md deleted file mode 100644 index f7c0178..0000000 --- a/src/posts/firstpost.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: This is my first post. -description: This is a post on My Blog about agile frameworks. -date: 2018-05-01 -tags: - - another-tag ---- - -Leverage agile frameworks to provide a robust synopsis for high level overviews. -Iterative approaches to corporate strategy foster collaborative thinking to -further the overall value proposition. Organically grow the holistic world view -of disruptive innovation via workplace diversity and empowerment. - -Bring to the table win-win survival strategies to ensure proactive domination. -At the end of the day, going forward, a new normal that has evolved from -generation X is on the runway heading towards a streamlined cloud solution. User -generated content in real-time will have multiple touchpoints for offshoring. - -## Section Header - -Capitalize on low hanging fruit to identify a ballpark value added activity to -beta test. Override the digital divide with additional clickthroughs from -DevOps. Nanotechnology immersion along the information highway will close the -loop on focusing solely on the bottom line. - -```js -// this is a command -function myCommand() { - let counter = 0; - counter++; -} - -// Test with a line break above this line. -console.log("Test"); -``` diff --git a/src/posts/fourthpost.md b/src/posts/fourthpost.md deleted file mode 100644 index efdad53..0000000 --- a/src/posts/fourthpost.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: This is my fourth post. -description: This is a post on My Blog about touchpoints and circling wagons. -date: 2018-09-30 -tags: - - second-tag ---- - -Leverage agile frameworks to provide a robust synopsis for high level overviews. -Iterative approaches to corporate strategy foster collaborative thinking to -further the overall value proposition. Organically grow the holistic world view -of disruptive innovation via workplace diversity and empowerment. - -Bring to the table win-win survival strategies to ensure proactive domination. -At the end of the day, going forward, a new normal that has evolved from -generation X is on the runway heading towards a streamlined cloud solution. User -generated content in real-time will have multiple touchpoints for offshoring. - -## Section Header - -Capitalize on low hanging fruit to identify a ballpark value added activity to -beta test. Override the digital divide with additional clickthroughs from -DevOps. Nanotechnology immersion along the information highway will close the -loop on focusing solely on the bottom line. diff --git a/src/posts/secondpost.md b/src/posts/secondpost.md deleted file mode 100644 index 3c8aeea..0000000 --- a/src/posts/secondpost.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: This is my second post. -description: This is a post on My Blog about leveraging agile frameworks. -date: 2018-07-04 -tags: - - number-2 - - second-tag - ---- - -Leverage agile frameworks to provide a robust synopsis for high level overviews. -Iterative approaches to corporate strategy foster collaborative thinking to -further the overall value proposition. Organically grow the holistic world view -of disruptive innovation via workplace diversity and empowerment. - -## Section Header - -[First post](firstpost.md) [Third post](thirdpost.md) - -Bring to the table win-win survival strategies to ensure proactive domination. -At the end of the day, going forward, a new normal that has evolved from -generation X is on the runway heading towards a streamlined cloud solution. User -generated content in real-time will have multiple touchpoints for offshoring. - -Capitalize on low hanging fruit to identify a ballpark value added activity to -beta test. Override the digital divide with additional clickthroughs from -DevOps. Nanotechnology immersion along the information highway will close the -loop on focusing solely on the bottom line. diff --git a/src/posts/thirdpost.md b/src/posts/thirdpost.md deleted file mode 100644 index 5371202..0000000 --- a/src/posts/thirdpost.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: This is my third post. -description: This is a post on My Blog about win-win survival strategies. -date: 2018-08-24 -pinned: true -tags: - - second-tag ---- - -Leverage agile frameworks to provide a robust synopsis for high level overviews. -Iterative approaches to corporate strategy foster collaborative thinking to -further the overall value proposition. Organically grow the holistic world view -of disruptive innovation via workplace diversity and empowerment. - -```js -// this is a command -function myCommand() { - let counter = 0; - - counter++; -} - -// Test with a line break above this line. -console.log("Test"); -``` - -Bring to the table win-win survival strategies to ensure proactive domination. -At the end of the day, going forward, a new normal that has evolved from -generation X is on the runway heading towards a streamlined cloud solution. User -generated content in real-time will have multiple touchpoints for offshoring. - -## Section Header - -Capitalize on low hanging fruit to identify a ballpark value added activity to -beta test. Override the digital divide with additional clickthroughs from -DevOps. Nanotechnology immersion along the information highway will close the -loop on focusing solely on the bottom line. diff --git a/src/search.tmpl.js b/src/search.tmpl.js deleted file mode 100644 index d20ea51..0000000 --- a/src/search.tmpl.js +++ /dev/null @@ -1,25 +0,0 @@ -export const url = "/search.json"; - -export default function ({ search }, { url }) { - const result = []; - - // Search tags - for (const tag of search.tags("type=posts")) { - result.push({ - label: `Tag: ${tag}`, - search: tag, - value: url(`/tags/${tag}/`), - }); - } - - // Search posts - for (const post of search.pages("type=posts")) { - result.push({ - label: post.data.title, - search: `${post.data.title} ${post.data.tags.join(" ")}`, - value: url(post.data.url), - }); - } - - return JSON.stringify(result); -} diff --git a/src/server.ts b/src/server.ts deleted file mode 100644 index 3b61169..0000000 --- a/src/server.ts +++ /dev/null @@ -1,18 +0,0 @@ -import Server from "lume/core/server.ts"; -import expires from "lume/middlewares/expires.ts"; -import notFound from "lume/middlewares/not_found.ts"; - -const server = new Server({ - port: 8000, - root: `${Deno.cwd()}/_site`, -}); - -server.use(expires()); -server.use(notFound({ - root: `${Deno.cwd()}/_site`, - page404: "/404.html", -})); - -server.start(); - -console.log("Listening on http://localhost:8000"); diff --git a/src/styles.css b/src/styles.css deleted file mode 100644 index cebe754..0000000 --- a/src/styles.css +++ /dev/null @@ -1,9 +0,0 @@ -/* Code syntax highlight */ -@import "https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.0.0/build/styles/github-dark.min.css"; - -@import "css/reset.css"; -@import "css/navbar.css"; -@import "css/search.css"; -@import "css/post-list.css"; -@import "css/post.css"; -@import "css/tag.css"; diff --git a/src/tag.tmpl.js b/src/tag.tmpl.js deleted file mode 100644 index ec3bb58..0000000 --- a/src/tag.tmpl.js +++ /dev/null @@ -1,12 +0,0 @@ -export const layout = "layouts/tag.njk"; - -export default function* ({ search }) { - for (const tag of search.tags()) { - yield { - url: `/tags/${tag}/`, - title: `Tagged “${tag}”`, - type: "tag", - tag, - }; - } -} diff --git a/src/tags.njk b/src/tags.njk deleted file mode 100644 index a9f8f28..0000000 --- a/src/tags.njk +++ /dev/null @@ -1,8 +0,0 @@ ---- -layout: layouts/base.njk ---- -

Tags

- -{% for page in search.pages("type=tag", "tag") %} - {{ page.data.tag }} -{% endfor %}