net/netsurf/meson.patch
$ cat meson.patch
diff --git a/frontends/tiny/wl.c b/frontends/tiny/wl.c
index a6664b124b68241c77b8009d6f2238ec61bdf74b..1e8c50bb518055cfddf19ed6f1ba34c8b2f041b3 100644
--- a/frontends/tiny/wl.c
+++ b/frontends/tiny/wl.c
@@ -969,8 +969,6 @@ platform_window_destroy(struct platform_window *p)
 	wl_surface_destroy(p->surface);
 	destroyimage(p->image);
 	pixman_region32_fini(&p->damage);
-	free(p);
-
 	tiny_schedule(-1, redraw, p);
 	tiny_schedule(-1, resize, p);
 	tiny_schedule(-1, keyrepeat, p);
@@ -978,6 +976,7 @@ platform_window_destroy(struct platform_window *p)
 		wl->kbdfocus = NULL;
 	if (wl->ptrfocus == p)
 		wl->ptrfocus = NULL;
+	free(p);
 }
 
 void
diff --git a/meson.build b/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..4f85a10e39df21b520ff8e4a1bfe11ee83d85271
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,195 @@
+project(
+  'netsurf-tiny',
+  'c',
+  version: '3.10',
+  meson_version: '>=0.59',
+  default_options: ['c_std=c99', 'warning_level=1'],
+)
+
+cc = meson.get_compiler('c')
+awk = find_program('awk')
+wayland = import('wayland')
+
+wayland_client_dep = dependency('wayland-client')
+wayland_cursor_dep = dependency('wayland-cursor')
+xkbcommon_dep = dependency('xkbcommon')
+pixman_dep = dependency('pixman-1')
+freetype_dep = dependency('freetype2')
+curl_dep = dependency('libcurl')
+png_dep = dependency('libpng')
+jpeg_dep = dependency('libjpeg')
+threads_dep = dependency('threads')
+zlib_dep = dependency('zlib')
+m_dep = cc.find_library('m', required: false)
+iconv_dep = cc.find_library('iconv', required: false)
+
+# NetSurf libraries are deliberately instantiated as subprojects.  Do not use
+# dependency(..., fallback: ...) here: that permits an installed library to win
+# before Meson consults its wrap, which can silently mix incompatible releases.
+wapcaplet_dep = subproject('libwapcaplet').get_variable('libwapcaplet_dep')
+parserutils_dep = subproject('libparserutils').get_variable('libparserutils_dep')
+hubbub_dep = subproject('libhubbub').get_variable('libhubbub_dep')
+dom_dep = subproject('libdom').get_variable('libdom_dep')
+css_dep = subproject('libcss').get_variable('libcss_dep')
+nsgif_dep = subproject('libnsgif').get_variable('libnsgif_dep')
+nsbmp_dep = subproject('libnsbmp').get_variable('libnsbmp_dep')
+nsutils_dep = subproject('libnsutils').get_variable('libnsutils_dep')
+svgtiny_dep = subproject('libsvgtiny').get_variable('libsvgtiny_dep')
+utf8proc_dep = subproject('libutf8proc').get_variable('libutf8proc_dep')
+
+install_resource_dir = get_option('prefix') / get_option('datadir') / 'netsurf'
+source_resource_path = meson.current_source_dir() / 'resources'
+tiny_resource_path = meson.current_source_dir() / 'frontends/tiny/res'
+build_resource_path = meson.current_build_dir()
+
+conf = configuration_data()
+conf.set('nstiny', 1)
+conf.set('WITH_BMP', 1)
+conf.set('WITH_CURL', 1)
+conf.set('WITH_GIF', 1)
+conf.set('WITH_JPEG', 1)
+conf.set('WITH_PNG', 1)
+conf.set('WITH_NS_SVG', 1)
+conf.set('WITH_UTF8PROC', 1)
+conf.set_quoted('NETSURF_HOMEPAGE', get_option('homepage'))
+conf.set_quoted('NETSURF_BUILTIN_LOG_FILTER', 'level:WARNING')
+conf.set_quoted('NETSURF_BUILTIN_VERBOSE_FILTER', 'level:DEBUG')
+conf.set_quoted('TINY_RESPATH',
+  install_resource_dir + ':' +
+  build_resource_path + ':' +
+  source_resource_path / 'en' + ':' +
+  source_resource_path + ':' +
+  tiny_resource_path + ':' +
+  get_option('font_path'))
+conf.set_quoted('TINY_FONT_SANS_SERIF', get_option('font_sans'))
+conf.set_quoted('TINY_FONT_SANS_SERIF_BOLD', get_option('font_sans_bold'))
+conf.set_quoted('TINY_FONT_SANS_SERIF_ITALIC', get_option('font_sans_italic'))
+conf.set_quoted('TINY_FONT_SANS_SERIF_ITALIC_BOLD', get_option('font_sans_bold_italic'))
+conf.set_quoted('TINY_FONT_SERIF', get_option('font_serif'))
+conf.set_quoted('TINY_FONT_SERIF_BOLD', get_option('font_serif_bold'))
+conf.set_quoted('TINY_FONT_MONOSPACE', get_option('font_monospace'))
+conf.set_quoted('TINY_FONT_MONOSPACE_BOLD', get_option('font_monospace_bold'))
+conf.set_quoted('TINY_FONT_CURSIVE', get_option('font_sans'))
+conf.set_quoted('TINY_FONT_FANTASY', get_option('font_sans'))
+conf.set('TINY_DPI', get_option('dpi'))
+configure_file(output: 'config.h', configuration: conf)
+configure_file(input: 'testament.h.in', output: 'testament.h', copy: true)
+
+add_project_arguments(
+  '-D_GNU_SOURCE',
+  '-DUTF8PROC_EXPORTS',
+  '-include', meson.current_build_dir() / 'config.h',
+  language: 'c',
+)
+
+xdg_shell_protocol = wayland.find_protocol('xdg-shell', state: 'stable')
+xdg_shell_sources = wayland.scan_xml(
+  xdg_shell_protocol,
+  client: true,
+  server: false,
+)
+
+messages = custom_target(
+  'Messages',
+  input: 'resources/FatMessages',
+  output: 'Messages',
+  command: [awk, '-f', files('tools/messages.awk'), '-v', 'lang=en', '-v', 'filter=any', '@INPUT@'],
+  capture: true,
+  install: true,
+  install_dir: get_option('datadir') / 'netsurf',
+)
+
+netsurf_sources = files(
+  'desktop/cookie_manager.c', 'desktop/knockout.c', 'desktop/hotlist.c',
+  'desktop/mouse.c', 'desktop/plot_style.c', 'desktop/print.c',
+  'desktop/search.c', 'desktop/searchweb.c', 'desktop/scrollbar.c',
+  'desktop/textarea.c', 'desktop/version.c', 'desktop/system_colour.c',
+  'desktop/local_history.c', 'desktop/global_history.c', 'desktop/treeview.c',
+  'desktop/page-info.c', 'desktop/browser.c', 'desktop/browser_window.c',
+  'desktop/browser_history.c', 'desktop/download.c', 'desktop/frames.c',
+  'desktop/netsurf.c', 'desktop/cw_helper.c', 'desktop/save_complete.c',
+  'desktop/save_text.c', 'desktop/selection.c', 'desktop/textinput.c',
+  'desktop/gui_factory.c', 'desktop/save_pdf.c', 'desktop/font_haru.c',
+  'frontends/tiny/download.c', 'frontends/tiny/fetch.c',
+  'frontends/tiny/icons.c', 'frontends/tiny/gui.c', 'frontends/tiny/render.c',
+  'frontends/tiny/schedule.c', 'frontends/tiny/ui.c', 'frontends/tiny/wl.c',
+  'content/content.c', 'content/content_factory.c', 'content/dirlist.c',
+  'content/fetch.c', 'content/hlcache.c', 'content/llcache.c',
+  'content/mimesniff.c', 'content/textsearch.c', 'content/urldb.c',
+  'content/no_backing_store.c', 'content/fetchers/curl.c',
+  'content/fetchers/data.c', 'content/fetchers/file.c',
+  'content/fetchers/about.c', 'content/fetchers/resource.c',
+  'content/handlers/image/image.c', 'content/handlers/image/image_cache.c',
+  'content/handlers/image/bmp.c', 'content/handlers/image/gif.c',
+  'content/handlers/image/ico.c', 'content/handlers/image/jpeg.c',
+  'content/handlers/image/png.c', 'content/handlers/image/svg.c',
+  'content/handlers/css/css.c', 'content/handlers/css/dump.c',
+  'content/handlers/css/internal.c', 'content/handlers/css/hints.c',
+  'content/handlers/css/select.c', 'content/handlers/css/utils.c',
+  'content/handlers/javascript/fetcher.c',
+  'content/handlers/javascript/none/none.c',
+  'content/handlers/html/box_construct.c',
+  'content/handlers/html/box_inspect.c',
+  'content/handlers/html/box_manipulate.c',
+  'content/handlers/html/box_normalise.c',
+  'content/handlers/html/box_special.c', 'content/handlers/html/box_textarea.c',
+  'content/handlers/html/css.c', 'content/handlers/html/css_fetcher.c',
+  'content/handlers/html/dom_event.c', 'content/handlers/html/font.c',
+  'content/handlers/html/form.c', 'content/handlers/html/forms.c',
+  'content/handlers/html/html.c', 'content/handlers/html/imagemap.c',
+  'content/handlers/html/interaction.c', 'content/handlers/html/layout.c',
+  'content/handlers/html/object.c', 'content/handlers/html/redraw.c',
+  'content/handlers/html/redraw_border.c', 'content/handlers/html/script.c',
+  'content/handlers/html/table.c', 'content/handlers/html/textselection.c',
+  'content/handlers/text/textplain.c',
+  'utils/bloom.c', 'utils/corestrings.c', 'utils/file.c', 'utils/filename.c',
+  'utils/filepath.c', 'utils/hashmap.c', 'utils/hashtable.c', 'utils/idna.c',
+  'utils/libdom.c', 'utils/log.c', 'utils/messages.c', 'utils/nscolour.c',
+  'utils/nsoption.c', 'utils/punycode.c', 'utils/ssl_certs.c',
+  'utils/talloc.c', 'utils/time.c', 'utils/url.c', 'utils/useragent.c',
+  'utils/utf8.c', 'utils/utils.c',
+  'utils/http/challenge.c', 'utils/http/generics.c',
+  'utils/http/primitives.c', 'utils/http/parameter.c',
+  'utils/http/cache-control.c', 'utils/http/content-disposition.c',
+  'utils/http/content-type.c', 'utils/http/strict-transport-security.c',
+  'utils/http/www-authenticate.c',
+  'utils/nsurl/nsurl.c', 'utils/nsurl/parse.c',
+)
+
+netsurf_deps = [
+  css_dep, dom_dep, nsbmp_dep, nsgif_dep, nsutils_dep, svgtiny_dep,
+  parserutils_dep, wapcaplet_dep, curl_dep, freetype_dep, jpeg_dep, png_dep,
+  utf8proc_dep, wayland_client_dep, wayland_cursor_dep, xkbcommon_dep,
+  pixman_dep, threads_dep, zlib_dep, m_dep, iconv_dep,
+]
+
+executable(
+  'nstiny',
+  netsurf_sources,
+  xdg_shell_sources,
+  include_directories: include_directories('.', 'include', 'frontends', 'content/handlers'),
+  dependencies: netsurf_deps,
+  install: true,
+)
+
+install_data(
+  'resources/SearchEngines', 'resources/adblock.css', 'resources/default.css',
+  'resources/favicon.png', 'resources/internal.css', 'resources/netsurf.png',
+  'resources/quirks.css', 'resources/en/credits.html',
+  'resources/en/licence.html', 'resources/en/welcome.html',
+  install_dir: get_option('datadir') / 'netsurf',
+)
+install_data(
+  'frontends/tiny/res/icons/COPYING',
+  'frontends/tiny/res/icons/add.ff',
+  'frontends/tiny/res/icons/back.ff',
+  'frontends/tiny/res/icons/close.ff',
+  'frontends/tiny/res/icons/down.ff',
+  'frontends/tiny/res/icons/forward.ff',
+  'frontends/tiny/res/icons/home.ff',
+  'frontends/tiny/res/icons/reload.ff',
+  'frontends/tiny/res/icons/remove.ff',
+  'frontends/tiny/res/icons/stop.ff',
+  'frontends/tiny/res/icons/up.ff',
+  install_dir: get_option('datadir') / 'netsurf/icons',
+)
diff --git a/meson.options b/meson.options
new file mode 100644
index 0000000000000000000000000000000000000000..69dd86af326cab0e88c228c60985f644edbeaa8e
--- /dev/null
+++ b/meson.options
@@ -0,0 +1,11 @@
+option('homepage', type: 'string', value: 'https://lite.duckduckgo.com/lite', description: 'default home page')
+option('dpi', type: 'integer', value: 96, min: 50, max: 400, description: 'default browser DPI')
+option('font_path', type: 'string', value: '/share/fonts/noto-fonts', description: 'font search path')
+option('font_sans', type: 'string', value: 'NotoSans-Regular.ttf')
+option('font_sans_bold', type: 'string', value: 'NotoSans-Bold.ttf')
+option('font_sans_italic', type: 'string', value: 'NotoSans-Italic.ttf')
+option('font_sans_bold_italic', type: 'string', value: 'NotoSans-BoldItalic.ttf')
+option('font_serif', type: 'string', value: 'NotoSerif-Regular.ttf')
+option('font_serif_bold', type: 'string', value: 'NotoSerif-Bold.ttf')
+option('font_monospace', type: 'string', value: 'NotoSansMono-Regular.ttf')
+option('font_monospace_bold', type: 'string', value: 'NotoSansMono-Bold.ttf')
diff --git a/subprojects/libcss.wrap b/subprojects/libcss.wrap
new file mode 100644
index 0000000000000000000000000000000000000000..0d973223f3273f90ba20925c5ce0eb8cae32e811
--- /dev/null
+++ b/subprojects/libcss.wrap
@@ -0,0 +1,8 @@
+[wrap-git]
+url = git://git.netsurf-browser.org/libcss.git
+revision = 385769d6554d2d3a9c2c35a04cf5dde706cefb6b
+depth = 1
+patch_directory = libcss
+
+[provide]
+libcss = libcss_dep
diff --git a/subprojects/libdom.wrap b/subprojects/libdom.wrap
new file mode 100644
index 0000000000000000000000000000000000000000..89df4ab14d254b3e9f3ee43f5fe42902b2172b53
--- /dev/null
+++ b/subprojects/libdom.wrap
@@ -0,0 +1,8 @@
+[wrap-git]
+url = git://git.netsurf-browser.org/libdom.git
+revision = 93b8a9bba18fc3166dd158484188b1730afdd382
+depth = 1
+patch_directory = libdom
+
+[provide]
+libdom = libdom_dep
diff --git a/subprojects/libhubbub.wrap b/subprojects/libhubbub.wrap
new file mode 100644
index 0000000000000000000000000000000000000000..9b038108f78268ebf24b068fd5cb5582e7db05a3
--- /dev/null
+++ b/subprojects/libhubbub.wrap
@@ -0,0 +1,8 @@
+[wrap-git]
+url = git://git.netsurf-browser.org/libhubbub.git
+revision = 41b3e0e617cfce96de85d4d031c4d131e3dc4cf4
+depth = 1
+patch_directory = libhubbub
+
+[provide]
+libhubbub = libhubbub_dep
diff --git a/subprojects/libnsbmp.wrap b/subprojects/libnsbmp.wrap
new file mode 100644
index 0000000000000000000000000000000000000000..1b5a6b2b86aee373222e3333326fc8e814ad9651
--- /dev/null
+++ b/subprojects/libnsbmp.wrap
@@ -0,0 +1,8 @@
+[wrap-git]
+url = git://git.netsurf-browser.org/libnsbmp.git
+revision = 3155a7e9db2d7d7c2349a12bc892fa9ff68c2338
+depth = 1
+patch_directory = libnsbmp
+
+[provide]
+libnsbmp = libnsbmp_dep
diff --git a/subprojects/libnsgif.wrap b/subprojects/libnsgif.wrap
new file mode 100644
index 0000000000000000000000000000000000000000..f08147109f799c090af03c76a2959a64428add3f
--- /dev/null
+++ b/subprojects/libnsgif.wrap
@@ -0,0 +1,8 @@
+[wrap-git]
+url = git://git.netsurf-browser.org/libnsgif.git
+revision = a937d161f6787ecc1c1bef9bad6039925ff13d72
+depth = 1
+patch_directory = libnsgif
+
+[provide]
+libnsgif = libnsgif_dep
diff --git a/subprojects/libnsutils.wrap b/subprojects/libnsutils.wrap
new file mode 100644
index 0000000000000000000000000000000000000000..876ee438596383c3ca8fe1ef3fa2c953f4347943
--- /dev/null
+++ b/subprojects/libnsutils.wrap
@@ -0,0 +1,8 @@
+[wrap-git]
+url = git://git.netsurf-browser.org/libnsutils.git
+revision = 142a7945fb9fe477324f8df5e9645ef161042483
+depth = 1
+patch_directory = libnsutils
+
+[provide]
+libnsutils = libnsutils_dep
diff --git a/subprojects/libparserutils.wrap b/subprojects/libparserutils.wrap
new file mode 100644
index 0000000000000000000000000000000000000000..68f04309aa489930b5ff51b22af6642e728dc674
--- /dev/null
+++ b/subprojects/libparserutils.wrap
@@ -0,0 +1,8 @@
+[wrap-git]
+url = git://git.netsurf-browser.org/libparserutils.git
+revision = 269b0047aa506be93637e93d109a34f4bd7cefc4
+depth = 1
+patch_directory = libparserutils
+
+[provide]
+libparserutils = libparserutils_dep
diff --git a/subprojects/libsvgtiny.wrap b/subprojects/libsvgtiny.wrap
new file mode 100644
index 0000000000000000000000000000000000000000..d6e9cb943779c136675ef1a5e8b3a69929e3da5d
--- /dev/null
+++ b/subprojects/libsvgtiny.wrap
@@ -0,0 +1,8 @@
+[wrap-git]
+url = git://git.netsurf-browser.org/libsvgtiny.git
+revision = e31a20a97c6cd957ac4d858318f5819b90d97f77
+depth = 1
+patch_directory = libsvgtiny
+
+[provide]
+libsvgtiny = libsvgtiny_dep
diff --git a/subprojects/libutf8proc.wrap b/subprojects/libutf8proc.wrap
new file mode 100644
index 0000000000000000000000000000000000000000..1267b3886eecd69e53dbdd63e7231c77eebf33b8
--- /dev/null
+++ b/subprojects/libutf8proc.wrap
@@ -0,0 +1,8 @@
+[wrap-git]
+url = git://git.netsurf-browser.org/libutf8proc.git
+revision = 0d22740b0de2636307cb95c928b244263ed17caa
+depth = 1
+patch_directory = libutf8proc
+
+[provide]
+libutf8proc = libutf8proc_dep
diff --git a/subprojects/libwapcaplet.wrap b/subprojects/libwapcaplet.wrap
new file mode 100644
index 0000000000000000000000000000000000000000..0e958acba2f59b539d861440b04ea32553f7c0c5
--- /dev/null
+++ b/subprojects/libwapcaplet.wrap
@@ -0,0 +1,8 @@
+[wrap-git]
+url = git://git.netsurf-browser.org/libwapcaplet.git
+revision = b5e42b12211a92339b0b62cb90f1a86a397e146e
+depth = 1
+patch_directory = libwapcaplet
+
+[provide]
+libwapcaplet = libwapcaplet_dep
diff --git a/subprojects/packagefiles/libcss/meson.build b/subprojects/packagefiles/libcss/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..7bdd7f852aa5e8d7956f84329346860542914237
--- /dev/null
+++ b/subprojects/packagefiles/libcss/meson.build
@@ -0,0 +1,227 @@
+project('libcss', 'c', version: '0.9.1', default_options: ['c_std=c99'])
+
+awk = find_program('awk')
+sh = find_program('sh')
+parserutils_dep = dependency('libparserutils')
+wapcaplet_dep = dependency('libwapcaplet')
+
+gen_prop_parser = executable(
+  'gen_prop_parser',
+  'src/parse/properties/css_property_parser_gen.c',
+  native: true,
+  c_args: ['-D_GNU_SOURCE'],
+)
+
+prop_parsers = custom_target(
+  'generated property parsers',
+  input: 'src/parse/properties/properties.gen',
+  output: 'prop_parsers.c',
+  command: [
+    sh, '-c',
+    'awk -f "$1" -v "gen_prop_parser=$2" "$3" > "$4"',
+    'generate-prop-parsers',
+    files('prop_parsers.awk'), gen_prop_parser,
+    '@INPUT@',
+    '@OUTPUT@',
+  ],
+)
+
+css_sources = files(
+  'src/charset/detect.c',
+  'src/lex/lex.c',
+  'src/parse/font_face.c',
+  'src/parse/important.c',
+  'src/parse/language.c',
+  'src/parse/mq.c',
+  'src/parse/parse.c',
+  'src/parse/properties/azimuth.c',
+  'src/parse/properties/background.c',
+  'src/parse/properties/background_position.c',
+  'src/parse/properties/border.c',
+  'src/parse/properties/border_color.c',
+  'src/parse/properties/border_spacing.c',
+  'src/parse/properties/border_style.c',
+  'src/parse/properties/border_width.c',
+  'src/parse/properties/clip.c',
+  'src/parse/properties/column_rule.c',
+  'src/parse/properties/columns.c',
+  'src/parse/properties/content.c',
+  'src/parse/properties/cue.c',
+  'src/parse/properties/cursor.c',
+  'src/parse/properties/elevation.c',
+  'src/parse/properties/flex.c',
+  'src/parse/properties/flex_flow.c',
+  'src/parse/properties/font.c',
+  'src/parse/properties/font_family.c',
+  'src/parse/properties/font_weight.c',
+  'src/parse/properties/list_style.c',
+  'src/parse/properties/list_style_type.c',
+  'src/parse/properties/margin.c',
+  'src/parse/properties/opacity.c',
+  'src/parse/properties/outline.c',
+  'src/parse/properties/overflow.c',
+  'src/parse/properties/padding.c',
+  'src/parse/properties/pause.c',
+  'src/parse/properties/play_during.c',
+  'src/parse/properties/properties.c',
+  'src/parse/properties/quotes.c',
+  'src/parse/properties/text_decoration.c',
+  'src/parse/properties/utils.c',
+  'src/parse/properties/voice_family.c',
+  'src/parse/propstrings.c',
+  'src/select/arena.c',
+  'src/select/computed.c',
+  'src/select/dispatch.c',
+  'src/select/font_face.c',
+  'src/select/hash.c',
+  'src/select/properties/align_content.c',
+  'src/select/properties/align_items.c',
+  'src/select/properties/align_self.c',
+  'src/select/properties/azimuth.c',
+  'src/select/properties/background_attachment.c',
+  'src/select/properties/background_color.c',
+  'src/select/properties/background_image.c',
+  'src/select/properties/background_position.c',
+  'src/select/properties/background_repeat.c',
+  'src/select/properties/border_bottom_color.c',
+  'src/select/properties/border_bottom_style.c',
+  'src/select/properties/border_bottom_width.c',
+  'src/select/properties/border_collapse.c',
+  'src/select/properties/border_left_color.c',
+  'src/select/properties/border_left_style.c',
+  'src/select/properties/border_left_width.c',
+  'src/select/properties/border_right_color.c',
+  'src/select/properties/border_right_style.c',
+  'src/select/properties/border_right_width.c',
+  'src/select/properties/border_spacing.c',
+  'src/select/properties/border_top_color.c',
+  'src/select/properties/border_top_style.c',
+  'src/select/properties/border_top_width.c',
+  'src/select/properties/bottom.c',
+  'src/select/properties/box_sizing.c',
+  'src/select/properties/break_after.c',
+  'src/select/properties/break_before.c',
+  'src/select/properties/break_inside.c',
+  'src/select/properties/caption_side.c',
+  'src/select/properties/clear.c',
+  'src/select/properties/clip.c',
+  'src/select/properties/color.c',
+  'src/select/properties/column_count.c',
+  'src/select/properties/column_fill.c',
+  'src/select/properties/column_gap.c',
+  'src/select/properties/column_rule_color.c',
+  'src/select/properties/column_rule_style.c',
+  'src/select/properties/column_rule_width.c',
+  'src/select/properties/column_span.c',
+  'src/select/properties/column_width.c',
+  'src/select/properties/content.c',
+  'src/select/properties/counter_increment.c',
+  'src/select/properties/counter_reset.c',
+  'src/select/properties/cue_after.c',
+  'src/select/properties/cue_before.c',
+  'src/select/properties/cursor.c',
+  'src/select/properties/direction.c',
+  'src/select/properties/display.c',
+  'src/select/properties/elevation.c',
+  'src/select/properties/empty_cells.c',
+  'src/select/properties/flex_basis.c',
+  'src/select/properties/flex_direction.c',
+  'src/select/properties/flex_grow.c',
+  'src/select/properties/flex_shrink.c',
+  'src/select/properties/flex_wrap.c',
+  'src/select/properties/float.c',
+  'src/select/properties/font_family.c',
+  'src/select/properties/font_size.c',
+  'src/select/properties/font_style.c',
+  'src/select/properties/font_variant.c',
+  'src/select/properties/font_weight.c',
+  'src/select/properties/height.c',
+  'src/select/properties/helpers.c',
+  'src/select/properties/justify_content.c',
+  'src/select/properties/left.c',
+  'src/select/properties/letter_spacing.c',
+  'src/select/properties/line_height.c',
+  'src/select/properties/list_style_image.c',
+  'src/select/properties/list_style_position.c',
+  'src/select/properties/list_style_type.c',
+  'src/select/properties/margin_bottom.c',
+  'src/select/properties/margin_left.c',
+  'src/select/properties/margin_right.c',
+  'src/select/properties/margin_top.c',
+  'src/select/properties/max_height.c',
+  'src/select/properties/max_width.c',
+  'src/select/properties/min_height.c',
+  'src/select/properties/min_width.c',
+  'src/select/properties/opacity.c',
+  'src/select/properties/order.c',
+  'src/select/properties/orphans.c',
+  'src/select/properties/outline_color.c',
+  'src/select/properties/outline_style.c',
+  'src/select/properties/outline_width.c',
+  'src/select/properties/overflow_x.c',
+  'src/select/properties/overflow_y.c',
+  'src/select/properties/padding_bottom.c',
+  'src/select/properties/padding_left.c',
+  'src/select/properties/padding_right.c',
+  'src/select/properties/padding_top.c',
+  'src/select/properties/page_break_after.c',
+  'src/select/properties/page_break_before.c',
+  'src/select/properties/page_break_inside.c',
+  'src/select/properties/pause_after.c',
+  'src/select/properties/pause_before.c',
+  'src/select/properties/pitch.c',
+  'src/select/properties/pitch_range.c',
+  'src/select/properties/play_during.c',
+  'src/select/properties/position.c',
+  'src/select/properties/quotes.c',
+  'src/select/properties/richness.c',
+  'src/select/properties/right.c',
+  'src/select/properties/speak.c',
+  'src/select/properties/speak_header.c',
+  'src/select/properties/speak_numeral.c',
+  'src/select/properties/speak_punctuation.c',
+  'src/select/properties/speech_rate.c',
+  'src/select/properties/stress.c',
+  'src/select/properties/table_layout.c',
+  'src/select/properties/text_align.c',
+  'src/select/properties/text_decoration.c',
+  'src/select/properties/text_indent.c',
+  'src/select/properties/text_transform.c',
+  'src/select/properties/top.c',
+  'src/select/properties/unicode_bidi.c',
+  'src/select/properties/vertical_align.c',
+  'src/select/properties/visibility.c',
+  'src/select/properties/voice_family.c',
+  'src/select/properties/volume.c',
+  'src/select/properties/white_space.c',
+  'src/select/properties/widows.c',
+  'src/select/properties/width.c',
+  'src/select/properties/word_spacing.c',
+  'src/select/properties/writing_mode.c',
+  'src/select/properties/z_index.c',
+  'src/select/select.c',
+  'src/stylesheet.c',
+  'src/utils/errors.c',
+  'src/utils/utils.c',
+)
+
+inc = include_directories('.', 'include', 'src')
+libcss = static_library(
+  'css',
+  css_sources,
+  prop_parsers,
+  include_directories: inc,
+  dependencies: [parserutils_dep, wapcaplet_dep],
+  c_args: [
+    '-D_BSD_SOURCE',
+    '-D_DEFAULT_SOURCE',
+    '-D_ALIGNED=__attribute__((aligned))',
+  ],
+)
+
+libcss_dep = declare_dependency(
+  link_with: libcss,
+  include_directories: inc,
+  dependencies: [parserutils_dep, wapcaplet_dep],
+)
+meson.override_dependency('libcss', libcss_dep)
diff --git a/subprojects/packagefiles/libcss/prop_parsers.awk b/subprojects/packagefiles/libcss/prop_parsers.awk
new file mode 100644
index 0000000000000000000000000000000000000000..68a596af99a1fc05a32016c8e37b60279fede2d2
--- /dev/null
+++ b/subprojects/packagefiles/libcss/prop_parsers.awk
@@ -0,0 +1,10 @@
+BEGIN {
+	FS=":"
+}
+
+/^#/ { next }
+/^$/ { next }
+
+{
+	system(gen_prop_parser " '" $0 "'")
+}
diff --git a/subprojects/packagefiles/libdom/dom/bindings/hubbub/meson.build b/subprojects/packagefiles/libdom/dom/bindings/hubbub/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..95432eee0f58204f5dd55c816d58547b780f04d9
--- /dev/null
+++ b/subprojects/packagefiles/libdom/dom/bindings/hubbub/meson.build
@@ -0,0 +1,2 @@
+configure_file(input: '../../../bindings/hubbub/errors.h', output: 'errors.h', copy: true)
+configure_file(input: '../../../bindings/hubbub/parser.h', output: 'parser.h', copy: true)
diff --git a/subprojects/packagefiles/libdom/dom/bindings/xml/meson.build b/subprojects/packagefiles/libdom/dom/bindings/xml/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..45a4f9ed97392d57ff6a95ff5cf9b85d1762b5fd
--- /dev/null
+++ b/subprojects/packagefiles/libdom/dom/bindings/xml/meson.build
@@ -0,0 +1,2 @@
+configure_file(input: '../../../bindings/xml/xmlerror.h', output: 'xmlerror.h', copy: true)
+configure_file(input: '../../../bindings/xml/xmlparser.h', output: 'xmlparser.h', copy: true)
diff --git a/subprojects/packagefiles/libdom/meson.build b/subprojects/packagefiles/libdom/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..8cbf1260370808e4d5fa469d90bda3e6295956a2
--- /dev/null
+++ b/subprojects/packagefiles/libdom/meson.build
@@ -0,0 +1,75 @@
+project('libdom', 'c', version: '0.4.1', default_options: ['c_std=c99'])
+
+parserutils_dep = dependency('libparserutils')
+wapcaplet_dep = dependency('libwapcaplet')
+hubbub_dep = dependency('libhubbub')
+expat_dep = dependency('expat')
+
+subdir('dom/bindings/hubbub')
+subdir('dom/bindings/xml')
+
+inc = include_directories('.', 'include', 'src')
+sources = files(
+  'src/core/string.c', 'src/core/node.c', 'src/core/attr.c',
+  'src/core/characterdata.c', 'src/core/element.c',
+  'src/core/implementation.c', 'src/core/text.c', 'src/core/typeinfo.c',
+  'src/core/comment.c', 'src/core/namednodemap.c', 'src/core/nodelist.c',
+  'src/core/cdatasection.c', 'src/core/document_type.c',
+  'src/core/entity_ref.c', 'src/core/pi.c', 'src/core/doc_fragment.c',
+  'src/core/document.c',
+  'src/events/event.c', 'src/events/dispatch.c',
+  'src/events/event_target.c', 'src/events/document_event.c',
+  'src/events/custom_event.c', 'src/events/keyboard_event.c',
+  'src/events/mouse_wheel_event.c', 'src/events/text_event.c',
+  'src/events/event_listener.c', 'src/events/mouse_event.c',
+  'src/events/mutation_event.c', 'src/events/ui_event.c',
+  'src/events/mouse_multi_wheel_event.c',
+  'src/events/mutation_name_event.c',
+  'src/html/html_applet_element.c', 'src/html/html_area_element.c',
+  'src/html/html_anchor_element.c', 'src/html/html_basefont_element.c',
+  'src/html/html_base_element.c', 'src/html/html_body_element.c',
+  'src/html/html_button_element.c', 'src/html/html_canvas_element.c',
+  'src/html/html_collection.c', 'src/html/html_document.c',
+  'src/html/html_element.c', 'src/html/html_dlist_element.c',
+  'src/html/html_directory_element.c', 'src/html/html_options_collection.c',
+  'src/html/html_html_element.c', 'src/html/html_head_element.c',
+  'src/html/html_link_element.c', 'src/html/html_title_element.c',
+  'src/html/html_meta_element.c', 'src/html/html_style_element.c',
+  'src/html/html_form_element.c', 'src/html/html_select_element.c',
+  'src/html/html_input_element.c', 'src/html/html_text_area_element.c',
+  'src/html/html_opt_group_element.c', 'src/html/html_option_element.c',
+  'src/html/html_hr_element.c', 'src/html/html_menu_element.c',
+  'src/html/html_fieldset_element.c', 'src/html/html_legend_element.c',
+  'src/html/html_div_element.c', 'src/html/html_paragraph_element.c',
+  'src/html/html_heading_element.c', 'src/html/html_quote_element.c',
+  'src/html/html_pre_element.c', 'src/html/html_br_element.c',
+  'src/html/html_label_element.c', 'src/html/html_ulist_element.c',
+  'src/html/html_olist_element.c', 'src/html/html_li_element.c',
+  'src/html/html_font_element.c', 'src/html/html_mod_element.c',
+  'src/html/html_image_element.c', 'src/html/html_object_element.c',
+  'src/html/html_param_element.c', 'src/html/html_map_element.c',
+  'src/html/html_script_element.c', 'src/html/html_tablecaption_element.c',
+  'src/html/html_tablecell_element.c', 'src/html/html_tablecol_element.c',
+  'src/html/html_tablesection_element.c', 'src/html/html_table_element.c',
+  'src/html/html_tablerow_element.c', 'src/html/html_frameset_element.c',
+  'src/html/html_frame_element.c', 'src/html/html_iframe_element.c',
+  'src/html/html_isindex_element.c',
+  'src/utils/namespace.c', 'src/utils/hashtable.c',
+  'src/utils/character_valid.c', 'src/utils/validate.c',
+  'bindings/hubbub/parser.c', 'bindings/xml/expat_xmlparser.c',
+)
+
+libdom = static_library(
+  'dom',
+  sources,
+  include_directories: inc,
+  dependencies: [parserutils_dep, wapcaplet_dep, hubbub_dep, expat_dep],
+  c_args: ['-D_BSD_SOURCE', '-D_DEFAULT_SOURCE'],
+)
+
+libdom_dep = declare_dependency(
+  link_with: libdom,
+  include_directories: inc,
+  dependencies: [parserutils_dep, wapcaplet_dep, hubbub_dep, expat_dep],
+)
+meson.override_dependency('libdom', libdom_dep)
diff --git a/subprojects/packagefiles/libhubbub/entities.awk b/subprojects/packagefiles/libhubbub/entities.awk
new file mode 100644
index 0000000000000000000000000000000000000000..9802bef85328dd6945d3fc75f6f6d613633b828f
--- /dev/null
+++ b/subprojects/packagefiles/libhubbub/entities.awk
@@ -0,0 +1,45 @@
+BEGIN {
+	for (i = 32; i <= 126; ++i) ord[sprintf("%c", i)] = i
+	n = -1
+}
+function makenode(c) {
+	++n
+	splits[n] = c
+	left[n] = -1
+	equal[n] = -1
+	right[n] = -1
+	values[n] = 0
+}
+function insert(nodes, id, c) {
+	nextid = nodes[id]
+	if (nextid != -1) return nextid
+	makenode(c)
+	nodes[id] = n
+	return n
+}
+/^(#|$)/ {next}
+{
+	id = 0
+	c = ord[substr($1, 1, 1)]
+	if (n < 0) makenode(c)
+	for (i = 1; i <= length($1) + 1;) {
+		if (c < splits[id]) {
+			id = insert(left, id, c)
+		} else if (c == splits[id]) {
+			if (i >= length($1)) values[id] = $2
+			if (c == 0) break
+			++i
+			c = i <= length($1) ? ord[substr($1, i, 1)] : 0
+			id = insert(equal, id, c)
+		} else {
+			id = insert(right, id, c)
+		}
+	}
+}
+END {
+	print "static hubbub_entity_node dict[] = {"
+	for (i = 0; i <= n; ++i)
+		print "\t{ "splits[i]", "left[i]", "equal[i]", "right[i]", "values[i]" },"
+	print "};"
+	print "static int32_t dict_root = 0;"
+}
diff --git a/subprojects/packagefiles/libhubbub/meson.build b/subprojects/packagefiles/libhubbub/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..ecb23066116a10088b08453196d6f0482096d3c0
--- /dev/null
+++ b/subprojects/packagefiles/libhubbub/meson.build
@@ -0,0 +1,61 @@
+project('libhubbub', 'c', version: '0.3.7', default_options: ['c_std=c99'])
+
+awk = find_program('awk')
+parserutils_dep = dependency('libparserutils')
+
+entities_inc = custom_target(
+  'HTML entities',
+  input: 'build/Entities',
+  output: 'entities.inc',
+  command: [awk, '-f', files('entities.awk'), '@INPUT@'],
+  capture: true,
+)
+
+inc = include_directories('.', 'include', 'src')
+sources = files(
+  'src/parser.c',
+  'src/charset/detect.c',
+  'src/tokeniser/entities.c',
+  'src/tokeniser/tokeniser.c',
+  'src/treebuilder/treebuilder.c',
+  'src/treebuilder/initial.c',
+  'src/treebuilder/before_html.c',
+  'src/treebuilder/before_head.c',
+  'src/treebuilder/in_head.c',
+  'src/treebuilder/in_head_noscript.c',
+  'src/treebuilder/after_head.c',
+  'src/treebuilder/in_body.c',
+  'src/treebuilder/in_table.c',
+  'src/treebuilder/in_caption.c',
+  'src/treebuilder/in_column_group.c',
+  'src/treebuilder/in_table_body.c',
+  'src/treebuilder/in_row.c',
+  'src/treebuilder/in_cell.c',
+  'src/treebuilder/in_select.c',
+  'src/treebuilder/in_select_in_table.c',
+  'src/treebuilder/in_foreign_content.c',
+  'src/treebuilder/after_body.c',
+  'src/treebuilder/in_frameset.c',
+  'src/treebuilder/after_frameset.c',
+  'src/treebuilder/after_after_body.c',
+  'src/treebuilder/after_after_frameset.c',
+  'src/treebuilder/generic_rcdata.c',
+  'src/utils/errors.c',
+  'src/utils/string.c',
+)
+
+libhubbub = static_library(
+  'hubbub',
+  sources,
+  entities_inc,
+  include_directories: inc,
+  dependencies: parserutils_dep,
+  c_args: ['-D_BSD_SOURCE', '-D_DEFAULT_SOURCE', '-DNDEBUG'],
+)
+
+libhubbub_dep = declare_dependency(
+  link_with: libhubbub,
+  include_directories: inc,
+  dependencies: parserutils_dep,
+)
+meson.override_dependency('libhubbub', libhubbub_dep)
diff --git a/subprojects/packagefiles/libnsbmp/meson.build b/subprojects/packagefiles/libnsbmp/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..ba8682607d1e9aaf79c91497a66210d0aa408c92
--- /dev/null
+++ b/subprojects/packagefiles/libnsbmp/meson.build
@@ -0,0 +1,12 @@
+project('libnsbmp', 'c', version: '0.1.5', default_options: ['c_std=c99'])
+
+inc = include_directories('include')
+libnsbmp = static_library(
+  'nsbmp',
+  'src/libnsbmp.c',
+  include_directories: inc,
+  c_args: ['-D_BSD_SOURCE', '-D_DEFAULT_SOURCE'],
+)
+
+libnsbmp_dep = declare_dependency(link_with: libnsbmp, include_directories: inc)
+meson.override_dependency('libnsbmp', libnsbmp_dep)
diff --git a/subprojects/packagefiles/libnsgif/meson.build b/subprojects/packagefiles/libnsgif/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..753cda30bf467e4ba956ed65033d038b974508e0
--- /dev/null
+++ b/subprojects/packagefiles/libnsgif/meson.build
@@ -0,0 +1,12 @@
+project('libnsgif', 'c', version: '0.1.0', default_options: ['c_std=c99'])
+
+inc = include_directories('include')
+libnsgif = static_library(
+  'nsgif',
+  files('src/libnsgif.c', 'src/lzw.c'),
+  include_directories: inc,
+  c_args: ['-D_BSD_SOURCE', '-D_DEFAULT_SOURCE'],
+)
+
+libnsgif_dep = declare_dependency(link_with: libnsgif, include_directories: inc)
+meson.override_dependency('libnsgif', libnsgif_dep)
diff --git a/subprojects/packagefiles/libnsutils/meson.build b/subprojects/packagefiles/libnsutils/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..59f75797262a570e4b80ae712f86f4299ab70d60
--- /dev/null
+++ b/subprojects/packagefiles/libnsutils/meson.build
@@ -0,0 +1,12 @@
+project('libnsutils', 'c', version: '0.1.0', default_options: ['c_std=c99'])
+
+inc = include_directories('include')
+libnsutils = static_library(
+  'nsutils',
+  files('src/base64.c', 'src/time.c', 'src/unistd.c'),
+  include_directories: inc,
+  c_args: ['-D_BSD_SOURCE', '-D_DEFAULT_SOURCE'],
+)
+
+libnsutils_dep = declare_dependency(link_with: libnsutils, include_directories: inc)
+meson.override_dependency('libnsutils', libnsutils_dep)
diff --git a/subprojects/packagefiles/libparserutils/aliases.awk b/subprojects/packagefiles/libparserutils/aliases.awk
new file mode 100644
index 0000000000000000000000000000000000000000..84094474c5633a732cbb5f2df4c94e4e95b1fa03
--- /dev/null
+++ b/subprojects/packagefiles/libparserutils/aliases.awk
@@ -0,0 +1,33 @@
+BEGIN {
+	print "static parserutils_charset_aliases_canon canonical_charset_names[] = {"
+	n = 0
+}
+/^(#|$)/ {next}
+function addalias(s) {
+	s = tolower(s)
+	gsub("[^a-z0-9]", "", s)
+	if (!(s in aliases)) ++num_aliases
+	aliases[s] = n
+}
+{
+	print "\t{ "$2", "length($1)", \""$1"\" },"
+	addalias($1)
+	for (i = 3; i <= NF; ++i) addalias($i)
+	if ($1 ~ /^ISO-10646-UCS-[24]$/ || $1 ~ /^UTF-(8$|16|32)/)
+		isunicode = (isunicode ? (isunicode" || ") : "") "((x) == "$2")"
+	++n
+}
+END {
+	print "};"
+	print "static const uint16_t charset_aliases_canon_count = "n";"
+	print "typedef struct { uint16_t name_len; const char *name; parserutils_charset_aliases_canon *canon; } parserutils_charset_aliases_alias;"
+	print "static parserutils_charset_aliases_alias charset_aliases[] = {"
+	for (alias in aliases) {
+		i = aliases[alias]
+		print "\t{ "length(alias)", \""alias"\", &canonical_charset_names["i"] }," | "sort -t '\"' -k 2"
+	}
+	close("sort -t '\"' -k 2")
+	print "};"
+	print "static const uint16_t charset_aliases_count = "num_aliases";"
+	print "#define MIBENUM_IS_UNICODE(x) ("isunicode")"
+}
diff --git a/subprojects/packagefiles/libparserutils/meson.build b/subprojects/packagefiles/libparserutils/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..750c53e69bfba6af52ffdb500e32ee73ef05ce68
--- /dev/null
+++ b/subprojects/packagefiles/libparserutils/meson.build
@@ -0,0 +1,47 @@
+project('libparserutils', 'c', version: '0.2.3', default_options: ['c_std=c99'])
+
+awk = find_program('awk')
+wapcaplet_dep = dependency('libwapcaplet')
+
+aliases_inc = custom_target(
+  'parserutils aliases',
+  input: 'build/Aliases',
+  output: 'aliases.inc',
+  command: [awk, '-f', files('aliases.awk'), '@INPUT@'],
+  capture: true,
+)
+
+inc = include_directories('.', 'include', 'src')
+sources = files(
+  'src/charset/aliases.c',
+  'src/charset/codec.c',
+  'src/charset/codecs/codec_ascii.c',
+  'src/charset/codecs/codec_8859.c',
+  'src/charset/codecs/codec_ext8.c',
+  'src/charset/codecs/codec_utf8.c',
+  'src/charset/codecs/codec_utf16.c',
+  'src/charset/encodings/utf8.c',
+  'src/charset/encodings/utf16.c',
+  'src/input/filter.c',
+  'src/input/inputstream.c',
+  'src/utils/buffer.c',
+  'src/utils/errors.c',
+  'src/utils/stack.c',
+  'src/utils/vector.c',
+)
+
+libparserutils = static_library(
+  'parserutils',
+  sources,
+  aliases_inc,
+  include_directories: inc,
+  dependencies: wapcaplet_dep,
+  c_args: ['-D_BSD_SOURCE', '-D_DEFAULT_SOURCE'],
+)
+
+libparserutils_dep = declare_dependency(
+  link_with: libparserutils,
+  include_directories: inc,
+  dependencies: wapcaplet_dep,
+)
+meson.override_dependency('libparserutils', libparserutils_dep)
diff --git a/subprojects/packagefiles/libsvgtiny/autogenerated_colors.c b/subprojects/packagefiles/libsvgtiny/autogenerated_colors.c
new file mode 100644
index 0000000000000000000000000000000000000000..f23635c388630f4d5a56d6b47b44aef2498d149e
--- /dev/null
+++ b/subprojects/packagefiles/libsvgtiny/autogenerated_colors.c
@@ -0,0 +1,923 @@
+/* ANSI-C code produced by gperf version 3.3 */
+/* Command-line: gperf --output-file=subprojects/packagefiles/libsvgtiny/autogenerated_colors.c subprojects/libsvgtiny/src/colors.gperf  */
+/* Computed positions: -k'1,3,6-8,12-13' */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gperf@gnu.org>."
+#endif
+
+#line 15 "subprojects/libsvgtiny/src/colors.gperf"
+
+#include <string.h>
+#include "svgtiny.h"
+#include "svgtiny_internal.h"
+
+#line 22 "subprojects/libsvgtiny/src/colors.gperf"
+struct svgtiny_named_color;
+
+#define TOTAL_KEYWORDS 147
+#define MIN_WORD_LENGTH 3
+#define MAX_WORD_LENGTH 20
+#define MIN_HASH_VALUE 4
+#define MAX_HASH_VALUE 565
+/* maximum key range = 562, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+svgtiny_color_hash (register const char *str, register size_t len)
+{
+  static const unsigned short asso_values[] =
+    {
+      566, 566, 566, 566, 566, 566, 566, 566, 566, 566,
+      566, 566, 566, 566, 566, 566, 566, 566, 566, 566,
+      566, 566, 566, 566, 566, 566, 566, 566, 566, 566,
+      566, 566, 566, 566, 566, 566, 566, 566, 566, 566,
+      566, 566, 566, 566, 566, 566, 566, 566, 566, 566,
+      566, 566, 566, 566, 566, 566, 566, 566, 566, 566,
+      566, 566, 566, 566, 566, 566, 566, 566, 566, 566,
+      566, 566, 566, 566, 566, 566, 566, 566, 566, 566,
+      566, 566, 566, 566, 566, 566, 566, 566, 566, 566,
+      566, 566, 566, 566, 566, 566, 566,   5,  55,   0,
+       35,   0,  75,  10,   5,   0, 566, 250,  10,  40,
+       85,  60,  70, 144,   0,  20,  45,  10,  30, 185,
+       95, 195, 566,   0, 566, 566, 566, 566, 566, 566,
+      566, 566, 566, 566, 566, 566, 566, 566, 566, 566,
+      566, 566, 566, 566, 566, 566, 566, 566, 566, 566,
+      566, 566, 566, 566, 566, 566, 566, 566, 566, 566,
+      566, 566, 566, 566, 566, 566, 566, 566, 566, 566,
+      566, 566, 566, 566, 566, 566, 566, 566, 566, 566,
+      566, 566, 566, 566, 566, 566, 566, 566, 566, 566,
+      566, 566, 566, 566, 566, 566, 566, 566, 566, 566,
+      566, 566, 566, 566, 566, 566, 566, 566, 566, 566,
+      566, 566, 566, 566, 566, 566, 566, 566, 566, 566,
+      566, 566, 566, 566, 566, 566, 566, 566, 566, 566,
+      566, 566, 566, 566, 566, 566, 566, 566, 566, 566,
+      566, 566, 566, 566, 566, 566, 566, 566, 566, 566,
+      566, 566, 566, 566, 566, 566, 566, 566
+    };
+  register unsigned int hval = len;
+
+  switch (hval)
+    {
+      default:
+        hval += asso_values[(unsigned char)str[12]];
+#if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9)))
+      [[fallthrough]];
+#elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10)
+      __attribute__ ((__fallthrough__));
+#endif
+      /*FALLTHROUGH*/
+      case 12:
+        hval += asso_values[(unsigned char)str[11]];
+#if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9)))
+      [[fallthrough]];
+#elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10)
+      __attribute__ ((__fallthrough__));
+#endif
+      /*FALLTHROUGH*/
+      case 11:
+      case 10:
+      case 9:
+      case 8:
+        hval += asso_values[(unsigned char)str[7]];
+#if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9)))
+      [[fallthrough]];
+#elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10)
+      __attribute__ ((__fallthrough__));
+#endif
+      /*FALLTHROUGH*/
+      case 7:
+        hval += asso_values[(unsigned char)str[6]];
+#if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9)))
+      [[fallthrough]];
+#elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10)
+      __attribute__ ((__fallthrough__));
+#endif
+      /*FALLTHROUGH*/
+      case 6:
+        hval += asso_values[(unsigned char)str[5]];
+#if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9)))
+      [[fallthrough]];
+#elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10)
+      __attribute__ ((__fallthrough__));
+#endif
+      /*FALLTHROUGH*/
+      case 5:
+      case 4:
+      case 3:
+        hval += asso_values[(unsigned char)str[2]+2];
+#if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9)))
+      [[fallthrough]];
+#elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10)
+      __attribute__ ((__fallthrough__));
+#endif
+      /*FALLTHROUGH*/
+      case 2:
+      case 1:
+        hval += asso_values[(unsigned char)str[0]];
+        break;
+    }
+  return hval;
+}
+
+const struct svgtiny_named_color *
+svgtiny_color_lookup (register const char *str, register size_t len)
+{
+#if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
+#endif
+  static const struct svgtiny_named_color wordlist[] =
+    {
+#line 44 "subprojects/libsvgtiny/src/colors.gperf"
+      {"cyan",		svgtiny_RGB(  0, 255, 255)},
+#line 77 "subprojects/libsvgtiny/src/colors.gperf"
+      {"gray",		svgtiny_RGB(128, 128, 128)},
+#line 38 "subprojects/libsvgtiny/src/colors.gperf"
+      {"chartreuse",	svgtiny_RGB(127, 255,   0)},
+#line 78 "subprojects/libsvgtiny/src/colors.gperf"
+      {"grey",		svgtiny_RGB(128, 128, 128)},
+#line 79 "subprojects/libsvgtiny/src/colors.gperf"
+      {"green",		svgtiny_RGB(  0, 128,   0)},
+#line 97 "subprojects/libsvgtiny/src/colors.gperf"
+      {"lightgrey",	svgtiny_RGB(211, 211, 211)},
+#line 96 "subprojects/libsvgtiny/src/colors.gperf"
+      {"lightgreen",	svgtiny_RGB(144, 238, 144)},
+#line 95 "subprojects/libsvgtiny/src/colors.gperf"
+      {"lightgray",	svgtiny_RGB(211, 211, 211)},
+#line 153 "subprojects/libsvgtiny/src/colors.gperf"
+      {"skyblue",	svgtiny_RGB(135, 206, 235)},
+#line 156 "subprojects/libsvgtiny/src/colors.gperf"
+      {"slategrey",	svgtiny_RGB(112, 128, 144)},
+#line 151 "subprojects/libsvgtiny/src/colors.gperf"
+      {"sienna",		svgtiny_RGB(160,  82,  45)},
+#line 155 "subprojects/libsvgtiny/src/colors.gperf"
+      {"slategray",	svgtiny_RGB(112, 128, 144)},
+#line 150 "subprojects/libsvgtiny/src/colors.gperf"
+      {"seashell",	svgtiny_RGB(255, 245, 238)},
+#line 161 "subprojects/libsvgtiny/src/colors.gperf"
+      {"teal",		svgtiny_RGB(  0, 128, 128)},
+#line 40 "subprojects/libsvgtiny/src/colors.gperf"
+      {"coral",		svgtiny_RGB(255, 127,  80)},
+#line 99 "subprojects/libsvgtiny/src/colors.gperf"
+      {"lightsalmon",	svgtiny_RGB(255, 160, 122)},
+#line 103 "subprojects/libsvgtiny/src/colors.gperf"
+      {"lightslategrey",	svgtiny_RGB(119, 136, 153)},
+#line 31 "subprojects/libsvgtiny/src/colors.gperf"
+      {"black",		svgtiny_RGB(  0,   0,   0)},
+#line 102 "subprojects/libsvgtiny/src/colors.gperf"
+      {"lightslategray",	svgtiny_RGB(119, 136, 153)},
+#line 129 "subprojects/libsvgtiny/src/colors.gperf"
+      {"orange",		svgtiny_RGB(255, 165,   0)},
+#line 130 "subprojects/libsvgtiny/src/colors.gperf"
+      {"orangered",	svgtiny_RGB(255,  69,   0)},
+#line 30 "subprojects/libsvgtiny/src/colors.gperf"
+      {"bisque",		svgtiny_RGB(255, 228, 196)},
+#line 106 "subprojects/libsvgtiny/src/colors.gperf"
+      {"lime",		svgtiny_RGB(  0, 255,   0)},
+#line 143 "subprojects/libsvgtiny/src/colors.gperf"
+      {"red",		svgtiny_RGB(255,   0,   0)},
+#line 107 "subprojects/libsvgtiny/src/colors.gperf"
+      {"limegreen",	svgtiny_RGB( 50, 205,  50)},
+#line 92 "subprojects/libsvgtiny/src/colors.gperf"
+      {"lightcoral",	svgtiny_RGB(240, 128, 128)},
+#line 145 "subprojects/libsvgtiny/src/colors.gperf"
+      {"royalblue",	svgtiny_RGB( 65, 105, 225)},
+#line 108 "subprojects/libsvgtiny/src/colors.gperf"
+      {"linen",		svgtiny_RGB(250, 240, 230)},
+#line 72 "subprojects/libsvgtiny/src/colors.gperf"
+      {"fuchsia",	svgtiny_RGB(255,   0, 255)},
+#line 49 "subprojects/libsvgtiny/src/colors.gperf"
+      {"darkgreen",	svgtiny_RGB(  0, 100,   0)},
+#line 91 "subprojects/libsvgtiny/src/colors.gperf"
+      {"lightblue",	svgtiny_RGB(173, 216, 230)},
+#line 55 "subprojects/libsvgtiny/src/colors.gperf"
+      {"darkorchid",	svgtiny_RGB(153,  50, 204)},
+#line 158 "subprojects/libsvgtiny/src/colors.gperf"
+      {"springgreen",	svgtiny_RGB(  0, 255, 127)},
+#line 109 "subprojects/libsvgtiny/src/colors.gperf"
+      {"magenta",	svgtiny_RGB(255,   0, 255)},
+#line 75 "subprojects/libsvgtiny/src/colors.gperf"
+      {"gold",		svgtiny_RGB(255, 215,   0)},
+#line 131 "subprojects/libsvgtiny/src/colors.gperf"
+      {"orchid",		svgtiny_RGB(218, 112, 214)},
+#line 154 "subprojects/libsvgtiny/src/colors.gperf"
+      {"slateblue",	svgtiny_RGB(106,  90, 205)},
+#line 52 "subprojects/libsvgtiny/src/colors.gperf"
+      {"darkmagenta",	svgtiny_RGB(139, 0,   139)},
+#line 45 "subprojects/libsvgtiny/src/colors.gperf"
+      {"darkblue",	svgtiny_RGB(  0,   0, 139)},
+#line 104 "subprojects/libsvgtiny/src/colors.gperf"
+      {"lightsteelblue",	svgtiny_RGB(176, 196, 222)},
+#line 152 "subprojects/libsvgtiny/src/colors.gperf"
+      {"silver",		svgtiny_RGB(192, 192, 192)},
+#line 149 "subprojects/libsvgtiny/src/colors.gperf"
+      {"seagreen",	svgtiny_RGB( 46, 139,  87)},
+#line 159 "subprojects/libsvgtiny/src/colors.gperf"
+      {"steelblue",	svgtiny_RGB( 70, 130, 180)},
+#line 160 "subprojects/libsvgtiny/src/colors.gperf"
+      {"tan",		svgtiny_RGB(210, 180, 140)},
+#line 138 "subprojects/libsvgtiny/src/colors.gperf"
+      {"peru",		svgtiny_RGB(205, 133,  63)},
+#line 142 "subprojects/libsvgtiny/src/colors.gperf"
+      {"purple",		svgtiny_RGB(128,   0, 128)},
+#line 56 "subprojects/libsvgtiny/src/colors.gperf"
+      {"darkred",	svgtiny_RGB(139,   0,   0)},
+#line 121 "subprojects/libsvgtiny/src/colors.gperf"
+      {"mintcream",	svgtiny_RGB(245, 255, 250)},
+#line 69 "subprojects/libsvgtiny/src/colors.gperf"
+      {"firebrick",	svgtiny_RGB(178,  34,  34)},
+#line 100 "subprojects/libsvgtiny/src/colors.gperf"
+      {"lightseagreen",	svgtiny_RGB( 32, 178, 170)},
+#line 53 "subprojects/libsvgtiny/src/colors.gperf"
+      {"darkolivegreen",	svgtiny_RGB( 85, 107,  47)},
+#line 122 "subprojects/libsvgtiny/src/colors.gperf"
+      {"mistyrose",	svgtiny_RGB(255, 228, 225)},
+#line 84 "subprojects/libsvgtiny/src/colors.gperf"
+      {"indigo",		svgtiny_RGB( 75,   0, 130)},
+#line 126 "subprojects/libsvgtiny/src/colors.gperf"
+      {"oldlace",	svgtiny_RGB(253, 245, 230)},
+#line 139 "subprojects/libsvgtiny/src/colors.gperf"
+      {"pink",		svgtiny_RGB(255, 192, 203)},
+#line 57 "subprojects/libsvgtiny/src/colors.gperf"
+      {"darksalmon",	svgtiny_RGB(233, 150, 122)},
+#line 87 "subprojects/libsvgtiny/src/colors.gperf"
+      {"lavender",	svgtiny_RGB(230, 230, 250)},
+#line 85 "subprojects/libsvgtiny/src/colors.gperf"
+      {"ivory",		svgtiny_RGB(255, 255, 240)},
+#line 123 "subprojects/libsvgtiny/src/colors.gperf"
+      {"moccasin",	svgtiny_RGB(255, 228, 181)},
+#line 37 "subprojects/libsvgtiny/src/colors.gperf"
+      {"cadetblue",	svgtiny_RGB( 95, 158, 160)},
+#line 63 "subprojects/libsvgtiny/src/colors.gperf"
+      {"darkviolet",	svgtiny_RGB(148,   0, 211)},
+#line 146 "subprojects/libsvgtiny/src/colors.gperf"
+      {"saddlebrown",	svgtiny_RGB(139,  69,  19)},
+#line 59 "subprojects/libsvgtiny/src/colors.gperf"
+      {"darkslateblue",	svgtiny_RGB( 72,  61, 139)},
+#line 133 "subprojects/libsvgtiny/src/colors.gperf"
+      {"palegreen",	svgtiny_RGB(152, 251, 152)},
+#line 157 "subprojects/libsvgtiny/src/colors.gperf"
+      {"snow",		svgtiny_RGB(255, 250, 250)},
+#line 83 "subprojects/libsvgtiny/src/colors.gperf"
+      {"indianred",	svgtiny_RGB(205,  92,  92)},
+#line 94 "subprojects/libsvgtiny/src/colors.gperf"
+      {"lightgoldenrodyellow",	svgtiny_RGB(250, 250, 210)},
+#line 163 "subprojects/libsvgtiny/src/colors.gperf"
+      {"tomato",		svgtiny_RGB(255,  99,  71)},
+#line 90 "subprojects/libsvgtiny/src/colors.gperf"
+      {"lemonchiffon",	svgtiny_RGB(255, 250, 205)},
+#line 98 "subprojects/libsvgtiny/src/colors.gperf"
+      {"lightpink",	svgtiny_RGB(255, 182, 193)},
+#line 110 "subprojects/libsvgtiny/src/colors.gperf"
+      {"maroon",		svgtiny_RGB(128,   0,   0)},
+#line 88 "subprojects/libsvgtiny/src/colors.gperf"
+      {"lavenderblush",	svgtiny_RGB(255, 240, 245)},
+#line 164 "subprojects/libsvgtiny/src/colors.gperf"
+      {"turquoise",	svgtiny_RGB( 64, 224, 208)},
+#line 54 "subprojects/libsvgtiny/src/colors.gperf"
+      {"darkorange",	svgtiny_RGB(255, 140,   0)},
+#line 125 "subprojects/libsvgtiny/src/colors.gperf"
+      {"navy",		svgtiny_RGB(  0,   0, 128)},
+#line 68 "subprojects/libsvgtiny/src/colors.gperf"
+      {"dodgerblue",	svgtiny_RGB( 30, 144, 255)},
+#line 71 "subprojects/libsvgtiny/src/colors.gperf"
+      {"forestgreen",	svgtiny_RGB( 34, 139,  34)},
+#line 120 "subprojects/libsvgtiny/src/colors.gperf"
+      {"midnightblue",	svgtiny_RGB( 25,  25, 112)},
+#line 115 "subprojects/libsvgtiny/src/colors.gperf"
+      {"mediumseagreen",	svgtiny_RGB( 60, 179, 113)},
+#line 58 "subprojects/libsvgtiny/src/colors.gperf"
+      {"darkseagreen",	svgtiny_RGB(143, 188, 143)},
+#line 26 "subprojects/libsvgtiny/src/colors.gperf"
+      {"aqua",		svgtiny_RGB(  0, 255, 255)},
+#line 28 "subprojects/libsvgtiny/src/colors.gperf"
+      {"azure",		svgtiny_RGB(240, 255, 255)},
+#line 147 "subprojects/libsvgtiny/src/colors.gperf"
+      {"salmon",		svgtiny_RGB(250, 128, 114)},
+#line 166 "subprojects/libsvgtiny/src/colors.gperf"
+      {"wheat",		svgtiny_RGB(245, 222, 179)},
+#line 35 "subprojects/libsvgtiny/src/colors.gperf"
+      {"brown",		svgtiny_RGB(165,  42,  42)},
+#line 27 "subprojects/libsvgtiny/src/colors.gperf"
+      {"aquamarine",	svgtiny_RGB(127, 255, 212)},
+#line 39 "subprojects/libsvgtiny/src/colors.gperf"
+      {"chocolate",	svgtiny_RGB(210, 105,  30)},
+#line 89 "subprojects/libsvgtiny/src/colors.gperf"
+      {"lawngreen",	svgtiny_RGB(124, 252,   0)},
+#line 148 "subprojects/libsvgtiny/src/colors.gperf"
+      {"sandybrown",	svgtiny_RGB(244, 164,  96)},
+#line 93 "subprojects/libsvgtiny/src/colors.gperf"
+      {"lightcyan",	svgtiny_RGB(224, 255, 255)},
+#line 165 "subprojects/libsvgtiny/src/colors.gperf"
+      {"violet",		svgtiny_RGB(238, 130, 238)},
+#line 105 "subprojects/libsvgtiny/src/colors.gperf"
+      {"lightyellow",	svgtiny_RGB(255, 255, 224)},
+#line 112 "subprojects/libsvgtiny/src/colors.gperf"
+      {"mediumblue",	svgtiny_RGB(  0,   0, 205)},
+#line 137 "subprojects/libsvgtiny/src/colors.gperf"
+      {"peachpuff",	svgtiny_RGB(255, 218, 185)},
+#line 80 "subprojects/libsvgtiny/src/colors.gperf"
+      {"greenyellow",	svgtiny_RGB(173, 255,  47)},
+#line 25 "subprojects/libsvgtiny/src/colors.gperf"
+      {"antiquewhite",	svgtiny_RGB(250, 235, 215)},
+#line 33 "subprojects/libsvgtiny/src/colors.gperf"
+      {"blue",		svgtiny_RGB(  0,   0, 255)},
+#line 119 "subprojects/libsvgtiny/src/colors.gperf"
+      {"mediumvioletred",	svgtiny_RGB(199,  21, 133)},
+#line 114 "subprojects/libsvgtiny/src/colors.gperf"
+      {"mediumpurple",	svgtiny_RGB(147, 112, 219)},
+#line 76 "subprojects/libsvgtiny/src/colors.gperf"
+      {"goldenrod",	svgtiny_RGB(218, 165,  32)},
+#line 32 "subprojects/libsvgtiny/src/colors.gperf"
+      {"blanchedalmond",	svgtiny_RGB(255, 235, 205)},
+#line 86 "subprojects/libsvgtiny/src/colors.gperf"
+      {"khaki",		svgtiny_RGB(240, 230, 140)},
+#line 140 "subprojects/libsvgtiny/src/colors.gperf"
+      {"plum",		svgtiny_RGB(221, 160, 221)},
+#line 113 "subprojects/libsvgtiny/src/colors.gperf"
+      {"mediumorchid",	svgtiny_RGB(186,  85, 211)},
+#line 144 "subprojects/libsvgtiny/src/colors.gperf"
+      {"rosybrown",	svgtiny_RGB(188, 143, 143)},
+#line 116 "subprojects/libsvgtiny/src/colors.gperf"
+      {"mediumslateblue",	svgtiny_RGB(123, 104, 238)},
+#line 62 "subprojects/libsvgtiny/src/colors.gperf"
+      {"darkturquoise",	svgtiny_RGB(  0, 206, 209)},
+#line 135 "subprojects/libsvgtiny/src/colors.gperf"
+      {"palevioletred",	svgtiny_RGB(219, 112, 147)},
+#line 136 "subprojects/libsvgtiny/src/colors.gperf"
+      {"papayawhip",	svgtiny_RGB(255, 239, 213)},
+#line 117 "subprojects/libsvgtiny/src/colors.gperf"
+      {"mediumspringgreen",	svgtiny_RGB(  0, 250, 154)},
+#line 50 "subprojects/libsvgtiny/src/colors.gperf"
+      {"darkgrey",	svgtiny_RGB(169, 169, 169)},
+#line 118 "subprojects/libsvgtiny/src/colors.gperf"
+      {"mediumturquoise",	svgtiny_RGB( 72, 209, 204)},
+#line 48 "subprojects/libsvgtiny/src/colors.gperf"
+      {"darkgray",	svgtiny_RGB(169, 169, 169)},
+#line 47 "subprojects/libsvgtiny/src/colors.gperf"
+      {"darkgoldenrod",	svgtiny_RGB(184, 134,  11)},
+#line 67 "subprojects/libsvgtiny/src/colors.gperf"
+      {"dimgrey",	svgtiny_RGB(105, 105, 105)},
+#line 66 "subprojects/libsvgtiny/src/colors.gperf"
+      {"dimgray",	svgtiny_RGB(105, 105, 105)},
+#line 81 "subprojects/libsvgtiny/src/colors.gperf"
+      {"honeydew",	svgtiny_RGB(240, 255, 240)},
+#line 29 "subprojects/libsvgtiny/src/colors.gperf"
+      {"beige",		svgtiny_RGB(245, 245, 220)},
+#line 162 "subprojects/libsvgtiny/src/colors.gperf"
+      {"thistle",	svgtiny_RGB(216, 191, 216)},
+#line 42 "subprojects/libsvgtiny/src/colors.gperf"
+      {"cornsilk",	svgtiny_RGB(255, 248, 220)},
+#line 127 "subprojects/libsvgtiny/src/colors.gperf"
+      {"olive",		svgtiny_RGB(128, 128,   0)},
+#line 34 "subprojects/libsvgtiny/src/colors.gperf"
+      {"blueviolet",	svgtiny_RGB(138,  43, 226)},
+#line 111 "subprojects/libsvgtiny/src/colors.gperf"
+      {"mediumaquamarine",	svgtiny_RGB(102, 205, 170)},
+#line 41 "subprojects/libsvgtiny/src/colors.gperf"
+      {"cornflowerblue",	svgtiny_RGB(100, 149, 237)},
+#line 24 "subprojects/libsvgtiny/src/colors.gperf"
+      {"aliceblue",	svgtiny_RGB(240, 248, 255)},
+#line 141 "subprojects/libsvgtiny/src/colors.gperf"
+      {"powderblue",	svgtiny_RGB(176, 224, 230)},
+#line 134 "subprojects/libsvgtiny/src/colors.gperf"
+      {"paleturquoise",	svgtiny_RGB(175, 238, 238)},
+#line 61 "subprojects/libsvgtiny/src/colors.gperf"
+      {"darkslategrey",	svgtiny_RGB( 47,  79,  79)},
+#line 51 "subprojects/libsvgtiny/src/colors.gperf"
+      {"darkkhaki",	svgtiny_RGB(189, 183, 107)},
+#line 60 "subprojects/libsvgtiny/src/colors.gperf"
+      {"darkslategray",	svgtiny_RGB( 47,  79,  79)},
+#line 74 "subprojects/libsvgtiny/src/colors.gperf"
+      {"ghostwhite",	svgtiny_RGB(248, 248, 255)},
+#line 128 "subprojects/libsvgtiny/src/colors.gperf"
+      {"olivedrab",	svgtiny_RGB(107, 142,  35)},
+#line 132 "subprojects/libsvgtiny/src/colors.gperf"
+      {"palegoldenrod",	svgtiny_RGB(238, 232, 170)},
+#line 46 "subprojects/libsvgtiny/src/colors.gperf"
+      {"darkcyan",	svgtiny_RGB(  0, 139, 139)},
+#line 82 "subprojects/libsvgtiny/src/colors.gperf"
+      {"hotpink",	svgtiny_RGB(255, 105, 180)},
+#line 73 "subprojects/libsvgtiny/src/colors.gperf"
+      {"gainsboro",	svgtiny_RGB(220, 220, 220)},
+#line 64 "subprojects/libsvgtiny/src/colors.gperf"
+      {"deeppink",	svgtiny_RGB(255,  20, 147)},
+#line 43 "subprojects/libsvgtiny/src/colors.gperf"
+      {"crimson",	svgtiny_RGB(220,  20,  60)},
+#line 36 "subprojects/libsvgtiny/src/colors.gperf"
+      {"burlywood",	svgtiny_RGB(222, 184, 135)},
+#line 70 "subprojects/libsvgtiny/src/colors.gperf"
+      {"floralwhite",	svgtiny_RGB(255, 250, 240)},
+#line 167 "subprojects/libsvgtiny/src/colors.gperf"
+      {"white",		svgtiny_RGB(255, 255, 255)},
+#line 124 "subprojects/libsvgtiny/src/colors.gperf"
+      {"navajowhite",	svgtiny_RGB(255, 222, 173)},
+#line 169 "subprojects/libsvgtiny/src/colors.gperf"
+      {"yellow",		svgtiny_RGB(255, 255,   0)},
+#line 170 "subprojects/libsvgtiny/src/colors.gperf"
+      {"yellowgreen",	svgtiny_RGB(154, 205,  50)},
+#line 101 "subprojects/libsvgtiny/src/colors.gperf"
+      {"lightskyblue",	svgtiny_RGB(135, 206, 250)},
+#line 65 "subprojects/libsvgtiny/src/colors.gperf"
+      {"deepskyblue",	svgtiny_RGB(  0, 191, 255)},
+#line 168 "subprojects/libsvgtiny/src/colors.gperf"
+      {"whitesmoke",	svgtiny_RGB(245, 245, 245)}
+    };
+#if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3)
+#pragma GCC diagnostic pop
+#endif
+
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      register unsigned int key = svgtiny_color_hash (str, len);
+
+      if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
+        {
+          register const struct svgtiny_named_color *resword;
+
+          switch (key - 4)
+            {
+              case 0:
+                resword = &wordlist[0];
+                goto compare;
+              case 10:
+                resword = &wordlist[1];
+                goto compare;
+              case 16:
+                resword = &wordlist[2];
+                goto compare;
+              case 20:
+                resword = &wordlist[3];
+                goto compare;
+              case 21:
+                resword = &wordlist[4];
+                goto compare;
+              case 25:
+                resword = &wordlist[5];
+                goto compare;
+              case 26:
+                resword = &wordlist[6];
+                goto compare;
+              case 30:
+                resword = &wordlist[7];
+                goto compare;
+              case 33:
+                resword = &wordlist[8];
+                goto compare;
+              case 35:
+                resword = &wordlist[9];
+                goto compare;
+              case 37:
+                resword = &wordlist[10];
+                goto compare;
+              case 40:
+                resword = &wordlist[11];
+                goto compare;
+              case 44:
+                resword = &wordlist[12];
+                goto compare;
+              case 45:
+                resword = &wordlist[13];
+                goto compare;
+              case 46:
+                resword = &wordlist[14];
+                goto compare;
+              case 52:
+                resword = &wordlist[15];
+                goto compare;
+              case 55:
+                resword = &wordlist[16];
+                goto compare;
+              case 56:
+                resword = &wordlist[17];
+                goto compare;
+              case 60:
+                resword = &wordlist[18];
+                goto compare;
+              case 62:
+                resword = &wordlist[19];
+                goto compare;
+              case 65:
+                resword = &wordlist[20];
+                goto compare;
+              case 67:
+                resword = &wordlist[21];
+                goto compare;
+              case 70:
+                resword = &wordlist[22];
+                goto compare;
+              case 74:
+                resword = &wordlist[23];
+                goto compare;
+              case 75:
+                resword = &wordlist[24];
+                goto compare;
+              case 76:
+                resword = &wordlist[25];
+                goto compare;
+              case 80:
+                resword = &wordlist[26];
+                goto compare;
+              case 81:
+                resword = &wordlist[27];
+                goto compare;
+              case 83:
+                resword = &wordlist[28];
+                goto compare;
+              case 85:
+                resword = &wordlist[29];
+                goto compare;
+              case 90:
+                resword = &wordlist[30];
+                goto compare;
+              case 91:
+                resword = &wordlist[31];
+                goto compare;
+              case 92:
+                resword = &wordlist[32];
+                goto compare;
+              case 93:
+                resword = &wordlist[33];
+                goto compare;
+              case 95:
+                resword = &wordlist[34];
+                goto compare;
+              case 97:
+                resword = &wordlist[35];
+                goto compare;
+              case 100:
+                resword = &wordlist[36];
+                goto compare;
+              case 102:
+                resword = &wordlist[37];
+                goto compare;
+              case 104:
+                resword = &wordlist[38];
+                goto compare;
+              case 105:
+                resword = &wordlist[39];
+                goto compare;
+              case 107:
+                resword = &wordlist[40];
+                goto compare;
+              case 109:
+                resword = &wordlist[41];
+                goto compare;
+              case 110:
+                resword = &wordlist[42];
+                goto compare;
+              case 114:
+                resword = &wordlist[43];
+                goto compare;
+              case 115:
+                resword = &wordlist[44];
+                goto compare;
+              case 117:
+                resword = &wordlist[45];
+                goto compare;
+              case 118:
+                resword = &wordlist[46];
+                goto compare;
+              case 120:
+                resword = &wordlist[47];
+                goto compare;
+              case 125:
+                resword = &wordlist[48];
+                goto compare;
+              case 129:
+                resword = &wordlist[49];
+                goto compare;
+              case 130:
+                resword = &wordlist[50];
+                goto compare;
+              case 135:
+                resword = &wordlist[51];
+                goto compare;
+              case 137:
+                resword = &wordlist[52];
+                goto compare;
+              case 138:
+                resword = &wordlist[53];
+                goto compare;
+              case 140:
+                resword = &wordlist[54];
+                goto compare;
+              case 141:
+                resword = &wordlist[55];
+                goto compare;
+              case 144:
+                resword = &wordlist[56];
+                goto compare;
+              case 145:
+                resword = &wordlist[57];
+                goto compare;
+              case 149:
+                resword = &wordlist[58];
+                goto compare;
+              case 155:
+                resword = &wordlist[59];
+                goto compare;
+              case 156:
+                resword = &wordlist[60];
+                goto compare;
+              case 157:
+                resword = &wordlist[61];
+                goto compare;
+              case 159:
+                resword = &wordlist[62];
+                goto compare;
+              case 160:
+                resword = &wordlist[63];
+                goto compare;
+              case 164:
+                resword = &wordlist[64];
+                goto compare;
+              case 165:
+                resword = &wordlist[65];
+                goto compare;
+              case 166:
+                resword = &wordlist[66];
+                goto compare;
+              case 167:
+                resword = &wordlist[67];
+                goto compare;
+              case 168:
+                resword = &wordlist[68];
+                goto compare;
+              case 170:
+                resword = &wordlist[69];
+                goto compare;
+              case 172:
+                resword = &wordlist[70];
+                goto compare;
+              case 174:
+                resword = &wordlist[71];
+                goto compare;
+              case 175:
+                resword = &wordlist[72];
+                goto compare;
+              case 176:
+                resword = &wordlist[73];
+                goto compare;
+              case 180:
+                resword = &wordlist[74];
+                goto compare;
+              case 181:
+                resword = &wordlist[75];
+                goto compare;
+              case 182:
+                resword = &wordlist[76];
+                goto compare;
+              case 183:
+                resword = &wordlist[77];
+                goto compare;
+              case 185:
+                resword = &wordlist[78];
+                goto compare;
+              case 188:
+                resword = &wordlist[79];
+                goto compare;
+              case 190:
+                resword = &wordlist[80];
+                goto compare;
+              case 191:
+                resword = &wordlist[81];
+                goto compare;
+              case 192:
+                resword = &wordlist[82];
+                goto compare;
+              case 196:
+                resword = &wordlist[83];
+                goto compare;
+              case 200:
+                resword = &wordlist[84];
+                goto compare;
+              case 201:
+                resword = &wordlist[85];
+                goto compare;
+              case 209:
+                resword = &wordlist[86];
+                goto compare;
+              case 210:
+                resword = &wordlist[87];
+                goto compare;
+              case 211:
+                resword = &wordlist[88];
+                goto compare;
+              case 215:
+                resword = &wordlist[89];
+                goto compare;
+              case 221:
+                resword = &wordlist[90];
+                goto compare;
+              case 222:
+                resword = &wordlist[91];
+                goto compare;
+              case 226:
+                resword = &wordlist[92];
+                goto compare;
+              case 230:
+                resword = &wordlist[93];
+                goto compare;
+              case 232:
+                resword = &wordlist[94];
+                goto compare;
+              case 238:
+                resword = &wordlist[95];
+                goto compare;
+              case 240:
+                resword = &wordlist[96];
+                goto compare;
+              case 241:
+                resword = &wordlist[97];
+                goto compare;
+              case 243:
+                resword = &wordlist[98];
+                goto compare;
+              case 245:
+                resword = &wordlist[99];
+                goto compare;
+              case 250:
+                resword = &wordlist[100];
+                goto compare;
+              case 251:
+                resword = &wordlist[101];
+                goto compare;
+              case 255:
+                resword = &wordlist[102];
+                goto compare;
+              case 258:
+                resword = &wordlist[103];
+                goto compare;
+              case 260:
+                resword = &wordlist[104];
+                goto compare;
+              case 261:
+                resword = &wordlist[105];
+                goto compare;
+              case 263:
+                resword = &wordlist[106];
+                goto compare;
+              case 269:
+                resword = &wordlist[107];
+                goto compare;
+              case 271:
+                resword = &wordlist[108];
+                goto compare;
+              case 278:
+                resword = &wordlist[109];
+                goto compare;
+              case 279:
+                resword = &wordlist[110];
+                goto compare;
+              case 281:
+                resword = &wordlist[111];
+                goto compare;
+              case 284:
+                resword = &wordlist[112];
+                goto compare;
+              case 289:
+                resword = &wordlist[113];
+                goto compare;
+              case 293:
+                resword = &wordlist[114];
+                goto compare;
+              case 298:
+                resword = &wordlist[115];
+                goto compare;
+              case 299:
+                resword = &wordlist[116];
+                goto compare;
+              case 306:
+                resword = &wordlist[117];
+                goto compare;
+              case 308:
+                resword = &wordlist[118];
+                goto compare;
+              case 309:
+                resword = &wordlist[119];
+                goto compare;
+              case 311:
+                resword = &wordlist[120];
+                goto compare;
+              case 316:
+                resword = &wordlist[121];
+                goto compare;
+              case 321:
+                resword = &wordlist[122];
+                goto compare;
+              case 330:
+                resword = &wordlist[123];
+                goto compare;
+              case 335:
+                resword = &wordlist[124];
+                goto compare;
+              case 336:
+                resword = &wordlist[125];
+                goto compare;
+              case 338:
+                resword = &wordlist[126];
+                goto compare;
+              case 344:
+                resword = &wordlist[127];
+                goto compare;
+              case 345:
+                resword = &wordlist[128];
+                goto compare;
+              case 349:
+                resword = &wordlist[129];
+                goto compare;
+              case 350:
+                resword = &wordlist[130];
+                goto compare;
+              case 355:
+                resword = &wordlist[131];
+                goto compare;
+              case 364:
+                resword = &wordlist[132];
+                goto compare;
+              case 369:
+                resword = &wordlist[133];
+                goto compare;
+              case 373:
+                resword = &wordlist[134];
+                goto compare;
+              case 380:
+                resword = &wordlist[135];
+                goto compare;
+              case 384:
+                resword = &wordlist[136];
+                goto compare;
+              case 398:
+                resword = &wordlist[137];
+                goto compare;
+              case 410:
+                resword = &wordlist[138];
+                goto compare;
+              case 426:
+                resword = &wordlist[139];
+                goto compare;
+              case 436:
+                resword = &wordlist[140];
+                goto compare;
+              case 437:
+                resword = &wordlist[141];
+                goto compare;
+              case 467:
+                resword = &wordlist[142];
+                goto compare;
+              case 482:
+                resword = &wordlist[143];
+                goto compare;
+              case 483:
+                resword = &wordlist[144];
+                goto compare;
+              case 552:
+                resword = &wordlist[145];
+                goto compare;
+              case 561:
+                resword = &wordlist[146];
+                goto compare;
+            }
+          return (struct svgtiny_named_color *) 0;
+        compare:
+          {
+            register const char *s = resword->name;
+
+            if (*str == *s && !strcmp (str + 1, s + 1))
+              return resword;
+          }
+        }
+    }
+  return (struct svgtiny_named_color *) 0;
+}
diff --git a/subprojects/packagefiles/libsvgtiny/meson.build b/subprojects/packagefiles/libsvgtiny/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..f5b3b81ae981d58b47eecb8044175d8f43870d03
--- /dev/null
+++ b/subprojects/packagefiles/libsvgtiny/meson.build
@@ -0,0 +1,20 @@
+project('libsvgtiny', 'c', version: '0.1.8', default_options: ['c_std=c99'])
+
+dom_dep = dependency('libdom')
+wapcaplet_dep = dependency('libwapcaplet')
+
+inc = include_directories('.', 'include', 'src')
+libsvgtiny = static_library(
+  'svgtiny',
+  files('src/svgtiny.c', 'src/svgtiny_gradient.c', 'src/svgtiny_list.c'),
+  include_directories: inc,
+  dependencies: [dom_dep, wapcaplet_dep],
+  c_args: ['-D_BSD_SOURCE', '-D_DEFAULT_SOURCE'],
+)
+
+libsvgtiny_dep = declare_dependency(
+  link_with: libsvgtiny,
+  include_directories: inc,
+  dependencies: [dom_dep, wapcaplet_dep],
+)
+meson.override_dependency('libsvgtiny', libsvgtiny_dep)
diff --git a/subprojects/packagefiles/libutf8proc/meson.build b/subprojects/packagefiles/libutf8proc/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..3b695fe999a508f5415a5ace12f9d565c8f3ba40
--- /dev/null
+++ b/subprojects/packagefiles/libutf8proc/meson.build
@@ -0,0 +1,16 @@
+project('libutf8proc', 'c', version: '2.4.0', default_options: ['c_std=c99'])
+
+public_inc = include_directories('include')
+private_inc = include_directories('include/libutf8proc')
+libutf8proc = static_library(
+  'utf8proc',
+  'src/utf8proc.c',
+  include_directories: private_inc,
+  c_args: ['-DUTF8PROC_EXPORTS'],
+)
+
+libutf8proc_dep = declare_dependency(
+  link_with: libutf8proc,
+  include_directories: public_inc,
+)
+meson.override_dependency('libutf8proc', libutf8proc_dep)
diff --git a/subprojects/packagefiles/libwapcaplet/meson.build b/subprojects/packagefiles/libwapcaplet/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..db91a95b3d418dfb0f2a06423cb75dad421e8aef
--- /dev/null
+++ b/subprojects/packagefiles/libwapcaplet/meson.build
@@ -0,0 +1,15 @@
+project('libwapcaplet', 'c', version: '0.4.3', default_options: ['c_std=c99'])
+
+inc = include_directories('include')
+libwapcaplet = static_library(
+  'wapcaplet',
+  'src/libwapcaplet.c',
+  include_directories: inc,
+  c_args: ['-D_BSD_SOURCE', '-D_DEFAULT_SOURCE'],
+)
+
+libwapcaplet_dep = declare_dependency(
+  link_with: libwapcaplet,
+  include_directories: inc,
+)
+meson.override_dependency('libwapcaplet', libwapcaplet_dep)
diff --git a/testament.h.in b/testament.h.in
new file mode 100644
index 0000000000000000000000000000000000000000..2417b6c8604161f7e14092765fd2acabd092c116
--- /dev/null
+++ b/testament.h.in
@@ -0,0 +1,8 @@
+#ifndef NETSURF_REVISION_TESTAMENT
+#define NETSURF_REVISION_TESTAMENT 1
+
+#define WT_NO_GIT 1
+#define WT_MODIFIED 0
+#define WT_MODIFICATIONS {{NULL, NULL}}
+
+#endif
diff --git a/tools/messages.awk b/tools/messages.awk
new file mode 100644
index 0000000000000000000000000000000000000000..aeaea725990ef15aa9fd74551bebbf43f3a792b7
--- /dev/null
+++ b/tools/messages.awk
@@ -0,0 +1,8 @@
+/^(#|$)/ {next}
+{
+	i = index($0, ":")
+	if (!i) next
+	split(substr($0, 1, i - 1), key, ".")
+	if (lang == key[1] && (filter == "any" || key[2] == "all" || key[3] == filter))
+		print key[3] substr($0, i)
+}